Hatalar, hatalar, sorular - sayfa 54

 

Evet, hepimize grafikte ve test cihazında normal şekilde çalışan bir gösterge örneği vermek güzel olurdu.

Sürümümü yeniden düzenledim, şimdi grafikteki gösterge değerleri geçmişle birleşiyor, ancak test cihazında herhangi bir değer yok.

Neyi yanlış yaptım?

 #property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1   "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- plot Label2
#property indicator_label2   "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2   1
//--- indicator buffers
double          I1Buffer[];
double          I2Buffer[];
int OnInit ()
  {
   SetIndexBuffer ( 0 ,I1Buffer, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,I2Buffer, INDICATOR_DATA );
   return ( 0 );
  }
int OnCalculate ( const int rates_total,       // размер входных таймсерий
                 const int prev_calculated,   // обработано баров на предыдущем вызове
                 const datetime & time[],     // Time
                 const double & open[],       // Open
                 const double & high[],       // High
                 const double & low[],         // Low
                 const double & close[],       // Close
                 const long & tick_volume[],   // Tick Volume
                 const long & volume[],       // Real Volume
                 const int & spread[])         // Spread
  {
   string Symbol_1= "EURUSD" ,Symbol_2= "GBPUSD" ;
   if (rates_total< 1 ) return ( 0 );
   double Arr1[],Arr2[];
   int end,rez0,rez1,rez_0,rez_1;
   datetime ld1[],ld2[];
   end= MathMin (( int ) SeriesInfoInteger (Symbol_1, 0 , SERIES_BARS_COUNT )- 1 ,( int ) SeriesInfoInteger (Symbol_2, 0 , SERIES_BARS_COUNT )- 1 );
   end= MathMin (end,rates_total-prev_calculated+ 1 );
   rez0= CopyClose (Symbol_1, PERIOD_CURRENT , 0 ,end, Arr1);
   rez_0= CopyTime (Symbol_1, PERIOD_CURRENT , 0 ,end, ld1);
   if (rez0==- 1 ){ Print ( "Ошибка копирования " ,Symbol_1, " " , GetLastError ()); return ( 0 );}
   if (rez0!=rez_0){ Print ( "Не сходятся цены с временем" ,Symbol_1, " " , GetLastError ()); return ( 0 );}
   rez1= CopyClose (Symbol_2, PERIOD_CURRENT , 0 ,end, Arr2);
   rez_1= CopyTime (Symbol_2, PERIOD_CURRENT , 0 ,end, ld2);
   if (rez1==- 1 ){ Print ( "Ошибка копирования " ,Symbol_2, " " , GetLastError ()); return ( 0 );}
   if (rez1!=rez_1){ Print ( "Не сходятся цены с временем" ,Symbol_2, " " , GetLastError ()); return ( 0 );}
   if (rez1!=rez0){ Print ( "Ошибка Синхронизации" ); return ( 0 );}
  
   ArraySetAsSeries (Arr1,true);
   ArraySetAsSeries (Arr2,true);
   ArraySetAsSeries (ld1,true);
   ArraySetAsSeries (ld2,true);
    
   int li=rates_total- 1 ;
   I1Buffer[li]=Arr1[ 0 ]+ 0.26 ;
   I2Buffer[li]=Arr2[ 0 ];
   li--;
  
   int shift1= 0 ,shift2= 0 ;  
   for ( int i= 1 ;i<end- MathMax (shift2,shift1);i++)
     {      
       if (time[li]==ld1[i+shift1])I1Buffer[li]=Arr1[i+shift1]+ 0.26 ;
       else if (time[li]>ld1[i+shift1]&&i!= 0 ){shift1--;I1Buffer[li]=I1Buffer[li+ 1 ];}
       else if (time[li]<ld1[i+shift1]&&i!= 0 ){shift1++;I1Buffer[li]=I1Buffer[li+ 1 ];}
            
       if (time[li]==ld2[i+shift2])I2Buffer[li]=Arr2[i+shift2];
       else if (time[li]>ld2[i+shift2]&&i!= 0 ){shift2--;I2Buffer[li]=I2Buffer[li+ 1 ];}
       else if (time[li]<ld2[i+shift2]&&i!= 0 ){shift2++;I2Buffer[li]=I2Buffer[li+ 1 ];}
      li--;
     }
   return (rates_total);
  }
