Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 1164

 
Roman :

Kodun bellek, başlatma ve değer döndürme düzeyinde nasıl yürütüldüğünü önceden düşünmek gerekir.

hiçbir şey düşünmeye gerek yok, kılavuzlar bu şeylere hizmet ediyor ve MQL'de bellek tahsisi hakkında hiçbir zaman bir kılavuz olmadı, yalnızca geliştiricilerin mesajları ve genellikle uygulamanın değişebileceğine dair açıklama ile

tamam, konuşma kimin programlama üzerine hangi kitabı okuduğuna bağlı, okuldan beri okuyorum ve son 30 yıldır bunu okuyorum

 
Igor Makanu :

hiçbir şey düşünmeye gerek yok, kılavuzlar bu şeylere hizmet ediyor ve MQL'de bellek tahsisi konusunda hiçbir zaman bir kılavuz olmadı, yalnızca geliştiricilerden gelen mesajlar ve genellikle uygulamanın değişebileceğine ilişkin açıklama ile

tamam, konuşma kimin programlama üzerine hangi kitabı okuduğuna bağlı, okuldan beri okuyorum ve son 30 yıldır bunu okuyorum

Elbette neden diye düşünmenize gerek yok... derleyici her şeyi kendi başına yapacak. ))
C# C değil

Ve __inline için videoyu izleyin.
Farkı olmayanlar için sadece hafızadaki fonksiyonların nasıl çalıştığını açıklıyor.

 
Vladimir Karputov :

İlk önce, bir resim çizin ve sizin için "sıfır çubuğu" gösterge için shift parametresiyle belirtin.

Ben çizdim. Sıfır çubuğu dikey bir çizgi ile işaretlenmiştir.


 
RickD :

Ben çizdim. Sıfır çubuğu dikey bir çizgi ile işaretlenmiştir.


Kod örneği:

 //+------------------------------------------------------------------+
//|                                        iMA Values on a Chart.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
//--- input parameters
input int                   Inp_MA_ma_period     = 12 ;           // MA: averaging period
input int                   Inp_MA_ma_shift      = 5 ;           // MA: horizontal shift
input ENUM_MA_METHOD        Inp_MA_ma_method     = MODE_SMA ;     // MA: smoothing type
input ENUM_APPLIED_PRICE    Inp_MA_applied_price = PRICE_CLOSE ; // MA: type of price
//---
int     handle_iMA;                           // variable for storing the handle of the iMA indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create handle of the indicator iMA
   handle_iMA= iMA ( Symbol (), Period (),Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created
   if (handle_iMA== INVALID_HANDLE )
     {
       //--- tell about the failure and output the error code
       PrintFormat ( "Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d" ,
                   Symbol (),
                   EnumToString ( Period ()),
                   GetLastError ());
       //--- the indicator is stopped early
       return ( INIT_FAILED );
     }
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   double array_ma[];
   ArraySetAsSeries (array_ma, true );
   int start_pos= 0 ,count= 3 ;
   if (!iGetArray(handle_iMA, 0 ,start_pos,count,array_ma))
       return ;

   string text= "" ;
   for ( int i= 0 ; i<count; i++)
      text=text+ IntegerToString (i)+ ": " + DoubleToString (array_ma[i], Digits ()+ 1 )+ "\n" ;

   Comment (text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
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))
     {
       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
       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);
  }
//+------------------------------------------------------------------+

Sonuç:


Gördüğünüz gibi, bir tef ile dans etmeden sessizce kopyalanır.

Dosyalar:
 
Vladimir Karputov :

Kod örneği:

Sonuç:


Gördüğünüz gibi, bir tef ile dans etmeden sessizce kopyalanır.

Kod örneği. Göstergeye dayalı. Gösterge, arabellek açma işleminde devreye giriyor.

 #property copyright "Copyright 2019"
#property link        ""
#property version    "1.00"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    0

//---

input int                   MA_period = 12 ;
input int                   MA_shift = 5 ;
input ENUM_MA_METHOD        MA_method = MODE_SMA ;
input ENUM_APPLIED_PRICE    MA_applied_price = PRICE_CLOSE ;

int start_pos = 0 ;

//---

double MA_Calc_Buf[];

int hMA = INVALID_HANDLE ;


int OnInit ()
{
   SetIndexBuffer ( 0 , MA_Calc_Buf, INDICATOR_CALCULATIONS ); 
   ArraySetAsSeries (MA_Calc_Buf, true );
 
  hMA = iMA ( NULL , 0 , MA_period, MA_shift, MA_method, MA_applied_price);   
   if (hMA == INVALID_HANDLE )
  {
     int LErr = GetLastError ();
     PrintFormat ( "iMA create failed (%d)" , LErr);
     return ( INIT_FAILED );
  }
 
   return ( INIT_SUCCEEDED );
}

