システムトレード 게시글

MetaTrader 4でのトレーリングストップの設定方法 - マジックナンバーを使った自動売買

첨부파일
34177.zip (1.19 KB, 다운로드 0회)

トレーリングストップは、利益を確保するためにストップロスを自動的に移動させることで、私たちの取引を大いにサポートしてくれます。これにより、常に利益エリアを保持しつつ、相場の動きに追従できます。

では、まず入力パラメータを設定するところから始めましょう。

input    bool     isTrailingStop = true;  // トレーリングストップを有効にする
input    int      trailingStart  = 15;    // トレーリング開始(pips)
input    int      trailingStep   = 5;     // トレーリングステップ(pips)

input    int      MagicNumber = 0;        // マジックナンバー

次に、グローバル変数を設定します。

// グローバル変数
double   myPoint    = 0.0;

このEAを実行すると、最初にOnInit()関数が実行され、ここで入力パラメータの検証と初期化が行われます。

int OnInit()
  {
  
   if (isTrailingStop && trailingStart <= 0){
      Alert ("パラメータが不正です");
      return(INIT_PARAMETERS_INCORRECT);
   }
   
   myPoint     = GetPipPoint(Symbol());
   
   return(INIT_SUCCEEDED);
  }

価格が動くたびに、OnTick()関数が実行され、その中でsetTrailingStop()関数が呼び出されます。

void OnTick()
  {
//---
   setTrailingStop(MagicNumber);
   
  }

setTrailingStop()関数の詳細は以下の通りです。

void setTrailingStop(int magicNumber=0){
   if (isTrailingStop==false) return;
   
   int      tOrder = 0;
   string   pair = "";
   double   sl = 0.0, tp = 0.0;
   
   pair = Symbol();
   
   tOrder = OrdersTotal();
   for (int i=tOrder-1; i>=0; i--){
      bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber() == magicNumber && StringFind(OrderSymbol(), pair, 0) == 0 ){
         if (OrderType() == OP_BUY){
            if ( (Bid - (trailingStart * myPoint)) >= OrderOpenPrice()
                  && (Bid - ((trailingStart+trailingStep) * myPoint) >= OrderStopLoss() )
                ){
               sl = NormalizeDouble(Bid - (trailingStart * myPoint), Digits());
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                  Print ("#", OrderTicket(), " SLの更新に失敗しました");
               }
            }
         }
         if (OrderType() == OP_SELL){
            if ( (Ask + (trailingStart * myPoint)) <= OrderOpenPrice()
                  && ( (Ask + ((trailingStart+trailingStep) * myPoint) <= OrderStopLoss() ) || OrderStopLoss() == 0.0)
               ){
               sl = NormalizeDouble(Ask + (trailingStart * myPoint), Digits() );
               if (!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, clrBlue)){
                  Print ("#", OrderTicket(), " SLの更新に失敗しました");
               }
            }
      } // マジックナンバーの処理終了
   }// ループ終了
}

他に必要な標準関数としては、GetPipPoint()があります。

// GetPipPoint関数
double GetPipPoint(string pair)
{
   double point= 0.0;
   int digits = (int) MarketInfo(pair, MODE_DIGITS);
   if(digits == 2 || digits== 3) point= 0.01;
   else if(digits== 4 || digits== 5) point= 0.0001;
   return(point);
}

何か質問があれば、コメント欄に残すか、私たちのグループに参加してください。t.me/codeMQLで共有しています。

また、SignalForexアプリも提供しています。こちらをダウンロードして、より利益を上げるために活用してください。

SignalForexアプリのダウンロード


연관 포스트

댓글 (0)