Erreurs, bugs, questions - page 54

 

Il serait bien de nous donner à tous un exemple d'indicateur qui fonctionne bien sur le graphique et dans le testeur.

J'ai modifié ma version, maintenant les valeurs de l'indicateur sur le graphique correspondent à l'historique mais pas les valeurs dans le testeur.

Qu'est-ce que j'ai fait de mal ?

#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);
  }
//+------------------------------------------------------------------+

Et le conseiller expert

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;
  }
Dossiers :
proverka.mq5  4 kb
prover__1.mq5  1 kb
 

Donc je suis de retour à mes anciennes habitudes)

Si vous obtenez les valeurs de l'indicateur par le biais du testeur, elles seront différentes des valeurs de l'indicateur et des données historiques.

Pour vérifier, exécutons prover.mq5 du 01.07.2010 sur EURUSD pour la période M1, regardons le log et voyons les prix réels.

 

Bonjour, je ne comprends pas la fonction SymbolInfoSessionTrade(), ou plutôt les deux derniers paramètres - début de session et fin de session. Je peux lire dans l'aide :


Permet d'obtenir l'heure de début et l'heure de fin de la session de négociation spécifiée pour un symbole et un jour de la semaine donnés.

Il s'avère que pour connaître l'heure de début et de fin d'une session de négociation, je dois déjà connaître l'heure de début et de fin de la session de négociation (en secondes) - ce qui n'est pas cohérent.

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

Bonjour, je n'arrive pas à comprendre la fonction SymbolInfoSessionTrade(), plus précisément les deux derniers paramètres - début et fin de session. J'ai lu dans l'aide :

Dans ces paramètres, la fonctionSymbolInfoSessionTrade() passe des variables qui enregistreront l'heure de début et de fin.

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

Au fait, il y a une erreur dans l'aide :

uintsession_index,// nom du symbole

 
ddd06:

Dans ces paramètres de la fonctionSymbolInfoSessionTrade(), on passe des variables dans lesquelles les heures de début et de fin seront écrites.

Merci, je l'ai eu.
 

J'ai simplifié en obtenant une erreur.

Voici un conseiller expert qui copie les tableaux de prix CLOSE.

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;
  }

Exécutons prover.mq5 à partir du 01.07.2010 sur EURUSD pour la période M1, regardons le journal et voyons les prix réels.

De temps en temps, nous voyons des valeurs incorrectes

De plus, jusqu'à 01.00 le prix du GBPUSD est gelé à 1.49393, après cela il commence à courir.

Je souffre depuis un mois et je ne peux pas tester mon conseiller expert multi-devises.

 
ddd06:

J'ai simplifié en obtenant une erreur.

Voici un conseiller expert qui copie les tableaux de prix CLOSE.

Exécutons prover.mq5 à partir du 01.07.2010 sur EURUSD pour la période M1, regardons le journal et voyons les prix réels.

Et de temps en temps, nous voyons des valeurs incorrectes

De plus, jusqu'à 01.00 le prix du GBPUSD est gelé à 1.49393, après cela il commence à courir.

Je souffre de ce problème depuis un mois et je ne peux pas tester mon conseiller expert multi-devises.

Vous travaillez avec des valeurs actuelles sur une barre non finie.

Essayez ceci

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

Soit définir les séries temporelles des tableaux.

 
stringo:

Vous travaillez avec des valeurs actuelles sur une barre non finie.

Essayez comme ceci

Ou définissez les séries temporelles des tableaux.

Suite du site
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;
  }

Et vous refusez obstinément de répondre à la question de savoir pourquoi les citations sont au début.

Sur l'EURUSD, il semble avoir commencé à correspondre).

 

Si c'est le cas, alors vous devez conserver 2 tableaux de temps. Certaines fois, la copie provient de l'EURUSD, d'autres fois du GBPUSD.

 
stringo:

Si c'est le cas, alors vous devez conserver 2 tableaux de temps. Certains moments doivent être copiés à partir de l'EURUSD, d'autres à partir du GBPUSD.

Bien.

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;
  }

Je ne pense pas que ça devrait être comme ça, et toi ?