Errori, bug, domande - pagina 1343

 
StrategyTester:

Salve.

Domanda su MT5 e il suo Tester.

Ho un Expert Advisor multicurrency scritto da me, che chiama un indicatore multicurrency scritto da me che calcola alcuni rapporti tra due coppie di valute. Durante i test e il debug ho trovato un problema: nel Terminale in un certo momento la linea "A" è più alta della linea "B", mentre nello Strategy Tester nello stesso momento e con le stesse impostazioni dell'indicatore con visualizzazione attivata, la linea "A" è più bassa della linea "B". E in generale: l'aspetto delle linee dell'indicatore nel Terminale è fondamentalmente diverso da quello dello Strategy Tester. Domanda: è un difetto del MT5 Tester o un errore nel codice?


Mi spiego meglio: sto vedendo un ridisegno dell'indicatore.

 
Karputov Vladimir:
Sempre l'indicatore è disegnato come nel terminale. Forse nel tester è necessario provare diverse modalità (tutti i tick, prezzi matematici e così via).
Ho provato "Tutti i tick", "OHLC su M1", "Solo i prezzi di apertura". Il risultato è lo stesso: l'indicatore viene ridisegnato. L'opzione"Calcoli matematici" non è attiva, non è disponibile.
 
StrategyTester:
Provato "Tutti i tick", "OHLC su M1", "Solo i prezzi di apertura". Il risultato è lo stesso: l'indicatore si ridisegna. L'opzione"Calcoli matematici" non è attiva, non è disponibile.
In questo caso, vi prego di fornirmi il codice.
 

Domanda agli sviluppatori: in quali condizioni la storia del simbolo è considerata non sincronizzata, cioè SeriesInfoInteger(symbol, period, SERIES_SYNCHRONIZED) restituisce false?

Il punto è che di tanto in tanto incontro una situazione in cui vengono restituiti valori falsi per un certo simbolo in tutti i timeframe, anche se c'è una storia per questo simbolo (Bars e altre funzioni restituiscono valori non nulli). Quale può essere la ragione?

 

C'è anche un problema simile. Quando si legge la storia per diversi simboli / timeframes nell'indicatore attraverso CopyTime, CopyClose, ecc. l'indicatore spesso lampeggia.Questo non è il risultato del rendering (non c'è ricalcolo delle barre), ma semplicemente l'intera immagine scompare per una frazione di secondo, e poi appare di nuovo. E a volte non per frazioni, ma per interi secondi. Di solito si osserva durante lo scorrimento del grafico. Se la serie temporale richiesta è piccola, il problema non si verifica.

Mi piacerebbe sentire il commento degli sviluppatori su come questo possa essere collegato.

 
Karputov Vladimir:
In questo caso, si prega di fornire il codice.

Allego un'illustrazione delle differenze del terminale e del tester e il codice dell'indicatore.

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

In generale, con le funzioni

Copy

hanno altri problemi,

Mi sono imbattuto nel fatto che quando questa funzione viene chiamata può "congelare" l'EA, ho scritto un programma utilizzando un gran numero di simboli e ho fatto i calcoli sulla storia per letteralmente gli ultimi 3 giorni su ogni simbolo,

Avevo dei momenti in cui tutto si bloccava per qualche minuto, a malapena ho capito che era la funzione Copy. La funzione gestiva tranquillamente 150-200 simboli, poi si bloccava, si bloccava su diversi simboli...

il tempo di sospensione variava da 5 secondi a 2-3 minuti...

 
Le funzioni di copia negli EA sono sincrone e si aspettano la paginazione dei dati se non sono disponibili.
 
StrategyTester:

Allego un'illustrazione delle differenze tra il terminale e il tester e il codice dell'indicatore.

C'è un errore nella funzione:

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

State cercando di copiare in fretta i dati di un altro simbolo. Non dovreste farlo. I dati devono prima essere scaricati, preparati e controllati... Ecco la descrizione:Organizzazione dell'accesso ai dati

 
Karputov Vladimir:

C'è un errore nella funzione:

State cercando di copiare i dati di un altro personaggio in fretta e furia. Questo non è il modo di farlo. I dati devono prima essere caricati, preparati, assicurati... Ecco la descrizione:Organizzare l'accesso ai dati

Grazie per il suggerimento. Darò un'occhiata.
Motivazione: