Errori, bug, domande - pagina 100

 
Urain:

Esiste una terminazione forzata della funzione OnTester()

o perché la storia delle transazioni prima della funzione personalizzata esiste e restituisce zero dopo :

double OnTester()
  {
   int HTD=-1;
   Custom_func();
   if(HistorySelect(0,TimeCurrent()))HTD=HistoryDealsTotal();   
   return(HTD);
  }

Quali funzioni non funzionano nel tester?

come può il tester (durante l'ottimizzazione) segnalare all'esterno che qualcosa non va (avvisi di stampa, niente funziona) ?

A quanto pare stasera dormono tutti.
 
Urain:
A quanto pare, oggi dormono tutti.

Hai guardato i log dell'agente, forse c'è tutto?

Per quanto ne so, le stampanti non vengono visualizzate nel log principale del tester solo durante l'ottimizzazione (in modalità normale tutto è OK).

OnTester() come ho capito non è possibile uscire forzatamente. E per che cosa? Calcola semplicemente un certo risultato di test (inoltre, è essenzialmente usato solo per l'ottimizzazione)?

OnTester:
La funzione OnTester() è un gestore di eventi Tester che viene generato automaticamente alla fine del test storico dell'Expert Advisor su un dato intervallo di date. La funzione deve essere definita con il tipo double, non ha parametri:

doppioOnTester();

La funzione viene chiamata immediatamente prima di OnDeinit() e ha il tipo di ritorno double. La funzione OnTester() può essere utilizzata solo negli esperti durante i test. Il suo scopo principale è quello di calcolare un certo valore da utilizzare come criterio Custom max nell'ottimizzazione genetica dei parametri di input.


PS

> perché la cronologia delle transazioni prima di una funzione personalizzata, ma dopo mostra zero...

Forse questa è una domanda per gli sviluppatori.

Per quanto ho capito, OnTester deve restituire il numero di trade (se ce ne sono), mentre Custom_func() è intesa come una funzione personalizzata?

 
Urain:

Dedicato agli sviluppatori ...

Voi ragazzi almeno avreste avvertito se date un'opportunità che prima in linea di principio non era possibile.

Ho sprecato ventiquattro ore per cercare di prendere questo bug.

Non dirmi che va bene, certo che lo so, ma ho sprecato 24 ore solo perché sono abituato al fatto che con questo

Sono abituato a farmi dare un errore dal compilatore.

Qual è la cosa giusta da fare alla fine? È "==" o è "="?
 
Urain:

Esiste una terminazione forzata della funzione OnTester()

o perché la storia delle transazioni prima della funzione personalizzata esiste e restituisce zero dopo :

Quali funzioni non funzionano nel tester?

come segnalare dal tester (durante l'ottimizzazione) all'esterno che qualcosa non va (avvisi di stampa che non funzionano)?

Grazie per il suo messaggio. La sua domanda è stata ricevuta - ce ne stiamo occupando.

 

Come faccio a calcolare il lotto massimo consentito per margine per aprire una nuova posizione? In MQL4 è stato fatto come segue:

MaxLot=AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
EvgeTrofi:

Come faccio a calcolare il lotto massimo consentito per margine per aprire una nuova posizione? In MQL4 si faceva così:

All'incirca così:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
Questo codice non solo calcola il volume massimo, ma lo inserisce anche esattamente nei limiti delle impostazioni del simbolo.
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Renat:

Va più o meno così:

Questo codice non solo calcola il volume massimo, ma lo inserisce anche esattamente nei limiti dell'impostazione del carattere.
Grazie! Non ho OrderCalcMargin() nel mio aiuto :)
 
EvgeTrofi:
Grazie! Non ho OrderCalcMargin() nel mio aiuto :)
Questa funzione è stata aggiunta molto tempo fa - guarda nella documentazione, per favore.
 
EvgeTrofi:
Quindi, alla fine, qual è il modo giusto? È "==" o è "="?

In ogni caso.

if(a==0){espressione} significa che se a è uguale a 0 è vero, quindi eseguiamo {espressione}.

if(a=0){espressione} è uguale a if(a){a=0;espressione} se a è vero, {a=0;espressione}.

 
Interesting:

Hai guardato i log dell'agente, forse c'è tutto?

Per quanto ne so, le stampanti non vengono visualizzate nel log principale del tester solo durante l'ottimizzazione (in modalità normale tutto è OK).

OnTester() come ho capito non è possibile uscire forzatamente. E per che cosa, calcola solo un certo risultato del test (che in realtà è usato solo per l'ottimizzazione)?

PS

> Perché la storia delle transazioni prima di una funzione personalizzata esiste e dà zero dopo...

Forse questo è un problema per gli sviluppatori.

Per quanto ho capito, OnTester dovrebbe restituire il numero di accordi (se ce ne sono), mentre la funzione personalizzata è Custom_func()?

Il problema è che nell'ottimizzazione stessa il programma non funziona come in altre situazioni (ecco perché ho bisogno di inviare messaggi da sotto OnTester).

A questo scopo ho creato l'analogo di print (funzione che crea un file per stampare una stringa passata alla funzione come parametro).

int prints=0;// счётчик вызовов, должен быть обьявлен глобально
//+------------------------------------------------------------------+
//| вывод информации из под тестера                                  |
//+------------------------------------------------------------------+
void WriteFilePrint(string text,string folder="Print")
  {
   string subfolder="Print";
   int han=FileOpen(subfolder+"\\"+folder+(string)prints+".csv",FILE_WRITE|FILE_CSV,";");
   if(han!=INVALID_HANDLE)
     {
      FileWrite(han,text);
      FileClose(han);
     }
   else Print("File open failed"+subfolder+"\\"+folder+".txt, error",GetLastError());
   prints++;
  }

Così, sono riuscito a catturare l'esecuzione errata di alcune funzioni in OnTester.

Motivazione: