Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 767

 
tuner:

Não notei a resposta de imediato. Bem, para ser honesto, eu não entendi bem o que você quis dizer ao dizer que não há confusão sobre isso.

O que você quer dizer com "não importa o tempoStringToTime() conta os segundos transcorridos"?

A função essencialmente leva uma data à esquerda(acredito que a data do PC local é à esquerda) e compara a hora atual do servidor do corretor com ela, por que isso não importaria?

Da captura de tela acima, o comentário diz que o tempo em seu PC local é 1 hora antes do tempo do corretor, ou seja, o turno GMT é maior. Se fossem X horas a menos, seria crítico, como no caso de eu ter escrito sobre sexta-feira.

Quanto ao fim do tempo de negociação. Acho que para a funçãoStringToTime() não deveimportar quando o corretor termina o dia ou a semana de negociação...

Não tenho outra explicação.

Se são 11:40 em Moscou, então passaram XXX segundos de 01.01.1970 até a hora atual.

Quando forem 11:40 em Londres, por exemplo, o número de segundos será o mesmo que em Moscou agora... Isto só porque 01.01.1970 em Londres foi muito mais tarde que a época atual. Não é o tempo especificado, mas apenas o número de segundos.

Tente escrever você mesmo uma fórmula para calcular o número de segundos desde 01.01.1970 00:00:00.

Por um curto período de tempo, você poderia usar esta fórmula. Desde o início do mês corrente passou 6*24*60*60 + 11*60*60 + 59*60 + valor atual de segundos no relógio que você está olhando.

 

É claro que a comparação se baseia no número de segundos decorridos desde o ano 70, mas este número de segundos leva em conta tudo - data e hora.

Vou dar apenas um exemplo, que é essencialmente uma simplificação de um problema que encontrei recentemente.

A tarefa: calcular a hora (data/hora) de término da negociação na sexta-feira, levando em conta a variável string "21:30".

Inicialmente eu tinha uma solução desse tipo:

datetime EndTrading;

if(TimeDayOfWeek(TimeCurrent())==5)     // если сейчас пятница, например возьмем сегодняшний день, первый тик 2014.11.07 00:00
  EndTrading=StringToTime("21:30");     // подразумевается что тут должно быть время пятницы...

if(TimeDayOfWeek(TimeCurrent())==5)     // если настала пятница
  if(TimeCurrent()>EndTrading)          // и время удовлетворяет условию
    Print("Настала пятница и текущее время больше чем 21:30");

E agora o gimmick: a impressão especificada no código aparecerá na sexta-feira, mas não depois das 21h30, mas às 00h00 do primeiro tick.

Porque quando o servidor do meu corretor chegou na sexta-feira, no meu PC local ainda era quinta-feira, o timeshift é diferente.

No testador, tudo está bem e a impressão será liberada como deve ser na sexta-feira depois das 21h30. Isso não é confuso?

 
tuner:

É claro que a comparação se baseia no número de segundos decorridos desde o ano 70, mas este número de segundos leva em conta tudo - data e hora.

Apenas para dar um exemplo, basicamente uma simplificação de um problema que encontrei recentemente.

A tarefa: calcular a hora (data/hora) de término da negociação na sexta-feira, levando em conta a variável string "21:30".

Inicialmente eu tinha uma solução desse tipo:

E agora o gimmick: a impressão especificada no código aparecerá na sexta-feira, mas não depois das 21h30, mas às 00h00 do primeiro tick.

Porque quando o servidor do meu corretor chegou na sexta-feira, no meu PC local ainda era quinta-feira, o timeshift é diferente.

No testador, tudo está bem e a impressão será liberada como deve ser na sexta-feira depois das 21h30. Isso não é confuso?

É claro que é confuso. É só confusão na sua cabeça. TimeToString("21:30") dará a data atual das 21:30:00 às 21:29:59 do dia seguinte. Vou corrigir os comentários em seu código.

datetime EndTrading;

if(TimeDayOfWeek(TimeCurrent())==5)     // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
  EndTrading=StringToTime("21:30");     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

if(TimeDayOfWeek(TimeCurrent())==5)     // если настала пятница
  if(TimeCurrent()>EndTrading)          // А тут условие если(текущее время больше чем четверг 21:30)
   {
    Print("EndTrading = ", TimeToString(EndTrading)); // Посмотри что будет напечатано.
   }


E este código vai funcionar corretamente

if(TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() >= StringToTime("21:30"))
Print("Настала пятница и текущее время больше чем 21:30");
 
