仕掛けシグナルでポジションを建て、手仕舞いシグナルでポジションを決済するシステムのひな型です。それぞれのシグナルについては、仕掛けシグナルのページ、手仕舞いシグナルのページを参照してください。

//共通ライブラリ
#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に設定します。