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

 
C-4 :
"Ayarlamak" kelimesinden ne anlıyorsunuz? Mantisleri ondalık basamak sayısına göre normalleştir? - Bunun için NormalizeDouble işlevi vardır. Başka bir şey varsa, lütfen daha ayrıntılı olarak açıklayın.

Girişte herhangi bir pozitif çift, çıkışta bu enstrümanda olabilecek gerçek fiyata yuvarlanır.

Fiyat adımı 0,25 ise, 0,25'e yuvarlanır. Peki, şöyle:

 double RoundPrice( const double price)
{
   if (price<= 0 ) return (- 1 );
   double tick_size= SymbolInfoDouble ( Symbol (), SYMBOL_TRADE_TICK_SIZE );
   double p= round (price/tick_size);
   return ( NormalizeDouble (p*tick_size, _Digits ));
}

Ama aynı zamanda bir offset varsa (0,13; 0,38; 0,63; 0,88 gibi), o zaman dikkate alınır. Sonra:

girişte 1.0 çıkışta 1.13;

girişte 1.25 çıkışta 1.38;

1,5 ---> 1,63...

API düzeyinde, bu birkaç montajcı komutuna kodlanabilir ve bu kesinlikle temel bir işlevdir. onun olduğunu düşündüm

 
Canlı güncelleme yoluyla yeni bir yapıya nasıl güncellenir. Bu Canlı güncelleme nerede
 
Newalligator :
Canlı güncelleme yoluyla yeni bir yapıya nasıl güncellenir. Bu Canlı güncelleme nerede
MetaQuotes-Demo sunucusunda bir demo hesabı açmanız ve bu hesaptaki güncellemeleri kontrol etmek için periyodik olarak bağlanmanız gerekir. MetaQuotes-Demo sunucusunda bir demo hesabı nasıl açılır
 
Gerçek hayatta ticarete verdiğiniz yanıt için teşekkür ederiz ve her zaman MT5 etkindir. Programın kendisi güncellenmesi gerektiğini belirtiyorsa, bu iyidir, ancak değilse, bu Canlı güncelleme nerede?
 
Newalligator :
Gerçek hayatta ticarete verdiğiniz yanıt için teşekkür ederiz ve her zaman MT5 etkindir. Programın kendisi güncellenmesi gerektiğini belirtiyorsa, bu iyidir, ancak değilse, bu Canlı güncelleme nerede?
MetaQuotes-Demo demo sunucusundaki bir ticaret hesabına bağlanırken, MetaTrader terminali güncellemeleri kontrol eder. Bir güncelleme varsa, yeni sürümün otomatik olarak indirilmesi başlayacaktır.
 

Hepinize iyi günler! Böyle bir sorun vardı - Özel bir göstergede başka bir özel göstergenin okumalarını kullanamıyorum . Yanlış yaptığımdan neredeyse eminim ama yine de kodu göndereceğim:

 int OnCalculate ( const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if (rates_total < iPeriod ) {
       return ( 0 );
   }
   
   int first;
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1 ;
   }
      
   // Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom ( "EURUSD" , 0 , "Examples\\ROC" );   
   CopyBuffer (iRocHandleEURUSD, 0 , 0 , rates_total, aRocRatesEURUSD);

   for ( int bar = first; bar < rates_total; bar++) {

Burada, bu kodda, Değişim Oranı ( aRocRatesEURUSD) gösterge tamponu mevcut değildir. Neden - Bu göstergeyi doğru şekilde nasıl bağlayacağımı anlayamıyorum, lütfen çözmeme yardım edin?

 
jommerbot :

Hepinize iyi günler! Böyle bir sorun vardı - Özel bir göstergede başka bir özel göstergenin okumalarını kullanamıyorum . Yanlış yaptığımdan neredeyse eminim ama yine de kodu göndereceğim:

Burada, bu kodda, Değişim Oranı ( aRocRatesEURUSD) gösterge tamponu mevcut değildir. Neden - Bu göstergeyi doğru şekilde nasıl bağlayacağımı anlayamıyorum, lütfen çözmeme yardım edin?

Gösterge tutamaçları OnInit() içinde bildirilmelidir:

 //+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
// Пользовательский индикатор ROC для EURUSD   
   double aRocRatesEURUSD[];
   int iRocHandleEURUSD = iCustom ( "EURUSD" , 0 , "Examples\\ROC" );   
  }
Aksi takdirde, OnCalculate()'i her çağırdığınızda yeni bir özel gösterge oluşturduğunuz ortaya çıkar.
 
barabashkakvn :

Gösterge tanıtıcıları OnInit() içinde bildirilmelidir:

Bu da işe yaramıyor. Tamponlu dizi ya boş ya da sol değerlerle dolu.
 
jommerbot :
Bu da işe yaramıyor. Tamponlu dizi ya boş ya da sol değerlerle dolu.
Bununla birlikte, OnInit() içindeki gösterge tanıtıcılarının bildirilmesi doğrudur. Başka bir şey - neden her seferinde yeni bir onay işareti geldiğinde yazmanız gerekiyor (onCalculate() işlevi)
rates_total,       // размер входных таймсерий

arabelleğe almak

aRocRatesEURUSD

? Bu, terminali gerçekten yavaşlatabilir. Üstelik çok derin bir hikaye.

Göstergelerin ekonomik olarak yeniden hesaplanmasının ilkeleri makalesini okumanızın ilginç olacağını düşünüyorum.

Ayrıca OnCalculate() işlevindeki yardımı da okuyun.

 

Tamam, en basit durumda bile çalışmıyor:

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double ExtLineBuffer[];   
int iRocHandleEURUSD;  
int iPlotShift = 0 ;
int iPeriod = 6 ;
 
void OnInit () {
   SetIndexBuffer ( 0 , ExtLineBuffer, INDICATOR_DATA );
   PlotIndexSetInteger ( 0 , PLOT_SHIFT , iPlotShift);
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN , iPeriod - 1 );
   
   int iRocHandleEURUSD = iCustom ( "EURUSD" , 0 , "Examples\\ROC" );    
   if ( iRocHandleEURUSD == INVALID_HANDLE )
   {
       Print ( "Не удалось получить хендл индикатора ROC EURUSD" );  
   }
}

int OnCalculate ( const int rates_total, const int prev_calculated, const int begin, const double &price[]) {
   
   if (rates_total < iPeriod ) {
       return ( 0 );
   }
   
   int first;
   double aRocRatesEURUSD[]; 
   
   if ( prev_calculated == 0 ) {
      first = iPeriod + begin;
   } else {
      first = prev_calculated - 1 ;
   }
   
   for ( int bar = first; bar < rates_total; bar++) {
       CopyBuffer (iRocHandleEURUSD, 0 , bar, 1 , aRocRatesEURUSD);
       Print (aRocRatesEURUSD[ 0 ]);   
      ExtLineBuffer[ bar ] = NormalizeDouble (aRocRatesEURUSD[ 0 ], SYMBOL_DIGITS );
   }
     
   return (rates_total);
}

Hatam nerede anlamıyorum. EA ve komut dosyasında aynı göstergenin arabelleğini kopyalamak çalışır, ancak göstergede çalışmaz. Gösterge tutamacı hatasız olarak başlatılır.