void OnDeinit ( const int reason)
{
   if (hMA != INVALID_HANDLE )
  {
     IndicatorRelease (hMA);
    hMA = INVALID_HANDLE ;
  }
}

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 copied;
  copied = CopyBuffer (hMA, 0 , start_pos, rates_total, MA_Calc_Buf);
   if (copied == - 1 )
  {
     int LErr = GetLastError ();
     PrintFormat ( "CopyBuffer(hMA) failed (%d)" , LErr);
     return (prev_calculated);
  }
 
   if (copied == 0 )
  {
     PrintFormat ( "CopyBuffer(hMA) copied 0 bars" );
     return (prev_calculated);
  } 
 
   string text = "" ;
   for ( int i= 0 ; i< 15 ; i++)
    text = text + IntegerToString (i) + ": " + DoubleToString (MA_Calc_Buf[i], Digits ()+ 1 ) + "\n" ;
 
   Comment (text);

   return (rates_total);
}

start_pos = 0 olduğunda, 5. pozisyonda grafiğin 0. çubuğuna karşılık gelen değeri görüyoruz. 1.017041 Expert Advisor'da sıfır konumundadır. TAMAM.


Ama bu değeri sıfır konumunda almam gerekiyor.

start_pos = 5 olarak ayarladım. İstediğim sonucu alamadım. Yine istenilen değer 5. konumdadır.


start_pos = -5 olarak ayarladım. İstenen sonucu almıyorum. Yine istenilen değer 5. konumdadır.


start_pos = -10 olarak ayarladım. Ve şimdi istenen sonucu alıyorum.


 
RickD :

Kod örneği. Göstergeye dayalı. Gösterge, arabellek açma işleminde devreye giriyor.

start_pos = 0 olduğunda, 5. pozisyonda grafiğin 0. çubuğuna karşılık gelen değeri görüyoruz. 1.017041 Expert Advisor'da sıfır konumundadır. TAMAM.


Ama bu değeri sıfır konumunda almam gerekiyor.

start_pos = 5 olarak ayarladım. İstediğim sonucu alamadım. Yine istenilen değer 5. konumdadır.


start_pos = -5 olarak ayarladım. İstenen sonucu almıyorum. Yine istenilen değer 5. konumdadır.


start_pos = -10 olarak ayarladım. Ve şimdi istenen sonucu alıyorum.


Bir danışmandan ve bir göstergeden çalışırken farkı anlamanız gerekir. Göstergeden çalışmak için yardımdaki örneği kullanın ( iMA ).

Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov :

Bir danışmandan ve bir göstergeden çalışırken farkı anlamanız gerekir. Göstergeden çalışmak için yardımdaki örneği kullanın ( iMA ).

Yani iMA yardımından örneği alıyorsunuz, ekleyin

   ArraySetAsSeries (iMABuffer, true );
   comm = ( string ) DoubleToString (iMABuffer[ 0 ], Digits ());
   ArraySetAsSeries (iMABuffer, false );

   Comment (comm);   

ve değerin Uzman Danışmanınız tarafından verilen değerden tam olarak ma_shift çubukları ile farklı olduğundan emin olun.

Array_ma[0]'daki uzmanda olduğu gibi iMABuffer[0]'daki göstergedeki değeri almam gerekiyor.

En azından şu anda CopyBuffer'ın Uzman Danışmanlar ve göstergeler için davranışının farklı olduğu görülebilir. Bir Uzman Danışmandan ve bir göstergeden çalışırken CopyBuffer arasındaki farkı anlıyorsanız, lütfen çalışma için belgelerin ilgili bölümüne gelin.

 

Soruyu basitleştirmeye çalışacağım. Bu MA değerlerini göstergedeki tampona nasıl alabilirim (kırmızı dikey çizgiden başlayarak ve sola doğru)? Bir örnek yazabilir misin?


 
RickD :

Soruyu basitleştirmeye çalışacağım. Bu MA değerlerini göstergedeki tampona nasıl alabilirim (kırmızı dikey çizgiden başlayarak ve sola doğru)? Bir örnek yazabilir misin?


Ekranda, arabellek ekranı beş çubuk sağa kaydırılır. Öyleyse, gösterge arabelleğinin beşinci çubuğunu (indeks 4 ile) ve soldaki listenin daha aşağısında almak için, nereden alınmaları gerekir? Tampondan[4] ve daha sola.

Teoride. Uygulamada, uzun süredir gösterge kodunu açmadım ve neredeyse bir yıldır onlarla çalışmıyorum... Deneyin.

 
Artyom Trishkin :


Teoride. Uygulamada, uzun süredir gösterge kodunu açmadım ve neredeyse bir yıldır onlarla çalışmıyorum... Deneyin.

Beceri içemezsin.