错误、漏洞、问题 - 页 2652

 
Алексей Тарабанов:

你为什么要打架?我们为什么不一起做一些有用的事情呢?

Stanislav在KB中发布了 一个非常有用的脚本。它很容易创建带有MQL文件和资源的档案。

我有一个有数百个mqh文件的EA。使用该脚本,我现在可以轻松地将我的EA转移到源代码,控制版本并与他人分享。

MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This script allows you to assemble a zip-file of your MQL5-program with all dependencies automatically. The dependencies are: included source files via #include directive (both modes of absolute () and relative ("") references are supported); icons linked by #property icon directive; resources (images, sounds, and other types) embedded by...
 
 
Vladislav Andruschenko:
谢谢你。我会试着把它分解,用图表事件检查选项。

请看一下这个主题,最近详细地处理了这个问题 -https://www.mql5.com/ru/forum/327888

EventChartCustom => indicator is too slow
EventChartCustom => indicator is too slow
  • 2019.12.06
  • www.mql5.com
Использую в советнике для получения тиков с других инструментов "индикатор-шпион": Периодически в журнале появляются записи "indicator is too slow...
 
Anton Shpilyuk:

2) Циклом-перебором до тех пор пока дата не будет совпадать(минус - скорость работы)

 это так?

关于 "按时间拷贝获取酒吧指数 "的问题

恐怖,它真的是!?任务是在指标中获得M1时间框架的条形图,尽管指标本身在M5时间框架上工作。

1.我们不得不在OnCalculate()中初始化所需的时间框架,以便在指标开始之前加载它(初始化之后,FirstStartFlag = false;)。记住,在指标中,如果没有加载,它将给出-1或没有完全加载,所以我们检查有多少是加载的,如果不够,我们去开始返回(0)

声明数组MqlRates rates[]; 在开始时,其中cnt_bars*5; - 重新计算M1中M5的条数。

//--- загрузка данных М1 таймфрейма для поминутной экспирации в оптимизаторе   
   if(FirstStartFlag) 
      {
         int count = cnt_bars*5;
         int copied=CopyRates(_Symbol,PERIOD_M1,0,count,rates);
         if(copied>0) 
            {
               if(debug) Print("Скопировано баров: "+IntegerToString(copied)+", надо было "+IntegerToString(count)); 
               if(copied<count)
                  {
                      Print("Не удалось получить достаточно исторических данных, ждем");
                      return(0);
                  }
                
            }
         else  
            {
               Print("Не удалось получить исторические данные, ждем");
               return(0);
            } 
         ArraySetAsSeries(rates,true);  
      }

之后,每次进行计算时,我们都会在所需函数的主体中更新M1的历史数据

//--- загрузка актуальных данных М1 таймфрейма для поминутной экспирации в оптимизаторе    
   int count = cnt_bars*5;
   copied=CopyRates(_Symbol,PERIOD_M1,0,count,rates);
   if(copied>0) 
      {
         Print("cnt_Statist() Скопировано баров: "+IntegerToString(copied)+", надо было "+IntegerToString(count)); 
         if(copied<count)
            {
                Print("cnt_Statist() Не удалось получить достаточно исторических данных");
            }
          
      }
   else  
      {
         Print("cnt_Statist() Не удалось получить исторические данные"); 
      } 
   ArraySetAsSeries(rates,true);  

此外,在M5条的循环中,我们做了一个搜索相应M1条的索引的嵌入式循环,time[s]是正在处理的时间框架的当前M5条

                          for(h=copied-1;h>0;h--)
                              {
                                 if(rates[h].time == time[s])
                                    {
                                       IndexRates = h;
                                       break;
                                    }
                              }

然后我们用这个索引来寻找必要的M1条形数据,在我的例子中,它是 rates[IndexRates-5].time 和 rates[IndexRates-k-4].close。

谢天谢地,这个嵌套循环很快就通过了,即使是在90天的历史上。但我希望能够像二进制搜索一样,使用ArrayBsearch函数在rate[].time数组中搜索条形索引。

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту
  • www.mql5.com
Константы, перечисления и структуры / Торговые константы / Информация об исторических данных по инструменту - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
对于以下几行的编译器来说,有什么不同?
Print("123" "456");
Print("123" + "456");
Print("123", "456");
 
MQLs正在一点一点地削弱士气。
#ifdef __cplusplus
    #include<iostream>
    #include<stdio.h>
#endif

class input_iterator_tag  {};
class output_iterator_tag {};
class forward_iterator_tag       : public input_iterator_tag         {};
class bidirectional_iterator_tag : public forward_iterator_tag       {};
class random_access_iterator_tag : public bidirectional_iterator_tag {};

struct MyIterator{
public:
   int index;
   class iterator_category : public random_access_iterator_tag{};
   
   MyIterator(int __index = 0):index(__index){}
   
   bool operator!=(MyIterator &it){
      return index != it.index;
   }
   
   int operator-(MyIterator &it){
      return index - it.index;
   };
   
   MyIterator operator++(){
      index+=1;
#ifdef __cplusplus
      return *this;
#else
      return this;
#endif 
   } 
};

