MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1501

 
Николай К :

오류 4806 해결 방법을 알려주십시오 - 요청한 데이터를 찾을 수 없습니다. 지표에서 볼린저에 대한 다양한 평균 기간의 데이터를 얻고 싶습니다. 입문서에 따르면 핸들은 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에서는 1~2개를 위해 수행되었습니다. 그럼에도 불구하고 다른 시간 프레임과 평균 기간에 대한 볼린저 데이터를 오류 없이 하나의 어레이로 수집하는 방법은 무엇입니까?
 
Николай К :
@Vladimir Karputov @Maxim Kuznetsov 접착제 또는 못? )) 간단한 작업은 복잡한 준비이며 mql4에서는 1~2개를 위해 수행되었습니다. 그럼에도 불구하고 다른 시간 프레임과 평균 기간에 대한 볼린저 데이터를 오류 없이 하나의 어레이로 수집하는 방법은 무엇입니까?

당신은 모든 것이 옳습니다. 당신은 모든 손잡이를 먹었습니다. 이것은 고갈 된 자원입니다 ... 그들은 풀어야합니다.

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

fxsaber가 4에서 5로의 이동을 단순화하기 위해 라이브러리에서 어떻게 수행했는지 확인하십시오.

 
MakarFX :
가장 먼저 떠오르는 것은 표시기의 작동을 확인한 다음 조언자를 관찰하는 것입니다.

거기에는 아무것도 찾을 수 없습니다. - exit if... 표시기에서 모든 틱 이 처리되고 모든 틱이 로봇에 옵니다.

전체 m1에는 막대가 변경되고 새로운 신호가 될 때까지 신호가 없습니다. 신호가 모든 틱을 감시하고 있으며 새 막대에 대한 처리가 없음을 상기시켜 드리겠습니다.

한 번에 3개의 터미널에서 테스트해야 함을 상기시켜 드리겠습니다. 세 개의 단말기를 손에 들고 나를 묻어주세요.

 
Fast235 :

거기에는 아무것도 찾을 수 없습니다. - exit if... 표시기에서 모든 틱 이 처리되고 모든 틱이 로봇에 옵니다.

전체 m1에는 막대가 변경되고 새로운 신호가 될 때까지 신호가 없습니다. 신호가 모든 틱을 감시하고 있으며 새 막대에 대한 처리가 없음을 상기시켜 드리겠습니다.

한 번에 3개의 터미널에서 테스트해야 함을 상기시켜 드리겠습니다. 세 개의 단말기를 손에 들고 나를 묻어주세요.

아마도 표시기의 신호는 막대가 변경될 때만 ...

코드를 보는 것이 좋습니다.

 
안녕하세요 아르템입니다!
저는 제 동료들이 원래 MT5에 내장된 CTrade 클래스와 기타 클래스를 사용하여 MQL5 로 빠르게 코딩하는 방법을 부러워하며 지켜보고 있습니다.
극복할 수 없는 다양한 상황으로 인해 나는 여전히 MQL4로 코딩해야 하고 내 자신의 서투른 구성을 생각해 내야 합니다.
엠비. MQL4에 대한 이러한 클래스 세트가 이미 있습니까?
미리 감사드립니다)