Errori, bug, domande - pagina 561

 

ArrayInitialize non funziona il codice è allegato, se decommentiamo il ciclo, tutto va bene.

E quando si dichiarano le variabili nella classe e l'indicatore a livello globale con lo stesso nome, appare un avviso.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Durante il fine settimana, mentre non c'erano tick, ho fatto il debug dell'indicatore su conti demo, facendolo girare sull'ultima build di due istanze del terminale MT5, ma di società diverse: MetaQuotes e EGlobal. Le impostazioni sono le stesse ovunque. Per essere sicuro ho controllato off-line, quindi il fattore tick è escluso.

Il problema è che il codice più semplice del "sottoindicatore" (per non parlare dell'indicatore completo e più complesso) mostra un numero diverso di risultati in diversi terminali di diverse aziende:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

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[])
  {
   Print(1);

   return(rates_total);
  }

1. EGlobal. 2. Meta-Citazioni.EGlobalMetaQuotes

Ho scaricato completamente entrambi i terminali (controllato con Task Manager per processi di memoria), li ho caricati di nuovo e ho ricompilato entrambi i codici per sicurezza. Alla fine - nessun cambiamento.

 
Non è sorprendente, è così che dovrebbe essere.
 

MathRound() funziona diversamente in 4 e 5, e dovrebbe essere lo stesso.

Il codice di 4p:

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

Codice di 5 secondi:

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

MathRound() funziona diversamente in 4 e 5, e dovrebbe essere lo stesso.

Codice di 4 secondi:

Codice di 5 secondi:

Il problema è qui:

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

Questo valore è arrotondato diversamente in 4 e 5.

 
Loky:
Non c'è da sorprendersi, è così che dovrebbe essere.
E più precisamente?
 

Perché MT5 non salva la cronologia degli ordini, ecc. se il test viene interrotto? In MT4 è stato salvato.

Inoltre non c'è posizionamento nella cronologia degli ordini dal grafico di test - era comodo visualizzare gli ordini nella zona di grandi drawdown cliccando sul grafico.

 

Buona sera.

Potete spiegarmi, per favore, come funziona il metodo SLeep()?

Dovrebbe mettere in pausa l'Expert Advisor per un certo periodo di tempo, o mi sbaglio?


{for (int sleep=0;sleep<10000;sleep++)

se(BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; } else Sleep(100);}

Per questo codice, mi aspetto il risultato - se il numero di barre calcolate per un certo indicatore è maggiore di un certo valore, il ciclo viene interrotto; altrimenti c'è un ritardo di 100ms nell'ulteriore esecuzione del codice. Il ritardo totale possibile è 100*10000ms....Questo è un tempo sufficiente per il calcolo dell'indicatore. Allora perché il codice continua a girare (che segue questo ciclo) o nel tester, questa funzione non funziona come presumo. Grazie in anticipo per il chiarimento.

 
mi__x__an:

Buona sera.

Potete spiegarmi, per favore, come funziona il metodo SLeep()?

Dovrebbe mettere in pausa l'Expert Advisor per un certo periodo di tempo, o mi sbaglio?


{for (int sleep=0;sleep<10000;sleep++)

se (BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; } else Sleep(100);}

Per questo codice, mi aspetto il risultato - se il numero di barre calcolate per un certo indicatore è maggiore di un certo valore, il ciclo viene interrotto; altrimenti c'è un ritardo di 100ms nell'ulteriore esecuzione del codice. Il ritardo totale possibile è 100*10000ms....Questo è un tempo sufficiente per il calcolo dell'indicatore. Allora perché il codice continua a girare (che segue questo ciclo) o nel tester, questa funzione non funziona come presumo. Grazie in anticipo per il chiarimento.

Il sonno non funziona negli indicatori
 

La documentazione, per esempio, di CopyBuffer, fa scervellare: "Se volete fare una copia parziale dei valori dell'indicatore in un altro array (non il buffer dell'indicatore), dovete usare l'array intermedio per questo scopo, nel quale vengono copiati i valori richiesti. E già da questa matrice intermedia eseguire la copia elemento per elemento del numero richiesto di valori nei posti giusti della matrice ricevente. "

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

Se si fa esplicitamente riferimento abuffer_num, la necessità di legare preliminarmente l'array ricevente al buffer indicatore con uno o un altro numero di sequenza attraverso SetIndexBuffer è certamente implicita. Ma,"se vogliamo copiare alcuni valori dell'indicatore in un altro array (non il buffer dell'indicatore)", non possiamo parlare dibuffer_num, perché non è un indicatore, e non lo abbiamo collegato a niente per definizione.

Una contraddizione?

Ambiguità?

O forse sono completamente programmato?

Ho cercato di trovare una definizione chiara di un buffer di indicatori e non ci sono riuscito. È davvero un buffer qualsiasi collegato tramite SetIndexBuffer o non è sufficiente e dovrebbe essere un array con l'identificatore INDICATOR_DATA?