论坛全局菜单下方 - TICKMILL 285X70论坛全局菜单下方 - ThinkMarkets285X70论坛全局菜单下方 - 荔枝返现285X70论坛全局菜单下方 -  icmarkets285X70
查看:46回复:0
迪迪七六九
注册时间2022-07-03
[欧元]受论坛会友黑哥启发,写了个MT5的风控EA
楼主发表于:2025-05-06 07:33只看该作者倒序浏览
1楼 电梯直达
电梯直达

代码如下:


//+------------------------------------------------------------------+

//|                                                   RiskControlEA.mq5 |

//|              交易风险控制系统(MT5 EA)                             |

//+------------------------------------------------------------------+

#include <Trade\Trade.mqh>

#include <Trade\PositionInfo.mqh>

#include <Trade\SymbolInfo.mqh>


CTrade trade;


// 输入参数

input string InpTradeSymbol             = "EURUSD";    // 交易品种

input double InpMaxTotalVolume          = 10.0;         // 最大总持仓(手数)

input double InpMaxDailyLossPercent     = 2.0;          // 最大单日亏损比例(%)

input double InpProfitTargetPercent     = 1.0;          // 持仓浮盈目标比例(%)

input bool   InpDisableNewAfterLoss     = true;         // 单日亏损触发后禁止新仓

input bool   InpDisableNewAfterProfit   = false;        // 达到盈利目标后禁止新仓


// 全局变量

datetime g_lastDay        = 0;   // 当日零点时间戳

double   g_startingEquity = 0.0; // 当日开盘时的账户净值

bool     g_tradingDisabled = false; // 是否禁止新开仓


//+------------------------------------------------------------------+

//| EA 初始化                                                      |

//+------------------------------------------------------------------+

int OnInit()

{

  // 记录初始交易日(零点)和净值

  g_lastDay        = TimeCurrent() - TimeCurrent() % 86400;

  g_startingEquity = AccountInfoDouble(ACCOUNT_EQUITY);

  g_tradingDisabled = false;

  return(INIT_SUCCEEDED);

}


//+------------------------------------------------------------------+

//| EA 每个Tick调用                                                  |

//+------------------------------------------------------------------+

void OnTick()

{

  // 日切检查:服务器时间零点对比

  datetime todayMid = TimeCurrent() - TimeCurrent() % 86400;

  if(todayMid != g_lastDay)

  {

     g_lastDay        = todayMid;

     g_startingEquity = AccountInfoDouble(ACCOUNT_EQUITY);

     g_tradingDisabled = false;

  }


  // 风控流程

  CloseDifferentSymbols();     // 非指定品种平仓

  CheckMaxTotalVolume();       // 超过总持仓量平仓

  CheckDailyLoss();            // 单日亏损超限平仓并禁新仓(可选)

  CheckProfitTarget();         // 持仓浮盈达到目标自动平仓(可选)


  // 禁止新开仓时直接返回

  if(g_tradingDisabled)

     return;


  // TODO: 添加具体交易逻辑(开仓条件)

}


//+------------------------------------------------------------------+

//| 平仓所有非指定品种的持仓                                       |

//+------------------------------------------------------------------+

void CloseDifferentSymbols()

{

  for(int i = PositionsTotal() - 1; i >= 0; --i)

  {

     ulong ticket = PositionGetTicket(i);

     if(ticket == 0) continue;

     if(!PositionSelectByTicket(ticket)) continue;

     if(PositionGetString(POSITION_SYMBOL) != InpTradeSymbol)

        trade.PositionClose(ticket);

  }

}


//+------------------------------------------------------------------+

//| 检查并平仓:当总持仓量超过设定值                             |

//+------------------------------------------------------------------+

void CheckMaxTotalVolume()

{

  double totalVolume = 0.0;

  for(int i = 0; i < PositionsTotal(); ++i)

  {

     ulong ticket = PositionGetTicket(i);

     if(ticket == 0) continue;

     if(!PositionSelectByTicket(ticket)) continue;

     totalVolume += PositionGetDouble(POSITION_VOLUME);

  }

  if(totalVolume > InpMaxTotalVolume)

     CloseAllPositions();

}


