Archivio delle versioni MT.

 

Cari amici, vi propongo di creare qui un archivio di versioni MT. A volte con gli aggiornamenti possono verificarsi errori inaspettati e bisogna tornare a una versione precedente...

Ho bisogno di costruire 2007 ora. Ce l'hai? Condividetelo per favore.

 
Сергей Таболин:

Cari amici, vi propongo di creare qui un archivio di versioni MT. A volte con gli aggiornamenti possono verificarsi errori inaspettati e bisogna tornare a una versione precedente...

Ho bisogno di costruire 2007 ora. Ce l'hai? Condividetelo, per favore.

C'è un uomo che sta costruendo una collezione. Ma per quanto mi ricordo, i suoi post con i link agli archivi delle versioni MT vengono talvolta cancellati per non rallentare il progresso. ))

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

Nuova versione di MetaTrader 5 build 2007: Calendario economico, MQL5-programmi come servizio

Andrey Khatimlianskii, 2019.03.15 23:03

Mi sono spostato su un altro account Google. Nuovo link qui.

Se avete bisogno di altre costruzioni, parlate, ce ne sono molte.

 


il mio link è stato ucciso qui,

gli sviluppatori suggeriscono di scaricare solo da fonti verificate

Se vuoi rischiare la mia costruzione, fammi un fischio.

si dovrebbe continuare a lavorare stabilmente nel portale o nell'archivio e aggiornare consapevolmente alle build di test

dovreste essere molto consapevoli di aggiornare alle ultime build.

 
Fast235:

il mio link è stato ucciso qui,

gli sviluppatori suggeriscono di scaricare solo da fonti verificate

Se vuoi rischiare la mia costruzione, fammi un fischio.

si dovrebbe continuare a lavorare stabilmente nel portale o nell'archivio e aggiornare consapevolmente alle build di test

si dovrebbe mantenere stabile il lavoro nel portatile o nell'archivio e in generale essere consapevoli di aggiornare le build di prova. la build 2007 può farlo in DC

Hanno ragione a rimuovere le vecchie versioni.

Dovete scrivere programmi normali. Non ignorare gli avvertimenti. Inizializzare le variabili e non usare quelle globali il più possibile. Evitare frammenti potenzialmente pericolosi nel codice.

Ho decine di migliaia di linee di codice - non un solo avvertimento in strict-mode. La metà dei miei progetti di base di codice hanno avvertimenti anche senza strict, anche se non contengono nemmeno migliaia di linee. E poi cominciate a lamentarvi che "tutto funzionava nella vecchia build e ha smesso di funzionare in quella nuova"...

 
Georgiy Merts:

Hanno ragione a rimuovere le vecchie versioni.

Bisogna scrivere i programmi in modo corretto. Non ignorare gli avvertimenti. Inizializzare le variabili e non usare quelle globali il più possibile. Evitare frammenti di codice potenzialmente non sicuri.

Non ho un solo avvertimentoin decine di migliaia di linee di codice in strict-mode. Metà dei miei progetti di base di codice riportano avvertimenti anche senza strict, anche se non contengono nemmeno un migliaio di stringhe. E poi cominciate a lamentarvi che "tutto funzionava nella vecchia build e ha smesso di funzionare in quella nuova"...

È il programma Mars Rover? Cosa si può descrivere in così tante righe?

 
Sergey Basov:

C'è una persona qui che sta costruendo una collezione. Ma per quanto mi ricordo i suoi post con i link agli archivi della versione MT sono a volte cancellati per non far rallentare il progresso. ))

Grazie. Scaricato.

Fast235:

il link ha ucciso il mio link qui,

Gli sviluppatori suggeriscono di scaricare solo da fonti verificate.

Se volete rischiare la mia costruzione, basta che mi scriviate.

si dovrebbe continuare a lavorare stabilmente nel portale o nell'archivio e aggiornare consapevolmente alle build di test

Sono a DC ora con il 2007 costruire forse.

Non sto aggiornando sulle build di prova. Ma ora salverò))).

Georgiy Merts:

Hanno ragione a rimuovere le vecchie versioni.

Bisogna scrivere i programmi in modo corretto. Non ignorare gli avvertimenti. Inizializzare le variabili e non usare quelle globali il più possibile. Evitare frammenti di codice potenzialmente non sicuri.

