Ajude um novato - Funções de dia e hora

 

Hi,

Sou um novato aqui dentro, então preciso de ajuda.

Tenho um EA que negocia quando o mercado abre aos domingos. O problema com a EA é que ela também aceita negociações durante a semana e eu não quero isso.

Eu quero que funcione assim:

início de dia externo = "domingo".

início int externo Tempo de início="23:00"

externo int StopDay="segunda-feira"

tempo de parada externo int="15:00"

Se dia="domingo" e o mercado estiver aberto (apenas uma negociação pode ser aberta entre domingo 23:00 e segunda-feira 15:00, nenhuma nova negociação se nossa negociação estiver fechada por causa de TP ou SL)

{

Iniciar o comércio (algum código que eu já tenho)

}

Como posso fazer isso na MQL?

 

verificar Tempo[0]

com essas funções de ajuda Funções de data e hora

 
// SEE IF THIS WORK FOR YOU..... (I'VE NOT TESTED IT....)



int start()
{
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )
      go_trading();

}
 
abstract_mind:
  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())>=0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())<=1) && (Hour()<=15); 
  if( sunday_cond  || monday_cond )

Não tenho certeza se isto está certo. O "sunday_cond" é verdadeiro todos os dias da semana, entre 23h e meia-noite. Portanto, como o código faz o "sunday_cond" ou o "sundday_cond", ele potencialmente será negociado após as 23h todos os dias. Além disso, o "segunda-feira_cond" é atendido aos domingos até as 15h. É improvável, mas em alguns fusos horários que também podem cair dentro do horário de negociação. Mais importante, Hora() <= 15 é verdadeiro até as 15:59, não até as 15:00.


Mas o princípio é obviamente sólido em termos do que o EagleEye precisa fazer: verificar a hora, e também o dia da semana usando DayOfWeek() ou TimeDayOfWeek().

 
jjc:

Não tenho certeza se isto está certo. O "sunday_cond" é verdadeiro todos os dias da semana, entre 23h e meia-noite. Portanto, como o código faz o "sunday_cond" ou o "sundday_cond", ele potencialmente será negociado após as 23h todos os dias. Além disso, o "segunda-feira_cond" é atendido aos domingos até as 15h. É improvável, mas em alguns fusos horários que também podem cair dentro do horário de negociação. Mais importante, Hora() <= 15 é verdadeiro até as 15:59, não até as 15:00.


Mas o princípio é obviamente sólido em termos do que o EagleEye precisa fazer: verificar a hora, e também o dia da semana usando DayOfWeek() ou TimeDayOfWeek().



Você está certo. Isto deve funcionar:

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
go_trading();
 

Obrigado, pessoal,


Vou tentar isso e avisarei se funcionar.

 

only one trade can be open between sunday 23:00 and monday 15:00

O código acima deve ser negociado de domingo 23:00 até segunda-feira 15:59 (Hora()<=15), não 15:00 (Hora()<15)

Você também precisará ter código para abrir apenas um Comércio durante o período permitido.

 
Que tipo deve ser o sunday_cond e o sundday_cond? int?
 

Não tenho certeza se entendi o que você quer dizer com esta parte do WHRoeder : Segunda-feira 15:59 (Hora()<=15), não 15:00 (Hora()<15)???

Sim, claro, eu também preciso desse código. Espero que alguém possa me fornecer isso.

 
EagleEye:

Sim, eu preciso desse código também. Espero que alguém possa me fornecer isso.

Este é um problema um pouco incomum porque você não quer aceitar uma nova negociação se já abriu uma durante a janela de negociação atual, mesmo que a negociação esteja agora fechada. A maioria das discussões neste fórum se preocupam apenas em verificar se não há uma negociação atualmente aberta (e este é um tópico que vem muito à tona).


Em essência, você tem três opções em termos de verificação de negociações fechadas:


  1. Ao abrir um novo comércio, armazenar o horário atual em uma variável. Ao considerar a colocação de uma nova negociação, verifique se o tempo armazenado da última negociação não se enquadra na janela de negociação atual.
  2. Como acima, mas armazene o tempo de última negociação nas variáveis globais da MT4.
  3. Procure na lista de negociações MT4, procurando por negociações fechadas que foram abertas durante a janela de negociação atual.


Estas opções estão aproximadamente em ordem de complexidade (e também em ordem inversa de desempenho, ou seja, com 3 sendo de longe as mais lentas, embora qualquer diferença de velocidade entre elas seja muito improvável de causar problemas na vida real).


Entretanto, as opções também estão em ordem de resiliência:


  1. Se o último tempo de negociação for armazenado em uma variável (em memória), então o valor é perdido se o MT4 for reiniciado ou se sua EA tiver que ser recarregada por qualquer outro motivo. Em outras palavras, se o EA for recarregado, então ele potencialmente negociará mais de uma vez durante a mesma janela de negociação.
  2. Se o tempo for armazenado em uma variável global MT4, então o registro da mesma deverá sobreviver a recargas do EA. Entretanto, se a negociação tiver que ser movida rapidamente para um novo computador, então o registro do último tempo de negociação será perdido (a menos que um backup do arquivo gvariables.dat do MT4 esteja disponível).
  3. A digitalização da lista de negociações da MT4 é a única opção que resiste adequadamente em termos de recuperação de desastres: você pode entrar na conta do corretor a partir de uma cópia da MT4 em outro computador, iniciar a EA e ter a garantia de não aceitar negociações extras incorretas.


 

// Aproximação_1

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
if(OrdersTotal()==0)
go_trading();



// Aproximação_2

  bool sunday_cond = ( TimeDayofWeek(TimeCurrent())==0) && (Hour()>=23);
  bool monday_cond = ( TimeDayofWeek(TimeCurrent())==1) && (Hour()<=15);
  if( sunday_cond  || monday_cond )
{
if(number_of_longs()==0) // Count the longs from both "trade context" and history for the period in qestion. There is code for counting open longs/shorts in the forum
go_trading_longs();
if(number_of_shorts()==0)
go_trading_shorts();

}