//+------------------------------------------------------------------+

ve uzman

 int Handle;
int bars,i;
void OnInit ()
  {
   Handle= iCustom ( NULL , 0 , "proverka" );
  }

void OnTick ()
  {
   double    buf1[],buf2[];
   datetime time[];
//---
   if (bars== Bars ( _Symbol , _Period )) return ;
   bars= Bars ( _Symbol , _Period );
   CopyTime ( _Symbol , _Period , 0 , 2 ,time);
   if ( CopyBuffer (Handle, 0 , 0 , 2 ,buf1)< 0 || CopyBuffer (Handle, 1 , 0 , 2 ,buf2)< 0 ) Print ( "Ошибка копирования значений индикаторных буферов " , GetLastError (), "!!" );
   if (i> 100 ) return ;
   i++;
   Print ( "Время " + TimeToString (time[ 1 ],TIME_DATE|TIME_MINUTES), "   буф1-" ,buf1[ 1 ], "   буф2-" ,buf2[ 1 ]);
   return ;
  }
Dosyalar:
proverka.mq5  4 kb
prover__1.mq5  1 kb
 

Yani yine eskiye döndüm)

Test cihazı aracılığıyla gösterge değerleri alırsanız, bunlar gösterge değerlerinden ve geçmiş verilerden farklı olacaktır.

Kontrol etmek için, EURUSD dönemi M1 için 07/01/2010 tarihinden itibaren prover.mq5'i çalıştırın, günlüğe bakın ve gerçek fiyatlara bakın.

 

Merhaba, SymbolInfoSessionTrade() işlevini veya son iki parametreyi anlayamıyorum - oturum başlangıcı ve oturum sonu. Yardımda okudum:


Belirtilen sembol ve haftanın günü için belirtilen işlem seansının başlangıç ve bitiş saatini almanızı sağlar.

İşlem seansının başlangıç ve bitiş zamanını bulmak için, işlem seansının başlangıcını ve sonunu (ve saniye cinsinden) zaten bilmem gerektiği ortaya çıktı - bir tutarsızlık olduğu ortaya çıktı.

Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 
kirill190982 :

Merhaba, SymbolInfoSessionTrade() işlevini veya son iki parametreyi anlayamıyorum - oturum başlangıcı ve oturum sonu. Yardımda okudum:

Değişkenler, başlangıç ve bitiş zamanlarının yazılacağı SymbolInfoSessionTrade() işlevinin bu parametrelerine iletilir.

 void OnTick ()
  {
   datetime ld_start, ld_end;
   SymbolInfoSessionTrade(
   _Symbol ,     // имя символа
   MONDAY ,       // день недели
   0 ,           // Порядковый номер сессии
   ld_start,     // время начала сессии
   ld_end       // время окончания сессии
   );
   
   Print (ld_start, " - " ,ld_end);
  }

Bu arada, kılavuzda bir hata var:

uint                session_index , // sembol adı

 
ddd06 :

Değişkenler, başlangıç ve bitiş zamanlarının yazılacağı SymbolInfoSessionTrade() işlevinin bu parametrelerine iletilir.

Teşekkürler, anladım
 

Hatayı almayı basitleştirdim.

İşte CLOSE fiyatlarının dizilerini kopyalayan bir EA

 int bars,i;
void OnTick ()
  {
   if (bars== Bars ( _Symbol , _Period )) return ;
   bars= Bars ( _Symbol , _Period );
   if (i> 100 ) return ;
   i++;  
   datetime time[];  
   double Arr1[],Arr2[];
   CopyTime ( _Symbol , _Period , 0 , 2 ,time);
   CopyClose ( "EURUSD" , PERIOD_CURRENT , 0 , 2 , Arr1);
   CopyClose ( "GBPUSD" , PERIOD_CURRENT , 0 , 2 , Arr2);
   Print ( "Время " + TimeToString (time[ 1 ],TIME_DATE|TIME_MINUTES), "  mas1(EURUSD)-" ,Arr1[ 1 ], "   mas2(GBPUSD)-" ,Arr2[ 1 ]);
   return ;
  }

07/01/2010 tarihinden itibaren EURUSD dönemi M1 için prover.mq5'i piyasaya sürüyoruz, günlüğe bakın ve gerçek fiyatlara bakın

Ve bazen yanlış değerler vardır

Ayrıca 01.00'e kadar GBPUSD fiyatı 1.49393'te dondu, ardından koşmaya başladı.

Bir aydır acı çekiyorum ve çoklu para birimi danışmanımı test edemiyorum

 
ddd06 :

Hatayı almayı basitleştirdim.

İşte CLOSE fiyatlarının dizilerini kopyalayan bir EA

07/01/2010 tarihinden itibaren EURUSD dönemi M1 için prover.mq5'i piyasaya sürüyoruz, günlüğe bakın ve gerçek fiyatlara bakın

Ve bazen yanlış değerler vardır

Ayrıca 01.00'e kadar GBPUSD fiyatı 1.49393'te dondu, ardından koşmaya başladı.

Bir aydır acı çekiyorum ve çoklu para birimi danışmanımı test edemiyorum

Eksik bir çubuk üzerinde mevcut değerlerle çalışıyorsunuz.

böyle dene

 Print ( "Время " + TimeToString (time[ 0 ],TIME_DATE|TIME_MINUTES), "  mas1(EURUSD)-" ,Arr1[ 0 ], "   mas2(GBPUSD)-" ,Arr2[ 0 ]);

Veya dizi zaman serilerini ayarlayın.

 
stringo :

Eksik bir çubuk üzerinde mevcut değerlerle çalışıyorsunuz.

böyle dene

Veya dizi zaman serilerini ayarlayın.

devam ediyoruz
 int bars,i;
void OnTick ()
  {
   if (bars== Bars ( _Symbol , _Period )) return ;
   bars= Bars ( _Symbol , _Period );
   if (i> 100 ) return ;
   i++;  
   datetime time[];  
   double Arr1[],Arr2[];
   CopyTime ( _Symbol , _Period , 0 , 2 ,time);
   CopyClose ( "EURUSD" , PERIOD_CURRENT , 0 , 2 , Arr1);
   CopyClose ( "GBPUSD" , PERIOD_CURRENT , 0 , 2 , Arr2);
   Print ( "Время " + TimeToString (time[ 0 ],TIME_DATE|TIME_MINUTES), "  mas1(EURUSD)-" ,Arr1[ 0 ], "   mas2(GBPUSD)-" ,Arr2[ 0 ]);
   return ;
  }

Ve inatla alıntıların neden başında olduğunu cevaplamıyorsun.

EURUSD için, çakışmaya başladılar gibi görünüyor)

 

Buna gelirse, o zaman 2 dizi tutmanız gerekir. Bazı zamanlar EURUSD'den kopyalanır, diğerleri - GBPUSD'den

 
stringo :

Buna gelirse, o zaman 2 dizi tutmanız gerekir. Bazı zamanlar EURUSD'den kopyalanır, diğerleri - GBPUSD'den

İyi

 int bars,i;
void OnTick ()
  {
   if (bars== Bars ( _Symbol , _Period )) return ;
   bars= Bars ( _Symbol , _Period );
   if (i> 100 ) return ;
   i++;  
   datetime time1[],time2[];  
   double Arr1[],Arr2[];
   CopyTime ( "EURUSD" , _Period , 0 , 2 ,time1);
   CopyTime ( "GBPUSD" , _Period , 0 , 2 ,time2);
   CopyClose ( "EURUSD" , PERIOD_CURRENT , 0 , 2 , Arr1);
   CopyClose ( "GBPUSD" , PERIOD_CURRENT , 0 , 2 , Arr2);
   Print ( "Время EURUSD" + TimeToString (time1[ 0 ],TIME_DATE|TIME_MINUTES), "  Время GBPUSD" + TimeToString (time2[ 0 ],TIME_DATE|TIME_MINUTES), "    mas1(EURUSD)-" ,Arr1[ 0 ], "   mas2(GBPUSD)-" ,Arr2[ 0 ]);
   return ;
  }

Bence böyle olmamalı, değil mi?