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

 
Николай К:

请告知如何解决错误4806--未找到所需数据。我想从指标中获得波林格的不同平均周期的数据。Handle是在OnInit中接收的,但对于我的目的,它应该在OnCalculate 中接收,因此出现了错误。请帮助我通过实例来理解它。


编码
 
//+------------------------------------------------------------------+
//|                                                          вап.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   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[])
  {
//---
  int limit=rates_total-prev_calculated;
   if(limit>1) 
     {
      limit=rates_total-1;                 
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(i>=rates_total-10) 
         continue;

      ArrayInitialize(middle1,0);
      ArrayInitialize(middle2,0);


      for(BandsPeriod=2; BandsPeriod<=5; BandsPeriod++)
        {
         int T=3;
         Handle1=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_HIGH);
         Handle2=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_LOW);
         count=Bars(Symbol(),PERIOD_CURRENT)-10;
         if(!iGetArray(Handle1,BASE_LINE,start_pos,count,middle1) ||
            !iGetArray(Handle2,BASE_LINE,start_pos,count,middle2))// ||
            //CopyRates(Symbol(),PERIOD_CURRENT,start_pos,count,rates)!=count)

           {
            return(false);
           }
        }
      //--- return value of prev_calculated for next call
      return(rates_total);
     }
     }
//+------------------------------------------------------------------+
   
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
组织起来大致是这样的,对不起诚信。
 
Николай К:
像这样组织起来的,对不起诚信。

MQL5中的指标句柄必须在OnInit()中创建!

 
Vladimir Karputov:

MQL5中的指标句柄必须在OnInit()中创建!

那么每一个平均期都会有一个单独的手柄?

 
Николай К:
它是这样组织的,抱歉的是它的一致性。

资源没有被释放出来......但它是正确的,虽然效率不高

在iMA(...)和操作之后,如果你不再需要它,你需要调用IndicatorRelease

IndicatorRelease()函数用于从计算机内存中释放指标,该指标句柄被传递到该内存。

而一个指标句柄可以在任何地方创建,除了OnDeinit。只要担心 "万一创造错误该怎么办"。

 
@Vladimir Karputov @Maxim Kuznetsov 胶水还是钉子?))简单的任务--复杂的准备,它在mql4中做了一两个。那么,我如何将不同时间段和平均期的博林格数据收集到一个阵列中而不出错呢?
 
Николай К:
@Vladimir Karputov @Maxim Kuznetsov 钉子还是钉子?))简单的任务--复杂的准备工作,在mql4中是在一二中完成的。那么,我如何将不同时间段和平均期的博林格数据收集到一个阵列中而不出错呢?

你说对了,你刚吃了所有的手柄,这是一种可耗尽的资源......你需要释放它们。

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

看看fxsaber是如何在他的图书馆里做的,以使其更容易从4到5移动。

 
MakarFX:
首先想到的是检查指标的运行情况,然后观察EA的情况

我找不到任何东西,在指标中没有像--输出如果......这样的行,每一个刻度 都被处理,而在机器人中每一个刻度都被处理。

整个m1没有信号,直到条形变化和新的信号,回顾信号所有的ticks都在看,处理一个新的条形是没有的。

我提醒你,我必须同时在3个终端进行测试。我将被埋在3个终端中。

 
Fast235:

我找不到任何东西,在指标中没有像--输出如果......这样的行,每一个刻度 都被处理,而在机器人中每一个刻度都被处理。

整个m1没有信号,直到条形变化和新的信号,回顾信号所有的ticks都在看,处理一个新的条形是没有的。

该机器人在各方面都没有信号。

也许在指标中,只有当条形图发生变化时才会出现信号...

当然,最好能看到代码。

 
你好,Artem!

由于各种情况,我不得不用MQL4编码,并想出自己的笨拙结构,我很羡慕看到MQL5的同志们使用CTAL 和其他类的 编码速度。
也许,已经有这样一套MQL4的类了?
预先感谢)