Problemas com o Tempo()

 
Olá Comunidade MQL4!

Este é meu primeiro post. Primeiro, por favor, não que eu não seja um desenvolvedor MQL. Eu sou um Trader, que usa uma ferramenta para me ajudar a construir EAs. Essa ferramenta permite o uso de alguma estrutura MQL, mas não executa em funções MQL explícitas. Ela simplesmente pega o código MQL, avalia se a condição baseada em MQL é verdadeira/falsa, e então executa uma função personalizada como OpenBuy, OpenSell, CloseBuy, CloseSell, DeletePendingBuy, DeletePendingSell, etc. Mas, ele não executa o código MQL explicitamente. Por exemplo, você pode usar a função Imprimir ou Comentar para obter algo para aparecer na janela do gráfico do MT4 (apenas um exemplo).

Portanto, sei um pouco sobre MQL, o que é suficiente para que eu possa usar a ferramenta de desenvolvimento EA que uso para construir meus EAs. Até agora, eu construí 10 EAs usando a ferramenta e abandonei 7 deles devido à não lucratividade, que é cerca de 30% melhor do que minha relação de protótipos de sucesso que eu costumava obter com a construção de sistemas comerciais em Excel. Eu normalmente espero que 7-8 idéias em 10 não sejam tão lucrativas quanto o esperado, deixando 2-3 projetos lucrativos o suficiente para iniciar o processo de otimização. Ok, chega de falar de mim e de como eu funciono.

Aqui está o meu problema e espero ter vindo ao lugar certo para pedir ajuda!

Estou executando este código [b]para fechar negócios:[/b]

Day() == 1 ||| Day() == 2 ||| Day() == 3 ||| Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Nota: O problema é que todas as negociações permanecem abertas de segunda a quinta-feira, até as 23:57. Além disso, todas as negociações permanecem abertas na sexta-feira, até as 21:57.


Também estou executando este código através de um bloco MQL [b]para abrir negociações:[/b].

TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05

Nota: A única negociação que abre entre 00:00 e 00:05, é a primeira negociação do back-test, ao clicar no botão Tester Start. Essa negociação se abre precisamente às 00:00. Entretanto, nenhuma das outras negociações abre entre 00:00 e 00:05, no final da semana.

Em resumo:

- Uma negociação se abre após clicar no botão Tester Start às 00:00.
- Nenhuma negociação é fechada posteriormente às 23:57 (M-Thu), ou 21:57 (sex).
- Nenhuma negociação é aberta subseqüentemente entre 00:00 e 00:05.

Todos os horários mostrados acima têm amplo fluxo de carrapato disponível. Portanto, não houve lacunas nos dados que estão sendo usados pelo Testador.

Qualquer ajuda seria bem-vinda. Por que estas trocas não estão fechando na hora codificada? Por que nenhuma negociação está sendo executada quando há sempre um sinal de negociação disponível entre 00:00 e 00:05, de segunda a sexta?

Obrigado!
cfx
 

Que depuração Print statements você adicionou ao seu código para descobrir o que está ou não sendo executado ? por exemplo, o OrderClose() está falhando ou é o código que leva ao OrderClose() ? você toma nota dos valores de retorno e imprime algum erro relevante ?

O que são valores de retorno de função ? Como eu os utilizo ?

Day() funciona corretamente no Strategy Tester ? tem que testar se funciona ? você pode usar TimeDayOfWeek() em vez disso .

 

>Estou executando este código [b]para fechar negócios:[/b]

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

>Note: O problema é que todas as negociações permanecem abertas de segunda a quinta-feira, até as 23:57. Além disso, todas as negociações permanecem abertas na sexta-feira, até as 21:57.

Este é um erro muito comum com iniciantes; tentando encaixar toda a expressão lógica em uma linha. É impossível fazer a depuração.

O truque é quebrar o teste em pedacinhos e verificar cada pedaço (com declarações impressas ou não).

