ある仕掛けシグナルでポジションを建て、手仕舞いを部分的に変えたいケースがあるかと思います。共通ライブラリを使う場合、そういうケースでは、最初から手仕舞いの異なる部分を別々のポジションにしておくことをお勧めします。
つまり、複数のポジションを用意しておき、それぞれの手仕舞いの方法を変えればよいのです。例えば、ポジション番号0、1という二つのポジションを用意しておき、以下のように売買ルールを設定します。
<aside> 💡 ポジション0、ポジション1:2本の移動平均線の交差
</aside>
<aside> 💡 ポジション0:2本の移動平均線の交差による手仕舞い ポジション1:RSIによる手仕舞い
</aside>
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
//ティック時実行関数
void Tick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
int sig_exit = ExitSignal(); //手仕舞いシグナル
//成行売買
MyOrderSendMarket(sig_entry, sig_entry, Lots, 0);
MyOrderSendMarket(sig_entry, sig_exit, Lots, 1);
}
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; //シグナルの出力
}
input int RSIPeriod = 14; //RSIの期間
//手仕舞いシグナル関数
int ExitSignal()
{
//1本前のRSI
double RSI1 = iRSI(_Symbol, 0, RSIPeriod, PRICE_CLOSE, 1);
int ret = 0; //シグナルの初期化
//買いシグナル
if(RSI1 < 30) ret = 1;
//売りシグナル
if(RSI1 > 70) ret = -1;
return ret; //シグナルの出力
}
ポジション番号で区別する関数はMyOrderSendMarket()
のみです。最後の引数に0
と1
をそれぞれ代入します。
この例では、仕掛けシグナルをEntrySignal()
、手仕舞いシグナルをExitSignal()
という関数で求めます。
二つのポジションとも仕掛けシグナルは共通なので、MyOrderSendMarket()
の最初の引数には、仕掛けシグナルsig_entry
を代入します。
手仕舞いシグナルはポジションにより異なりますが、ポジション0では、途転売買となるように仕掛けシグナルsig_entry
をMyOrderSendMarket()
の2番目の引数に代入します。
そして、ポジション1では、手仕舞いシグナルsig_exit
をMyOrderSendMarket()
の2番目の引数に代入します。
このシステムでは、仕掛けシグナルにより二つのポジションが同時にできますが、決済は別々という形になります。