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

 
Vitaly Muzichenko # :


İşte bunu yapmanın en iyi yolu.
 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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 H= 100 ;
   double b, a;
   if (prev_calculated== 0 ) {
     ArrayInitialize (Buffer1, EMPTY_VALUE );
     ArrayInitialize (Buffer2, EMPTY_VALUE );
  }

  b= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
  a= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

   if (rates_total-prev_calculated== 1 ) {
    Buffer1[H+ 1 ]= EMPTY_VALUE ;
    Buffer2[H+ 1 ]= EMPTY_VALUE ;
  }
   else if (rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
     for ( int j=H; j> 0 ; j--) { 
      Buffer1[j]=Buffer1[j- 1 ];
      Buffer2[j]=Buffer2[j- 1 ];
    }
  }
   // записываем новые данные
  Buffer1[ 0 ]=b;
  Buffer2[ 0 ]=a;
   return (rates_total);
}
 
JRandomTrader bir halka arabelleği olarak kullanırsanız, ilk öğenin geçerli konumunu hatırlıyor musunuz?

Dahi fikir! Kim icat etti ve pratik uygulaması nedir? Sadece sürgülü pencere çizelgeleri için kullanıldığından şüpheliyim ...

 
Mihail Matkovskij # :

Dahi fikir! Kim icat etti ve pratik uygulaması nedir? Sadece sürgülü pencere çizelgeleri için kullanıldığından şüpheliyim ...

Doğru, ne kadar verinin geri alınabileceğini bilmek gereksiz olmayacak. Çünkü bu halka tampon, sınırlı uzunluğu nedeniyle "kendi topuklarının üzerinde adım atıyor"...

 
Mihail Matkovskij # :
İşte bunu yapmanın en iyi yolu.

Kontrol edildi, evet bu iyi bir karar - kaldı.

Ama yine de ArrayCopy'nin çalışmasını kontrol etmek istiyorum.

---

Bu şekilde yapmaya karar verdim, aksi takdirde grafik güzel bir şekilde bozulmaz:

 #property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots    2
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrDodgerBlue
#property indicator_label1    "Bid"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrRed
#property indicator_label2    "Ask"

double Buffer1[];
double Buffer2[];
int H;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit ()
{
   SetIndexBuffer ( 0 ,Buffer1);
   ArraySetAsSeries (Buffer1, true );
   SetIndexBuffer ( 1 ,Buffer2);
   ArraySetAsSeries (Buffer2, true );
   ArrayInitialize (Buffer1, EMPTY_VALUE );
   ArrayInitialize (Buffer2, EMPTY_VALUE );
   IndicatorSetInteger ( INDICATOR_DIGITS , Digits ());
   IndicatorSetString ( INDICATOR_SHORTNAME , "Tick:" );
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
{
  H=( int ) ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );
   if (prev_calculated== 0 ) {
     ArrayInitialize (Buffer1, EMPTY_VALUE );
     ArrayInitialize (Buffer2, EMPTY_VALUE );
  }

   double b= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
   double a= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );

   if (rates_total-prev_calculated== 1 ) {
    Buffer1[H+ 1 ]= EMPTY_VALUE ;
    Buffer2[H+ 1 ]= EMPTY_VALUE ;
  } else if (rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала)
     for ( int j=H; j> 0 ; j--) {
      Buffer1[j]=Buffer1[j- 1 ];
      Buffer2[j]=Buffer2[j- 1 ];
    }
  }
// записываем новые данные
  Buffer1[ 0 ]=b;
  Buffer2[ 0 ]=a;
   return (rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,         // идентификатор события
                   const long & lparam,   // параметр события типа long
                   const double & dparam, // параметр события типа double
                   const string & sparam   // параметр события типа string
                 )
{
   if (id== CHARTEVENT_CHART_CHANGE ) {
    H=( int ) ChartGetInteger ( 0 , CHART_FIRST_VISIBLE_BAR );
     int B= Bars ( Symbol (), 0 );
     for ( int j=H; j<B; j++) {
      Buffer1[j]= EMPTY_VALUE ;
      Buffer2[j]= EMPTY_VALUE ;
    }
  }
}
//+------------------------------------------------------------------+
 