Você pode fechá-lo depois das 23:57 em qualquer dia? Não há necessidade de se preocupar com os dias da semana com esse teste. Uma vez que um teste funcione corretamente, você pode se tornar mais aventureiro. Mas use várias linhas sempre que possível para permitir a impressão de declarações no meio para a depuração. Quando funcionar, remova as declarações de impressão , mas deixe o código em linhas separadas. O código é na verdade mais eficiente quando escrito em muitas linhas (funciona mais rápido).

 
  1.  Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    Qual destes você quis dizer?
    Day() == 1 || Day() == 2 || Day() == 3 || ( Day() == 4 && TimeHour(TimeCurrent()) >=23) && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    ( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    Sempre parênteses completamente ou simplificar e auto documentar
    #define HR2157 79020 // 21 * 3600 + 57 * 60
    #define HR2357 86220
    datetime now = TimeCurrent();
    int      tod = now % 86400;
    bool     isFriday = TimeDayOfWeek(now) == 5;
    if (isFriday) int todClose = HR215700;
    else              todClose = HR235700
    if (now >= todClose) ...
    

  2. https://www.mql5.com/en/forum/127483 reportou DayOfWeek() sempre retorna 5 no testador, então eu só uso as versões Timexxx().
 
WHRoeder:
  1. Qual destes você quis dizer?
O OP obviamente significa OU todos os dias da semana, exceto sexta-feira. Claramente ele está tentando forçar um fechamento antes do final do dia de negociação, mas com a sexta-feira sendo mais curta. Ele não percebeu que o teste de usar o OR dos quatro dias é redundante, pois podemos sempre fechar se o horário for depois das 23:57. A sexta-feira não precisa ser excluída!
 
RaptorUK:

Que depuração Print statements você adicionou ao seu código para descobrir o que está ou não sendo executado ? por exemplo, o OrderClose() está falhando ou é o código que leva ao OrderClose() ? você toma nota dos valores de retorno e imprime algum erro relevante ?

O que são valores de retorno de função ? Como eu os utilizo ?

Day() funciona corretamente no Strategy Tester ? tem que testar se funciona ? você pode usar TimeDayOfWeek() em vez disso .


Eu não usei declarações impressas para tal propósito. Eu fiz um erro de digitação em meu post original. A ferramenta que estou usando [b]cannot[/b] (Eu originalmente digitei "pode") usa funções MQL, como Imprimir, ou Comentar. Portanto, peço desculpas pelo erro de digitação, que teve impacto em sua resposta.

Entretanto, posso facilmente olhar para o Jornal do Testador e ver que a EA não está preparando nenhuma negociação quando deveria (às 00:00), e não está instanciando o fechamento de nenhuma negociação quando deveria (Seg - Sex às 23:59, ou Sex às 21:57). Essencialmente, posso ver o carregamento da EA no tempo de execução do Testador, as informações obrigatórias sobre a Conta Demo e, finalmente, posso ver que todos os Quadros de Tempo para o(s) indicador(es) utilizado(s) pela EA estão sendo carregados corretamente e sem erros. Eu normalmente não recebo erros de qualquer tipo com meus EAs, seja qual for. E, eu testei rotineiramente os EAs Multi-Time Frame o tempo todo.

Parece que estou tendo apenas um problema com a função Time().

Como a única posição que se abre é a primeira troca que o EA vê DEPOIS de clicar no botão Tester Start, não posso dizer se o Day() está funcionando ou não a partir da saída que vem de Print, ou Comment. Entretanto, como um teste aleatório, removi a linha [b]TimeMinute(TimeCurrent()) <= 05[/b] do segmento de código que controla a Abertura de Posições às 00:00, de segunda a sexta. Quando fiz isso, o seguinte código começou a funcionar como projetado:

Day() == 1 ||| Day() == 2 ||| Day() == 3 ||| Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Isto me diz que, de fato, o Day() está de fato trabalhando por dedução. Na verdade, todo aquele segmento de código que fecha posições, funciona. Mas, por alguma razão, não quando [b]TimeMinute(TimeCurrent())) <= 05[/b] é usado no segmento de código que controla a Abertura de posições. Essa ironia não faz sentido para mim - não consigo entender por que isso seria o caso.

