
トレーリングストップを利用する
■処理の概要
価格が開始価格より、5pip有利に動いた状態で、(買いの場合)エントリー価格と前足最安値との間にSLを入れる
また、前足最安値がさらに有利な位置に移動した都度、SLを引き上げる
(筆者より)
ポジション数が多い場合、バックテスト時、処理が非常に重くなるため、Tick更新時に作動させた方が無難
↓↓↓↓↓こちら参考↓↓↓↓↓
//<<<<<>>>>><<<<<>>>>><< include >><<<<<>>>>><<<<<>>>>>
#include <Trade\Trade.mqh>
//<<<<<>>>>><<<<<>>>>><< 共通変数 >><<<<<>>>>><<<<<>>>>>
CTrade mytrade;
input group "MagicNumber"
int MagicNumber_bid = 1111; // bidマジックナンバー
int MagicNumber_ask = 1112; // askマジックナンバー
OnInit()
特になし
OnTick()
TrailingStop();
TrailingStop()
//+------------------------------------------------------------------+
//|トレーリングストップ処理
//+------------------------------------------------------------------+
//価格が開始価格より、5pip有利に動いた状態で、エントリー価格と前足最安値との間にSLを入れる
//また、前足最安値がさらに有利な位置に移動した都度、SLを引き上げる
void TrailingStop()
{
double Low_ = iLow(_Symbol,_Period,1);
double High_ = iHigh(_Symbol,_Period,1);
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
//保有ポジションを一つ選択
ulong position_ticket = PositionGetTicket(i);
//選択したポジションが、実行されている通貨ペアと同じかどうかチェック
if(PositionGetInteger(POSITION_MAGIC) == MagicNumber_bid || PositionGetInteger(POSITION_MAGIC) == MagicNumber_ask)
{
double Price_Open = PositionGetDouble(POSITION_PRICE_OPEN);
double Price_SL = PositionGetDouble(POSITION_SL);
if(PositionGetInteger(POSITION_TYPE) == ORDER_TYPE_BUY)
{
double Price_Harf = NormalizeDouble((Low_ + Price_Open)/2,_Digits);
if(Low_ - Price_Open > 50*_Point)
{
if(Price_Harf > Price_SL || Price_SL == 0)
{
mytrade.PositionModify(position_ticket, Price_Harf, PositionGetDouble(POSITION_TP));
Sleep(500);
}
}
}
else
if(PositionGetInteger(POSITION_TYPE) == ORDER_TYPE_SELL)
{
double Price_Harf = NormalizeDouble((High_ + Price_Open)/2,_Digits);
if(Price_Open - High_ > 50*_Point)
{
if(Price_Harf < Price_SL || Price_SL == 0)
{
mytrade.PositionModify(position_ticket, Price_Harf, PositionGetDouble(POSITION_TP));
Sleep(500);
}
}
}
}
}
}
MQL5コード一覧はコチラ