错误、漏洞、问题 - 页 100

 
Urain:

是否存在强制终止OnTester()函数 的情况

或者为什么自定义函数之前的交易历史存在,而之后却返回零。

double OnTester()
  {
   int HTD=-1;
   Custom_func();
   if(HistorySelect(0,TimeCurrent()))HTD=HistoryDealsTotal();   
   return(HTD);
  }

什么功能在测试器中不工作?

测试员(在优化过程中)如何向外界发出信号,说明有什么问题(打印警报,没有工作)?

显然,今晚大家都在睡觉。
 
Urain:
很显然,今天大家都在睡觉。

你是否看了代理日志,也许一切都在那里?

据我所知,只有在优化期间,打印机才不会显示在主测试器日志中(在正常模式下一切正常)。

OnTester(),根据我的理解,不可能强行退出。它只是简单地计算某个测试结果(此外,它基本上只用于优化),又是为了什么呢?

检验员
OnTester()函数是一个测试者 事件处理程序,在专家顾问在给定日期间隔的历史测试结束后自动生成。该函数必须以double类型定义,它没有参数。

doubleOnTester()。

该函数在OnDeinit()之前立即调用,其返回类型为双倍。OnTester()函数只能在专家测试期间使用,其主要目的是计算一些数值,作为输入参数遗传优化中的Custom max标准。


PS

> 为什么在自定义函数之前的交易历史,在之后却显示为零?

也许这是给开发者的一个问题。

据我所知,OnTester 必须返回交易数量(如果有的话),而Custom_func()被理解为一个自定义函数?

 
Urain:

献给开发者...

如果你们给了一个机会,至少会发出警告,以前原则上是不可能的。

我浪费了二十四个小时试图抓住这个错误。

不要告诉我这没关系,我当然知道,但我已经浪费了24个小时,只是因为我已经习惯了与这个事实

我已经习惯于让编译器给我一个错误。

什么是正确的方法?是"=="还是"="?
 
Urain:

是否存在强制终止OnTester()函数 的情况

或者为什么自定义函数之前的交易历史存在,而之后却返回零。

什么功能在测试器中不工作?

如何从测试者(在优化过程中)向外界发出信号,说明有什么问题(打印出的警报没有任何作用)?

谢谢你的留言。您的申请已经收到 - 我们正在处理。

 

如何计算开立新仓时按保证金计算的最大允许手数?在MQL4中是这样做的。

MaxLot=AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
EvgeTrofi:

如何计算开立新仓时按保证金计算的最大允许手数?在MQL4中,它是这样做的。

大约是这样的。

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
这段代码不仅能计算出最大的体积,而且还能在符号设置的限制范围内准确地适合它。
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Renat:

情况是这样的。

这段代码不仅计算了最大的体积,而且还将其完全适合于字符设置的限制。
谢谢你!我的帮助中没有OrderCalcMargin():)
 
EvgeTrofi:
谢谢你!我的帮助中没有OrderCalcMargin():)
这个功能在很久以前就已经加入了--请看文档。
 
EvgeTrofi:
那么,最终什么才是正确的方式?是"=="还是"="?

无论是哪种方式。

if(a==0){expression}意味着如果a是0,那么它就是真的,所以我们执行{expression}。

if(a=0){表达式}等于if(a){a=0;表达式}。如果a为真,{a=0;表达式}。

 
Interesting:

你是否看了代理日志,也许一切都在那里?

据我所知,只有在优化期间,打印机才不会显示在主测试器日志中(在正常模式下一切正常)。

据我所知,OnTester()是不可能强行退出的。而且,它只是计算某个测试结果(此外,它基本上只用于优化),这又是为了什么

PS

> 为什么自定义函数之前的交易历史存在,而之后给出的是零...

也许这对开发者来说是个问题。

根据我的理解,OnTester 应该返回交易的数量(如果有的话),而自定义函数是Custom_func()?

问题是,在优化本身中,程序不像在其他情况下那样工作(这就是为什么我需要从OnTester 下发送消息)。

为了这个目的,我发明了模拟打印(为了打印作为参数传递给函数的字符串而创建一个文件的函数)。

int prints=0;// счётчик вызовов, должен быть обьявлен глобально
//+------------------------------------------------------------------+
//| вывод информации из под тестера                                  |
//+------------------------------------------------------------------+
void WriteFilePrint(string text,string folder="Print")
  {
   string subfolder="Print";
   int han=FileOpen(subfolder+"\\"+folder+(string)prints+".csv",FILE_WRITE|FILE_CSV,";");
   if(han!=INVALID_HANDLE)
     {
      FileWrite(han,text);
      FileClose(han);
     }
   else Print("File open failed"+subfolder+"\\"+folder+".txt, error",GetLastError());
   prints++;
  }

因此,我设法抓住了OnTester 中一些函数的不正确执行。