さて、損益 10 ポイント未満で決済できるように Loop_Entry プログラムを手直ししてみました。
手直ししたプログラムはこちら↓にアップしてあります。
http://www1.bbiq.jp/hideho-fx-auto/loop_entry/source/loop_entry.htm#上記プログラムは十分なテストを行っておりません。もしご利用の際には
#自己責任でお願いします・・・
手直しのポイントは次のとおりです。
・トレードプールに複数のポジションがある場合を見越した対応・複数の EA 同時実行を見越しマジック番号での識別対応・注文の仕方を指値注文っぽい成行注文に変更・画面より入力した利益確定ポイント幅を基準に成行決済現時点では 1 つのEA ならびに 1 つの注文しかしないため複数ポジション対応の必要はありませんが、将来的に他の EA を同時に動かしたりする場合を見越し、トレードプールに複数のポジションがあっても動作するように対応しました。
また、指値注文についても、指値と相場価格にある一定以上の価格差がないと注文が成立しなかったため、こちらも画面で指定した価格で即注文成立するように変更しました。
手直しの詳しい内容は次のとおりです。
1. トレードプールにあるポジションを順番に調べ、Loop_Entry プログラムによる注文のマジック番号をもつポジションを見つける。まず、トレードプールにあるポジションを順番に調べる方法として次のような書き方をしています。
---------------------------------------------------------
int MAGIC_NO=1;
//Loop_Entryプログラムで注文したことを識別するマジック番号
int Entry_Cnt=0;
//トレードプールにLoop_Entryプログラムでのポジションが何個あるか保持する
int i;
//トレードプールからポジションを取得するためのオーダー番号を格納する
int j=OrdersTotal();
//トレードプールにある全ポジションの数を取得し保持する
for(i=0; i<j; i++)
{
}
---------------------------------------------------------
これは、i という数値が入る識別子を準備し、かつ、トレードプールの全ポジション数を j という識別子に格納し、i を 0 から一つずつカウントアップしながら j の数より小さい間、for の中括弧の内容を実行するというものです。
このカウントアップしていく i の値をオーダー番号として利用し、OrderSelect() でポジションを取得していきます。
そして、Loop_Entry プログラムによるポジションがみつかったら、見つかったことを識別するための Entry_Cnt 識別子に 1 を加算し、for の処理を中断しています。
Loop_Entry プログラムによるポジションかどうかは、取得したポジションのマジック番号を OrderMagicNumber() で調べ、新規注文の時に指定しているマジック番号(MAGIC_NO)とを比較して判断しています。
2. ポジションが見つからなかったら、新規に注文する次に、上記1. で調べた結果である Entry_Cnt が 0 のままであれば、Loop_Entry による注文ポジションは存在しないため、新たな注文を実行しています。
注文する際には、注文方法を指値注文ではなく成行注文に変えてあります。
つまり「OrderSend(Symbol(),CHUMON_TYPE,・・・」の CHUMON_TYPE の値を、入力画面で"買"が指定されたら"0"とし、"売"が指定されたら"1"をセットしています。
これで成行注文となりましたが、Loop_Entry はあくまでも「同じ価格で注文を繰り返す」プログラムなので、画面で指定した指値と相場価格が同じ場合のみ成行注文が実行されるようにしました。
3. ポジションが見つかったら、「有効なポジション」なのか「有効な注文」なのかを判断し、有効なポジションであれば、決済注文を出す。Entry_Cnt が 0 以外なら、最後に取得したポジションは Loop_Entry により注文されたポジションなので、ポジションタイプ(取引種類)を OrderType() で調べ判断しています。
4. 決済注文を出す際には、市場価格と利食い価格と損切り価格から判断し成行決済を行う最後に、市場価格(Bid/Ask)と、画面で指定した入力パラメータより算出した利食い価格と損切り価格から、決済すべきかどうかを判断し処理しています。
なお、今回は判断の方法として「switch」を利用しています。これは「if」でも書ける内容ですが、一つの判定基準に対して複数の結果がありえる場合に便利な書き方です。
つまり、switch の横に判定される内容(今回はポジションタイプ)を書き、判定基準を case の行に書いて、それぞれの場合に即した処理を書いていきます。
ざっと変更点を書きましたが、公開しているプログラムにもできるだけコメントを書き込んでいますので、参考にしてみてください。