Ho decine di migliaia di linee di codice e non un solo avvertimento sul strict-mode. La metà dei miei manichini di base del codice mostra avvertimenti anche senza strict, sebbene non contengano nemmeno mille stringhe. E poi cominciate a lamentarvi che "tutto funzionava nella vecchia build e ha smesso di funzionare in quella nuova"...

George, leggi il mio ultimo post nel thread. Ho trovato la fonte del problema. Non è nel mio codice.

 
Сергей Таболин:

Grazie. Scaricato.

Non aggiorno a quelli di prova. Ma ora lo salverò ))))

George, leggi il mio ultimo post nel thread. Ho trovato la fonte del problema. Non è nel mio codice.

L'ho letto.

La fonte del problema è che gli sviluppatori e voi avete affrontato la situazione in modo leggermente diverso. Ecco perché insisto sul fatto che il codice deve essere sempre molto semplice e chiaro, tranne i punti in cui ci possono essere ambiguità.

Mi ricordo, ai tempi in cui MT5 si stava appena facendo strada - ero stupito, la gente usava le variabili senza inizializzazione, pensando che avrebbero contenuto zero.

Non si può fare a meno di ricordare una barzelletta:

Pinocchio diede a Pinocchio tre mele. Ne ha mangiati due. Quante mele sono rimaste?

Programmatore N1:
- Non sai quanti sono. Nessuno sa quante mele aveva prima!

Morale: cancellare le variabili iniziali.


Programmatore N2
- Non è chiaro quanti. Forse mentre Malvina regalava le mele, anche Pierrot le mangiava?

Morale: non usate variabili globali.

Programmatore N3
- Non si sa quanti siano. Non dice che Pinocchio ha mangiato esattamente delle mele, dice che ne ha mangiate due, ma non è chiaro quali. Inoltre, dato che il nome "Pinocchio" non è declinato - Pinocchio e Pinocchio sono variabili diverse.


Morale: attenzione alla sintassi

 
Сергей Таболин:

Grazie. Scaricato.

Non aggiorno a quelli di prova. Ma ora lo salverò ))))

George, leggi il mio ultimo post nel thread. Ho trovato la fonte del problema. Non è nel mio codice.

E la fonte del problema era "non aver letto la documentazione", non la nuova build. Quindi fai il furbo dicendo che non è il tuo codice.

1:

Forum sul trading, sistemi di trading automatico e strategie di trading di prova

Quindi cosa vuoi fare dopo?

Sergey Tabolin, 2019.06.16 00:17

Ho trovato la ragione di questa indignazione.

Il fatto è questo:

//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))  TesterStop();
      check_init = true;
   }
//*/

Si scopre che dopo TesterStop(), OnTester() viene lanciato anche nella nuova versione, anche se non dovrebbe essere lanciato.

Naturalmente, nessun dato viene preparato e questo è ciò che otteniamo.

Questa è la colpa di MT 2085.

2:

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

Cosa devo fare dopo?

Sergey Tabolin, 2019.06.16 09:02

Scuse. La descrizione dice solo che OnTester() viene chiamato dopo. (((

Devo fare dei controlli anche lì. Proverò a sostituirlo con ExpertRemove()...

E poi "proverò" di nuovo. E poi, se i vostri tentativi non hanno successo, allora è di nuovo colpa di MQ?

Non ricordo, ma credo che ci sia una funzione speciale per saltare i passaggi "cattivi". E proprio quello che vuoi provare, gli sviluppatori non hanno raccomandato di usare - di nuovo - se la memoria non mi inganna.

Ma ciò che è importante nel mio messaggio - prima di scaricare la colpa sugli sviluppatori, devi prima leggere la documentazione, chiedere una soluzione sul forum, e solo allora, e solo se l'errore è davvero trovato, scrivere un bug report con un codice minimo che lo riproduca. Sarebbe una cosa seria, ma per il resto...

 
Artyom Trishkin:

E la fonte del problema era "non aver letto la documentazione", non la nuova build. Quindi stai mentendo sul fatto che il codice non è tuo.

1:

2:

E poi vai avanti a "provare" di nuovo... E poi, se i vostri tentativi non hanno successo, allora è di nuovo colpa di MQ?

Non ricordo, ma credo che ci sia una funzione speciale per saltare i passaggi "cattivi". E proprio quello che vuoi provare, gli sviluppatori non hanno raccomandato di usare - di nuovo - se la memoria non mi inganna.

Ma ciò che è importante nel mio messaggio - prima di spingere la colpa sugli sviluppatori, si dovrebbe prima leggere la documentazione, chiedere una soluzione sul forum, e solo allora, e solo nel caso di un bug veramente trovato - scrivere un bug report con la riproduzione con codice minimo. Sarebbe una cosa seria, ma per il resto...

Artyom, il problema è nella nuova costruzione!

Ditemi, qui avete scritto un codice che funziona senza errori. Funziona per molto tempo. E improvvisamente, dopo la nuova release di MT si blocca con un mucchio di errori. Di chi è la colpa? Tanto più che la documentazione, come molti sanno, non sta sempre al passo con le innovazioni.

Quindi, il mio codice ha funzionato senza errori.

Ho usato questo:

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

Con cosa sostituire INIT_PARAMETERS_INCORRECT? Soluzione trovata )))

