ホーム システムトレード 投稿

現在の市場価格に基づくトレーリングストップのコードブロック - MetaTrader 5用

添付ファイル
49021.zip (1.31 KB, ダウンロード 0回)

このコードは、ストップロスを使用する場合も、使用しない場合も機能します。


必要な条件

  • ポジションや注文を扱うためのCTradeクラスにアクセスするために、"Trade.mqh"を含める必要があります。
#include <Trade\Trade.mqh> // <<------------------------------------------ この"Trade.mqh"を含めてCTradeクラスにアクセスします
  • トレーリング距離を調整するための入力パラメータを設定する必要があります。これは必須ではありませんが、便利です。
input double Traling_Step = 3.0;
  • CTradeクラスのインスタンスを定義する必要があります。名前は任意ですが、OnInitイベントハンドラの後に定義するのが良いでしょう。

  • 次に、現在実行中のポジションがあるかどうかを確認するためのif文を作成する必要があります。この文は、Check_TrailingStop();関数を毎ティックごとに呼び出します。これは、EAがスムーズかつシャープにトレイルするために重要です。この文をOnTickイベントハンドラの最上部に配置することを忘れないでください。
//+------------------------------------------------------------------+
//| エキスパート初期化関数                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- タイマーを作成
   EventSetTimer(60);

//---
   return(INIT_SUCCEEDED);
  }


CTrade trade; // <<------------------------------------------ "CTrade"クラスを宣言します。名前は任意です
void OnTick()
  {
   
   if(PositionsTotal() > 0) // 実行中のポジションがあれば、毎ティックでトレーリングストップ関数を呼び出します。
     {
      Check_TralingStop(); 
     } 
     
       
  }

  • カスタム関数として、Check_TrailingStop();(この場合を宣言する必要があります。任意の名前を使用できます。
  • カスタム関数は、すべてのオープンポジションをループして、指定した距離でトレイルします。
void Check_TralingStop()
  {
   int totalPositions = PositionsTotal();
   for(int count =0; count < totalPositions; count++)
     {
      ulong TicketNo = PositionGetTicket(count); // インデックスを使用してポジションのチケット番号を取得します。

      if(PositionSelectByTicket(TicketNo)) // チケット番号を使用してポジションを選択します(すでにチケット番号を取得しています)
        {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) // ポジションの種類をチェックします。
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);       // <<-------------------現在のストップロスを取得
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(bidPrice - (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // ストップロスが設定されていない場合。
              {
               if(bidPrice > openPrice && trailingLevel > openPrice) // 各ポジションで一度のみ実行。最初のSLを設定します。

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"を使用してトレーリングストップを修正します
              }


            if(bidPrice > openPrice && trailingLevel > stopLoss) // トレーリングレベルが前のレベルを上回っているか確認します。
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"を使用してトレーリングストップを修正します
              }

           }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
           {
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            double stopLoss  = PositionGetDouble(POSITION_SL);
            double takeProfit = PositionGetDouble(POSITION_TP);
            double bidPrice  = SymbolInfoDouble(_Symbol,SYMBOL_BID);
            double askPrice  = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            ulong ticket = PositionGetTicket(count);
            double trailingLevel = NormalizeDouble(askPrice + (Traling_Step * Point()),_Digits);

            if(stopLoss < openPrice) // ストップロスが設定されていない場合。
              {
               if(askPrice < openPrice && trailingLevel < openPrice) // 各ポジションで一度のみ実行。最初のSLを設定します。

                  trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"を使用してトレーリングストップを修正します
              }

            if(askPrice < openPrice && trailingLevel < stopLoss) // トレーリングレベルが前のレベルを上回っているか確認します。
              {
               trade.PositionModify(ticket,trailingLevel,takeProfit); // "CTrade.trade"を使用してトレーリングストップを修正します
              }
         }
      }
    }   }


関連記事

コメント (0)