初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1339

 
Kira27 #:
嗨!!!告诉我哪里错了,我自己也不明白)

在275个工具中,它处理了27个,然后卡住了,占据了内存,并在脚本被迫终止时产生一个错误字符串。

如果这个数组

   double bufer_MA[];  //Буфер для хендла

然后将其用于

         CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

这一点也不对。

还是我误解了什么?

 
Alexey Viktorov #:

如果这个数组

然后将其用于

是完全不对的。

还是我误解了什么?

有很多事情是不对的。

 
Alexey Viktorov #:

如果这个数组

那么它在



Пример:



//+------------------------------------------------------------------+ 
//|                                              TestCopyBuffer3.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00"
 
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 
//---- plot MA 
#property indicator_label1  "MA" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- input parameters 
input bool               AsSeries=true; 
input int                period=15; 
input ENUM_MA_METHOD     smootMode=MODE_EMA; 
input ENUM_APPLIED_PRICE price=PRICE_CLOSE; 
input int                shift=0; 
//--- indicator buffers 
double                   MABuffer[]; 
int                      ma_handle; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- indicator buffers mapping 
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA); 
   Print("Параметр AsSeries = ",AsSeries); 
   Print("Индикаторный буфер после SetIndexBuffer() является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- set short indicator name 
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries); 
//--- set AsSeries (depends on input parameter) 
   ArraySetAsSeries(MABuffer,AsSeries); 
   Print("Индикаторный буфер после ArraySetAsSeries(MABuffer,true); является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- 
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price); 
   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[]) 
  { 
//--- check if all data calculated 
   if(BarsCalculated(ma_handle)<rates_total) return(0); 
//--- we can copy not all data 
   int to_copy; 
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total; 
   else 
     { 
      to_copy=rates_total-prev_calculated; 
      //--- last value is always copied 
      to_copy++; 
     } 
//--- try to copy 
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0); 
//--- return value of prev_calculated for next call 
   return(rates_total); 
  } 
//+------------------------------------------------------------------+
 

是完全不对的。

还是我误解了什么?

为什么错了? 因为在函数的例子中


复制缓冲区

并使用

 

Alexey Viktorov #:


还是我误解了什么?

脚本的重点是在1分钟到4小时的时间段内,通过市场观察中的每个工具来寻找价格高于MA200的情况,如果检测到这一事实,在所有6个时间段内产生一个带有价格高于MA的符号名称的警报。

 
Artyom Trishkin #:

有很多事情是不对的。

如果你不介意的话,请更具体一些)

 
Kira27 #:

如果你不介意的话,请更具体一些)

阵列索引只是简单的令人毛骨悚然...在一个循环中复制相同的数据...在一个循环中创建新的手柄--无字...

我甚至不想看他们的其他部分,对不起

 
Artyom Trishkin #:

阵列索引只是简单的令人毛骨悚然...在一个循环中复制相同的数据...在一个循环中创建新的手柄--无字...

我甚至不想看其余的代码,对不起

我不明白数组的索引,你不喜欢什么数组? CopyBuffer函数第43行的数据是复制不同时间段的句柄,从1分钟到4H。5个MA指标价格被复制,为前5个柱状,句柄和5个柱状的数组在每次迭代时都被清零。

ArrayFree(bufer_MA);


并且手柄被删除。

 IndicatorRelease(MA200); //Удаление хендла

如果你能提出一种算法,以其他方式处理274个符号和6个时间段上的每个符号,我会很高兴的。 只是这个主题有点像叫--初学者的问题。 如果我是一个专家,我可能不会有任何问题。

 

在不同的情况下创建手柄 似乎并不昂贵,它只是一个没有预加载的指针? 主要的工作是由CopyBuffer完成的。

没有必要在循环中删除句柄,你可能需要检查它。 就我个人而言,我只有在创建第一个时才有一个持续的问题;它是通过Sleep()加载一个图表或预加载报价的功能来解决的。

开发者应该自己决定,速度在OnInit中并不重要,我指的是第一个有7个符号的指标,错误总是在不同的迭代中显示出来。

----------

创建一个句柄是如何工作的,在一个特殊的循环中,是否有必要检查可用性,或者只是另一个创建就够了(即覆盖)?

 
Fast235 #:

在不同的情况下创建手柄 似乎并不昂贵,它只是一个没有预加载的指针? 主要的工作是由CopyBuffer完成的。

没有必要在循环中删除句柄,你可能需要检查它。 就我个人而言,我只有在创建第一个时才有一个持续的问题;它是通过Sleep()加载一个图表或预加载报价的功能来解决的。

开发者应该自己决定,速度在OnInit中并不重要,我指的是第一个有7个符号的指标,错误总是在不同的迭代中显示出来。

----------

创建一个句柄是如何工作的,在一个特殊的循环中,是否有必要检查可用性,或者只是另一个创建就足够了(即覆盖)?

你是在跟我说话,还是在问当地专家的问题?)

 
Kira27 #:

你是在跟我说话,还是在问这里的专家?)

关于创建和删除手柄。

它是有效的,我对正确的方法感兴趣,我希望开发者能告诉我。