Discussão do artigo "Negociação noturna na sessão asiática: como continuar tendo lucro"

 

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

Fig. 1. Pregões no mapa-múndi

Autor: Dmitriy Zabudskiy

 
//--- 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.

 
fxsaber:

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
 
ANG3110:

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.

 
Andrey F. Zelinsky:

Isso não é data e hora - veja:

É que o autor tem um problema com nomes de variáveis

Eu 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.

 
fxsaber:

No modo de otimização do MT5, não é difícil determinar o TimeGMT em uma única execução - você precisa pensar sobre isso.

Mas e se outra pessoa fornecer os resultados do teste? Não há como determinar isso.
 
ANG3110:
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.

 
Eugene Myzrov:

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.

 
Dmitriy Zabudskiy: Obrigado pelo comentário. É um bom hábito, eu mesmo faço isso às vezes.... Seu exemplo: Honestamente, não entendo, 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. O tamanho do código será reduzido, mas a velocidade 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ê pode trabalhar um pouco mais e, de alguma forma, alterar os parâmetros de entrada, então o código pode ser alterado, talvez simplificado.
   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".