https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7781142f-a38d-4de7-87b0-d7bd86ba1332/EURUSD_iM15.png

テクニカル指標による仕掛けシグナルは、条件の設定の仕方によっては、多くのタ イミングで発生することがあります。ただし、実際にはポジションがオープンしていれ ば、次のシグナルが出ても無視されるため、そのなかの多くのシグナルは利用されて いません。

もし複数のポジションをオープンできるのであれば、これまで使われなかった仕掛け シグナルで、別のポジションをオープンすることが可能になります。

ここでは、3個のポジションを用意し、仕掛けシグナルが出るたびに、順にポジシ ョンをオープンするシステムを作成してみます。

仕掛けシグナル

<aside> 💡 ポジション0、ポジション1、ポジション2ボリンジャーバンドと終値の交差

</aside>

コード

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

input int WaitMin = 60;   //待機時間(分)
sinput double Lots = 0.1; //売買ロット数

//ティック時実行関数
void Tick()
{
   int sig_entry = EntrySignal(); //仕掛けシグナル
   //ポジション0の成行売買
   MyOrderSendMarket(sig_entry, sig_entry, Lots, 0);
   //ポジション1の成行売買
   MyOrderSendMarket(WaitSignal(sig_entry, WaitMin, 0), sig_entry, Lots, 1);
   //ポジション2の成行売買
   MyOrderSendMarket(WaitSignal(sig_entry, WaitMin, 1), sig_entry, Lots, 2);
}

input int BBPeriod = 10;  //ボリンジャーバンドの期間
input double BBDev = 2.0; //標準偏差の倍率

//仕掛けシグナル関数
int EntrySignal()
{
   //1本前と2本前のボリンジャーバンド
   double BBUpper1 = iBands(_Symbol, 0, BBPeriod, BBDev, 0, PRICE_CLOSE, MODE_UPPER, 1);
   double BBLower1 = iBands(_Symbol, 0, BBPeriod, BBDev, 0, PRICE_CLOSE, MODE_LOWER, 1);
   double BBUpper2 = iBands(_Symbol, 0, BBPeriod, BBDev, 0, PRICE_CLOSE, MODE_UPPER, 2);
   double BBLower2 = iBands(_Symbol, 0, BBPeriod, BBDev, 0, PRICE_CLOSE, MODE_LOWER, 2);

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

   //買いシグナル
   if(Close[2] >= BBLower2 && Close[1] < BBLower1) ret = 1;
   //売りシグナル
   if(Close[2] <= BBUpper2 && Close[1] > BBUpper1) ret = -1;

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

説明

3つのポジションともに仕掛けシグナルは同じです。この例では新規バーができたときにしかシグナルは出ないので、新規バーができたときだけ実行する方法にすることもできます。

ただ、バーの途中でティック単位でシグナルが出るケースだと、仕掛けシグナルが短時間に連続して発生する可能性もあります。

そこで、1個目のポジションをオープンしたあと、2個目のポジションをオープンできるまでに待機時間を設けることにします。その時間が経過したあとに出たシグナルを 使ってポジションをオープンするわけです。2個目のポジションオープン後に3個目の ポジションをオープンするときも同様にします。

3つのポジションとも、[MyOrderSendMarket()](<https://www.notion.so/MyOrderSendMarket-3e0c92f431514dc6ba54b78b23c1afc6>)で成行注文を送信するところは同じです。最後の引数にポジション番号012をそれぞれ代入するところに注意してください。

もう一つ注意することは、ポジション1とポジション2に対して、[MyOrderSendMarket()](<https://www.notion.so/MyOrderSendMarket-3e0c92f431514dc6ba54b78b23c1afc6>)の最初の引数にsig_entryではなく、[WaitSignal()](<https://www.notion.so/WaitSignal-73e1e25bc2704661a93bb248db3fe0c7>)を代入するところです。

WaitSignal(sig_entry, WaitMin, 0)は、ポジション番号0のポジションがオープンしてからWaitMin分までは0を返し、WaitMin分を超えたらsig_entryを返すという意味です。

これをポジション1の成行注文の仕掛けシグナルとすることにより、ポジション0のオープン後WaitMin分経過後の仕掛けシグナルによりポジションを建てることになります。

同様にポジション2の仕掛けシグナルをWaitSignal(sig_entry, WaitMin, 1)とすると、ポジション1のオープン後WaitMin分経過後の仕掛けシグナルでポジションを建てるので、連続したポジションのオープンを避けることができるのです。