テクニカル指標による仕掛けシグナルは、条件の設定の仕方によっては、多くのタ イミングで発生することがあります。ただし、実際にはポジションがオープンしていれ ば、次のシグナルが出ても無視されるため、そのなかの多くのシグナルは利用されて いません。
もし複数のポジションをオープンできるのであれば、これまで使われなかった仕掛け シグナルで、別のポジションをオープンすることが可能になります。
ここでは、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()
で成行注文を送信するところは同じです。最後の引数にポジション番号0
、1
、2
をそれぞれ代入するところに注意してください。
もう一つ注意することは、ポジション1とポジション2に対して、MyOrderSendMarket()
の最初の引数にsig_entry
ではなく、WaitSignal()
を代入するところです。
WaitSignal(sig_entry, WaitMin, 0)
は、ポジション番号0のポジションがオープンしてからWaitMin
分までは0
を返し、WaitMin
分を超えたらsig_entry
を返すという意味です。
これをポジション1の成行注文の仕掛けシグナルとすることにより、ポジション0のオープン後WaitMin
分経過後の仕掛けシグナルによりポジションを建てることになります。
同様にポジション2の仕掛けシグナルをWaitSignal(sig_entry, WaitMin, 1)
とすると、ポジション1のオープン後WaitMin
分経過後の仕掛けシグナルでポジションを建てるので、連続したポジションのオープンを避けることができるのです。