Hatalar, hatalar, sorular - sayfa 1343

 
StrategyTester :

Merhaba.

MT5 ve Test Cihazı hakkında soru.

İki para birimi çifti arasındaki belirli oranları hesaplayan, kendi kendine yazılan çok para birimi göstergesini çağıran, kendi kendine yazılan çok para birimi Uzman Danışmanı vardır. Test etme ve hata ayıklama sürecinde bir sorun buldum: Terminalde zamanın bir noktasında "A" satırı "B" satırının üzerinde ve test cihazında aynı anda ve aynı gösterge ayarlarıyla görselleştirme açık, "A" satırı "B" satırının altında. Ve genel olarak: Terminaldeki gösterge çizgilerinin görünümü, Test Cihazındaki görünümden temel olarak farklıdır. Soru: Bu, MT5 Test Cihazında bir aksaklık mı yoksa koddaki hatalar mı?


Açıklığa kavuşturmama izin verin: gözlemlenen göstergenin yeniden çizilmesidir.

 
Karputov Vladimir :
Gösterge her zaman terminalde olduğu gibi çizilir. Belki de test cihazında birkaç modu denemeniz gerekir (tüm işaretler, matematiksel fiyatlar vb.).
"Tüm işaretler", "M1'de OHLC", "Yalnızca açık fiyatlar" denedim. Sonuç aynı - gösterge yeniden çizilir. " Matematik Hesaplamaları " seçeneği aktif değil, mevcut değil.
 
StrategyTester :
"Tüm işaretler", "M1'de OHLC", "Yalnızca açık fiyatlar" denedim. Sonuç aynı - gösterge yeniden çizilir. " Matematik Hesaplamaları " seçeneği aktif değil, mevcut değil.
Bu durumda, stüdyodaki kod.
 

Geliştiricilere soru: Sembole göre tarih hangi koşullar altında senkronize edilmemiş olarak kabul edilir, yani. SeriesInfoInteger (sembol, nokta, SERIES_SYNCHRONIZED) false döndürür mü?

Gerçek şu ki, zaman zaman bir geçmiş olmasına rağmen, bazı semboller için false tüm zaman dilimleri için sürekli olarak döndürülen bir durumum var (Çubuklar ve diğer işlevler sıfır olmayan değerler döndürür). Nedeni ne olabilir?

 

Ve başka bir sorun. Belki birileri de tanışır. CopyTime, CopyClose vb. aracılığıyla çeşitli semboller/zaman çerçeveleri için geçmişi okurken göstergede. göstergesi sık sık yanıp söner. Bu bir çizim sonucu değildir (burada çubuklar yeniden hesaplanmaz), ancak tüm görüntü bir saniyeden kısa bir süre için kaybolur ve ardından yeniden görünür. Ve bu kesirler için değil, bütün saniyeler için olur. Bu genellikle grafiği kaydırırken görülür. İstenen zaman serileri az ise sorun oluşmaz.

Geliştiricilerin bunun nasıl bağlanabileceğine dair yorumlarını duymak isterim.

 
Karputov Vladimir :
Bu durumda, stüdyodaki kod.

Terminal ve test cihazı ve gösterge kodundaki farklılıkların bir resmini ekliyorum.

 //+------------------------------------------------------------------+
//|                                             Indicator1_6test.mq5 |
//+------------------------------------------------------------------+
#property copyright ""
#property link        ""
#property version    "1.6"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_color1 SkyBlue
#property indicator_color2 Yellow
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
//---
enum TT{_close= 0 ,_open= 1 ,_high= 2 ,_low= 3 };
//---
input string activ1= "GBPUSD" ,activ2= "EURUSD" ;
input TT PriceType=_close;
input int Len= 100 ;
//---
double ratio[],avr[]; string NN[]={ "rr1" , "rr2" , "aa1" , "aa2" };
//---
void setv( int i, double v){ ObjectSetDouble ( 0 ,NN[i], OBJPROP_PRICE ,v);}
//---
int OnInit ()
{
   SetIndexBuffer ( 0 ,ratio);
   PlotIndexSetString ( 0 , PLOT_LABEL , "Ratio" );
   SetIndexBuffer ( 1 ,avr);
   PlotIndexSetString ( 1 , PLOT_LABEL , "Avr" );
   ArraySetAsSeries (ratio, 1 );
   ArraySetAsSeries (avr, 1 );
   for ( int i= 0 ;i< 4 ;i++) ObjectCreate ( 0 ,NN[i], 22 , 0 , 0 , 0 );
return ( INIT_SUCCEEDED );
}
//---
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= 0 ; double zz[ 4 ];

   if (prev_calculated== 0 ){limit= MathMin ( Bars (activ1, 0 ), Bars (activ2, 0 ));limit--;}
   else limit=rates_total-prev_calculated;
   if (limit== 0 )limit= 1 ;
   double Price1[],Price2[]; ArraySetAsSeries (Price1, 1 ); ArraySetAsSeries (Price2, 1 );
  getV(Price1,Price2,limit);
   for ( int i= 0 ;i<limit;i++){ if (Price1[i]> 0 &&Price2[i]> 0 )ratio[i]=Price1[i]/Price2[i]; else ratio[i]=ratio[i+ 1 ];}
  
   double sred= 0 ,sum= 0 ; 
   for ( int i= 0 ;i<limit;i++)
      {
      sred= 0 ;
      avr[i]=SimpleMA(i,Len,ratio);
      
       for ( int j=i;j<i+Len;j++)
        {
         if (j>= ArraySize (ratio)) break ;
       if (ratio[j]== 0 ||ratio[j]== EMPTY_VALUE ){sred= 0 ; break ;}
      sred= 1 ;
        }
      }
      
   if (prev_calculated!= 0 ) for ( int i= 0 ;i< 10 ;i++) if (ratio[i]== 0 )ratio[i]=ratio[i+ 1 ];
  