ikatsko:
Há dois terminais MT4 no mesmo laptop: um com 4 casas decimais e outro com 5 casas decimais. Ao mesmo tempo, o tráfego no primeiro é de 105/0 kb, no segundo de 3450/0 kb. A primeira é intensiva em CPU em 6%, a segunda em 39%. Qual é o problema? Isto é sequer uma norma?
Sim.
 

AlexeyVik

Alterei a data em meu computador para 2000.

rodou este roteiro:

input string time="21:30";

Comment("TimeCurrent() = ",TimeCurrent(),"\n",
"TimeLocal() = ",TimeLocal(),"\n",
"StringToTime(",time,") = ",StringToTime(time));

e consegui isto:

portanto StringToTime() tira a data do computador local

 
tuner:

AlexeyVik

Alterei a data em meu computador para 2000.

rodou este roteiro:

e consegui isto:

Então StringToTime() tira a data do computador local

E daí? Deixe que ele o tire da lua, desde que o tempo "de e para" tenha passado de XXX segundos e este número inteiro nós comparamos com o número de segundos passados de 01.01.1970 do tempo necessário.

É melhor você verificar esta linha

if(TimeDayOfWeek(TimeCurrent()) == 5 && TimeCurrent() >= StringToTime("21:30"))

onde você tinha o problema. Hoje é sexta-feira.

 
AlexeyVik:

É melhor você verificar essa linha

onde você tinha o problema. Hoje é sexta-feira.

Eu verifiquei, se o computador local tem uma data inferior à data do corretor, então as impressoras estão lá,

e se o computador local tiver uma data maior do que a do corretor, não há impressoras.

ou seja, o tempo já passou, ou seja, "11h30".

no primeiro caso o TimeCurrent() é comparado com 2014.11.06 11:30, e no segundo casocom 2014.11.0811:30

PS corrigiu o destacado

if(TimeDayOfWeek(TimeCurrent())==5)      // если сейчас пятница, от текущего времени. Наступит когда по времени сервера будет 00:00
   EndTrading=StringToTime("21:30");     // А тут в 00:00 устанавливается четверг 21:30 потому, что это время пятницы ещё далеко.

A primeira linha é clara, o comentário sobre a segunda linha não é.

Por que a sexta-feira está longe, quando já chegou? Afinal de contas, a segunda linha só é executada se for sexta-feira.

 
tuner:

Eu verifiquei, se o computador local tem uma data inferior à data do corretor, então as impressoras estão lá,

e se a data no computador local for maior que a data do corretor, então não há impressoras.

ou seja, o tempo já passou, ou seja, "11h30".

no primeiro caso o TimeCurrent() é comparado com 2014.11.06 11:30, e no segundo casocom 2014.11.0811:30

PS corrigiu o destacado


Bem aqui eu tenho tempo local maior que o do servidor em 1 hora.

Este roteiro

   datetime time_begin;
    time_begin = StringToTime("21:30");
    Comment("Текущее локальное время ", TimeLocal(), " ", TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS), "\n"
          , "Текущее время сервера    ", TimeCurrent(), " ", TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), "\n"
          , "Сегодня 21:30 по TimeLocal будет через    ", time_begin-TimeLocal(), " секунд или ", 
           TimeToString(time_begin-TimeLocal(), TIME_MINUTES|TIME_SECONDS), "\n"
          , "Сегодня 21:30 по TimeCurrent будет через ", time_begin-TimeCurrent(), " секунд или ", 
           TimeToString(time_begin-TimeCurrent(), TIME_MINUTES|TIME_SECONDS), "\n"
          );


Produz os seguintes valores.

Primeiro o número de segundos decorridos de 01.01.1970 até o tempo especificado e depois o tempo na forma usual.


Com base nisso, explique o que o confunde com esses valores.


Sim. Em meu segundo comentário, eu estava pensando em outra coisa.

 
TheXpe
TheXpert:
да.
Obrigado. Brevity é a irmã do talento!
 

Olá.

Há uma tarefa como esta. (não pode ser anexado a um carrapato)

Se uma ordem pendente desencadear {então...}.

No meu EA, uso Terminal.mqh para calcular pedidos.

Terminal // Mas_Tip[0] aberto Comprar

// se o número de pedidos de comprativer aumentado em 1

se (Mas_Tip[0]+1)

{

função

}

Tudo funciona. Mas isso aciona em cada próximo tique.

Como anexar este caso a um carrapato? E depois compare o valor no tick anterior e no tick atual.