JRandomTrader bir halka arabelleği olarak kullanırsanız, ilk öğenin geçerli konumunu hatırlıyor musunuz?

Vitaly'nin örneği bu fikri kullanabilir. Ama yine de döngüden kurtulamazsınız (ki bu onun için kritiktir). Her iki durumda da, bir döngü kullanarak veya ArrayCopy işlevini kullanarak halka arabelleğinden gösterge arabelleğine veri aktarmanız gerekecektir. Ve ne değişecek?

 
Mihail Matkovskij # :

Dahi fikir! Kim icat etti ve pratik uygulaması nedir? Sadece sürgülü pencere çizelgeleri için kullanıldığından şüpheliyim ...

Kim buldu - bulunacak bir son yok, bence birçok kez yeniden icat edildi, fikir oldukça açık.

Örneğin, diğer şeylerin yanı sıra, geçmişte depolanmayan, ancak yalnızca anlık bir değeri olan verilerin hareketli ortalamasını hesaplamak için kullanıyorum.

Veri iletiminde bu çok eski zamanlardan beri kullanılmaktadır.

 
Mihail Matkovskij # :

Vitaly'nin örneği bu fikri kullanabilir. Ama yine de döngüden kurtulamazsınız (ki bu onun için kritiktir). Her iki durumda da, bir döngü kullanarak veya ArrayCopy işlevini kullanarak halka arabelleğinden gösterge arabelleğine veri aktarmanız gerekecektir. Ve ne değişecek?

Yeni bir değer ekleyebilir ve hemen doğru yerden kopyalayabilirsiniz. Bir kopyalama döngüsü kalır, ancak kaydırma döngüsü yoktur.

 
Vitaly Muzichenko # :

Kontrol edildi, evet bu iyi bir karar - kaldı.

Ama yine de ArrayCopy'nin çalışmasını kontrol etmek istiyorum.

ArrayCopy'yi kullanarak yalnızca başka bir diziden veri aktarabilirsiniz. Ama onları hareket ettiremezsiniz. Bir halka arabelleği kullanabilir ve ondan veri aktarabilirsiniz... Ama ArrayCopy ile nasıl yapılır, dairesel bir hareketi varsa... Belli değil. Ve prensip olarak, bunu anlamanıza gerek yok. Bir döngü kullanan olağan ofset, hız açısından çok kritik değildir. En azından daha hızlı bir şey bilmiyorum. Daha hızlı ne olabilir, sadece montajcı mı? ... Genel olarak. her şeyi olduğu gibi bırakın. Çalışacak.

 
JRandomTrader # :

Yeni bir değer ekleyebilir ve hemen doğru yerden kopyalayabilirsiniz. Bir kopyalama döngüsü kalır, ancak kaydırma döngüsü yoktur.

Bana bir örnek ver, konuyla ilgili olacak

Yükseltme kodu mevcut

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2022.02.13
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Mihail Matkovskij # :

ArrayCopy'yi kullanarak yalnızca başka bir diziden veri aktarabilirsiniz. Ama onları hareket ettiremezsiniz. Bir halka arabelleği kullanabilir ve ondan veri aktarabilirsiniz... Ama ArrayCopy ile nasıl yapılır, dairesel bir hareketi varsa... Belli değil. Ve prensip olarak, bunu anlamanıza gerek yok. Bir döngü kullanan olağan ofset, hız açısından çok kritik değildir. En azından daha hızlı bir şey bilmiyorum. Daha hızlı ne olabilir, montajcı? ... Genel olarak. her şeyi olduğu gibi bırakın. Çalışacak.

Şimdi kod çalışıyor, ancak döngü nedeniyle hız konusunda şüpheler var.

O ne olacak?

Arbitraj olasılığı için birkaç mutfağı kontrol etmek istiyorum, gösterge değerlerdeki farkı çizecek, her 100ms'de bir zamanlayıcıda çalışıyor. Kod yürütme gecikmeleri bu durum için kritik öneme sahiptir.

Neden: