損切り・利食い注文による手仕舞いは、たいていの業者では指定した損切り値幅、利食い値幅で決済できますが、注文そのものが業者に見えてしまうという問題があります。

ここで紹介するのは、ポジションに付加する注文は使わないで損切りや利食いを行う、いわゆる「ステルスモード」と呼ばれる方法です。

共通ライブラリには、ポジションごとに含み損益をpips単位で求める関数MyOrderProfitPips()があります。これを使ってティックごとに損益をチェックしておけば、指定した損切り値幅、利食い値幅に達した時点(わずかに超えることはありますが)でポジションを決済することができます。

コード

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

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

//ティック時実行関数
void Tick()
{
//損切り・利食いによる手仕舞い
   if((SLpips != 0 && MyOrderProfitPips() <= -SLpips)
   || (TPpips != 0 && MyOrderProfitPips() >= TPpips)) MyOrderClose();

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

説明

MyOrderProfitPips()は、引数がなければ0番のポジションの含み損益をpips単位で返します。別途宣言した損切り値幅SLpips(0を除く)、利食い値幅TPpips(0を除く)との比較により損切り価格、利食い価格に到達したかを判別し、どちらかの条件を満たせば、MyOrderClose()でそのポジションを決済します。

ただし、損失の場合マイナスの値となるので、損切りの判別では、SLpipsではなく、-SLpipsと比較します。


<aside> 💡 損益のチェックはティック単位で行うので、ストラテジーテスターのモデルを「全ティック」にしてバックテストする必要があります。

</aside>