仕掛けシグナルでポジションを建て、手仕舞いシグナルでポジションを決済するシステムのひな型です。それぞれのシグナルについては、仕掛けシグナルのページ、手仕舞いシグナルのページを参照してください。
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
//ティック時実行関数
void Tick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
int sig_exit = ExitSignal(); //手仕舞いシグナル
//成行売買
MyOrderSendMarket(sig_entry, sig_exit, Lots);
}
//仕掛けシグナル関数
int EntrySignal()
{
int ret = 0; //シグナルの初期化
//シグナルの生成
return ret; //シグナルの出力
}
//手仕舞いシグナル関数
int ExitSignal()
{
int ret = 0; //シグナルの初期化
//シグナルの生成
return ret; //シグナルの出力
}
EntrySignal()
で仕掛けシグナルを生成し、sig_entry
に代入します。さらにExitSignal()
で手仕舞いシグナルを生成し、sig_exit
に代入します。注文の送信にはMyOrderSendMarket()
を使いますが、仕掛けシグナルと手仕舞いシグナルが独立して生成されるので、いくつか注意点があります。
MyOrderSendMarket(sig_entry, sig_exit, Lots);
手仕舞いシグナルが次の仕掛けシグナルより必ず先に出るロジックになっている場合、MyOrderSendMarket()
の第1引数にsig_entry
を、第2引数にsig_exit
を代入するだけでOKです。
MyOrderSendMarket(sig_entry, sig_entry+sig_exit, Lots);
手仕舞いシグナルが出る前に次の仕掛けシグナルが出ることがあるロジックになっている場合、その仕掛けシグナルも手仕舞いシグナルとしたければ、MyOrderSendMarket()
の第2引数をsig_entry+sig_exit
とします。
これは稀なケースですが、買い(売り)の仕掛けシグナルと売り(買い)の手仕舞いシグナルが同時に出るような場合、MyOrderSendMarket()
の第2引数がsig_exit
でも、sig_entry+sig_exit
でも、ポジションの決済はされません。
このようなケースでも決済したい場合、優先したい方のシグナルを2倍にすることで決済が行われます。例えば、仕掛けシグナルを優先する場合、MyOrderSendMarket()
の第2引数を2*sig_entry+sig_exit
に、手仕舞いシグナルを優先する場合、MyOrderSendMarket()
の第2引数をsig_entry+2*sig_exit
に設定します。