首页 系统交易 帖子

如何在账户回撤达到特定百分比时自动平仓 - MetaTrader 4 交易系统

附件
14582.zip (2.27 KB, 下载 2次)

大家好,今天我们来聊聊一个非常实用的功能:如何在账户回撤达到特定百分比时自动平仓。这段代码可以帮助你在回撤超出预设值时,自动关闭所有打开的订单,保护你的资金安全。

使用这个功能非常简单,只需输入订单的魔术数字(如果想控制所有订单,可以输入0),以及你希望设定的最大回撤百分比。一旦达到这个百分比,代码就会自动执行平仓操作。

要使用这个代码,你只需调用函数 DD_close 即可。

下面是包含此代码的头文件和EA的示例。

// 要使用这个选项,只需调用函数 : ( DD_close ) 
//+------------------------------------------------------------------+
//|                          全局作用域                            |
//+------------------------------------------------------------------+
bool Close_All_V;
//+------------------------------------------------------------------+
//|                         主函数                            |
//+------------------------------------------------------------------+
// DD:               这里是回撤百分比,100表示永远不平仓。
// Magic_Number:     你的EA魔术数字,输入0以控制所有订单。
void DD_close(int DD,int Magic_Number)
  {
   if(DD(Magic_Number)>=DD)
      Close_All_V=true;
   if(Close_All_V)
      Close_All(Magic_Number);
  }
//+------------------------------------------------------------------+
//|                          检查平仓                             |
//+------------------------------------------------------------------+
void Check_Close(int Check_Number) // 检查平仓状态
  {
   if(Check_Number<0) Print("平仓失败,错误信息: ",ErrorDescription(GetLastError()));
   else Close_All_V=false;
  }
//+------------------------------------------------------------------+
//|                          平仓所有订单                               |
//+------------------------------------------------------------------+
void Close_All(int M_N)
  {
   int Loop=0;
   for(int i=0; Loop<OrdersTotal(); i++)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       Loop++;
       if(OrderSymbol()==Symbol())
        if(OrderMagicNumber()==M_N || OrderMagicNumber()==0)
          {
           if(OrderType()==OP_BUY)
              Check_Close(OrderClose(OrderTicket(),OrderLots(),Bid,100,clrNONE));
           if(OrderType()==OP_SELL)
              Check_Close(OrderClose(OrderTicket(),OrderLots(),Ask,100,clrNONE));
          }
      }
  }
//+------------------------------------------------------------------+
//|                          计算损失                          |
//+------------------------------------------------------------------+
double Loss(int M_N)
  {
   double re=0;
   int Loop=0;
   for(int i=0; Loop<OrdersTotal(); i++)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         Loop++;
         if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()==M_N || OrderMagicNumber()==0)
               re=re+OrderProfit();
        }
   return re * -1;
  }
//+------------------------------------------------------------------+
//|                  计算回撤百分比                   |
//+------------------------------------------------------------------+
double DD(int M_N)
  {
   return ( 100 / AccountBalance ( ) ) * Loss ( M_N );
  }
//+------------------------------------------------------------------+

相关帖子

评论 (0)