我试图更新EA的版本,得到一个错误。
同样的EA也在策略测试器中。
我同时也在为MT4编写EA,那里一切正常。4和5的代码是相同的,唯一不同的是包含文件(4和5的文件是不同的)。
我上次更新这个EA时,是在1月份,一切都很正常。
软件版本 - MetaTrader 5 x64 build 2025 开始 (MetaQuotes Software Corp.)
- 终端 Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memory: 1866 / 3967 Mb, Disk: 5 / 35 Gb, GMT+3
假装是个白痴,投入1美元存款或100500手,看看是否会有任何交易。而且会不会有提醒,只有白痴才会设置这样的参数。
当然不会有交易。那么警报应该是什么呢?我只有在OnInit中,如果批量大小不在SYMBOL_VOLUME_MIN 和SYMBOL_VOLUME_MAX范围内,则初始化错误INIT_PARAMETERS_INCORRECT。
当然不会有交易。那么警报应该是什么呢?我只有在OnInit中,如果批量大小不在SYMBOL_VOLUME_MIN 和SYMBOL_VOLUME_MAX范围内,则初始化错误INIT_PARAMETERS_INCORRECT。
我记得我那时也有过差不多的情况,版主在自动检查后又进行检查。在参数不正确的情况下,OnInit也以代码INIT_PARAMETERS_INCORRECT终止。而自动检查产生了同样的错误,即没有交易操作。所以,版主建议我不要用这段代码来终止OnInit(),而是要发出一个Alert。
当然不会有交易。那么警报应该是什么呢?我只有在OnInit中,如果批量大小不在SYMBOL_VOLUME_MIN 和SYMBOL_VOLUME_MAX范围内,则初始化错误INIT_PARAMETERS_INCORRECT。
我明白,假装成一个白痴是非常困难的,但这种技能有时会有帮助。再试一次。你已经设置了专家顾问,你的账户有1美元,你设置了100500手,你在等待。你等了一天,第二天,第三天......。然后你开始怨恨,"我花钱买了什么。为什么这玩意儿不起作用?"没有人说什么,没有人愿意说 "你是个白痴...... "之类的话。你不能用这样的存款在外汇市场工作。只有白痴才会把很多100500"...事情就是这样的。
可能每个月都会有人提起这个问题。这已经持续了一段时间了。
问题是,在交易时(在现实生活中),不仅余额的大小可能会改变,而且手数也会改变。
而在测试过程中,存款规模(从1到10000000)或手数(从1000000到0.01)可以变化。
因此,这些检查不仅应该在OnInit时进行一次,而且应该在循环中长期进行(例如,在OnTick)。
警告(打印信息或警报)必须只打印一次,以避免日志溢出。
即使是非常简单的代码也不能通过验证。它似乎满足了你提到的条件。
void OnTick() { ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL; MqlTradeRequest request; MqlTradeResult result; MqlTradeCheckResult check; ZeroMemory(request); ZeroMemory(result); ZeroMemory(check); long digit; double point,Bid; SymbolInfoDouble(_Symbol,SYMBOL_BID,Bid); request.type = ORDER_TYPE_SELL; request.price = Bid; request.action = TRADE_ACTION_DEAL; request.symbol = _Symbol; request.volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN); request.sl=0; request.tp=0; request.deviation=10; request.magic=55555; request.comment=NULL; request.type_filling=0; if(PositionsTotal()==0 &&CheckMoneyForTrade(_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),ORDER_TYPE_SELL)==true ){ OrderSend(request,result); }else{ ExtExpert.Deinit(); return; } } bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type) { //--- получим цену открытия MqlTick mqltick; SymbolInfoTick(symb,mqltick); double price=mqltick.ask; if(type==ORDER_TYPE_SELL) price=mqltick.bid; //--- значения необходимой и свободной маржи double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE); //--- вызовем функцию проверки if(!OrderCalcMargin(type,symb,lots,price,margin)) { //--- что-то пошло не так, сообщим и вернем false Print("Error in ",__FUNCTION__," code=",GetLastError()); return(false); } //--- если не хватает средств на проведение операции if(margin>free_margin) { //--- сообщим об ошибке и вернем false Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError()); return(false); } //--- проверка прошла успешно return(true); }有钱的检查 - 没有交易业务,没有检查 - 没有足够的钱
可能每个月都会有人提起这个问题。这已经持续了一段时间了。
问题是,在交易时(在现实生活中),不仅余额的大小可能会改变,而且手数也会改变。
而在测试过程中,存款规模(从1到10000000)或手数(从1000000到0.01)可以变化。
因此,这些检查不仅应该在OnInit时进行一次,而且应该在循环中长期进行(例如,在OnTick)。
警告(打印信息或警报)必须只输出一次,以避免日志溢出。
这些检查(LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck)在每次开仓时 进行。只有在OnInit中才会有批量的检查。我不知道在OnInit中检查余额的逻辑。
PS: 警报并不能使我免于验证器错误 ((((((((((
验证器没有错误 :)
验证器只是显示提供的代码是
- 没有全面的检查
- 没有错误处理
))
我试图更新EA的版本,得到一个错误。
同样的EA也在策略测试器中。
我同时也在为MT4编写EA,那里一切正常。4和5的代码是相同的,唯一不同的是包含文件(4和5的文件是不同的)。
我上次更新这个EA时,是在1月份,一切都很正常。
软件版本 - MetaTrader 5 x64 build 2025 开始 (MetaQuotes Software Corp.)
- 终端 Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memory: 1866 / 3967 Mb, Disk: 5 / 35 Gb, GMT+3