template <typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, input_iterator_tag*){
    int __r=0;
    for (; __first != __last; ++__first)
        ++__r;
    return __r;
}

template <typename _RandIter>
int __distance(_RandIter &__first, _RandIter &__last, forward_iterator_tag*){
    return __last - __first;
}


//+------------------------------------------------------------------+
//| MQL realization                                                  |
//+------------------------------------------------------------------+
#ifdef __MQL5__
// Bypass the bug (https://www.mql5.com/ru/forum/1111/page2648#comment_15015191)
template <typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, forward_iterator_tag* __category){
   return __distance(__first, __last, (input_iterator_tag*) __category);
};

template <typename _InputIter>
int __distance(_InputIter &__first, _InputIter &__last, random_access_iterator_tag* __category){
   return __distance(__first, __last, (bidirectional_iterator_tag*) __category);
};


// Bypass Compilation ERROR: '_InputIter' - struct undefined    
template<typename T>
class GetStructType{
public:
   struct type : public T{};
};


template <typename _InputIter>
int distance_mql(_InputIter &__first, _InputIter &__last){
   //_InputIter::iterator_category category;                      //Compilation ERROR: '_InputIter' - struct undefined  
   GetStructType<_InputIter>::type::iterator_category category;
   GetStructType<_InputIter>::type::iterator_category* ptr = &category;
   
   // Bypass the bug (https://www.mql5.com/ru/forum/1111/page2648#comment_15015191)
   random_access_iterator_tag* ptr_ra = dynamic_cast<random_access_iterator_tag*>(ptr);
   if(ptr_ra != NULL){
      return __distance(__first, __last, ptr_ra);
   };
   
   bidirectional_iterator_tag* ptr_bd = dynamic_cast<bidirectional_iterator_tag*>(ptr);
   if(ptr_bd != NULL){
      return __distance(__first, __last, ptr_bd);
   };
   
   forward_iterator_tag* ptr_fw = dynamic_cast<forward_iterator_tag*>(ptr);
   if(ptr_fw != NULL){
      return __distance(__first, __last, ptr_fw);
   };
   
   input_iterator_tag* ptr_in = dynamic_cast<input_iterator_tag*>(ptr);
   if(ptr_in != NULL){
      return __distance(__first, __last, ptr_in);
   };
   
   //TODO RAISE EXCEPTION
   return -1;
}

void OnStart(){
   MyIterator it1(1);
   MyIterator it2(5);
   printf("result:%d", distance_mql(it1, it2));            
}
#endif 


//+------------------------------------------------------------------+
//|  C++ realization, online: https://onlinegdb.com/S1tcVt9XU 	     |
//+------------------------------------------------------------------+
#ifdef __cplusplus
template <typename _InputIter>
int distance_cplusplus(_InputIter &__first, _InputIter &__last){
    return __distance(__first, __last, (typename _InputIter::iterator_category*)(NULL));
}

int main(){
   MyIterator it1(1);
   MyIterator it2(5);
   printf("result:%d", distance_cplusplus(it1, it2)); 
   
   return 0;
}
#endif 

该错误 的简要要点。
当有类的继承性时,A <= B <= C <= D
并实现了两个重载函数,例如,一个带参数A*,一个带参数B*。
当把一个C*或D*对象传入这样一个函数时,MQL会导致 "对重载函数的模糊调用 "的编译错误。

问题:对于这个愚蠢的错误,是否有比上面提出的更合理的解决方法?
 
在这里,我们将提供更多的 "为什么MQL !=C++"表...
 
Сергей Таболин:
在这里,我们会有更多的 "为什么MQL !=C++"...

如果你没有弄清事情的真相,为什么要发表评论?

 
Sergey Dzyublik:

如果你没有弄清事情的真相,为什么要发表评论?

因为我早就为这种澄清开了一个话题(因为没有人像你一样可以自己做)。

然后,语言的差异与错误或bug毫无关系!

MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
MQL v C++. Что хотелось бы, чего нет, что не так, куда копать.
  • 2019.08.02
  • www.mql5.com
Общую тему багов и вопросов просто уже снасильничали такими разборками. Предложил открыть специализированную ветку, никто не чешется...
 
Sergey Dzyublik:
MQL正在一点一点地削弱士气。

该错误 的简要要点。
当有类的继承性时,A <= B <= C <= D
并实现两个函数,例如,一个用于A*,一个用于B*。
当把一个C*或D*对象传递给这样的函数时,MQL会引起 "对重载函数的模糊调用 "的编译错误。

问题:对于这个愚蠢的错误,是否有比上面提出的更合理的解决方法?

嗯,STL不是一对一的转置。你必须仔细看一下这里的具体情况。最简单的方法是将所有可能的功能写在基类或接口的抽象方法中,而在子类中--要么实现,要么=delte。在这种情况下,你需要向基类的方法传递相同类型的指针或引用。虽然在虚拟表的形式上有一个不可避免的弊端,但最好是以这样的方式安排架构,在任何地方都不会有昂贵的dynamic_cast分支。