Sergey Tabolin, 2019.04.24 08:48

Ho trovato la risposta alla mia stessa domanda nel thread:

Si è rivelato abbastanza semplice. È sufficiente spostare il controllo dei parametri non validi da OnInit() a OnTick()

bool                 check_init              = false;                // флаг проверки входных параметров
..........
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                 ExpertRemove();
      if(period_HMA7C == 0 && move_stop)                                   ExpertRemove();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                 ExpertRemove();
      check_init = true;
   }
//*/ 
//+------------------------------------------------------------------+ 

Controllato! Funziona. La genetica non fallisce ))))

Ora, dopo che sono apparsi dei problemi, ho aggiunto un paio di righe in più:

bool                 check_init              = false;                // флаг проверки входных параметров
bool                 tester_stop             = true;                 // флаг проверки выхода по TesterStop
.............
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
//*
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(period_HMA7C == 0 && move_profit)                                                            TesterStop();
      if(period_HMA7C == 0 && move_stop)                                                              TesterStop();
      if(period_HMA7C == 0 && shift_correction_HMA7C != 5)                                            TesterStop();
      if(indent_channel_line_a0 == 0.0 && indent_channel_line_a4 != 0.0)                              TesterStop();
      if(indent_channel_line_a4 == 0.0 && indent_channel_line_a0 != 0.0)                              TesterStop();
      if((stop_loss_buy > 0 && stop_loss_buy < 700) || (stop_loss_sell > 0 && stop_loss_sell < 700))
      {
         Print("Результат в OnTester() должен быть -99999999999.99");
         TesterStop();
      }
      check_init  = true;
      tester_stop = false;
   }
//*/
.........
}
Вызов TesterStop() считается нормальным завершением тестирования, и поэтому будет вызвана функция OnTester() 
с отдачей тестеру стратегий всей накопленной торговой статистики и значения критерия оптимизации.

Si suppone, ragionando, che il trasferimento debba essere eseguito immediatamente, senza eseguire il resto del codice. Giusto?

E infatti TesterStop() non ferma affatto il test!

