用ai做个一个EA ,一直不开单,请教大神上面原因

 
用ai做个一个EA  ,一直不开单,请教大神上面原因
附加的文件:
 
ll27277:
用ai做个一个EA  ,一直不开单,请教大神上面原因

朋友您好,大部分程序员看不上AI写的,也不太喜欢使用自己的时间去更正AI的错误。

您可以在自由职业者里请求基础Review,也可以在自由职业者中直接提出需求。

 
时间改成0:01-23:59试试
 

我也在研究这一块,但是AI的错误太多了

 
YiFengLiu #:

我也在研究这一块,但是AI的错误太多了

这个需要自己会看懂代码
 
ll27277:
用ai做个一个EA  ,一直不开单,请教大神上面原因

我刚刚用ai完成一个。现在在跑着呢,正常开单。我建议你要一步一步排查。你的开不了单是挂上了没有开单还是挂不上开不了单。里面有很多细节的。

 
XiaoMing Bao #:

我刚刚用ai完成一个。现在在跑着呢,正常开单。我建议你要一步一步排查。你的开不了单是挂上了没有开单还是挂不上开不了单。里面有很多细节的。

有盈利吗,跑什么产品

 
我帮你改了一下 你自己再试试
附加的文件:
11111.mq4  31 kb
 
好用吗
 
ll27277:
用ai做个一个EA  ,一直不开单,请教大神上面原因

我问了一下Gemini 这是他的回答,你自己照着改吧.我自用的是MT5,所以你这个我没法回测.不过我自己用gemini 做饿了5个EA,目前实盘都还可以.用AI做EA就是要不停打磨.

----------------------------------------------

这段代码逻辑清晰、结构完整,但在实际运行中(特别是在黄金 XAUUSD 上),它极有可能因为几个硬伤型逻辑错误过于苛刻的条件导致完全无法开单。

我为你把主要原因揪出来了,按严重程度和排查顺序整理如下:

核心致命错误(必须修改代码)

1. 止损点数过小导致开仓被服务器拒绝 (严重)

  • 代码缺陷:你设置的默认参数为 StopLossPoints = 5 (5个点), TakeProfitPoints = 10 (10个点)。

  • 原因分析:在 MT4/MT5 中,黄金(XAUUSD)通常是 2 位或 3 位小数。这意味着 Point 是 0.01 或 0.001。

    • 如果是 2 位小数(例如 2300.50),5 个点代表 0.05 美金的波动。

    • 如果是 3 位小数(例如 2300.500),5 个点代表 0.005 美金的波动。

  • 后果:绝大多数交易商的黄金最小止损距离(Stops Level)都远大于这个值(通常至少要求几百点,即几美金)。当 EA 带着 5 个点的止损去发单时,平台服务器会直接报错 ERR_INVALID_STOPS (错误代码 130),导致完全无法开仓。

  • 解决办法:大幅调高止损止盈点数。如果是 2 位平台,止损 3 美金应该写 300 ;如果是 3 位平台,应该写 3000 。

2. 北京时间与服务器时间跨天逻辑混淆 (严重)

  • 代码缺陷:在 IsTradeAllowedNow() 函数中,你将服务器时间转换为了北京时间:

    代码段

    datetime beijingTime = serverTime + (BeijingGMTDiff - ServerGMTDiff) * 3600;

    然后用这个 beijingTime 的小时和分钟去匹配 TradeStartTime ("00:00")和 TradeEndTime ("24:00")。

  • 原因分析:由于时差原因,北京时间过了半夜 12 点(00:00)时,外汇服务器时间可能还在前一天的下午或晚上。此时,MT4 内置的 iClose() 、 iOpen() 等函数获取的是服务器当前交易日的 K 线。用跨了天的北京时间去匹配服务器的 K 线时间轴,会导致时间判定紊乱。

  • 后果:时间过滤条件容易产生逻辑死锁,让 EA 误以为当前处于非交易时段,直接在第一关被 return false 。

  • 解决办法:强烈建议直接使用服务器时间进行过滤,不要在 EA 内部做北京时间转换。把输入参数改成服务器时间(例如 00:00 到 23:59)。

策略逻辑过于苛刻(导致信号极少)

3. 多重指标共振导致“完美风暴”难出现

在 GetEntrySignal() 中,你的开单条件是一个极度严苛的串联电路:

  1. 实体过滤:前一根 K 线的实体必须大于过去 5 根 K 线平均实体的 0.8 倍。

  2. 趋势过滤:多单要求价格同时大于 EMA12 和 EMA26。

  3. 动量过滤(以 RSI 为例):必须恰好在前一根 K 线从超卖区(<30)勾头穿上来( rsi2 <= 30 && rsi1 > 30 )。

为什么这很难触发?

黄金波动剧烈。当黄金价格处于 EMA26 之上(强多头趋势)时,它的 RSI 很难跌到 30 以下的超卖区。RSI 能跌到 30 以下,通常意味着价格已经跌破了 EMA 均线。

  • 多单矛盾:要求价格在均线上方(多头),同时要求 RSI 跌入超卖再拐头(空头回调)。这两者在同一根 K 线上同时发生的概率极低。

  • 同理布林带:要求价格在均线上方,同时要求前一根 K 线在中轨下方、当前 K 线突破中轨。这也是一个非常短暂的窄窗口。

4. 移动止损参数(TrailingStart = 3)过小

虽然这不影响第一次开单,但即便开单了,3 个点(0.03美金)的利润空间在黄金上连点差都不够。只要价格稍微跳动,就会立刻触发 ManageExistingOrders 里的平仓,导致秒开秒平。

如何排查与修正?

既然你的代码开启了调试模式( DebugMode = true ),请打开 MT4 的“专家”(Experts)日志或者回测中的“日志”标签页:

  1. 如果日志里什么提示都没有:

    • 说明程序卡在 IsTradeAllowedNow() 。请检查点差是否超过了 MaxSpread(30) (注:黄金 30 个点差通常指 0.3 美金,很多平台黄金点差在 30-50 左右,如果是 50 就会导致由于点差大而不开单)。

    • 或者是时间转换逻辑把交易时间锁死了。

  2. 如果日志里频繁出现 "信号: 实体不足..." 或 "买入条件未满足..." :

    • 说明时间合规,但策略的指标组合太苛刻。你可以把 EMA_Short 和 EMA_Long 先设为相同值,或者把 RSI 阈值放宽(例如 40/60),观察是否有信号输出。

  3. 如果日志里出现 "开仓失败, 错误: 130" :

    • 100% 是止损距离太近,请把 StopLossPoints 改为 300 或更大再试。

 
因为你这个条件太苛刻了,大部分情况都不满足!