記事「MQL5経済指標カレンダーを用いたニュースフィルタリング(第2回):ニュースリリース中に管理ポジションを停止する」についてのディスカッション

 

新しい記事「MQL5経済指標カレンダーを用いたニュースフィルタリング(第2回):ニュースリリース中に管理ポジションを停止する」はパブリッシュされました:

第2回では、ニュースフィルタを拡張し、ニュースイベント中に既存のポジションを保護します。取引を決済する代わりに、ストップロス(SL)およびテイクプロフィット(TP)を一時的に解除し、それらの値をメモリ上へ安全に保存します。ニュースウィンドウが終了すると、ストップは決定論的に復元されます。この際、価格がすでに元の水準を超えている場合には、その値を調整するとともに、ブローカーの最小ストップ距離ルールを遵守します。その結果、エントリーロジックへ干渉せず取引構造の整合性を維持し、ボラティリティの高い状況でもEAが取引を制御できる仕組みを実現します。

第2回の目的は、制限されたニュースウィンドウ中にSLとTPを一時的に停止し、ニュースウィンドウ終了後に安全に復元することです。

このアプローチは、ニュースによる相場の方向性を判断しようとするものではありません。異常な市場環境によって発生するストップロスの早期執行を防ぐことだけを目的としています。

ストップ復元の原則

ストップ復元のロジックは決定論的です。

  • 価格が保存された元のSLまたはTP水準をまだ通過していない場合、ストップは元の値へそのまま復元される。
  • 価格がすでに元のストップロス水準を超えている場合、ストップは現在価格の直近で有効な水準へ復元される。
  • 同じロジックがテイクプロフィットにも適用される。

これにより、次の性質が保証されます。

  • 無効なストップの設定がおこなわれないこと
  • 価格水準をまたぐことによるブローカーからの拒否が発生しないこと
  • 論理的に復元不可能な値が設定されないこと
  • 技術的に可能な限り、元の取引構造が維持されること

この仕組みは一貫してルールベースで動作します。


作者: Solomon Anietie Sunday

 

これらの機能をどのように活用するつもりか:

プロップファームで稼働させているすべてのEAにおいて、「第1部: ニュース制限時間帯中の新規トレードの開始および既存ポジションの決済を停止する という記事の内容を適用する予定です。

一方、「パート2および パート3(ニュース制限時間帯の前後でSL/TPを一旦解除し、その後再設定する)」については、別のEAで使用する予定です。このコードは口座内の全建玉を順次処理するため、複数のチャートを同時に開いている場合でも、必要以上に何度も実行する必要がないようにするためです。シンボル選択を「USD、GBP、EURに手動で上書きします。これは、経験上、すでにフィルタリングが必要だと分かっている「赤いフォルダ」のニュースがこれらだけだからです(皆様の場合は異なるでしょう)。

そこで、RestoreStops()関数に1行の修正を加えました。

SuspendStops()関数については修正の必要はありませんでした。

状況を見る限り、Part3については何も変更する必要はなさそうです。必要なのは、チケット番号、SL、TPだけだからです。

@Solomon Anietie Sundayさん、どうもありがとうございました。

デモ口座で実際にテストしてみます!

// I won't need this if statement, in the 2nd EA, as the 2nd EA only modifies trades, 
// only need this is statement in the first EA (that opens trades)

if(!CanOpenNewTrade(_Symbol))
    return;
 
//+------------------------------------------------------------------+
//| ニュース終了後の放送再開(元の記事に基づいて編集)      |
//+------------------------------------------------------------------+
bool RestoreStops(ulong ticket, double sl, double tp)
{
    if (!PositionSelectByTicket(ticket))
      return(false);
    string   symbol= PositionGetString(POSITION_SYMBOL);  // 元の変数「_Symbol」を「symbol」に置き換えた
    ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
    double price = (type == POSITION_TYPE_BUY) ?
        SymbolInfoDouble(symbol, SYMBOL_BID) :  //例:「_Symbol」は現在「symbol」となっています
        SymbolInfoDouble(symbol, SYMBOL_ASK);
        
    double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
    
    double minStopDist = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL) * point;

    // 安全確認:価格が保存済みのSL/TPを超えた場合は、有効な水準に調整する
    if(type == POSITION_TYPE_BUY)
    {
        if(sl != 0 && price <= sl)
            sl = price - minStopDist;
        if(tp != 0 && price >= tp)
            tp = price + minStopDist;
    }
    else // 売り
    {
        if(sl != 0 && price >= sl)
            sl = price + minStopDist;
        if(tp != 0 && price <= tp)
            tp = price - minStopDist;
    }

    // ストップの完全復元 
    if(trade.PositionModify(ticket, sl, tp))
    {
        PrintFormat("Restored SL/TP for #%I64u | SL=%.5f, TP=%.5f", ticket, sl, tp);
        return true;
    }
    else
    {
        PrintFormat("Failed to restore SL/TP for #%I64u | Error=%d", ticket, GetLastError());
        return false;
    }
}
Discussing the article: "Using the MQL5 Economic Calendar for News Filtering (Part 1): Implementing Pre- and Post-News Windows in MQL5"
Discussing the article: "Using the MQL5 Economic Calendar for News Filtering (Part 1): Implementing Pre- and Post-News Windows in MQL5"
  • 2026.02.18
  • www.mql5.com
Check out the new article: Using the MQL5 Economic Calendar for News Filtering (Part 1): Implementing Pre- and Post-News Windows in MQL5...
 
はい!、それは非常に効果的なアプローチですね。マジックナンバーを使って特定のEAをブロックすることも可能です。しかし、取引している主要な3つの銘柄、特にボラティリティが最も高い銘柄に焦点を当てることは、ポートフォリオ全体を守るための強力な手段となります。
本記事シリーズで紹介する手法は、適切に実施すれば、非常に柔軟でカスタマイズ性の高いものになります。
テストは過去のデータ(バックテスト)で行うこともできますが、これはやや難しく、ある程度の作業を要します。ニュースイベントを用いたバックテストを行いたい方のために、今後の記事でその方法を紹介できるよう努めます。

どういたしまして、フィリップさん。アルゴリズム取引 に関する話題があれば、いつでもご相談ください。

返信が少し遅くなってしまいました。時々忙しくなってしまうので…すみません。