Fehler, Irrtümer, Fragen - Seite 54

 

Es wäre schön, wenn Sie uns allen ein Beispiel für einen Indikator geben könnten, der auf dem Chart und im Tester gut funktioniert.

Ich habe meine Version geändert, jetzt stimmen die Indikatorwerte auf dem Chart mit der Historie überein, aber die Werte im Tester nicht.

Was habe ich falsch gemacht?

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

Und der Expert Advisor

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

Ich bin also wieder auf dem alten Weg)

Wenn Sie die Indikatorwerte über den Tester erhalten, unterscheiden sie sich von den Indikatorwerten und von den historischen Daten.

Um dies zu überprüfen, lassen wir prover.mq5 vom 01.07.2010 auf EURUSD für den Zeitraum M1 laufen, beobachten das Log und sehen die realen Preise.

 

Hallo, ich verstehe die Funktion SymbolInfoSessionTrade() nicht, bzw. die letzten beiden Parameter - Beginn der Sitzung und Ende der Sitzung. Ich kann in der Hilfe lesen:


Ermöglicht die Abfrage der Anfangs- und Endzeit einer bestimmten Handelssitzung für ein bestimmtes Symbol und einen bestimmten Wochentag.

Es stellt sich heraus, dass ich, um die Anfangs- und Endzeit einer Handelssitzung herauszufinden, bereits die Anfangs- und Endzeit der Handelssitzung (in Sekunden) kennen sollte - dies ist nicht konsistent.

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

Hallo, ich kann die Funktion SymbolInfoSessionTrade() nicht verstehen, genauer gesagt die letzten beiden Parameter - Sitzungsbeginn und Sitzungsende. Ich habe in der Hilfe gelesen:

In diesen Parametern übergibt die FunktionSymbolInfoSessionTrade() Variablen, die den Start- und Endzeitpunkt aufzeichnen.

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

Übrigens, in der Hilfe ist ein Fehler enthalten:

uintsession_index,// Symbolname

 
ddd06:

In diesen Parametern der FunktionSymbolInfoSessionTrade() werden Variablen übergeben, in die die Start- und Endzeiten geschrieben werden.

Danke, ich habe es verstanden.
 

Ich habe eine vereinfachte Fehlermeldung erhalten.

Hier ist ein Expert Advisor, der Arrays von CLOSE-Kursen kopiert

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

Führen wir prover.mq5 vom 01.07.2010 auf EURUSD für den Zeitraum M1 aus, beobachten wir das Protokoll und sehen wir uns die realen Preise an

Von Zeit zu Zeit sehen wir falsche Werte

Außerdem friert der Preis von GBPUSD bis 01.00 Uhr bei 1.49393 ein, danach beginnt er zu laufen.

Ich leide seit einem Monat und kann meinen Multicurrency Expert Advisor nicht testen

 
ddd06:

Ich habe eine vereinfachte Fehlermeldung erhalten.

Hier ist ein Expert Advisor, der Arrays von CLOSE-Kursen kopiert

Führen wir prover.mq5 vom 01.07.2010 auf EURUSD für den Zeitraum M1 aus, beobachten wir das Protokoll und sehen wir uns die realen Preise an

Und von Zeit zu Zeit sehen wir falsche Werte

Außerdem friert der Preis von GBPUSD bis 01.00 Uhr bei 1.49393 ein, danach beginnt er zu laufen.

Ich leide seit einem Monat unter diesem Problem und kann meinen Expert Advisor für mehrere Währungen nicht testen.

Sie arbeiten mit aktuellen Werten auf einem unvollendeten Balken.

Versuchen Sie dies

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

Oder legen Sie die Zeitreihen der Arrays fest.

 
stringo:

Sie arbeiten mit den aktuellen Werten eines unvollendeten Balkens.

Probieren Sie es so

Oder legen Sie die Zeitreihen der Arrays fest.

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

Und Sie weigern sich hartnäckig zu beantworten, warum die Anführungszeichen am Anfang stehen.

Auf EURUSD scheint es zu passen)

 

Wenn das der Fall ist, dann sollten Sie 2 Zeitfelder behalten. Manchmal wird vom EURUSD kopiert, manchmal vom GBPUSD.

 
stringo:

Wenn das der Fall ist, dann sollten Sie 2 Zeitfelder behalten. Einige Zeiten sollten von EURUSD kopiert werden, andere von GBPUSD

Nun.

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

Ich glaube nicht, dass es so sein sollte, Sie etwa?