トレード備忘録 & MT4/MT5インディケータ及びEAの開発

日々のトレード備忘録及びMT4/MT5に関する事項

MT4 stoploss(sl)とtakeprofit(tp)がOrderSend( )で作動しない

2017-04-02 10:36:11 | 投資

 for文のなかでOrderSend( )を繰り返すと(例えば10pips間隔で10注文を連続発注等)、トラブルになることがある。コンパイルは何の問題もなく通っているのに、実際稼働させてみるとニコマークは点灯しているが、EAは全く作動しないという事態になる。エラーコードをたよりにターミナルのエキスパートタグを開いてみると、Invalid Stop等のメーッセージが出ている。 

 どういう場合にこうなるのか、推敲を重ねていたところ、原因はslとtpにあるらしいことが分かった。slとtpには実際の価格を与えなくてはならないが、それでは不便であるから、発注価格からのピップス差(diff)で指定することが多い。例えば、slにはprice – diff*i*Pointを指定。さらに、slを入れたくない場合もあるから、diffがゼロの場合は、slもゼロとなるよう、OrderSend( )外のスタート関数内で計算してslに代入するようにすると、もうこのOrderSend( )は反応しなくなる。 

 分かったことは、OrderSend( )関数のパラメータであるslやtpは、関数内で自己完結的に計算されていなくてはならないということである。つまり、関数外で場合分けをしてslやtpを選択的に適用するとOrderSend( )はマヒ状態になるのである。 

 解決策は、またもや豊嶋久道著「メタトレーダー実践プログラミング」326ページの氏オリジナルの注文送信関数「MyOrderSendSL」にあった。著書では氏独自開発のライブラリーを使用しておられるので、これをライブラリーなしのプログラムにするには、MyOrderSend( )及びMyOrderSendSL( )は、Myを除いた形に戻さなくてはならない。早速試してみたところ、今までのトラブルは嘘のように解消した。

「実践プログラミング」に紹介されている、MyOrderSendSL( )は次のようなものである。

 

// オーダー送信関数(損切り・利食いを値幅で指定)

bool MyOrderSendSL(int type, double lots, double price, int slippage, int slpips, int tppips, string comment, int magic)

{

   int mult=1;

   if(Digits == 3 || Digits == 5) mult=10;

   slippage *= mult; 

   if(type==OP_SELL || type==OP_SELLLIMIT || type==OP_SELLSTOP) mult *= -1; 

   double sl=0, tp=0;

   if(slpips > 0) sl = price-slpips*Point*mult;

   if(tppips > 0) tp = price+tppips*Point*mult; 

   return(MyOrderSend(type, lots, price, slippage, sl, tp, comment, magic));

}