Qualsiasi nuovo prodotto software contiene inevitabilmente dei bug, che non sempre possono essere rilevati anche dai più accurati test interni. Ed è per questo che diamo grande importanza a tutti i rapporti degli utenti sui problemi riscontrati nel nostro software e cerchiamo di rispondere a ciascuno di essi.
Come possiamo comunicare se prima c'è una risposta errata e poi la ignoriamo. Applicazione 2016.06.22 08:06, #1499568
Forse qualcosa che la comunità può spiegare?
Ecco una parte del codice EA. Dentro void OnTick().
bool openNew, newDay, newHour; if((int)mqlDateTime.hour == startHour) // startHour = 0 Это условие выполнено. { newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); // if(newDay) Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour); if(newHour) Print("***** newHour ", newHour); // Судя по распечатке newHour = true if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { openNew = openNew_or_No(); Print("***** openNew ", openNew, " ***** PositionsTotal ", PositionsTotal()); // Эта распечатка отсутствует if(openNew || PositionsTotal() == 0) // Продолжение кода... // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.
Questo è il contenuto della scheda "Esperti".
2016.06.22 00:00:44.531 Toad Green (EURUSD,M15) ***** newHour true 2016.06.22 00:00:44.331 Toad Green (USDJPY,M15) ***** newHour true 2016.06.22 00:00:18.361 Toad Green (EURUSD,M15) ***** newDay true mqlDateTime.hour 0 2016.06.22 00:00:12.770 Toad Green (USDJPY,M15) ***** newDay true mqlDateTime.hour 0
Le prime righe del file di log del 21.06 dove si vede chiaramente che il codice di cui sopra ha funzionato bene.
GM 0 00:00:30.116 Trades '3265046': instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55) NK 0 00:00:30.246 Trades '3265046': accepted instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55) IE 0 00:00:30.246 Trades '3265046': deal #73303810 buy 0.01 EURUSD at 1.13188 done (based on order #87892298) KI 0 00:00:30.246 Trades '3265046': order #87892298 buy 0.01 / 0.01 EURUSD at 1.13188 done in 130 ms ON 0 00:00:30.256 Trades '3265046': instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55) LQ 0 00:00:30.366 Trades '3265046': accepted instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55) HG 0 00:00:30.376 Trades '3265046': deal #73303813 sell 0.01 EURUSD at 1.13093 done (based on order #87892301) RK 0 00:00:30.376 Trades '3265046': order #87892301 sell 0.01 / 0.01 EURUSD at 1.13093 done in 120 ms MJ 0 00:00:30.376 Trades '3265046': modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462 GK 0 00:00:30.476 Trades '3265046': accepted modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462 OK 0 00:00:30.486 Trades '3265046': modify #87608748 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 107 ms OH 0 00:00:30.486 Trades '3265046': modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462 GJ 0 00:00:30.586 Trades '3265046': accepted modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462 KI 0 00:00:30.596 Trades '3265046': modify #87892301 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 109 ms EN 0 04:20:25.608 Trades '3265046': deal #73317674 sell 0.01 EURUSD at 1.13388 done (based on order #87906853)
L'EA riposa fino all'inizio del giorno successivo.
Ultime 2 righe del file di log del 21.06
OD 0 23:09:20.196 Network '3265046': scanning network for access points NR 0 23:09:33.496 Network '3265046': scanning network finished
e inizio del registro da 22.06
PM 1 02:13:39.422 Network '3265046': connection to MetaQuotes-Demo lost GF 2 02:13:39.582 MQL5.community authorization failed DO 2 02:13:39.682 MQL5.community authorization failed IP 2 02:13:40.052 MQL5.community authorization failed PK 0 02:13:43.252 Network '3265046': authorized on MetaQuotes-Demo through Access Point RU Moscow (ping: 117.48 ms) DI 0 02:13:43.252 Network '3265046': previous successful authorization performed from 31.173.80.184 on 2016.06.21 14:55:11
Se avete entrambi NewDay e NewHour stampati simultaneamente, dovrebbero essere uno accanto all'altro nei registri. Con lo stesso tempo
Mi dispiace per l'inconveniente, non stavo facendo attenzione all'ora. Ma!!! Allora perché all'apparire della prima barra del nuovo giorno, anche la prima barra della nuova ora e il nuovo minuto la stessa funzione restituisce qualcuno vero a qualcuno falso e quando vuole può restituire tutto correttamente?
Per favore, spiegate cosa può essere sbagliato in questa funzione?
/*****************Определение появления нового бара******************/ class cNewBar { public: bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime & m_tOld) { datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE); if(tNew > m_tOld) { m_tOld = tNew; return(true); } return(false); } }; /********************************************************************/Perché tutto funzionava bene per molte settimane e all'improvviso va male?
Squadra di supporto 2016.06.22 11:31
Questa funzione non può essere usata ripetutamente a causa di
m_tOld = tNew;
Alexey Viktorov 2016.06.23 10:17
Una cosa che non ho capito subito ieri... Dopotutto, la variabile m_tOld è passata per riferimento, che è dichiarata a livello di variabili globali e non dovrebbe influenzare la chiamata multipla se diverse variabili sono passate alla funzione per riferimento. Non è così? Prima di tutto, perché funziona correttamente nel tester e nel debug, e perché non funziona sul conto demo?
E questo assegno?
if(tNew > m_tOld)
Squadra di supporto 2016.06.23 10:24
Chiamate la vostra funzione 2 volte di seguito. Se alla prima chiamata restituisce true, alla chiamata successiva restituirà false, anche se lo si chiama nello stesso tick
Alexey Viktorov 2016.06.23 10:36
Beh, si chiama. Tutto il codice richiesto l'ho fornito io. Perché non impedisce in tester e debug, e in demo come volete voi? È questo che non riesco a capire. Bene, se nel tester un tale problema si verificasse occasionalmente, potremmo e dovremmo cercare nuovi modi, ma non ci sono problemi nel tester...
Tutto lo stesso, ora non ho salvato un EA usando la stessa funzione su mql4, ma non ci sono stati problemi. Questo problema è apparso solo con mql5.Alexey Viktorov 2016.06.23 10:41
Quindi? Quindi il test... Perché prima del controllo, alla variabile tNew viene assegnato un valore e viene confrontato con la variabile passata per riferimento, non con la variabile m_tOld stessa. E questa m_tOld può avere il valore del tempo della barra precedente del periodo specificato, o 01.01.1970 se è la prima chiamata. E solo al prossimo tick di ogni periodo i valori della stessa barra saranno confrontati.
Alexey Viktorov 2016.06.23 10:57
Nota, diverse variabili e diversi periodi sono passati alla funzione
newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);
E TUTTI... Dopo di che sono completamente ignorato. Grazie per la pronta risposta senza indugio, ma non ho ricevuto alcuna risposta intelligibile. Se c'è un bug in mql5, puoi semplicemente scrivere: "Stiamo cercando di risolverlo, quindi aspetta...". Ma in questo caso, state semplicemente ignorando il problema.
Una funzione simile in mql4 definiva il cambiamento di tempo come un multiplo di 15 secondi, e in mql5 questo problema è apparso improvvisamente...
Questo è ciò che significa un'osservazione organizzata in modo improprio quando si conduce un esperimento.
...
Per rispondere, avete bisogno di un codice. Avete frammenti di codice. Fare il codice minimo - in modo che chiunque possa eseguire questo codice nel proprio posto.
Sarebbe anche bene stampare nel codice i valori delle variabili - in ingresso alla funzione e in uscita dalla funzione.
Dimitri, è ricominciato? Forse è più facile rispondere alla domanda "Perché il 21.06.2016 i mandati si sono aperti senza problemi, ma il 22.06.2016 improvvisamente l'organizzazione di sorveglianza sbagliata" o qualche altro problema...
Se rispondo in modo semplice e diretto, probabilmente verrò bannato per questo.
per sempre...
Non riesci nemmeno a dormire, sogni così tanto?
Qual è il punto? Perché non ti rende più saggio.
Non è divertente vivere quando il senso della vita è l'odio? А?
Per rispondere, avete bisogno di un codice. Avete frammenti di codice. Fate il codice minimo in modo che chiunque possa eseguire questo codice al suo posto.
Sarebbe bene stampare i valori delle variabili nel codice - in ingresso alla funzione e in uscita dalla funzione.
Nessun problema.
Ma si noti che non ci sono stati problemi e improvvisamente... Perché? Oltre agli snippet di codice ci sono dei log che mostrano che il 21.06.2016 e prima di questo ha funzionato come dovrebbe per settimane, ma qui il 22.06.2016 i problemi sono apparsi improvvisamente. Prima di scrivere su SD, ho eseguito ripetutamente in tester, ho fatto il debug attraverso la storia e non sono stati trovati problemi.
Ecco perché dubito dell'utilità di pubblicare il codice. È solo per divertimento.
#property strict datetime oldDay, oldHour; MqlDateTime mqlDateTime; /*******************Expert initialization function*******************/ int OnInit() { return(INIT_SUCCEEDED); }/*******************************************************************/ /************************Expert tick function************************/ void OnTick() { bool newDay, newHour; TimeToStruct(TimeCurrent(), mqlDateTime); if((int)mqlDateTime.hour == 0) { newDay = IsNewBar(_Symbol, PERIOD_D1, oldDay); // Обратите внимание на то, что это отдельная переменная передаваемая в функцию по ссылке if(newDay) Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true newHour = IsNewBar(_Symbol, PERIOD_H1, oldHour); // А это совсем другая переменная if(newHour) Print("***** newHour ", newHour); // Судя по распечатке newHour = true if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { Print("Ордер должен откыться. "); } } }/*******************************************************************/ /*****************Определение появления нового бара******************/ bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld) { datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE); if(tNew > m_tOld) { m_tOld = tNew; return(true); } return(false); } /********************************************************************/ /******************Expert deinitialization function******************/ void OnDeinit(const int reason) { Comment(""); }/*******************************************************************/
Visto che l'autore non è disposto, ci proverò:
//+------------------------------------------------------------------+ //| test_1Vc2f.mq5 | //| Copyright © 2016, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2016, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- bool openNew,newDay,newHour; //--- newDay=IsNewBar(_Symbol,PERIOD_D1,oldDay); // if(newDay) Print("***** newDay ",newDay," mqlDateTime.hour ",mqlDateTime.hour); // Судя по распечатке newDay = true newHour=IsNewBar(_Symbol,PERIOD_H1,oldHour); if(newHour) Print("***** newHour ",newHour); // Судя по распечатке newDay = true } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool IsNewBar(string symbol,ENUM_TIMEFRAMES timeframe,datetime &m_tOld) { datetime tNew=(datetime)SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE); if(tNew>m_tOld) { Print("in: m_tOld = ",m_tOld); m_tOld=tNew; Print("out: m_tOld = ",m_tOld); return(true); } return(false); } //+------------------------------------------------------------------+
Quello che resta da decidere è la struttura"mqlDateTime" e dove dichiarare le variabili "oldDay" e "oldHour"...
Visto che l'autore non vuole, ci proverò io:
Quello che resta da decidere è la struttura"mqlDateTime" e dove dichiarare le variabili "oldDay" e "oldHour"...
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso