新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 682

 

我有一个大型的程序,有相同类型的对象。我是说很多类型。但它们在该计划的不同模块中被重复使用。而在日志中,在测试完成 后,例如,我得到xxx个未删除的对象。等等几种类型。

我怎样才能找出我没有删除对象的地方?是否有一些工具箱用于此目的?

 
mbjen:

我有一个大型的程序,有相同类型的对象。我是说很多类型。但它们在该计划的不同模块中被重复使用。而在日志中,在测试完成后,比如说,我得到了xxx个未删除的对象。等等几种类型。

我怎样才能找出我没有删除对象的地方?有没有这方面的工具箱?

1930年建造的错误

 
测试的EA莫名其妙地在价格下方打开了BUYSTOP!现在我甚至不能手动关闭订单。这怎么可能呢?
附加的文件:
 

我惊讶地发现,MQl5支持OpenCL

难道这段时间没有人给机器人写一个优化器,使数百万次的运行不至于持续几个世纪,而至少是几年?:)

 
Igor Makanu:

这意味着你在计算你提交的代码中的每一个刻度,而不是初始化SredRazmax和SredRazmin 变量。

在使用变量之前对其进行初始化是一个很好的习惯--大学里都是这么教的,这样可以减少发现bug的时间;)

我在一开始就初始化了它们,在注释中你可以看到另一个数组的元素(检查一下,0没有变化,所以公式应该可以工作,)以下是完整的代码。

//+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
//#property indicator_color1 Red
//#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
extern int nn=30;

int shift, ww=0;
double zz, SredRazmax, SredRazmin, Sredn; 
double HZZ[];


int OnInit()
  {
//--- indicator buffers mapping
    SetIndexBuffer(0, HZZ);
 // SetIndexStyle(0, DRAW_SECTION);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  for(shift = 0; shift <= Bars-1; shift++)
  {
      zz = iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, shift);
           if(zz > 0.0)
           {
           HZZ[ww]=zz;
           ww++;          
           }
  }
   
  
       for(ww=0;ww<=nn;ww++)
       {
      if(HZZ[ww]>HZZ[ww+1]){SredRazmax += HZZ[ww];}     
      if(HZZ[ww]<HZZ[ww+1]){SredRazmin += HZZ[ww+1];}
      
       
  Comment("Средний размах = ", (SredRazmax-SredRazmin)/nn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]); 
        }      
   
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      

   //    for(ww=0;ww<=nn;ww++){
   //    if(HZZ[ww]>HZZ[ww+1]){Sredn += HZZ[ww]-HZZ[ww+1];}     
   //    if(HZZ[ww]<HZZ[ww+1]){Sredn += HZZ[ww+1]-HZZ[ww];}
       
 // Comment("Средний размах = ", Sredn,",",HZZ[0],",",HZZ[1],",",HZZ[2],",",HZZ[3],",",HZZ[4]); 

            
         
     
       
//--- return value of prev_calculated for next call
    return(0);

  }
 
Artyom Trishkin:

来自1930版的错误

它是什么?我有MT4。建1090。

 
mbjen:

它是什么?我有MT4。建1090。

通过new创建的对象必须被附加到一个对象数组中,或者在OnDeinit()中被自己删除。
 
Dmitry Belov:

我在一开始就对它们进行了初始化,注释中逐一输出了另一个数组元素(检查一下,0没有变化,所以公式应该是有效的,)以下是完整的代码。

你没有在开头或其他地方初始化它们,你只是声明了它们

我在使用前写道,即如果你有变量SredRazmax、SredRazmin、Sredn是数组值的总和,那么为了正确计算总和,你需要将变量归零,然后将数组值相加并保存在这个变量中

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    SredRazmax = 0.0;
    SredRazmin = 0.0;
    Sredn = 0.0;
    .....

第二,你有一个问题,在指标中,每一个tick 都会调用OnCalculate() ,这意味着你将在每一个tick不断地计算ZigZag的顶部,即大约每秒40-60次。

 
Artyom Trishkin:
由new创建的对象必须被附加到一个对象数组上,或者在OnDeinit()中被自己删除。

谢谢你的启迪。但你至少应该阅读我的问题。

 
mbjen:

谢谢你的启迪。但你至少应该阅读我的问题。

我做了,我回答了。
原因: