前回のおさらいです。




メタトレーダで、自作EAを作る際に、もっとも注意しなくてはいけない点として、




「重複注文をしないでね」と命令文を入れないと、ひたすらに発注してしまう。(口座が破壊されるまで)




不親切極まりないですが、ユーザが気を付けるしかないです。






前回は、もっとも簡単(と思える)な方法で重複注文を避けるコードを紹介しました。



------------------------------------------------------------------------------------------




int BUY_Order = 0;



int start()
{


if (BUY_Order == 0 )
{
OrderSend(Symbol(),OP_BUY,0.1,Bid,5.0,0,0,NULL,123,0,Red);

}
BUY_Order = 1;

return(0);



}



------------------------------------------------------------------------------------------



赤文字で書いてあるところに注目してください。



int BUY_Order = 0;







BUY_Order  という変数に初めに”0”を代入しておきます。




注文した後に、



BUY_Order = 1 で”1”を代入します。





注文する条件が、if (BUY_Order == 0 ) ですから




日本語に直すと  




「もし、BUY_Order  が”0”ならば発注しなさい」






なので、変数BUY_Order に”1”が代入された後は、注文が発注される事はありません。










ただし、一度メタトレーダを閉じてしまうと変数がリセットされてしまうため







再起動時に、また発注されてしまいます。










面倒くさいですね(苦笑)









さて、これらを踏まえて、少し実践的なEAを作ってみました。







プログラム内容としては、




62EMAを10SMAが「ゴールデンクロス」したら買い、デッドクロスしたら売りで発注する。

発注の際にポジションを持っていたら決済をする。(重複注文防止)






ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー



//マジックナンバーの定義
#define MAGIC 1213

//パラメーターの設定//
extern double Lots = 0.01; //取引ロット数
extern int Slip = 10; //許容スリッページ数
extern string Comments = ""; //コメント
extern int ShortMA_Period = 10; //単純移動平均線の期間
extern int LongMA_Period = 62; //EMAの期間


//変数の設定//
int Ticket_L = 0; //買い注文の結果をキャッチする変数
int Ticket_S = 0; //売り注文の結果をキャッチする変数
int Exit_L = 0; //買いポジションの決済注文の結果をキャッチする変数
int Exit_S = 0; //売りポジションの決済注文の結果をキャッチする変数


int start()
{
double Short1,Short2,Long1,Long2; //移動平均線の値を入れる変数の宣言

Short1 = iMA(NULL,0,ShortMA_Period,0,MODE_SMA,PRICE_CLOSE,1); //一つ前の単純移動平均線
Short2 = iMA(NULL,0,ShortMA_Period,0,MODE_SMA,PRICE_CLOSE,2); //二つ前の単純移動平均線
Long1 = iMA(NULL,0,LongMA_Period,0,MODE_EMA,PRICE_CLOSE,1); //一つ前のEMA
Long2 = iMA(NULL,0,LongMA_Period,0,MODE_EMA,PRICE_CLOSE,2); //二つ前のEMA

//買いポジションのエグジット
OrderSelect(Ticket_L,SELECT_BY_TICKET);
if( Short1<Long1&&Short2 >Long2
&& ( Ticket_L != 0 && Ticket_L != -1 ))
{
Exit_L = OrderClose(Ticket_L,Lots,Bid,Slip,Red);
if( Exit_L ==1 ) {Ticket_L = 0;}
}

//売りポジションのエグジット
OrderSelect(Ticket_S,SELECT_BY_TICKET);
if( Short1 > Long1&&Short2 < Long2
&& ( Ticket_S != 0 && Ticket_S != -1 ))
{
Exit_S = OrderClose(Ticket_S,Lots,Ask,Slip,Blue);
if( Exit_S ==1 ) {Ticket_S = 0;}
}

//買いエントリー
if( Short1 >Long1 && Short2 < Long2
&& ( Ticket_L == 0 || Ticket_L == -1 )
&& ( Ticket_S == 0 || Ticket_S == -1 ))
{
Ticket_L = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,0,Comments,MAGIC,0,Red);
}

//売りエントリー
if( Short1<Long1 && Short2 > Long2
&& ( Ticket_S == 0 || Ticket_S == -1 )
&& ( Ticket_L == 0 || Ticket_L == -1 ))
{
Ticket_S = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,0,Comments,MAGIC,0,Blue);
}


return(0);
}





このコードも、一度メタトレーダを閉じてしまうと、変数がリセットされる為重複注文してしまうので注意です





是非、バックテストをしてデモトレードで試してみてください。






おすすめ通貨は「AUD/JPY」です。





約1年間のバックテストグラフです(4XP)


FX・シストレ日記(エコトレFX・MT4)







シストレバトルロイヤル