//+------------------------------------------------------------------+

//| 检查并平仓:当单日亏损比例超过设定值                           |

//+------------------------------------------------------------------+

void CheckDailyLoss()

{

  double currentEquity = AccountInfoDouble(ACCOUNT_EQUITY);

  double lossPercent = (g_startingEquity - currentEquity) / g_startingEquity * 100.0;

  if(lossPercent >= InpMaxDailyLossPercent)

  {

     CloseAllPositions();

     if(InpDisableNewAfterLoss)

        g_tradingDisabled = true;

  }

}


//+------------------------------------------------------------------+

//| 检查并平仓:当持仓浮盈达到目标比例                             |

//+------------------------------------------------------------------+

void CheckProfitTarget()

{

  for(int i = PositionsTotal() - 1; i >= 0; --i)

  {

     ulong ticket = PositionGetTicket(i);

     if(ticket == 0) continue;

     if(!PositionSelectByTicket(ticket)) continue;

     // 仅处理指定品种

     if(PositionGetString(POSITION_SYMBOL) != InpTradeSymbol) continue;


     // 获取开仓价和当前价

     double openPrice    = PositionGetDouble(POSITION_PRICE_OPEN);

     double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);

     long   type         = PositionGetInteger(POSITION_TYPE);


     // 计算盈亏百分比

     double profitPct = ((type == POSITION_TYPE_BUY)

                          ? (currentPrice - openPrice)

                          : (openPrice - currentPrice))

                        / openPrice * 100.0;


     // 达到盈利目标时平仓

     if(profitPct >= InpProfitTargetPercent)

     {

        if(!trade.PositionClose(ticket))

           PrintFormat("[Error] 平仓失败,Ticket=%I64u, ProfitPct=%.2f%%, Error=%d", ticket, profitPct, GetLastError());

        // 触发后可选是否禁仓

        if(InpDisableNewAfterProfit)

           g_tradingDisabled = true;

     }

  }

}


//+------------------------------------------------------------------+

//| 平仓所有持仓                                                   |

//+------------------------------------------------------------------+

void CloseAllPositions()

{

  for(int i = PositionsTotal() - 1; i >= 0; --i)

  {

     ulong ticket = PositionGetTicket(i);

     if(ticket == 0) continue;

     trade.PositionClose(ticket);

  }

}


//+------------------------------------------------------------------+

TK29帖子1楼右侧xm竖版广告90-240
个性签名

韬客社区www.talkfx.co

广告
TK30+TK31帖子一樓廣告
TK30+TK31帖子一樓廣告

本站免责声明:

1、本站所有广告及宣传信息均与韬客无关,如需投资请依法自行决定是否投资、斟酌资金安全及交易亏损风险;

2、韬客是独立的、仅为投资者提供交流的平台,网友发布信息不代表韬客的观点与意思表示,所有因网友发布的信息而造成的任何法律后果、风险与责任,均与韬客无关;

3、金融交易存在极高法律风险,未必适合所有投资者,请不要轻信任何高额投资收益的诱导而贸然投资;投资保证金交易导致的损失可能超过您投入的资金和预期。请您考虑自身的投资经验及风险承担能力,进行合法、理性投资;

4、所有投资者的交易帐户应仅限本人使用,不应交由第三方操作,对于任何接受第三方喊单、操盘、理财等操作的投资和交易,由此导致的任何风险、亏损及责任由投资者个人自行承担;

5、韬客不隶属于任何券商平台,亦不受任何第三方控制,韬客不邀约客户投资任何保证金交易,不接触亦不涉及投资者的任何资金及账户信息,不代理任何交易操盘行为,不向客户推荐任何券商平台,亦不存在其他任何推荐行为。投资者应自行选择券商平台,券商平台的任何行为均与韬客无关。投资者注册及使用韬客即表示其接受和认可上述声明,并自行承担法律风险。

版权所有:韬客外汇论坛 www.talkfx.com 联络我们:[email protected]