一个错误,一个警告
MT5脚本,
单子如果盈利了,但是没有设置止损,双击一下脚本,把止损自动设置在入场价位处,也就是拉平保。
//+------------------------------------------------------------------+
//| 简化版盈亏平衡止损脚本 |
//+------------------------------------------------------------------+
void OnStart()
{
for(int i = PositionsTotal()-1; i>=0; i--)
{
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket))
{
double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
double currentSL = PositionGetDouble(POSITION_SL);
// 如果当前有盈利且止损未设在入场价
if(PositionGetDouble(POSITION_PROFIT) > 0 && currentSL != openPrice)
{
MqlTradeRequest request = {0};
MqlTradeResult result = {0};
request.action = TRADE_ACTION_SLTP;
request.position = ticket;
request.sl = openPrice;
request.tp = PositionGetDouble(POSITION_TP);
OrderSend(request, result);
}
}
}
Print("盈亏平衡检查完成");
}
//+------------------------------------------------------------------+
问ai
现在chatgpt已经很智能了
Direct Chat gemini-3-pro gemini-3-pro 你的脚本主要存在 一个编译警告 和 几个严重的逻辑隐患(这会导致运行错误)。 1. 编译警告与错误分析 警告 (Warning): Return value of 'OrderSend' should be checked 原因: OrderSend 函数会返回一个布尔值(true/false)告诉你是成功还是失败。编译器强烈建议你检查这个结果,而不是直接忽略它。 潜在错误 (Error/Bug): 虽然你的代码语法上可能通过编译(或者报出初始化的错误,取决于编译器版本),但实际上有缺导致脚本无法工作的逻辑错误: 缺少 Symbol (最重要): 在 MqlTradeRequest 结构体中,即使是修改止盈止损 (TRADE_ACTION_SLTP),通常也必须指定 symbol,否则请求无效。 价格未标准化 (Normalize): openPrice 是一个浮点数,直接传给服务器可能会因为小数点后位数过多而被拒绝(Invalid Price)。必须使用 NormalizeDouble。 浮点数直接比较: currentSL != openPrice 这种写法在编程中是危险的(因为 1.10000001 不等于 1.1),应该判断两者之差是否极小。
韬客社区www.talkfx.co
深海游鱼 发表于 2025-11-21 15: 23现在chatgpt已经很智能了
他这个就是人工智障写的
韬客社区www.talkfx.co
论坛自动屏蔽回复
韬客社区www.talkfx.co
编程还是用Claude code吧
韬客社区www.talkfx.co
看不懂
韬客社区www.talkfx.co




