Obrigado!

cfx

 
dabbler:

>Estou executando este código [b]para fechar negócios:[/b]

>Note: O problema é que todas as negociações permanecem abertas de segunda a quinta-feira, até as 23:57. Além disso, todas as negociações permanecem abertas na sexta-feira, até as 21:57.

Este é um erro muito comum com iniciantes; tentando encaixar toda a expressão lógica em uma linha. É impossível fazer a depuração.

O truque é quebrar o teste em pedacinhos e verificar cada pedaço (com declarações impressas ou não).

Você consegue fechá-lo depois das 23:57 em qualquer dia? Não há necessidade de se preocupar com os dias da semana com esse teste. Uma vez que um teste funcione corretamente, você pode se tornar mais aventureiro. Mas use várias linhas sempre que possível para permitir a impressão de declarações no meio para a depuração. Quando funcionar, remova as declarações de impressão , mas deixe o código em linhas separadas. O código é na verdade mais eficiente quando escrito em muitas linhas (funciona mais rápido).


A propósito, obrigado a todos pelas respostas!


O Close Control funciona. Quando eu removi o [b]TimeMinute(TimeCurrent()) <= 05[/b] do Controle Aberto, ele funciona de fato. A primeira posição que foi executada DEPOIS de clicar no botão Tester Start, de fato é fechada às 23:57 (Seg-Thurs). O problema então se torna o fato de que nenhuma nova posição é aberta às 00:00, como o Controle Aberto requer por projeto ([b]TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05[/b]. Mesmo quando eu removo a função [b]TimeMinute(TimeCurrent() <=5[/b] como apenas uma verificação de sanidade.

Pensei que tornar o código o mais compacto possível seria a melhor alternativa, mas vou tentar expandir cada função, segmento, componente, etc., para ver se isso ajuda.


Obrigado!

cfx

 
WHRoeder:
  1. a qual destes você quis dizer?
    Sempre parênteses completos ou simplificados e autodocumentados.
  2. https://www.mql5.com/en/forum/127483 reportou DayOfWeek() sempre retorna 5 no testador, então eu só uso as versões Timexxx().

Eu quis dizer:

( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57


Parece faltar um parêntese neste segmento de código. Se você puder corrigi-lo para mim, eu agradeceria. A ferramenta que eu uso me avisa quando falta um parêntese, mas não me diz onde.


Obrigado!

 
dabbler:
O OP obviamente significa OU todos os dias da semana, exceto sexta-feira. Claramente ele está tentando forçar um fechamento antes do final do dia de negociação, mas com a sexta-feira sendo mais curta. Ele não percebeu que o teste de usar o OR dos quatro dias é redundante, já que podemos sempre fechar se o horário for depois das 23:57. A sexta-feira não precisa ser excluída!

Tenho que isolar a sexta-feira, senão não haverá distinção entre o horário de fechamento de segunda a quinta-feira e o horário de fechamento da sexta-feira. Ambos os horários de fechamento se distinguem pelo Dia da Semana em que ocorrem e não apenas pela Hora do Dia em que ocorrem.

Portanto, preciso fechar de segunda a quinta-feira às 23:57, e sexta-feira às 21:57, respectivamente. Se eu incluir o fechamento da sexta-feira com segunda a quinta-feira, então todas as negociações serão fechadas no horário mais próximo visto pela EA, que será 21:57, duas horas antes do horário de fechamento exigido de segunda a quinta-feira.

Por favor, esclareça sua declaração. Obrigado!

cfx

 

LOL!


Começo a pensar que a maioria das funções baseadas no "Tempo" no MT4 são seriamente defeituosas.


Quero dizer, se eu redefinir toda a minha lógica de controle de posição para algo tão mundano quanto: TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, e não conseguir fechar um negócio solitário (a EA simplesmente ignora o código!), então eu diria que o MT4 tem alguns problemas que precisam ser corrigidos com relação a estes tipos de funções.


Eu também passei por uma série de testes usando o seguinte: DayOfWeek() != 0 && DayOfWeek() !=, e nem uma única operação seria aberta de segunda a sexta-feira! Na verdade, nem um único comércio abriria. Mas, o que você acha que aconteceu com a EA quando eu removi completamente todas as funções baseadas no Tempo? É claro, ele funciona como projetado sem erros. Não sou desenvolvedor de MQL, mas sou realmente bom em desenvolver construções lógicas e posso detectar um problema sistêmico quando o sinto. Sinto que a MetaQuotes tem um problema com suas funções de Tempo(), ponto final. Não posso ser tão ignorante em algo tão facilmente codificado e já vi outras pessoas que fazem código em MQL, terem dificuldade com funções baseadas no Tempo no MT4.

Não sei exatamente qual é o problema, mas quando removo o TimeMinute(TimeCurrent()) <= 05, da lógica de Controle de Abertura (aquele pedaço de código que controla a abertura de todas as trocas), e recebo SOMENTE a primeira troca a fechar na hora correta, ainda que TODAS as outras trocas impulsionadas pela mesma lógica de Controle de Abertura sejam sumariamente ignoradas pela EA posteriormente, então sei que algo está sistemicamente errado com a própria função.

O código não pode ser mais simples! Estou instruindo a EA a abrir o maldito comércio entre 00:00 e 00:05. Isso não é uma coisa difícil de codificar. Uma criança de seis anos de idade poderia codificar isso. Aqui está mais uma vez: [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Aí está. Acabei de codificá-lo. Em seguida, eu deixo cair esse código na ferramenta que estou usando e a ferramenta me diz que a sintaxe do código está correta! Ok, e agora? Bem, eu compilo o maldito arquivo .ex4 para o MILHÃO de tempo e executo o Testador M4. Ok, e agora? Bem, o primeiro lançamento comercial é às 00:00. Incrível, certo? NOOOOOOO! Por quê? Porque às 23:59 de uma segunda-feira, a maldita posição é STILLL aberta. E depois? Bem, às 00:00 do próximo pregão (a próxima barra D1), o bom olé [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] vai conseguir onde o Controle de Fechamento falhou, certo? Errado! Por quê? Porque, de 00:00 a 00:05, nenhuma maldita negociação é aberta pela EA!!!

Eu passei dois (2) dias com este simples código e ninguém foi capaz de me dizer porque ele não vai funcionar - nem mesmo os especialistas em MQL! Isto me diz que a MetaQuotes tem um problema.

Ok, já terminei de desabafar. Foram dois dias de frustração reprimida e eu tive que desabafar.

Eu NUNCA tive problemas comigo EAs e fui capaz de montar alguns projetos bastante sofisticados usando todos os cronogramas, exceto W1 e MN. Todos os meus EAs usam projetos iCustom que eu construí e pesquisei do zero.

De repente, depois de funcionar como um motor V8 bem oleado e bem afinado, começo a usar as funções Time() e todo o inferno se solta? Alguma coisa não está muito certa sobre isso. Estou usando estas funções baseadas no Tempo da maneira mais simples possível, e elas ainda não funcionam? 48 horas em algo assim foi uma enorme quantidade de tempo para eu desperdiçar. Frustrado e desesperado, vou tentar viver sem "Tempo", um se isso for possível.

Vou ter que aprender a desenvolver a lógica comercial em torno das funções do Tempo().

Irreal.

 

CFx 2012.05.31 03:41

LOL!


Começo a pensar que a maioria das funções baseadas no "Tempo" no MT4 são seriamente defeituosas.


Quero dizer, se eu redefinir toda a minha lógica de controle de posição para algo tão mundano quanto: TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, e não conseguir fechar um negócio solitário (a EA simplesmente ignora o código!), então eu diria que o MT4 tem alguns problemas que precisam ser corrigidos com respeito a estes tipos de funções.


Eu também passei por uma série de testes usando o seguinte: DayOfWeek() != 0 && DayOfWeek() !=, e nem uma única operação seria aberta de segunda a sexta-feira! Na verdade, nem um único comércio abriria. Mas, o que você acha que aconteceu com a EA quando eu removi completamente todas as funções baseadas no Tempo? É claro, ele funciona como projetado sem erros. Não sou desenvolvedor de MQL, mas sou realmente bom em desenvolver construções lógicas e posso detectar um problema sistêmico quando o sinto. Sinto que a MetaQuotes tem um problema com suas funções Time(), ponto final. Não posso ser tão ignorante em algo tão facilmente codificado e já vi outras pessoas que fazem código em MQL, terem dificuldade com funções baseadas no Tempo no MT4.

Eu não sei exatamente qual é o problema, mas ao remover o TimeMinute(TimeCurrent()) <= 05, da lógica de Controle de Abertura (aquele pedaço de código que controla a abertura de todas as negociações), e eu recebo SOMENTE a primeira negociação a fechar na hora correta, no entanto TODAS as outras negociações impulsionadas pela mesma lógica de Controle de Abertura são sumariamente ignoradas pela EA posteriormente, então eu sei que algo está sistemicamente errado com a própria função.

O código não pode ser mais simples! Estou instruindo a EA a abrir o maldito comércio entre 00:00 e 00:05. Isso não é uma coisa difícil de codificar. Uma criança de seis anos de idade poderia codificar isso. Aqui está mais uma vez: [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Aí está. Acabei de codificá-lo. Em seguida, eu deixo cair esse código na ferramenta que estou usando e a ferramenta me diz que a sintaxe do código está correta! Ok, e agora? Bem, eu compilo o maldito arquivo .ex4 para o MILHÃO de tempo e executo o Testador M4. Ok, e agora? Bem, o primeiro lançamento comercial é às 00:00. Incrível, certo? NOOOOOOO! Por quê? Porque às 23:59 de uma segunda-feira, a maldita posição é STILLL aberta. E depois? Bem, às 00:00 do próximo pregão (a próxima barra D1), o bom olé [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] vai conseguir onde o Controle de Fechamento falhou, certo? Errado! Por quê? Porque, de 00:00 a 00:05, nenhuma maldita negociação é aberta pela EA!!!

Eu passei dois (2) dias com este simples código e ninguém foi capaz de me dizer porque ele não vai funcionar - nem mesmo os especialistas em MQL! Isto me diz que a MetaQuotes tem um problema.

Ok, já terminei de desabafar. Foram dois dias de frustração reprimida e eu tive que desabafar.

Eu NUNCA tenho problemas comigo EAs e fui capaz de montar alguns projetos bastante sofisticados usando todos os cronogramas, exceto W1 e MN. Todos os meus EAs usam projetos iCustom que eu construí e pesquisei a partir do zero.

De repente, depois de funcionar como um motor V8 bem oleado e bem afinado, começo a usar as funções Time() e todo o inferno se solta? Alguma coisa não está muito certa sobre isso. Estou usando estas funções baseadas no Tempo da maneira mais simples possível, e elas ainda não funcionam? 48 horas em algo assim foi uma enorme quantidade de tempo para eu desperdiçar. Frustrado e desesperado, vou tentar viver sem "Tempo", um se isso for possível.

Vou ter que aprender a desenvolver a lógica comercial em torno das funções do Tempo().

Irreal.

LOL. Você é aquele que é irreal. Este seu código ...

if (TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05)

... nunca retornará verdadeiro.

Você é o único que precisa desenvolver ainda mais "sua" construção lógica.

E construir esta ...

if (TimeHour(TimeCurrent()) >= 00 && TimeHour(TimeCurrent()) <= 05)