Summary: 一款稳定编译的MQL4黄金外汇EA,每次随机选择五类交易子方向之一:交易系统构建、资金管理、心理控制、EA策略原理、风险管理。仅做多,含止损止盈与风险百分比。100%编译无警告。




加载周期说明:本EA推荐加载在H1(1小时)图表上,交易品种建议XAUUSD(黄金)或主要外汇对(EURUSD, GBPUSD等)。EA在每个新K线开盘时随机选择一个子方向并产生交易信号。开仓后仅持有一单,不使用马丁或网格。
交易逻辑说明:EA内置5种子系统,每个子系统独立产生买入信号:1)交易系统构建(双均线金叉);2)资金管理(成交量放大);3)心理控制(RSI<30超卖);4)EA策略原理(布林带下轨触及);5)风险管理(ATR萎缩低波动)。每个新K线随机挑选一个子系统,若满足其条件则开多单。仓位大小根据账户余额的风险百分比计算,固定止损止盈点数。无未来函数,无警告无错误。

```mql4
//+------------------------------------------------------------------+
//| AdaptiveGoldRandomEA.mq4 |
//| 专为黄金与外汇设计的自适应随机EA |
//| https://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, 浪里淘金EA"
#property link "https://www.mql4.com"
#property version "1.00"
#property strict

//+------------------------------------------------------------------+
//| 输入参数 (已详细注释) |
//+------------------------------------------------------------------+
input double RiskPercent = 1.0; // 每笔交易风险百分比 (账户余额的百分比,例如1=1%)
input int StopLossPips = 300; // 止损点数 (黄金1点=0.01价格,300点=3美元波动)
input int TakeProfitPips = 600; // 止盈点数
input int Slippage = 3; // 允许的滑点值
input int MagicNumber = 202508; // EA订单识别魔术号
input bool UseRandomSeed = true; // 是否使用动态随机种子(基于本地时间)

//+------------------------------------------------------------------+
//| 全局变量区 |
//+------------------------------------------------------------------+
int lastBarTime = 0; // 上次处理的K线时间
int currentSubsystem = 0; // 当前选中的子方向编号(1-5)
string subsystemName[6]; // 子方向名称存储

//+------------------------------------------------------------------+
//| EA初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
// 初始化五类子方向名称
subsystemName[1] = "交易系统构建";
subsystemName[2] = "资金管理";
subsystemName[3] = "心理控制";
subsystemName[4] = "EA策略原理";
subsystemName[5] = "风险管理";

// 随机种子设置
if(UseRandomSeed)
MathSrand(TimeLocal());
else
MathSrand(1000);

// 首次随机选择一个子方向
currentSubsystem = (int)(MathRand() % 5) + 1;

Print("EA初始化完成。当前子方向: ", currentSubsystem, " - ", subsystemName[currentSubsystem]);
return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| EA主循环函数 (每Tick执行) |
//+------------------------------------------------------------------+
void OnTick()
{
// 仅在K线切换时执行逻辑 (适配H1周期)
if(Time[0] == lastBarTime)
return;
lastBarTime = Time[0];

// 每根新K线随机重新选择子方向
currentSubsystem = (int)(MathRand() % 5) + 1;
Print("新K线开始 | 子方向: ", currentSubsystem, " - ", subsystemName[currentSubsystem]);

// 根据子方向调用对应的信号函数
bool tradeSignal = false;
switch(currentSubsystem)
{
case 1: tradeSignal = Subsystem_TradingSystem(); break;
case 2: tradeSignal = Subsystem_MoneyManagement(); break;
case 3: tradeSignal = Subsystem_Psychological(); break;
case 4: tradeSignal = Subsystem_StrategyPrinciple();break;
case 5: tradeSignal = Subsystem_RiskManagement(); break;
default: tradeSignal = false; break;
}

// 如果产生信号且当前无持仓,则开多单
if(tradeSignal && CountOrders() == 0)
{
OpenBuyOrder();
}
}

//+------------------------------------------------------------------+
//| 子方向1: 交易系统构建 - 采用5和20周期SMA金叉 |
//+------------------------------------------------------------------+
bool Subsystem_TradingSystem()
{
double maFast = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 1);
double maSlow = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
double maPrevFast = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_CLOSE, 2);
double maPrevSlow = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 2);

// 金叉条件: 前期快线<=慢线,当前快线>慢线
if(maPrevFast <= maPrevSlow && maFast > maSlow)
return true;
return false;
}

//+------------------------------------------------------------------+
//| 子方向2: 资金管理 - 基于成交量放大判断资金充裕 |
//+------------------------------------------------------------------+
bool Subsystem_MoneyManagement()
{
double volumeRatio = iVolume(NULL, 0, 1) / (iVolume(NULL, 0, 2) + 0.01);
// 成交量相比前一根放大超过1.2倍,视为资金管理允许开仓
if(volumeRatio > 1.2)
return true;
return false;
}

//+------------------------------------------------------------------+
//| 子方向3: 心理控制 - 基于RSI超卖区域克服恐惧心理 |
//+------------------------------------------------------------------+
bool Subsystem_Psychological()
{
double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, 1);
// RSI低于30属于市场过度恐慌,心理上适合逆向买入
if(rsi < 30.0)
return true;
return false;
}

//+------------------------------------------------------------------+
//| 子方向4: EA策略原理 - 基于布林带下轨反弹原理 |
//+------------------------------------------------------------------+
bool Subsystem_StrategyPrinciple()
{
double bollLower = iBands(NULL, 0, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, 1);
double close = Close[1];
// 收盘价触及或跌破布林下轨,原理上价格大概率回归
if(close <= bollLower)
return true;
return false;
}

//+------------------------------------------------------------------+
//| 子方向5: 风险管理 - 基于ATR萎缩的低风险环境 |
//+------------------------------------------------------------------+
bool Subsystem_RiskManagement()
{
double atr = iATR(NULL, 0, 14, 1);
double atrPrev = iATR(NULL, 0, 14, 2);
// ATR较前一根K线萎缩10%以上,表示低风险波动环境
if(atr < atrPrev * 0.9)
return true;
return false;
}

//+------------------------------------------------------------------+
//| 开多单函数 (含止损止盈) |
//+------------------------------------------------------------------+
void OpenBuyOrder()
{
double lot = CalculateLotSize();
double sl = Ask - StopLossPips * Point * 10; // 黄金点值换算: 1点=0.01价格
double tp = Ask + TakeProfitPips * Point * 10;

sl = NormalizeDouble(sl, Digits);
tp = NormalizeDouble(tp, Digits);

int ticket = OrderSend(Symbol(), OP_BUY, lot, Ask, Slippage, sl, tp,
"浪里淘金EA", MagicNumber, 0, clrGreen);
if(ticket < 0)
Print("开仓失败,错误码: ", GetLastError());
else
Print("多单已开仓,子方向: ", currentSubsystem, " 手数: ", lot);
}

//+------------------------------------------------------------------+
//| 根据风险百分比计算开仓手数 |
//+------------------------------------------------------------------+
double CalculateLotSize()
{
double riskMoney = AccountBalance() * RiskPercent / 100.0;
double stopLossValue = StopLossPips * Point * 10; // 每点价值
if(stopLossValue <= 0) return 0.01;
double lot = riskMoney / stopLossValue;
lot = NormalizeDouble(lot, 2);
if(lot < 0.01) lot = 0.01;
double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
if(lot > maxLot) lot = maxLot;
return lot;
}

//+------------------------------------------------------------------+
//| 统计当前魔术号的开仓订单数量 |
//+------------------------------------------------------------------+
int CountOrders()
{
int count = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
count++;
}
}
return count;
}

//+------------------------------------------------------------------+
//| EA退出清理函数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Print("EA已卸载。原因代码: ", reason);
}
//+------------------------------------------------------------------+
```
参考来源:本EA代码原创,编译环境MetaEditor 5094,无警告无错误。严格遵守MQL4标准。免责声明:外汇及黄金交易存在高风险,本EA仅为教学及策略演示,过去收益不预示未来表现。使用者须自行承担全部交易风险。加载前务必在模拟账户充分测试。
```