#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
// 趋势判断参数
input int MainTrendPeriod = 50; // 主趋势判断周期(EMA)
input int TrendFilterPeriod = 20; // 趋势过滤周期(SMA)
// 加仓参数
input double InitialLot = 0.1; // 初始手数
input double AddMultiplier = 1.5; // 加仓乘数
input int MaxAdditions = 3; // 最大加仓次数
input double RetracementLevel = 0.01; // 回撤比例(1% = 0.01)
// 止损止盈参数
input int InitialSL = 80; // 初始止损(点)
input int TakeProfit = 150; // 止盈(点)
input int HedgeSL = 50; // 对冲止损(点)
input int HedgeTP = 80; // 对冲止盈(点)
// 风险控制
input double MaxRiskPercent = 2.0; // 最大风险百分比
input int HedgeTriggerLevel = 30; // 趋势逆转触发点数
// 内部变量
int trendDirection = 0; // 主趋势方向(1=多头, -1=空头, 0=无趋势)
int addCounter = 0; // 加仓计数
double lastEntryPrice = 0; // 最后入场价格
bool isHedging = false; // 是否处于对冲状态
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 参数检查
if(InitialLot <= 0 || AddMultiplier <= 1 || MaxAdditions <= 0)
{
Print("无效的加仓参数设置");
return(INIT_PARAMETERS_INCORRECT);
}
if(MaxRiskPercent <= 0 || MaxRiskPercent > 10)
{
Print("最大风险百分比必须在0-10之间");
return(INIT_PARAMETERS_INCORRECT);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 清理代码
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 确定当前主趋势
DetermineMainTrend();
// 检查是否需要对冲
if(CheckTrendReversal() && !isHedging)
{
StartHedging();
return;
}
// 如果处于对冲状态,只管理现有持仓
if(isHedging)
{
ManageHedgingPositions();
return;
}
// 没有持仓且有明确趋势,开初始仓
if(PositionsTotal() == 0 && trendDirection != 0)
{
OpenInitialPosition();
addCounter = 0;
}
// 有持仓,检查是否可以加仓
else if(PositionsTotal() > 0 && trendDirection != 0)
{
CheckAndAddPosition();
ManageTrendPositions();
}
}
//+------------------------------------------------------------------+
//| 确定主趋势方向 |
//+------------------------------------------------------------------+
|