Fehler, Irrtümer, Fragen - Seite 1343

 
StrategyTester:

Hallo.

Frage zum MT5 und seinem Tester.

Ich habe einen selbstgeschriebenen Multicurrency Expert Advisor, der einige Verhältnisse zwischen zwei Währungspaaren berechnet. Beim Testen und Debuggen habe ich ein Problem festgestellt: Im Terminal ist zu einem bestimmten Zeitpunkt die Zeile "A" höher als die Zeile "B", während im Strategy Tester zum gleichen Zeitpunkt und mit den gleichen Indikatoreinstellungen bei eingeschalteter Visualisierung die Zeile "A" niedriger ist als die Zeile "B". Und überhaupt: Das Aussehen der Indikatorlinien im Terminal unterscheidet sich grundlegend von dem im Strategy Tester. Frage: Ist dies eine Störung des MT5-Testers oder ein Fehler im Code?


Zur Klarstellung: Ich sehe eine Neuzeichnung des Indikators.

 
Karputov Vladimir:
Der Indikator wird immer so gezeichnet, wie er im Terminal dargestellt ist. Vielleicht müssen Sie im Testprogramm mehrere Modi ausprobieren (alle Ticks, mathematische Preise usw.).
Ich habe "Alle Ticks", "OHLC auf M1" und "Nur Eröffnungskurse" ausprobiert. Das Ergebnis ist das gleiche - der Indikator wird neu gezeichnet. Die Option"Mathematische Berechnungen" ist nicht aktiv, nicht verfügbar.
 
StrategyTester:
Versucht "Alle Ticks", "OHLC auf M1", "Nur Eröffnungskurse". Das Ergebnis ist das gleiche - der Indikator wird neu gezeichnet. Die Option"Mathematische Berechnungen" ist nicht aktiv, nicht verfügbar.
In diesem Fall bitte ich Sie, mir den Code mitzuteilen.
 

Frage an die Entwickler: Unter welchen Bedingungen wird die Historie des Symbols als unsynchronisiert betrachtet, d. h. SeriesInfoInteger(Symbol, Zeitraum, SERIES_SYNCHRONIZED) liefert false?

Der Punkt ist, dass ich gelegentlich auf eine Situation stoße, in der falsche Werte für ein bestimmtes Symbol in allen Zeitrahmen zurückgegeben werden, obwohl es eine Historie für dieses Symbol gibt (Bars und andere Funktionen geben Nicht-Null-Werte zurück). Was kann der Grund sein?

 

Es gibt auch ein solches Problem. Beim Auslesen der Historie für mehrere Symbole / Timeframes im Indikator durch CopyTime, CopyClose, etc. blinkt der Indikator oft.Dies ist nicht das Ergebnis des Renderings (es findet keine Neuberechnung der Balken statt), sondern das gesamte Bild verschwindet für einen Bruchteil einer Sekunde und erscheint dann wieder. Und manchmal nicht für Bruchteile, sondern für ganze Sekunden. Normalerweise wird dies beim Scrollen des Diagramms beobachtet. Wenn die angeforderte Zeitreihe klein ist, tritt das Problem nicht auf.

Ich würde gerne von den Entwicklern erfahren, wie dies zusammenhängen könnte.

 
Karputov Vladimir:
In diesem Fall geben Sie bitte den Code an.

Ich füge eine Illustration der Unterschiede zwischen dem Terminal und dem Tester sowie den Code des Indikators bei.

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

Im Allgemeinen werden bei Funktionen

Copy

andere Probleme haben,

Ich stieß auf die Tatsache, dass, wenn diese Funktion aufgerufen wird, kann es "einfrieren" die EA, ich schrieb ein Programm mit einer großen Anzahl von Symbolen und tat Berechnungen auf die Geschichte für buchstäblich die letzten 3 Tage auf jedes Symbol,

Ich hatte immer wieder Momente, in denen sich alles für ein paar Minuten aufgehängt hat, ich habe kaum herausgefunden, dass es die Kopierfunktion war. 150-200 Symbole konnte die Funktion sicher verarbeiten, dann hat sie sich aufgehängt, hängt sich bei verschiedenen Symbolen auf ...

Die Hängezeit reichte von 5 Sekunden bis zu 2-3 Minuten...

 
Kopierfunktionen in EAs sind synchron und erwarten ein Paging der Daten, wenn diese nicht verfügbar sind.
 
StrategyTester:

Ich füge eine Illustration der Unterschiede zwischen dem Terminal und dem Tester sowie den Code des Indikators bei.

Es liegt ein Fehler in der Funktion vor:

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

Sie versuchen in aller Eile, die Daten eines anderen Symbols zu kopieren. Sie sollten dies nicht tun. Die Daten müssen zunächst heruntergeladen, aufbereitet und überprüft werden... Hier ist die Beschreibung:Organisation des Datenzugriffs

 
Karputov Vladimir:

Es liegt ein Fehler in der Funktion vor:

Sie versuchen, die Daten eines anderen Charakters in aller Eile zu kopieren. Das ist nicht der richtige Weg. Die Daten müssen zunächst geladen, aufbereitet und sichergestellt werden... Hier ist die Beschreibung:Organisation des Datenzugriffs

Danke für den Hinweis. Ich werde es mir ansehen.
Grund der Beschwerde: