MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1501

 
Николай К :

Lütfen 4806 hatasını nasıl çözeceğimi söyleyin - istenen veri bulunamadı. Göstergeden bolinger için farklı ortalama periyotlarından veri almak istiyorum. Primer'e göre, tanıtıcı OnInit'te alınır, ancak benim amacım için OnCalculate'de olması gerekir, bu nedenle görünüşe göre hata. Bir örnekle anlamama yardımcı olun.


kod
 
//+------------------------------------------------------------------+
//|                                                          вап.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);
  }
//+------------------------------------------------------------------+
Böyle bir şey organize ettim, bütünlük için üzgünüm.
 
Николай К :
Böyle bir şey organize ettim, bütünlük için üzgünüm.

MQL5'teki gösterge eli OnInit() içinde oluşturulmalıdır!

 
Vladimir Karputov :

MQL5'teki gösterge eli OnInit() içinde oluşturulmalıdır!

O zaman her ortalama dönem için ayrı bir tutamaç olacak mı?

 
Николай К :
Böyle bir şey organize ettim, bütünlük için üzgünüm.

Kaynağın serbest bırakılması gerçekleşmez .. ve bu nedenle verimli olmasa da her şey doğru

iMA(...) ve onunla yapılan işlemlerden sonra, artık gerekli değilse IndicatorRelease'i aramanız gerekir

GöstergeRelease() işlevi, bilgisayarın belleğini artık kullanılmayan bir göstergeden kurtarmak için kullanılır ve bu göstergenin tutamacı kendisine iletilir.

Ve gösterge tutamacı OnDeinit dışında herhangi bir yerde oluşturulabilir. Sadece "oluşturma hatasıyla ne yapılacağına" dikkat edin.

 
@Vladimir Karputov @Maxim Kuznetsov Tutkal mı çivi mi? )) Basit bir görev karmaşık bir hazırlıktır, mql4'te bir veya iki kez yapıldı. Yine de, farklı zaman dilimleri ve ortalama periyotlar için bolinger verileri hatasız bir dizide nasıl toplanır?
 
Николай К :
@Vladimir Karputov @Maxim Kuznetsov Tutkal mı çivi mi? )) Basit bir görev karmaşık bir hazırlıktır, mql4'te bir veya iki kez yapıldı. Yine de, farklı zaman dilimleri ve ortalama periyotlar için bolinger verileri hatasız bir dizide nasıl toplanır?

her şeye sahipsin, sadece tüm tutamakları yedin, bu tükenebilir bir kaynak ... serbest bırakılmaları gerekiyor.

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

4'ten 5'e geçişi basitleştirmek için fxsaber'ın kitaplıklarında nasıl çalıştığını görün

 
MakarFX :
Akla gelen ilk şey, göstergenin çalışmasını kontrol etmek ve ardından danışmanı izlemektir.

Orada hiçbir şey bulamıyorum, şöyle bir satır yok - çıkar... göstergede, her tik işlenir ve her tik robota gelir.

tüm m1 bar değişene kadar sinyal yok ve yeni bir sinyal var, sinyalin tüm tiklerini izlediğini hatırlatmama izin verin, yeni çubuğun işlenmesi yoktur.

ve aynı anda 3 terminalde test etmem gerektiğini hatırlatmama izin verin. beni elinde üç terminalle gömün.

 
Fast235 :

Orada hiçbir şey bulamıyorum, şöyle bir satır yok - çıkar... göstergede, her tik işlenir ve her tik robota gelir.

tüm m1 bar değişene kadar sinyal yok ve yeni bir sinyal var, sinyalin tüm tiklerini izlediğini hatırlatmama izin verin, yeni çubuğun işlenmesi yoktur.

ve aynı anda 3 terminalde test etmem gerektiğini hatırlatmama izin verin. beni elinde üç terminalle gömün.

Belki de göstergedeki sinyal sadece çubuk değiştiğinde...

Kodu görmek daha iyidir.

 
Merhaba Artem!
Yoldaşlarımın CTrade sınıflarını ve orijinal olarak MT5'te yerleşik olan diğerlerini kullanarak MQL5'te nasıl hızlı bir şekilde kod yazdığını kıskanarak izliyorum.
Çeşitli, aşılmaz koşullar nedeniyle, hala MQL4'te kodlamak zorunda kalıyorum ve kendi beceriksiz yapılarımla ortaya çıkıyorum.
M.b. MQL4 için zaten böyle bir sınıf seti var mı?
Şimdiden teşekkür ederim)