Errori, bug, domande - pagina 1697

 
Karputov Vladimir:
Print(MQLInfoString(MQL_PROGRAM_NAME)); restituisce il nome breve dell'indicatore. Se non viene specificato alcun nome breve, verrà restituito il nome completo.
Grazie.
 
Vladimir Pastushak:

Grazie.

Alexey, il tuo esempio non funziona, i metodi del genitore sono ancora scaricati nell'erede, che non dovrebbe essere scaricato.


Non dovrebbe essere così, puoi lanciare il codice?

Quei dati che erano protetti e pubblicinel genitore, saranno protetti a protected-inheritance.

	          
 
  1. Impostiamo l'indicatore su un grafico NONE con le mani
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_plots   1
    
    double Buffer[];
    
    int handle = INVALID_HANDLE;
    
    void OnInit()
    {
      ::SetIndexBuffer(0, Buffer, INDICATOR_DATA);
      
      handle = ChartIndicatorGet(0, 1, ChartIndicatorName(0, 1, 0));  
    }
    
    #define  TOSTRING(A) #A + " = " + (string)A + "\n"
    
    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[] )
    {
      if (handle != INVALID_HANDLE)
      {
        Buffer[rates_total - 1] = MathRand();
        
        double BufferCopy[];
        
        if (CopyBuffer(handle, 0, 0, 1, BufferCopy) > 0)
          Print(TOSTRING(BufferCopy[0]) + TOSTRING(Buffer[rates_total - 1]));
      }
      
      return(rates_total);
    }
  2. Rimuovere l'indicatore dal grafico a mano.
  3. Nel log vediamo che l'indicatore continua a funzionare. Potete chiudere tutti i grafici nel terminale, ma sarà ancora in esecuzione. E non servirà, ovviamente,
    void OnDeinit( const int Reason )
    {
      if (handle != INVALID_HANDLE)  
        IndicatorRelease(handle);
      
      return;
    }
  4. Il riavvio del terminale ferma l'esecuzione dell'indicatore.
  5. Quanti indicatori possono essere inattivi e non ne siamo nemmeno a conoscenza? Non c'è nessun controllo.
 
fxsaber:
  1. Impostazione manuale dell'indicatore NULL sul grafico
  2. Rimuovere l'indicatore dal grafico a mano.
  3. Nel log vediamo che l'indicatore continua a funzionare. Potete chiudere tutti i grafici nel terminale, ma verrà comunque eseguito.
  4. Il riavvio del terminale ferma l'esecuzione dell'indicatore.
  5. Quanti indicatori possono essere inattivi e non ne abbiamo nemmeno sentito parlare? Non c'è nessun controllo.

È impossibile leggere e guardare i codici con#define e con ::

Si prega di riscrivere i codici nello stile del comune MQL5.

 
fxsaber:
  1. Impostazione manuale dell'indicatore NULL sul grafico
  2. Rimuovere l'indicatore dal grafico a mano.
  3. Nel log vediamo che l'indicatore continua a funzionare. Potete chiudere tutti i grafici nel terminale, ma verrà comunque eseguito.
  4. Il riavvio del terminale ferma l'esecuzione dell'indicatore.
  5. Quanti indicatori possono essere eseguiti in modalità inattiva e non ne abbiamo nemmeno sentito parlare? Non c'è nessun controllo.
Aggiungere il controllo _StopFlag non aiuta?
 
Karputov Vladimir:

È impossibile leggere e guardare i codici con#define e con ::

Si prega di riscrivere i codici nel comune stile MQL5.

Questo è lo stile MQL5. Si prega di studiare cosa è #define e cosa è ::.
 
Alexey Kozitsyn:
Aggiungere un controllo _StopFlag non aiuta?
Dove aggiungerlo e come può almeno teoricamente aiutare. Questo è un bug del terminale. Ed è un bug serio. Sono stato fortunato - vedo nel log che l'indicatore funziona. Tuttavia, ci sono molti indicatori che lavorano nel terminale senza alcuna informazione su di loro. Ma l'argomento viene fuori, e perché la mia CPU è così carica su un terminale vuoto?
 
fxsaber:
Questo è lo stile di MQL5. Si prega di studiare cosa è #define e cosa è ::.
Non è quello che voglio dire. Il "::" non è affatto necessario nei tuoi esempi - forse è una tua abitudine, ma non è affatto necessario lì. Il codice può essere scritto normalmente anche senza #defane. Prova a riscriverlo e vedi se qualcosa diventa chiaro.
 
Karputov Vladimir:
Non è quello che voglio dire. "::" non è affatto necessario nei tuoi esempi - forse è una tua abitudine, ma non è affatto necessario lì. Il codice può essere scritto benissimo senza #defane. Prova a riscriverlo e vedi se qualcosa diventa chiaro.

Avevo solo "::" in un posto. E non scrivo codici da zero. Come regola, prendo qualcosa dai miei codici. Ecco ::: ce n'era uno attraverso il copia-incolla. Non ci avevo mai fatto caso, ma l'ho rimosso perché ti fa sentire molto meglio.

Ma non è una questione di principio non rimuovere #define. Il 99% del codice può essere scritto senza. Questa non è un'occasione per toglierlo.

E c'è un 1% (relativamente) in cui non si può fare a meno di #define!

 
fxsaber:

Avevo solo "::" in un posto. E non scrivo codici da zero. Come regola, prendo qualcosa dai miei codici. Ecco ::: ce n'era uno attraverso il copia-incolla. Non ci avevo mai fatto caso, ma l'ho rimosso, visto che ti fa sentire molto meglio.

Ma non è una questione di principio non rimuovere #define. Il 99% del codice può essere scritto senza. Questa non è un'occasione per toglierlo.

E c'è l'1% (condizionalmente) in cui non si può fare a meno di #define!

Se non si copia il buffer:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];

int handle=INVALID_HANDLE;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=ChartIndicatorGet(0,1,ChartIndicatorName(0,1,0));
  }

#define  TOSTRING(A) #A + " = " + (string)A + "\n"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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[])
  {
   if(handle!=INVALID_HANDLE)
     {
      Buffer[rates_total-1]=MathRand();

      double BufferCopy[];
      Print(__FUNCTION__);
      //if(CopyBuffer(handle,0,0,1,BufferCopy)>0)
      //   Print(TOSTRING(BufferCopy[0])+TOSTRING(Buffer[rates_total-1]));
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int Reason)
  {
   Print("#1 OnDeinit");
   if(handle!=INVALID_HANDLE)
     {
      Print("#2 OnDeinit");
      IndicatorRelease(handle);
      Print("#3 OnDeinit");
     }
   Print("#4 OnDeinit");
   return;
  }
//+------------------------------------------------------------------+

allora l'indicatore completa con successo il suo lavoro

2016.09.23 12:11:12.655 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.737 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:12.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:13.406 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:14.794 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:15.747 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:16.936 2 (SBRF-12.16,M1)       OnCalculate
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #1 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #2 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #3 OnDeinit
2016.09.23 12:11:19.339 2 (SBRF-12.16,M1)       #4 OnDeinit