Hatalar, hatalar, sorular - sayfa 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

Yukarıda Spread_of_symbols göstergesinin kodu var... Daha hızlı çalışması için yeniden yapmaya karar verdim... ve kod çıktı aşağıya bakın... veriler kopyalanmıyor... eğer kodda veriler varsa 0'dan değil, 1'den başlayarak kopyalandı, ardından gösterge çok hızlı çiziyor ancak aralık dışı hatası... kodda yanlış olan ne, aşağıya bakın...?

 #property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1   "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- input parameters
input string symbol1= "AUDUSD" ;
input string symbol2= "NZDUSD" ;
input double mass_of_symbol1= 1 ;
input double mass_of_symbol2= 1 ;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double         ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,ind1, INDICATOR_DATA );
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ArraySetAsSeries (time, true ); ArraySetAsSeries (open, true ); ArraySetAsSeries (high, true ); ArraySetAsSeries (low, true );
   ArraySetAsSeries (close, true ); ArraySetAsSeries (tick_volume, true ); ArraySetAsSeries (volume, true ); ArraySetAsSeries (spread, true );

   ArraySetAsSeries (ind1, true );
   MqlRates rates1[]; ArraySetAsSeries (rates1, true );
   MqlRates rates2[]; ArraySetAsSeries (rates2, true );
   
   int to_copy;
   if (prev_calculated>rates_total || prev_calculated< 0 ) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
       if (prev_calculated> 0 ) 
      to_copy++;   
     }
   if ( CopyRates (symbol1, 0 , 0 ,to_copy,rates1)<= 0 )
     {
       Print ( "Данные по первому символу не скопированы, ошибка  " , GetLastError ());
       return ( 0 );
     }
   if ( CopyRates (symbol2, 0 , 0 ,to_copy,rates2)<= 0 )
     {
       Print ( "Данные по второму символу не скопированы, ошибка " , GetLastError ());
       return ( 0 );
     }
   if (prev_calculated<rates_total)
     {
     int limit;
   if (prev_calculated== 0 )
      limit= 0 ;
   else limit=prev_calculated- 1 ;
   for ( int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return (rates_total);
  }
 
FinEngineer :
MQL5 Referans / Zaman Serileri ve Göstergeler Erişimi / Veri Erişimini Düzenlemeye bir göz atın
 
FinEngineer : ancak aralık dışı hatası... kodda yanlış olan ne, aşağıya bakın...?
to_copy ve limit değişkenlerinin değerlerinin birbirine nasıl karşılık geldiğini görün.
 
Görselleştirme modunda, iki sembol üzerinde işlem yaparken, aynı anda anlaşmaları kapattıktan sonra, yalnızca Expert Advisor'ın başlatıldığı sembolün verileri geçmişe girer. Başka bir sembolden, veriler ancak aşağıdaki işlemlerin açılmasından sonra geçmiş sekmesine gelir. Sonuç olarak, ticaret ve geçmiş sekmelerindeki verilerin farklı olduğu bir zaman dilimi vardır.
 
JF 0 İşlemler 19:31:10 '***': #3694236 numaralı siparişi iptal et stop 1.10 AUDJPY.m at 95.679
DS 0 İşlemler 19:31:10 '***': #3694238 numaralı siparişi iptal et limiti 1.10 AUDJPY.m at 93.876
DH 0 İşlemler 19:31:10 '***': #3694237 numaralı siparişi iptal et stop 0.36 AUDJPY.m at 95.679
FI 0 İşlemleri 19:31:10 '***': #3694239 numaralı siparişi iptal et limiti 0.36 AUDJPY.m at 93.876
FP 0 İşlemler 19:31:10 '***': #3694236 numaralı siparişi iptal et stop 1.10 AUDJPY.m at 95.679 tamamlandı
QE 0 İşlemler 19:31:11 '***': #3694238 numaralı siparişi iptal et limiti 1.10 AUDJPY.m at 93.876 tamamlandı
CG 0 İşlemler 19:31:11 '***': #3694237 numaralı siparişi iptal et stop 0.36 AUDJPY.m 95.679'da tamamlandı
OL 0 İşlemler 19:31:11 '***': #3694239 numaralı siparişi iptal et limiti 0.36 AUDJPY.m at 93.876 tamamlandı

Dergiye göre bekleyen dört emir çabucak gitmiş gibi görünüyor. Ancak OnTradeTransaction'da cevaplar geldi, 15 saniye içinde bir yerde, bu süre zarfında düzenli olarak tikler geldi.

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 sl sil _ OnTrade BEKLEMEDE id=84 m=3 b/s=SAT Err=Sipariş tamamlandı
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 tp sil _ OnTrade BEKLEMEDE id=85 m=3 b/s=SAT Err=Sipariş tamamlandı
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 sl sil _ OnTrade BEKLEMEDE id=86 m=3 b/s=SAT Err=Sipariş tamamlandı
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 tp sil _ OnTrade BEKLEMEDE id=87 m=3 b/s=SAT Err=Sipariş tamamlandı

Gerçi burada da tuhaf bir şey var

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= Anlaşma kapat/ters fiyat=95.648 m=3 b/s=SAT ... ==>OrderSendAsync'den önceki süre
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 durum 8(gerçek) m=3 b/s=SAT Err=Sipariş verildi ==> OrderSendAsync uygulamasından sonra 3 sn biraz fazla gibi görünüyor.

Not: Expert Advisor'ın yürütülmesinde frenler vardı, ancak OnTradeTransaction paketlerinin kuyrukta ne kadar süreyle tutulabileceği ilginçtir.

 
fyords :

Yardımdan:

MQL5 Referansı / Standart Kitaplık / Paneller ve Diyaloglar Oluşturma Sınıfları / CWnd / StateFlagsSet

Hangi özellikler?

StateFlagsSet bir özellik değil, bir durumdur. Grup durumu değiştirme yöntemi. Biraz daha yüksek, bireysel durum bayraklarını değiştirme yöntemleri.

Ayrı ayrı kullanın.

 

"Veri erişimi organizasyonuna" baktım, verileri pompalayan ve her şeyi anlayan bir komut dosyası örneğine baktım, aşağıdaki sorular ortaya çıktı:

1. OnInit işlevindeki göstergeye neden bu kodu yazamıyorum ki, başladığında gösterge geçmişi kendisine indirip zaman serilerini hazırlasın? Expert Advisor'da böyle bir çek yazabilir miyim?  

2. Aşağıdakiler için ne sıklıkla benzer bir kontrol yapmanız gerekir: 1 Uzman Danışman, 2 gösterge? Geçmişi ve zaman serisini sadece bir kez kopyalamaya hazırlarsam, ileride kopyalama yaparken herhangi bir hata olmaz mı? Yoksa her seferinde veya periyodik olarak tarih ve zaman serilerinin hazır olup olmadığını kontrol etmem gerekecek mi?

3. Bu kontrol yalnızca birden fazla zaman çerçevesi ve sembol kullanan göstergeler ve Uzman Danışmanlar için mi gerekli, yoksa hepsinde mi isteniyor?

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Sayfalama işlemleri eşzamansızdır ve göstergenin veri bekleme hakkı yoktur. Bu nedenle, İnternette talep edebilirsiniz, hiçbir durumda beklemeyin ve yavaşlamayın ve yalnızca varlığı kontrol edin ve hesaplayın.

Lütfen dikkat - göstergenin bekleme veya döngü yapma hakkı yoktur, aksi takdirde sonraki göstergelerin hesaplanmasını öldürür.
 
Renat :
Sayfalama işlemleri eşzamansızdır ve göstergenin veri bekleme hakkı yoktur. Bu nedenle, İnternette talep edebilirsiniz, hiçbir durumda beklemeyin ve yavaşlamayın ve yalnızca varlığı kontrol edin ve hesaplayın.

Lütfen dikkat - göstergenin bekleme veya döngü yapma hakkı yoktur, aksi takdirde sonraki göstergelerin hesaplanmasını öldürür.

1 Peki, daha sonra verileri nerede sayfalayabilirim? Bir çift şaft sepetinin olacağı bir gösterge yapmak istersem, birçok sembol ... her biri için verileri kontrol etmek ve yüklemek gerekli olacak ... bir komut dosyası çalıştırmalı mıyım? gösterge ya da ne? Neden bir gösterge sonrakilerin hesaplamalarını öldürüyor? Sonraki göstergelerde BarsCalculated (indicator1_Handle) aracılığıyla önceki göstergenin hesaplanması için bir kontrol kullanmak, kendi başına saymasına ve verileri pompalamasına izin vermek yeterlidir, yoksa yanılıyor muyum?

2 Ve farklı nitelikte başka bir soru, init işlevinde gösterge tanıtıcısını bildirdiğimde hesaplanmaya başlıyor mu? Yoksa kopyalama emrini vermeden önce mi düşünülmeye başlanıyor?

Neden: