Errori, bug, domande - pagina 1679

 
fxsaber:
Sarebbe bene renderlo privato anche nei discendenti. Per una migliore comprensione. Non è il punto, insomma.
Dovrebbe essere chiamato nei discendenti. )
 
Sergei Vladimirov:
Deve essere evocata nei discendenti. )
Il punto è proprio che non è necessario. Vedi il mio esempio.
 
fxsaber:
Il punto è proprio che non è necessario. Vedi il mio esempio.
Il tuo esempio è solo diverso, ma il punto è lo stesso - il discendente sovrascrive un metodo virtuale della classe base. Ok, bene, è chiaro a tutti.
 

Errore nei buffer degli indicatori

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

class BUFFER
{
public:
  double Buffer[];
  
  BUFFER()
  {
    ::SetIndexBuffer(0, this.Buffer);
  }
};

BUFFER* Buf;

void OnInit()
{
  Buf = new BUFFER;
}

void OnDeinit( const int Reason )
{
  delete(Buf);
}

void Restart()
{
  OnDeinit(REASON_PARAMETERS);
  OnInit();
}

#define  PRINT(A) Print(#A + " = " + (string)A);

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[] )
{
  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;
  
  PRINT(ArraySize(Buf.Buffer));
  
  Buf.Buffer[0] = 0; // array out of range
  
  return(rates_total);
}

Risultato nel registro

2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      array out of range in 'Test.mq5' (56,13)
2016.09.12 17:21:54.851 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 0
2016.09.12 17:21:54.828 Test (RTS-9.16,H1)      ArraySize(Buf.Buffer) = 2067

Il debugger si ostina a dire che Buf.Buffer è SEMPRE array dinamico[0],I. Cioè è un buffer indicatore. Ma di dimensioni zero, come si è scoperto.

Si scopre che il debugger scrive di più nel log di quanto faccia il rilascio. Il comunicato non riporta queste cose

2016.09.12 17:25:08.706 Test (RTS-9.16,M1)      Indicator buffer #0  detached
È possibile impostare il buffer dell'indicatore solo una volta in MT5?
 

Perché queste complicazioni, se non è un segreto? Beh, a parte l'interesse della ricerca, naturalmente.

Invece di questo (che, a proposito, è sbagliato in linea di principio, perché la reinizializzazione può essere richiesta durante il funzionamento, non solo all'avvio):

  static bool Flag = false;
  
  if (Flag)
    Restart();
  
  Flag = true;

Proprio come questo:

if(prev_calculated == 0)
   ArrayInitialize(Buf.Buffer, 0.0);
 
Sergei Vladimirov:

Perché queste complicazioni, se non è un segreto? Beh, a parte l'interesse della ricerca, naturalmente.

Ho dei casi in cui un array dinamico, fissato come buffer di indicatori, viene cancellato. Poi dovete creare di nuovo una matrice dinamica e assegnarla come buffer dell'indicatore. Il debugger mostra che è assegnato. Ma solo la sua dimensione è zero. Questo è un errore.

Il problema è vecchio, a quanto pare.

Forum sul trading, sistemi di trading automatico e test di strategia

Come nascondere il messaggio "Buffer indicatore #x staccato

Konstantin Ivanov, 2015.02.17 21:18

Nel mio indicatore memorizzo array-buffer in istanze dell'oggetto.
Quando si cancella un oggetto in OnDeinit(), viene visualizzato un messaggio per tutti gli array collegati ai buffer (SetIndexBuffer()):

"Buffer indicatore #x staccato"

Come staccare un array da un buffer senza questo messaggio?
O come nascondere questo messaggio?

Ho trovato il ramo http://forum.mql4.com/63975, ma l'opzione suggerita per salvare i buffer in un contesto globale non funziona per me.


Anche l'opzione di salvare i buffer in un contesto globale non funziona per me. È interessante notare che funziona in MT4.

 

articolo Una guida passo dopo passo per scrivere EAs in MQL5 per principianti C'è del codice:


Non è necessario dividere a tre cifre?

 
Aleksey Rodionov:

articolo Una guida passo dopo passo per scrivere EAs in MQL5 per principianti C'è del codice:


Non è necessario dividere a tre cifre?

Questo è un rudimento rimasto da EURUSD (5 cifre) e USDJPY (3 cifre). Non c'è nessun errore, ma è meglio non farlo, soprattutto per i principianti.
 
Ho bisogno di definire una singola interfaccia per tutte le classi ereditate. Dovrebbe sempre avere il metodo Init. Ma Init è come un duplicato del costruttore, quindi le varianti dei parametri di input non possono essere definite in anticipo. Come specificare tale interfaccia?
 
MK, perché non rendere accettabile la seguente sintassi per le funzioni importate:
#import ...
 int send(SOCKET s, void &buf[], int len, int flags);
 int send(SOCKET s, void &buf, int len, int flags);
#import

Ora dobbiamo fare cose brutte:

#import ...
 int send(SOCKET s, char &buf[], int len, int flags);
 int send(SOCKET s, int &buf, int len, int flags);
 int send(SOCKET s, char &buf, int len, int flags);
 int send(SOCKET s, Cpoint &buf[], int len, int flags);
 ...
#import

Non lo suggerisco per le funzioni interne in linea, ma per le funzioni importate dovrebbe essere sicuro.