MT4、MT5では、各ポジションに損切り注文、および利食い注文を付加することができます。この注文により、設定した損切り価格や利食い価格に到達した時点で、ポジションを決済することができます。

共通ライブラリでは、これに対応して損切り・利食い注文をセットする[MyOrderSetSLTP()](<https://toyolab-fx.notion.site/MyOrderSetSLTP-41396bfb4ea14101b7f5c8d0e00ac593>)という関数を用意しています。

以下のコードは、2本の移動平均線の交差を仕掛けシグナルとした例ですが、損切り・利食い注文による手仕舞いは、仕掛けシグナルとは関係ない手仕舞い方法となります。

コード

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

sinput double Lots = 0.1; //売買ロット数
input double SLpips = 25; //損切り値幅(pips)
input double TPpips = 50; //利食い値幅(pips)

//ティック時実行関数
void Tick()
{
   //損切り・利食い注文の付加
   MyOrderSetSLTP(SLpips, TPpips);
   
   int sig_entry = EntrySignal(); //仕掛けシグナル
   //成行売買
   MyOrderSendMarket(sig_entry, sig_entry, Lots);
}

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; //シグナルの出力
}

説明

[MyOrderSetSLTP()](<https://toyolab-fx.notion.site/78e6ddbf283d4009bccd15402dac6e70>)は、Tick()の最初に記述しておきます。ポジションか、待機注文がある場合に、損切り注文、利食い注文をセットします。

引数は、損切り価格、利食い価格ではなく、売買価格に対して損切りとなる値幅、利食いとなる値幅をpips単位で指定します。この例では、別途宣言した損切り値幅SLpips、利食い値幅TPpips[MyOrderSetSLTP()](<https://toyolab-fx.notion.site/MyOrderSetSLTP-41396bfb4ea14101b7f5c8d0e00ac593>)の引数に代入しています。

なお、トレイリングストップなど損切り価格が変わる可能性がある場合は、以下のように損切り注文が付加されていない場合のみ損切り注文をセットしてください。

if(MyOrderStopLoss() == 0) MyOrderSetSLTP(SLpips, TPpips);

<aside> 💡 損切り・利食い注文はティック単位で判断するので、ストラテジーテスターのモデルを「全ティック」にしてバックテストする必要があります。

</aside>