花啥钱呢,MT5的代码如下:
//+------------------------------------------------------------------+
//| 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);
}
}
//+------------------------------------------------------------------+