アイデアの作者 — Vladimir Khlystov、MQL5コードの作者 — barabashkakvn。
このトレーディング戦略は、指定した時間帯における高値・安値のブレイクアウトを利用します。損失を回復するために、EAは「ネヴァリャシュカ」戦略とマーチンゲール手法を用いてロットを増やします。
EAは指定した時間帯の高値と安値を次のように計算します:「タイムスタート」から「タイムエンド」までの価格です。

価格がこの期間の高値を上回ると、BUYポジションがオープンされます。逆に、価格が安値を下回ると、SELLポジションがオープンされます。ストップロスは、ポジションの逆側の境界に設定され、BUYポジションには安値、SELLポジションには高値が適用されます。テイクプロフィットは、コントロール期間の高さに基づいて設定されます。
「使用時間クローズ」がtrueに設定されている場合、タイムクローズパラメータ(すべてのポジションをクローズする時間)が有効になります。
パラメータの「タイムスタート」、「タイムエンド」、「タイムクローズ」には、時間と分のみが考慮されます。
ストップロスによるクローズはOnTradeTransactionで監視されます。
「DEAL_ENTRY_OUT」が見つかると、この取引のコメント欄をチェックします。コメントに「sl」が含まれている場合、その取引はストップロスでクローズされたことを意味します:
if(deal_symbol==m_symbol.Name() && deal_magic==m_magic) if(deal_entry==DEAL_ENTRY_OUT) { MqlDateTime str1; TimeToStruct(TimeCurrent(),str1); //--- これはテイクプロフィットでクローズされた可能性があります if(StringFind(deal_comment,"tp",0)!=-1 || deal_profit>=0.0) { TradeDey=str1.day; return; } //--- これはストップロスでクローズされた可能性があります if(StringFind(deal_comment,"sl",0)!=-1) { if(TradeDey!=str1.day) { Print("ストップロスによるクローズが検出されました!"); double loss=MathAbs(deal_profit/m_symbol.TickValue()/deal_volume); if(deal_type==DEAL_TYPE_SELL) // 買いポジションがクローズされた { double SL=m_symbol.Bid()+loss*m_symbol.Point(); double TP=m_symbol.Bid()-loss*m_symbol.Point(); double Lot=LotCheck(deal_volume*InpK_martin); if(Lot==0.0) return; OpenSell(SL,TP,Lot,"ネヴァリャシュカ"); } if(deal_type==DEAL_TYPE_BUY) // 売りポジションがクローズされた { double SL=m_symbol.Ask()-loss*m_symbol.Point(); double TP=m_symbol.Ask()+loss*m_symbol.Point(); double Lot=LotCheck(deal_volume*InpK_martin); if(Lot==0.0) return; OpenBuy(SL,TP,Lot,"ネヴァリャシュカ"); } return; } }
閉じたポジションとは逆のポジションをオープンします(取引タイプが「DEAL_TYPE_SELL」の場合はBUYポジションが閉じられ、「DEAL_TYPE_BUY」の場合はSELLポジションが閉じられたことを意味します)し、ロットは「K.マーチン」で倍増します。ポジションがプラスの利益でクローズされた場合、EAは次の期間の開始時間「タイムエンド」を待ち、上記の手順を繰り返します。
「ノーロス」パラメータはブレイクイーブンを意味し、ポジションの利益が半分に達すると、ストップロスはポジションのオープン価格に移動されます。
例として、EURUSD、M30でのテスト結果を示します:

コメント 0