错误、漏洞、问题 - 页 221

 
vikulin:

这是相同的结果!这些点的输入参数是相同的!"。

请解释。我不明白 "这些点的输入参数是相同的"。根据我对优化器工作原理的理解,每一个通道都对应着一组独特的输入参数。或者你的意思是,当使用遗传算法 时,可能会有这样的情况:一组独特的输入参数可以被优化器处理几次?

...嗯,是的,这正是你所说的。然后发现所有后续的 "来自缓存 "的点都是虚构的,扭曲了优化结果的视觉感知?

 
sultanm:

很奇怪。这已经是第三次了。图上有两个数值接近的点,但结果中只有一个。

提示:请按要求的值排序,不要忘记显示表格的垂直滚动条。

 

这个问题会不会得到解决?

这是我第三次谈论这个问题了,但没有任何反应!我想这是我的责任。


 
vikulin:


顺便说一下,在我看来,如果选择了重新报价的建模,那么这个缓存就不应该被使用。开发人员对此有什么看法?

还有一个错误:当我的遗传算法 超过10496时,图表开始不正确地显示--垂直方向上它的比例正确,你可以理解为找到了更高的结果,但水平方向上它没有更新。

请写信给Servicedesk。而在第2点是对完整的信息感兴趣。EA,终端构建,优化设置...
 
代码。
int symbols = SymbolsTotal(false);
for (int i=0; i<symbols; i++) {
   Print("Символ №"+i+" значение="+SymbolName(i,false));
}

在终端,结果是

2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №11 значение=GBPJPY
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №10 значение=GBPCHF
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №9 значение=EURJPY
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №8 значение=EURCHF
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №7 значение=EURAUD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №6 значение=EURGBP
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №5 значение=AUDUSD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №4 значение=USDCAD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №3 значение=USDJPY
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №2 значение=USDCHF
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №1 значение=GBPUSD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №0 значение=EURUSD

测试者的结果。

2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №11 значение=USDJPY
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №10 значение=USDCHF
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №9 значение=USDCAD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №8 значение=GBPUSD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №7 значение=GBPJPY
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №6 значение=GBPCHF
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №5 значение=EURUSD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №4 значение=EURJPY
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №3 значение=EURGBP
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №2 значение=EURCHF
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №1 значение=EURAUD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №0 значение=AUDUSD

SymbolName(i)函数的所有优点都消失了

 
vyv:

对开发商的请求。虽然MT5的工作正在沸腾,而且仍在进行修改,但如果能扩大优化通道的数量,那就非常好。

据我所知,这么多任务的解决方案是为大约10 000个变体找到的,可能多一点或少一点。在一个处理器上搜索了几个小时,已经找到了最好的变体。

MQL5+OP+Multicore测试的多功能性让你看到使用MT5工具可以解决的任务的新视野(如搜索模式)。

但麻烦就在这里。

你网站上发布的文章有一个遗传算法的例子https://www.mql5.com/ru/articles/55,它花了3^100的正向蛮力来解决100条的搜索问题--嗯,这比LongInt多一点:),而17000次迭代就能找到解决方案。遗传算法可以为比LongInt多得多的变体找到解决方案。而这种限制是完全没有根据的,是过时的。好吧,除了在MT5的这个最后阶段,将很难做到这一点。

对开发者有一个非常大的要求,如果不是太困难的话,请使通过的次数至少为2^LongInt(2的幂)。

有人能给我一个答案吗?
 

代码。

//+------------------------------------------------------------------+
//|                                                      testInd.mq5 |
//|                                                                  |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   int handle1 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //
   int handle2 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //абсолютно идентичные параметры
   if(handle1 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle1 ="+handle1);
        }
        if(handle2 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle2 ="+handle2);
        }
        
   IndicatorRelease(handle2);
   handle2 = INVALID_HANDLE; //добавил для "надежности"
   handle2 = iMA(NULL,0,33,0,MODE_LWMA, PRICE_CLOSE); //другой период
        if(handle2 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Измененный? Handle2 ="+handle2); //все обращения к данным handle2 возвращают данные с handle1
        }
   
   
//---
   return(0);
  }

日志。

2010.12.06 18:07:52:52 testInd (EURUSD,H1) 修改了?Handle2 =10
2010.12.06 18:07:52 testInd (EURUSD,H1) Handle2 =10
2010.12.06 18:07:52 testInd (EURUSD,H1) Handle1 =10

因此,对handle2的所有数据调用都等同于对handle1的调用,尽管周期改变了。

当专家顾问运行时,有可能创建 具有相同特征的指标,这种对一个手柄的优化是合理的,但这种将一个手柄 "粘 "在一个变量上的做法是非常令人讨厌的。

P.S. 我已经找到了原因。这个错误是优化到一个手柄号的结果。

IndicatorRelease(handle2); //уменьшает счетчик хендлов на единицу и в итоге следующий созданный хэндл(с любой переменной) - опять 10
 
Vigor:

代码。

日志。

2010.12.06 18:07:52 testInd (EURUSD,H1) 修改了?Handle2 =10
2010.12.06 18:07:52 testInd (EURUSD,H1) Handle2 =10
2010.12.06 18:07:52 testInd (EURUSD,H1) Handle1 =10

因此,所有对handle2的调用都等于对handle1的调用,尽管周期改变了。

在EA的运行过程中,我们不能排除创建具有相同特征的指标,这种对一个手柄的优化是合理的,但这种将一个手柄 "粘 "在一个变量上的做法是非常令人讨厌的。

P.S. 我已经找到了原因。这是一个错误--优化到一个手柄号码的后果。

你为什么认为这是一个错误?

 
alexvd:

你为什么认为这是一个错误?

很好。这是一个特点。但是,你应该更清楚地了解一个人。

如果用户从界面上输入MA的周期值,为指标创建句柄并使用指标缓冲区的值,那么在创建了(例如,我在这个表格中的默认设置)2个具有相同特征的指标(它们的句柄存储在对象包装中)后,由于这个特征,他/她会收到第一个指标的句柄编号。

以下是一个可能的事件链。

情况1.它删除了第一个指标(并且程序执行IndicatorRelease);结果是第二个指标不能自动工作--缓冲区复制错误。

情况2。它删除了第二个指示器(程序做IndicatorRelease),手轮计数器减少。第一个人做得很好。它创建了第三个 具有不同周期的指标。它接收处理数+1,即刚刚删除的指标的处理数。最后,最糟糕的是,成功 创建的具有不同 周期 第三个指标,将第一个 指标的值(仍未删除)提供给缓冲区

处理号码的胶合功能,导致在删除两个胶合的一个,然后创建新的时,会出现含糊不清的情况。

//+------------------------------------------------------------------+
//|                                                      testInd.mq5 |
//|                                                                  |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   int handle1 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //
   int handle2 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //абсолютно идентичные параметры
   if(handle1 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle1 ="+handle1);
        }
        if(handle2 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle2 ="+handle2);
        }
        
   IndicatorRelease(handle2);

   handle3 = iMA(NULL,0,33,0,MODE_LWMA, PRICE_CLOSE); //другой период
        if(handle3 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Новый handle3 ="+handle3); //все обращения к данным handle3 возвращают данные с handle1
        }
   
   
//---
   return(0);
  }
 
vyv:
有人能为我解答吗?

这里已经谈过了。https://www.mql5.com/ru/forum/1997/page6/#comment_31644

也许把问题移到那里会更好--一个建议。

Оптимизация в Тестере стратегий
Оптимизация в Тестере стратегий
  • www.mql5.com
из которых ТОЛЬКО 546 ms было затрачено именно на тестирование эксперта.