系统交易 게시글

MT4自动交易系统中的Trailing Stop – 提高盈利的交易策略

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


Trailing Stop是一个强大的工具,它通过将止损移至盈利区来支持我们的交易,从而使我们能够自动保护我们的交易。

在这篇文章中,我们将介绍如何在MetaTrader 4 (MT4)平台上设置Trailing Stop,并用代码示例来说明如何实现这一功能。

首先,我们需要定义输入的Trailing Stop参数:

input    bool     isTrailingStop = true;  // 启用Trailing Stop
input    int      trailingStart  = 15;    // Trailing开始(点数)
input    int      trailingStep   = 5;     // Trailing步长(点数)

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);
  }


每当该EA所配对的图表上发生价格变动(tick)时,OnTick()函数将被执行。在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应用程序来支持我们的工作,使您的交易更加盈利

https://play.google.com/store/apps/details?id=com.autobotfx.signalforex



    연관 포스트

    댓글 (0)