//--- parâmetros de entrada input int order_time=0; // Horário de abertura do pedido
O problema com ambos os testadores é que o datetime não pode ser otimizado. Daí essa feiura forçada.
Deveríamos ter resolvido esse problema há muito tempo.
O ZY OnTesterInit pode ajudar com o datetime, mas nem todos podem.
Seria bom se no terminal fosse possível saber o horário do turno da corretora, pelo menos em relação ao GMT. Mais precisamente, isso estaria escrito no terminal para cada corretora. E nos resultados dos testes. Mas os testes são dados - qual é o horário do turno? Eu não sei.
A solicitação TimeGMT() é boa, mas não é suficiente. E não dá nada para considerar o teste. Precisamos exatamente do horário do turno do corretor em relação ao GMT.
O problema com ambos os testadores é que o datetime não pode ser otimizado. Daí essa feiura forçada.
Algo deveria ter sido feito com relação a isso há muito tempo.
Não é o datetime que está em questão aqui - veja:
if(time_now_str.hour==order_time && work==true && work_day==true)É que o autor tem um problema com nomes de variáveis
Seria bom se no terminal fosse possível saber o horário do turno da corretora, pelo menos em relação ao GMT. Mais precisamente, isso estaria escrito no terminal para cada corretora. E nos resultados dos testes. Mas os testes são dados - qual é o horário do turno? Eu não sei.
A solicitação TimeGMT() é boa, mas não é suficiente. E não dá nada para considerar o teste. O que é necessário é a mudança de horário do corretor em relação ao GMT.
É fácil determinar o TimeGMT no modo de otimização do MT5, em uma única execução - você deveria pensar nisso.
Isso não é data e hora - veja:
É que o autor tem um problema com nomes de variáveisEu me arrependo, li o artigo somente até a linha citada. Mas o problema de data e hora existe de fato. O tempo deve ser otimizado não apenas por meio do MQL, mas também, humanamente falando, por meio da GUI.
No modo de otimização do MT5, não é difícil determinar o TimeGMT em uma única execução - você precisa pensar sobre isso.
E se outras pessoas receberem os resultados do teste? Não há como saber.
Sim, não há nenhuma menção a isso no relatório. É por isso que os relatórios personalizados são poderosos. Especialmente no MT5.
Talvez em vez de
//+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { //--- time_now_var=TimeCurrent(time_now_str);// hora atual switch(time_now_str.day_of_week) { case 1: if(mon==false){work_day=false;} else {work_day=true;} break; case 2: if(tue==false){work_day=false;} else {work_day=true;} break; case 3: if(wen==false){work_day=false;} else {work_day=true;} break; case 4: if(thu==false){work_day=false;} else {work_day=true;} break; case 5: if(fri==false){work_day=false;} else {work_day=true;} break; }
use um mais simples
//+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { time_now_var=TimeCurrent(time_now_str);// hora atual switch(time_now_str.day_of_week) { case 1: work_day=mon; break; case 2: work_day=tue; break; case 3: work_day=wen; break; case 4: work_day=thu; break; case 5: work_day=fri; break; } ...
Como se costuma dizer, não é nada pessoal, apenas um hábito estúpido - não posso deixar de lado quando vejo um código ineficiente.
Não examinei o código mais a fundo.
Talvez em vez de
use um mais simples
Como se costuma dizer, não é nada pessoal, apenas um hábito estúpido - não posso deixar de lado quando vejo um código ineficiente.
Não examinei o código mais a fundo.
Obrigado por seu comentário. O hábito é bom, eu mesmo faço isso às vezes também.....
Seu exemplo:
//+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { time_now_var=TimeCurrent(time_now_str);// hora atual switch(time_now_str.day_of_week) { case 1: work_day=mon; break; case 2: work_day=tue; break; case 3: work_day=wen; break; case 4: work_day=thu; break; case 5: work_day=fri; break; } ...
Falando francamente, não o entendi, ele precisa ser complementado... Porque nas variáveis de entrada do Expert Advisor, os dias da semana em que você precisa trabalhar são marcados como "true" e, se você não precisar trabalhar nesse dia, então "false".
E a variável "work_day" envia a resposta como "true" (verdadeiro) ou "false" (falso). No seu exemplo, a variável passa a ser do tipo "string", portanto, você terá de fazer uma comparação novamente.
Portanto, sou a favor da otimização do código, embora nesse EA isso não tenha sido uma prioridade.
Esse código específico pode ser otimizado:
//+------------------------------------------------------------------+ //| Função de tique de especialista| //+------------------------------------------------------------------+ void OnTick() { //--- time_now_var=TimeCurrent(time_now_str);// hora atual work_day=true; switch(time_now_str.day_of_week) { case 1: if(mon==false){work_day=false;} break; case 2: if(tue==false){work_day=false;} break; case 3: if(wen==false){work_day=false;} break; case 4: if(thu==false){work_day=false;} break; case 5: if(fri==false){work_day=false;} break; }
O tamanho do código será reduzido, mas a velocidade do trabalho não será...
Talvez você possa implementar um loop na função, então o tamanho poderá ser menor, mas a velocidade de processamento será maior.
Você também pode trabalhar e alterar os parâmetros de entrada e, assim, alterar o código, talvez simplificando-o.
work_day=false; switch(time_now_str.day_of_week) { case 1: if (mon) work_day=true; break; case 2: if (tue) work_day=true; break; case 3: if (wen) work_day=true; break; case 4: if (thu) work_day=true; break; case 5: if (fri) work_day=true; break; }
Você também poderia oferecer esse código. Mas, ao remover os operadores "else", você simplificou o código-fonte apenas pela metade. A variante ideal será obtida se você remover também os operadores "if", deixando apenas 5 operadores de atribuição. Essa será a variante ideal que foi sugerida.
switch(time_now_str.day_of_week) { case 1: work_day=mon; break; case 2: work_day=tue; break; case 3: work_day=wen; break; case 4: work_day=thu; break; case 5: work_day=fri; break; default: work_day=false; // в субботу и воскресенье не торгуем... }
Mas não entendo nada sobre a variável que se torna do tipo "string".
- 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
Novo artigo Negociação noturna na sessão asiática: como continuar tendo lucro foi publicado:
O artigo discute o conceito de negociação em horário noturno, estratégias de trading e sua implementação em MQL5. É realizado um teste e são feitas conclusões.
Mais tarde, os mercados da Ásia e do Pacífico, cujo fuso horário é oposto ao americano e europeu, começam a trabalhar. Aqui a negociação começa quando os traders norte-americanos vão para casa e os europeus vão dormir. Eis a negociação noturna que nós conhecemos. Os períodos dos pregões podem ser representados no mapa do mundo pela figura 1 (o tempo passa da direita para a esquerda):
Fig. 1. Pregões no mapa-múndi
Autor: Dmitriy Zabudskiy