仕掛けシグナルが発生してすぐに成行売買の注文を出すのではなく、その価格から何pipsか離れた価格に指値注文を出すシステムです。ただし、この場合、いつまでも指値に到達しないとシグナルの意味がなくなってくるので、指値注文の有効期限も定めるようにします。

//共通ライブラリ
#include "LibEA.mqh"

sinput double Lots = 0.1; //売買ロット数
input double LimitPips = 20; //指値までの値幅(pips)
input int PendingMin = 150; //待機注文の有効時間(分)

//ティック時実行関数
void Tick()
{
   int sig_entry = EntrySignal(); //仕掛けシグナル
   //指値注文
   MyOrderSendPending(sig_entry, sig_entry, Lots, LimitPips, PendingMin);
}

input int FastMAPeriod = 20; //短期移動平均の期間
input int SlowMAPeriod = 50; //長期移動平均の期間

//仕掛けシグナル関数
int EntrySignal()
{
   //1本前と2本前の移動平均
   double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double FastMA2 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);

   int ret = 0; //シグナルの初期化

   //買いシグナル
   if(FastMA2 <= SlowMA2 && FastMA1 > SlowMA1) ret = 1;
   //売りシグナル
   if(FastMA2 >= SlowMA2 && FastMA1 < SlowMA1) ret = -1;

   return ret; //シグナルの出力
}

説明

EntrySignal()仕掛けシグナルを生成し、sig_entryに代入します。

MyOrderSendPending()の最初の3つの引数の意味は、MyOrderSendMarket()と同じです。第1引数と第2引数に同じsig_entryを代入することで、仕掛けシグナルが手仕舞いシグナルを兼ねることになります。

limit_pipsの引数には、指値までの値幅(pips)として、別途宣言した変数LimitPipsを代入します。

pend_minの引数には、待機注文の有効時間(分)として別途宣言した変数PendingMinを代入します。

これにより、sig_entryが買いシグナルであれば、現在の価格よりLimitPipspipsだけ安い価格に指値買い注文を入れ、その有効期限を注文発注からPendingMin分後とセットします。

sig_entryが売りシグナルであれば、現在の価格よりLimitPipspipsだけ高い価格に指値売り注文を入れ、その有効期限を注文発注からPendingMin分後とセットします。

指値にヒットすれば約定し、ポジションが建てられます。そして、そのポジションは、次の仕掛けシグナルが出ると同時に決済されます。


<aside> 💡 指値注文の約定はバーの途中で行われることもあるので、ストラテジーテスターのモデルを「全ティック」にしてバックテストする必要があります。

</aside>

<aside> 💡 MyOrderSendPending()limit_pipsの引数をマイナスの値に設定すると、指値注文の代わりに、逆指値注文を出すことができます。

</aside>