このコードは、ストップロスを使用する場合も、使用しない場合も機能します。
必要な条件
- ポジションや注文を扱うための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"を使用してトレーリングストップを修正します } } }
} }