一个错误,一个警告
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已经很智能了
韬客社区www.talkfx.co
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
johnnyso87 发表于 2025-11-21 16: 20Direct 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),应该判断两者之差是否极小。
不用那么麻烦,直接调用系统自带的#include <Trade\Trade.mqh>模块,再自定义个名称CTrade trade;,然后用trade.PositionModify就能进行修改了,也就人工zhizhang会用这么古老且复杂的方案,还搞错
韬客社区www.talkfx.co
不用那么麻烦,直接调用系统自带的#include <Trade\Trade.mqh>模块,再自定义个名称CTrade trade;,然后用trade.PositionModify就能进行修改了,也就人工zhizhang会用这么古老且复杂的方案,还搞错
韬客社区www.talkfx.co
大佬还是多
韬客社区www.talkfx.co
1神无月1 发表于 2025-11-22 04: 44不用那么麻烦,直接调用系统自带的#include <Trade\Trade.mqh>模块,再自定义个名称CTrade trade;,然后用trade.PositionModify就能进行修改了,也就人工zhizhang会用这么古老且复杂的方案,还搞错
这是AI 写的,我不会,兄台能否帮忙写一个?
韬客社区www.talkfx.co
MT4的已经有了
韬客社区www.talkfx.co
AI 写的,继续把问题丢给ai让它自己处理
韬客社区www.talkfx.co
#include <Trade\Trade.mqh>
//--- 输入参数
input int BreakEvenPoints = 20; // 启动平保的点数
input int LockPoints = 0; // 平保锁定利润点数
CTrade trade;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
// 检查交易权限
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
{
Alert("脚本检测到你没有允许自动交易,请先设置允许自动交易,再重新加载脚本");
return;
}
int total_positions = PositionsTotal();
if(total_positions == 0)
{
Print("没有持仓订单");
return;
}
// 遍历所有持仓
for(int i = total_positions - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(ticket > 0)
{
string symbol = PositionGetString(POSITION_SYMBOL);
long type = PositionGetInteger(POSITION_TYPE);
double current_sl = PositionGetDouble(POSITION_SL);
double open_price = PositionGetDouble(POSITION_PRICE_OPEN);
// 获取当前价格
double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
double new_sl = current_sl;
double profit_points = 0;
if(type == POSITION_TYPE_BUY)
{
profit_points = (bid - open_price) / point;
// 平保逻辑:当盈利达到指定点数且当前无止损时,设置止损到开仓价+锁定利润
if(current_sl == 0 && profit_points >= BreakEvenPoints)
{
new_sl = open_price + (LockPoints * point);
new_sl = NormalizeDouble(new_sl, digits);
}
}
else if(type == POSITION_TYPE_SELL)
{
profit_points = (open_price - ask) / point;
// 平保逻辑:当盈利达到指定点数且当前无止损时,设置止损到开仓价-锁定利润
if(current_sl == 0 && profit_points >= BreakEvenPoints)
{
new_sl = open_price - (LockPoints * point);
new_sl = NormalizeDouble(new_sl, digits);
}
}
// 如果需要修改止损
if(new_sl != current_sl)
{
double current_tp = PositionGetDouble(POSITION_TP);
if(trade.PositionModify(ticket, new_sl, current_tp))
{
Print("平保设置成功: ", symbol,
" 新止损: ", DoubleToString(new_sl, digits),
" 利润点数: ", DoubleToString(profit_points, 1));
}
else
{
Print("平保设置失败: ", symbol, " 错误代码: ", GetLastError());
}
}
}
}
Print("自动平保脚本执行完成");
}
//+------------------------------------------------------------------+
韬客社区www.talkfx.co






