zz[ 0 ]=ratio[ 1 ];zz[ 1 ]=ratio[ 2 ]; zz[ 2 ]=avr[ 1 ];zz[ 3 ]=avr[ 2 ];
for ( int i= 0 ;i< 4 ;i++)setv(i,zz[i]);
return (rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV( double &Price1[], double &Price2[], int limit)
{
if (PriceType==_close){ CopyClose (activ1, PERIOD_CURRENT , 0 ,limit,Price1); CopyClose (activ2, PERIOD_CURRENT , 0 ,limit,Price2);}
if (PriceType==_open){ CopyOpen (activ1, PERIOD_CURRENT , 0 ,limit,Price1); CopyOpen (activ2, PERIOD_CURRENT , 0 ,limit,Price2);}
if (PriceType==_high){ CopyHigh (activ1, PERIOD_CURRENT , 0 ,limit,Price1); CopyHigh (activ2, PERIOD_CURRENT , 0 ,limit,Price2);}
if (PriceType==_low){ CopyLow (activ1, PERIOD_CURRENT , 0 ,limit,Price1); CopyLow (activ2, PERIOD_CURRENT , 0 ,limit,Price2);}
}
//---
double SimpleMA( const int position, const int period, const double &price[])
  {
//---
   double result= 0.0 ;
//--- check position
       //--- calculate value
       if (position+period+ 1 > ArraySize (price)) return ( 0 );
       for ( int i= 0 ; i<period; i++) result+=price[position+i];
      result/=period;
   return (result);
  }
//---
 

Genel olarak fonksiyonlarla

 Copy

başka problemler var

Bu fonksiyon çağrıldığında danışmanı "dondurabileceği" gerçeğiyle karşılaştım, çok sayıda sembol kullanarak bir program yazdım ve her bir sembol üzerinde kelimenin tam anlamıyla son 3 günün geçmişi hakkında hesaplamalar yaptım,

ve her şeyin birkaç dakikalığına kapandığı anlar oldu, bunların Kopyalama işlevleri olduğunu belirlemek zordu. Aynı zamanda, fonksiyon 150-200 karakteri sorunsuz bir şekilde işledi, sonra kapattı, farklı karakterlerde gezinme meydana geldi...

bekleme süresi 5 saniye ile 2-3 dakika arasında değişiyordu...

 
Expert Advisors'daki Kopyalama işlevleri senkronizedir ve eğer yoksa verilerin değiştirilmesini bekler.
 
StrategyTester :

Terminal ve test cihazı ve gösterge kodundaki farklılıkların bir resmini ekliyorum.

İşlevde hata:

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV( double &Price1[], double &Price2[], int limit)
  {
   if (PriceType==_close)
     {
       CopyClose (activ1, PERIOD_CURRENT , 0 ,limit,Price1);
       CopyClose (activ2, PERIOD_CURRENT , 0 ,limit,Price2);
     }
   if (PriceType==_open)
     {
       CopyOpen (activ1, PERIOD_CURRENT , 0 ,limit,Price1);
       CopyOpen (activ2, PERIOD_CURRENT , 0 ,limit,Price2);
     }
   if (PriceType==_high)
     {
       CopyHigh (activ1, PERIOD_CURRENT , 0 ,limit,Price1);
       CopyHigh (activ2, PERIOD_CURRENT , 0 ,limit,Price2);
     }
   if (PriceType==_low)
     {
       CopyLow (activ1, PERIOD_CURRENT , 0 ,limit,Price1);
       CopyLow (activ2, PERIOD_CURRENT , 0 ,limit,Price2);
     }
  }

Aceleyle başka bir karakterin verilerini kopyalamaya çalışıyorsunuz. Bunu yapamazsın. Veriler önce yüklenmeli, hazırlanmalı, doğrulanmalı... İşte bir açıklama: Verilere erişimi organize etme  

 
Karputov Vladimir :

İşlevde hata:

Aceleyle başka bir karakterin verilerini kopyalamaya çalışıyorsunuz. Bunu yapamazsın. Veriler önce yüklenmeli, hazırlanmalı, doğrulanmalı... İşte bir açıklama: Verilere erişimi organize etme  

Bahşiş için teşekkürler. İzleyeceğim.