自动验证器--问题

 

我试图更新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

 
Uladzimir Kirychenka:

我试图更新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手,看看是否会有任何交易。而且会不会有提醒,只有白痴才会设置这样的参数。

 
Alexey Viktorov:

假装你是一个白痴,把1美元的存款或100500手,并检查是否会有交易。以及是否会出现只有白痴才能设置这种参数的警报。

同样的问题。试过了--没有帮助)。自4月13日起无法更新。如果我检查所有的东西和所有的东西--我在所有的符号上只得到一个铭文 "trehe are no trading operations"。如果我不检查所有的东西,我就会得到一个错误--没有足够的资产来建立头寸。MT4的版本,以及TS作者的更新没有任何问题。

123

我在图片中看到,最小手数是2000,余额是10000,显然没有足够的钱来开仓。反正我不通过检查。

在这种情况下该怎么做?

 

当然不会有交易。那么警报应该是什么呢?我只有在OnInit中,如果批量大小不在SYMBOL_VOLUME_MIN 和SYMBOL_VOLUME_MAX范围内,则初始化错误INIT_PARAMETERS_INCORRECT。

 
Uladzimir Kirychenka:

当然不会有交易。那么警报应该是什么呢?我只有在OnInit中,如果批量大小不在SYMBOL_VOLUME_MIN 和SYMBOL_VOLUME_MAX范围内,则初始化错误INIT_PARAMETERS_INCORRECT。

我记得我那时也有过差不多的情况,版主在自动检查后又进行检查。在参数不正确的情况下,OnInit也以代码INIT_PARAMETERS_INCORRECT终止。而自动检查产生了同样的错误,即没有交易操作。所以,版主建议我不要用这段代码来终止OnInit(),而是要发出一个Alert。

 

可能每个月都会有人提起这个问题。这已经持续了一段时间了。

问题是,在交易时(在现实生活中),不仅余额的大小可能会改变,而且手数也会改变。

而在测试过程中,存款规模(从1到10000000)或手数(从1000000到0.01)可以变化。

因此,这些检查不仅应该在OnInit时进行一次,而且应该在循环中长期进行(例如,在OnTick)。

为了避免日志溢出,有必要只输出一次警告(打印信息 或警报)。

 
Uladzimir Kirychenka:

当然不会有交易。那么警报应该是什么呢?我只有在OnInit中,如果批量大小不在SYMBOL_VOLUME_MIN 和SYMBOL_VOLUME_MAX范围内,则初始化错误INIT_PARAMETERS_INCORRECT。

我明白,假装成一个白痴是非常困难的,但这种技能有时会有帮助。再试一次。你已经设置了专家顾问,你的账户有1美元,你设置了100500手,你在等待。你等了一天,第二天,第三天......。然后你开始怨恨,"我花钱买了什么。为什么这玩意儿不起作用?"没有人说什么,没有人愿意说 "你是个白痴...... "之类的话。你不能用这样的存款在外汇市场工作。只有白痴才会把很多100500"...事情就是这样的。

 
Petros Shatakhtsyan:

可能每个月都会有人提起这个问题。这已经持续了一段时间了。

问题是,在交易时(在现实生活中),不仅余额的大小可能会改变,而且手数也会改变。

而在测试过程中,存款规模(从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);
  }
有钱的检查 - 没有交易业务,没有检查 - 没有足够的钱
 
Petros Shatakhtsyan:

可能每个月都会有人提起这个问题。这已经持续了一段时间了。

问题是,在交易时(在现实生活中),不仅余额的大小可能会改变,而且手数也会改变。

而在测试过程中,存款规模(从1到10000000)或手数(从1000000到0.01)可以变化。

因此,这些检查不仅应该在OnInit时进行一次,而且应该在循环中长期进行(例如,在OnTick)。

警告(打印信息或警报)必须只输出一次,以避免日志溢出。

这些检查(LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck)在每次开仓时 进行。只有在OnInit中才会有批量的检查。我不知道在OnInit中检查余额的逻辑。

PS: 警报并不能使我免于验证器错误 ((((((((((

 
Uladzimir Kirychenka:

这些检查(LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck)在每次开仓时 进行。而onInit只检查批次。我不知道在OnInit中检查余额的逻辑。

PS: Alert不能从验证器错误中保存((((((((((。

验证器没有错误 :)

验证器只是显示,在提供的代码中

  • 没有全面的检查
  • 没有错误处理
验证器显示,所谓的代码编写者从来没有把自己放在用户的位置上。

 
Vladimir Karputov:

验证器没有错误 :)

验证器只是显示提供的代码是

  • 没有全面的检查
  • 没有错误处理
验证器表明,所谓的代码编写者从来没有站在用户的角度考虑问题。

))