double OnTester()
{
   if(tester_stop) return(-99999999999.99);
   
   double   equity_dd_percent             = TesterStatistics(STAT_EQUITY_DDREL_PERCENT);
   if(equity_dd_percent > 0.0)
   {
      equity_dd_percent = 100.0 / equity_dd_percent;
   }
   else     equity_dd_percent    = 1.0;
   
   double   param                         = 0.0;
   double   profit                        = TesterStatistics(STAT_PROFIT);
   double   stability                     = 0.0;
   int      balance_arr_size              = ArraySize(balance_arr) - 1;
   int      alpha_size                    = balance_arr_size - 1;
   int      beta_size                     = alpha_size - 1;
   double   trade2time                    = ratioTrades2Time(TesterStatistics(STAT_TRADES));
   double   max_balance                   = balance_arr[0];
//+-------------------   
   if(balance_arr[balance_arr_size-1] - balance_arr[0] == 0.0) return(-99999999999.88);
//+-------------------   

Ho inserito un parametro "non valido" e ho ottenuto questo risultato:

LL      0       11:30:20.816    Core 1  2016.10.01 00:00:00   Советник получил MAGIC = 153128312914612747.
QN      0       11:30:20.816    Core 1  2016.10.03 00:00:00   Результат в OnTester() должен быть -99999999999.99
NJ      3       11:30:20.816    Core 1  TesterStop() called on 0% of testing interval
CD      0       11:30:20.816    Core 1  final balance 10000.00 USD
QF      0       11:30:20.816    Core 1  OnTester result -99999999999.88

Quindi questo è un bug! E questo è esattamente il bug di MQ.

Credo che TesterStop() eExpertRemove() dovrebbero restituire true se non possono passare immediatamente il controllo a OnTester(). Permetterà di reagire in qualche modo, per esempio, così:

bool                 tester_stop = false;                 // флаг проверки выхода по TesterStop
.......
void OnTick()
{
//--- пропустить бесполезные проходы оптимизации
   if(!check_init && (MQLInfoInteger(MQL_OPTIMIZATION) || MQLInfoInteger(MQL_TESTER)))
   {
      if(недопустимый параметр)          tester_stop = TesterStop();
........
}
double OnTester()
{
   if(tester_stop) return(-99999999999.99);

In questo caso possiamo ottenere esattamente il risultato che ci si aspetta logicamente, invece di ballare e prevedere tutti gli errori che potrebbero teoricamente verificarsi come risultato dell'arresto del test.

 
Сергей Таболин:

Artyom, il problema è nella nuova costruzione!

Ditemi, qui avete scritto un codice che funziona senza errori. Funziona per molto tempo. E improvvisamente, dopo la nuova release di MT si blocca con un mucchio di errori. Di chi è la colpa? Tanto più che la documentazione, come molti sanno, non sta sempre al passo con le innovazioni.

Quindi, il mio codice ha funzionato senza errori.

Ho usato questo:

Ora, dopo alcuni problemi, ho aggiunto un paio di righe in più:

Si suppone, intelligentemente, che il trasferimento venga fatto immediatamente, senza eseguire il resto del codice. Giusto?

Ma in realtà TesterStop() non ferma affatto il test!

Ho inserito un parametro "non valido" e ho ottenuto questo risultato:

Quindi questo è un bug! E questo è esattamente il bug di MQ.

Credo che TesterStop() eExpertRemove() dovrebbero restituire true se non possono passare immediatamente il controllo a OnTester(). In tal caso, sarà possibile reagire in qualche modo, ad esempio così:

In questo caso, possiamo ottenere esattamente il risultato che ci si aspetta logicamente, invece di ballare e prevedere tutti gli errori che potrebbero teoricamente verificarsi come risultato dell'arresto del test.

Tutti i vostri calcoli e test non devono essere mostrati a me, e non con una certa dose di sarcasmo e irritazione, ma in modo secco e conciso nel thread"Errori, bug, domande". A meno che, ovviamente, non vogliate essere ascoltati e ottenere una risposta.

ZS. E dimenticate preferibilmente parole come "bug", "difetto", "ballare con il tamburello" e altri "shitcodes" nei rapporti di bug - tutti gli umani, e voi non siete senza errori. E le dichiarazioni "psicotiche" non sembrano molto serie o costruttive.

 
Artyom Trishkin:

Tutti i vostri calcoli e test non devono essere mostrati a me, e non con una certa dose di sarcasmo e irritazione, ma in modo secco e conciso nel thread"bugs, bugs, questions". A meno che, ovviamente, non vogliate essere ascoltati e ottenere una risposta.

Mi dispiace che tu ti senta così. C'è irritazione, naturalmente, ma come potrebbe non esserci quando i problemi sorgono all'improvviso? E il sarcasmo... - Sono più perplesso da quelli che considero dei bloopers evidenti. ))

Per quanto riguarda l'argomento in questione, mi sembra che la domanda potrebbe facilmente "perdersi" lì. Quindi penso che un nuovo argomento con un problema specifico sia più efficace? O non lo è?

In ogni caso, tu, come moderatore, puoi piuttosto attirare l'attenzione degli sviluppatori su alcuni problemi, se tu stesso sei convinto della loro esistenza )))

Cercherò di aggiungere una domanda lì...

Motivazione: