見出し画像

逆張りナンピンEAをつくる(2)

前回の続きをする。

リファクタリング

続きをやる前にリファクタリングをする。

リファクタリング (refactoring) とは、コンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである。また、いくつかのリファクタリング手法の総称としても使われる。ただし、十分に確立された技術とはいえず、また「リファクタリング」という言葉に厳密な定義があるわけではない。

今回やるのは変数名の変更と短く書けるところは短く書く。って感じのことをやっていく。言語仕様的にもコードが長くなりやすい印象がある。

ロジックへの悩み

そもそも勝つ気のあるトレードのロジックではないけど、ある程度はロジックの穴は見つけられるようになりたいとは思っているという前置きをしたうえで、作ってるロジックに対して悩みがでてくる。

利確する価格をどこに持っていくのかが問題になる。ナンピンしている時点で読みは外れている。はずやから利益が出る範囲になったらできる限り早く利確したい。そうなると、最初の注文で利益が出なくてもナンピンした結果、利益のでる価格がでてくるはず。スワップの計算はややこしいから抜くとしても利確の線を的確に設定する計算を入れたほうがいいのかな?とはなってきた。(今回は保留するけど)

精算の実装

精算するべき時にすべてのポジションを決算する。今回は、指定した銘柄のすべてのポジションを精算するように作る。

精算する対象のポジションは銘柄指定し、存在する限り精算する。

PositionSelect を使ってポジションを選択

今後の作業で使用する保有ポジションを選択します。関数の実行に成功した場合、trueを返します。関数の実行に失敗した場合、falseを返します。エラーに関する情報を取得するには、GetLastError()関数を呼び出す必要があります。

PositionClose を使ってポジションを選択

指定されたシンボルでポジションを決済します。

この二つで行けると思ったけど、そもそも選択する必要があるのかは不明。

最後に次のポジションを決定している。

void settle()
 {
  while(position.Select(c_symbol))
    {
     trade.PositionClose(c_symbol);
    }
  c_position_type = c_position_type == POSITION_TYPE_BUY ? POSITION_TYPE_SELL : POSITION_TYPE_BUY
 }

ナンピンするロジック

ポジションを取るとき成りで行くので、いくらで注文が通ったのかを確認する。最新のポジションを取得して、その価格を確認する。

CPositionInfo OpenPrice でポジションの価格を取得することができる。

void average()
 {
  double order_volume = total_order_volume / 2;
  if(c_position_type == POSITION_TYPE_BUY)
    {
     trade.Buy(order_volume, c_symbol);
    }
  else
    {
     trade.Sell(order_volume, c_symbol);
    }
  position.Select(c_symbol);
  last_order_price   = position.PriceOpen();
  total_order_volume += order_volume;
 }

いままでのポジションの総量の半分のポジションを取るようにする。ここは定数として後で変更できるようにする必要があるけど、ナンピンする量を決める必要があることだけ記憶しておく。

テスト&デバッグ

できたのかは不明やけど、とりあえず動かしてみる。

Invalid Volume ってひたすら言われたので、volume を変更。なんとか動いた。ボロ負けしてる。

画像1

損切りのロジックを作っていないのもあるから、次回はそのあたりを作っていく。せめて、もう少し緩やかに負けてほしいところ。

コード


この記事が気に入ったらサポートをしてみませんか?