Errori, bug, domande - pagina 307

 
Jager:

Quando provo a testare su usdjpy ottengo un messaggio come questo:

e sembra andare avanti all'infinito, quando è arrivato a 3000 l'ho spento. I test hanno provato a passare su 2010.10.01 - 2010.10.10, solo i prezzi di apertura.

bild 401

Inoltre non riesco a far partire un altro agente remoto, ecco il log:

ha anche osservato un modello simile ieri... Sembra che l'intera storia sia stata sovraccaricata e apparentemente ci sono stati alcuni problemi.

Mi sembra di aver aspettato la fine del processo o di aver riavviato il terminale.

Ho trovato una cosa interessante ieri. dopo aver ricompilato l'EA, le modifiche non funzionano nel tester fino a quando non si riavvia il terminale - questo è lo stagno!!!

 
Im_hungry:
Completamente solidale - forse servicedesk? (chiudilo cento volte)
Qual è il punto? Lo sanno tutti perfettamente...
 

Da ieri, gli esperti hanno iniziato a vivere la loro vita digitale.

Durante i test dà una messa a fuoco casuale... Salta la funzione OnInit() in qualche modo magico, poi genera un errore di array fuori portata nella funzione DeInit().


Il fatto è che con gli stessi parametri può iniziare ed eseguire l'intero test, oppure può andare in crash.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Im_hungry:

Ecco la sfida: rendere dinamico il parametro dell'indicatore, quando si chiude una posizione si cambia uno dei parametri dell'indicatore, quindi questa è la sfida.

Ora la mia soluzione:

Posso dire che questo codice funziona come i test mostrano un risultato diverso, ma non è chiaro perché funziona t.s. una volta ogni tanto, ho guardato nel log - 1 settimana tutto funziona come dovrebbe, poi va in loop e produce gli stessi valori nel buffer, anche se questo è impossibile (2 settimane gli stessi valori nel log del tester), se non va in loop allora scrive solo un errore:

messaggio via Alert

Per quanto ho potuto capire, l'Expert Advisor crea un handle di qualche indicatore quando appare una nuova barra e allo stesso tempo richiede di copiare i buffer di questo indicatore. Ma questo non risolve la situazione in cui potrebbe essere necessario del tempo per calcolare i buffer degli indicatori. In altre parole, l'handle dell'indicatore può essere creato con successo, ma i buffer dell'indicatore non sono ancora stati calcolati.
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
Yedelkin:
Per quanto sono riuscito a capire, l'Expert Advisor crea un indicatore handle quando appare una nuova barra e allo stesso tempo richiede di copiare i buffer di questo indicatore. Ma la situazione non è elaborata, quando il calcolo dei buffer degli indicatori può richiedere del tempo. In altre parole, l'handle dell'indicatore può essere creato con successo, ma i buffer dell'indicatore non sono ancora stati calcolati.

Sì, sono d'accordo - è per questo che ho provato questo design:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{ 
   if (isNewBar()==true && proverkaHANDLA()==true)
     {
      if (!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
         {
          BSOpen();
         }
     }    
}
//+==================================================================+
bool proverkaHANDLA()
{
  ArraySetAsSeries(Sp1Buffer,true);
  ArraySetAsSeries(Sp2Buffer,true);
//----------------------
  vhandle=iCustom(NULL,0,"МТ5",Symbol1,100,Lots,1,Close());
  if(vhandle<0)
    {
     Alert("Ошибка при создании индиката: ",GetLastError());
     return(0);
    }
  if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
    {
     Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
     return(0);
    }
  return (true);
}

Per ora funziona! Grazie per il vostro aiuto

 

Ma ogni tanto cede:

Alert: Ошибка копирования буферов индикатора номер ошибки:4806
 
Im_hungry:

Sì, sono d'accordo - è per questo che ho provato questo design:

Per ora funziona! Grazie per il vostro aiuto

Un tale costrutto salta i casi in cui "l'handle è stato creato, ma i buffer degli indicatori non sono ancora stati calcolati". Poiché la costruzione stessa è chiamata una volta per periodo, si può provare a chiamare la funzione CopyBuffer() più volte. Cioè se CopyBuffer()<0, allora chiama ripetutamente la funzione, finché il periodo selezionato lo permette (entro il periodo di tempo selezionato).
 
Im_hungry:

Ma ogni tanto lo fa:

Bene, è così. La vostra funzione proverkaHANDLA() è un blocco indipendente, che internamente fa riferimento aCopyBuffer() solo una volta.Di conseguenza, se i buffer non vengono calcolati, salterà sempre fuori di nuovo. Finora la vostra funzione proverkaHANDLA() non gestisce la situazione "handle creato, ma buffer dell'indicatore non ancora calcolato", ma la ignora.

 
Yedelkin:
Questa costruzione salta i casi in cui "l'handle è stato creato, ma i buffer degli indicatori non sono ancora stati calcolati". Poiché la costruzione stessa viene chiamata una volta per periodo, si può provare a chiamare ripetutamente la funzione CopyBuffer(). Cioè se il CopyBuffer()<0, allora ripetere la chiamata della funzione, finché il periodo selezionato lo permette (entro il periodo di tempo selezionato).

Cioè, mentre CopyBuffer>0 lo calcoliamo, e il nuovo parametro (Close()

appare alla chiusura della posizione. Cioè, abbiamo bisogno di un ciclo attraverso While. Si scopre così.

if(!PositionSelect(Symbol1) && !PositionSelect(Symbol2))
  {
   While (vhandle>0)
    {
     if(CopyBuffer(vhandle,0,0,50,Sp1Buffer)<0 || CopyBuffer(vhandle,1,0,50,Sp2Buffer)<0)
      {
       Alert("Ошибка копирования буферов индикатора номер ошибки:",GetLastError());
       return(0);
      }
    }
  }
 
Prova a leggere su BarsCalculated nell'aiuto, che, tra l'altro, dà l'esempio giusto.