Qualquer produto de software novo inevitavelmente contém bugs, que nem sempre podem ser detectados mesmo pelos testes mais minuciosos realizados internamente. E é por isso que damos grande importância a todos os relatórios de usuários de problemas encontrados em nosso software e tentamos responder a cada um deles.
Como podemos nos comunicar se primeiro há uma resposta errada e depois a ignoramos. Aplicação 2016.06.22 08:06, #1499568
Talvez algo que a comunidade possa explicar?
Aqui está uma parte do código EA. Dentro do vazio 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) // Продолжение кода... // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.
Este é o conteúdo da guia "Especialistas".
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
As primeiras linhas do arquivo de log a partir de 21.06, onde se vê claramente que o código acima funcionou bem.
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)
O EA descansa até o início do dia seguinte.
Últimas 2 linhas de arquivo de log a partir de 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 início do log a partir de 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 você tiver o NewDay e o NewHour impressos simultaneamente, eles devem estar ao lado um do outro nos logs. Com o mesmo tempo
Desculpe pelo inconveniente, eu não estava prestando atenção ao tempo. Mas!!!! Então, por que ao surgir a primeira barra do novo dia, também a primeira barra da nova hora e do novo minuto a mesma função retorna alguém verdadeiro para alguém falso e quando quer pode retornar tudo corretamente?
Por favor, explique o que pode estar errado nesta função.
/*****************Определение появления нового бара******************/ 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); } }; /********************************************************************/Por que tudo estava funcionando bem por muitas semanas e, de repente, deu errado?
Equipe de apoio 2016.06.22 11:31
Esta função não pode ser usada repetidamente por causa de
m_tOld = tNew;
Alexey Viktorov 2016.06.23 10:17
Algo que ontem eu não entendi imediatamente... Afinal, a variável m_tOld é passada para a variável por referência, que é declarada no nível das variáveis globais e não deve afetar a chamada múltipla se variáveis diferentes forem passadas para a função por referência. Não é assim? Primeiro de tudo, por que está funcionando corretamente no teste e na depuração, e por que não está funcionando em conta de demonstração?
E quanto a este cheque?
if(tNew > m_tOld)
Equipe de apoio 2016.06.23 10:24
Chame sua função 2 vezes seguidas. Se na primeira chamada ela retornar verdadeira, na próxima chamada ela retornará falsa, mesmo que você a chame no mesmo tick
Alexey Viktorov 2016.06.23 10:36
Bem, é assim que se chama. Todos os códigos necessários que eu forneci. Por que isso não impede em testador e depurador, e em demonstração como você quiser? Isso é o que eu não consigo entender. Bem, se no testador tal problema ocorresse ocasionalmente, poderíamos e deveríamos procurar novos caminhos, mas não há problemas no testador...
Mesmo assim, não salvei um EA usando a mesma função no mql4, mas não houve problemas. Este problema só apareceu com mql5.Alexey Viktorov 2016.06.23 10:41
Então? Então, o teste... Porque antes da verificação, a variável tNew recebe um valor e é comparada à variável passada por referência, não à própria variável m_tOld. E esta m_tOld pode ter o valor de tempo da barra anterior do período especificado, ou 01.01.1970 se for a primeira chamada. E somente no próximo tick para cada período os valores da mesma barra serão comparados.
Alexey Viktorov 2016.06.23 10:57
Nota, variáveis diferentes e períodos diferentes são passados para a função
newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);
E TODOS... Depois disso, sou completamente ignorado. Obrigado pela pronta resposta sem demora, mas não recebi nenhuma resposta inteligível. Se houver um bug em mql5, você pode simplesmente escrever: "Estamos tentando consertá-lo, então é só esperar...". Mas, neste caso, você está simplesmente ignorando o problema.
Uma função similar em mql4 define a mudança de tempo como um múltiplo de 15 segundos, e em mql5 este problema apareceu de repente...
Isto é o que significa uma observação mal organizada ao conduzir uma experiência.
...
Para responder a isso, você precisa de um código. Você tem trechos de código. Faça o código mínimo - para que qualquer pessoa possa executar este código em seu próprio lugar.
Também seria bom imprimir no código os valores das variáveis - na entrada para a função e na saída da função.
Dimitri, já começou de novo? Talvez seja mais fácil responder à pergunta "Por que em 21.06.2016 os mandados abriram sem problemas, mas em 22.06.2016 de repente a organização de vigilância errada" ou algum outro problema...
Se eu responder de forma simples e direta, provavelmente serei banido por isso.
para sempre...
Você não consegue nem dormir, você sonha tanto?
Qual é o objetivo? Porque isso não o torna mais sábio.
Não é divertido viver quando o sentido da vida é ódio? А?
Para responder a isso, você precisa de um código. Você tem trechos de código. Faça o código mínimo para que qualquer um possa executar este código.
Seria bom imprimir os valores das variáveis no código - na entrada para a função e na saída da função.
Não há problema.
Mas note que não houve problemas e de repente... por quê? Além de trechos de código, há registros que mostram que 21.06.2016 e antes disso funcionou como deveria durante semanas, mas aqui 22.06.2016 surgiram subitamente problemas. Antes de escrever para a SD, eu corri repetidamente no testador, depurei a história e não foram encontrados problemas.
É por isso que eu duvido da utilidade de postar o código. É só por diversão.
#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(""); }/*******************************************************************/
Como o autor não está disposto a isso, vou tentar:
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+
O que falta decidir é a estrutura"mqlDateTime" e onde declarar as variáveis "oldDay" e "oldHour"...
Como o autor não está disposto a isso, vou tentar:
O que falta decidir é a estrutura"mqlDateTime" e onde declarar as variáveis "oldDay" e "oldHour"...
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso