Bibliotecas: Controle_Trade_Sessions - página 2

 
Forester #:
É apenas uma comparação em termos de tempo.
Em vez disso, você pode definir qualquer valor, aliás.

O tempo das sessões é obtido da corretora ou pode ser definido manualmente.

Eu estava falando do código interno, e não da chamada e do parâmetro de entrada.

datetime Sec = TimeSec(time); //segundo atual do dia
...
if(( Sec >= this.TradeTimeFrom[i][DayOfWeek] ) && ( Sec < this.TradeTimeTo[i][DayOfWeek] ))

Aqui, o Sec é definido no intervalo de 24 horas, mas não há limite entre “from” e “to”. Por exemplo, se for solicitado o horário das 3 da manhã e a sessão for negociada das 21h às 8h, deveria ser retornado “true”, mas a condição não será atendida e retornará “false”.

 
Stanislav Korotky #:

Eu estava falando do código interno, e não da chamada e do parâmetro de entrada.

Aqui, o Sec está definido no intervalo de 24 horas, mas não há limites de início e fim. Por exemplo, se for solicitada a hora das 3 da manhã e a sessão for negociada das 21h às 8h, deveria ser retornado true, mas a condição não será satisfeita e retornará false.

Isso pode ser definido com duas sessões:
21-24 e 0-8

É uma questão teórica ou as corretoras realmente têm intervalos “from-to” semelhantes?

 
Forester #:

Isso pode ser definido em duas sessões:
21-24 e 0-8

A pergunta é teórica ou o Centro de Dados realmente possui intervalos “from-to” semelhantes?

O que significa definir em duas sessões? — afinal, elas são obtidas nas configurações do MT5, e não definidas por nós. E no MT5, uma sessão = um registro. Em algumas corretoras (devido à distância geográfica do mercado), isso pode ocorrer. Nesse caso, o SymbolInfoSessionTrade retorna o horário “to” levando em conta dias adicionais (pelo menos era assim antes — não verifiquei agora), ou seja, a condição “from < to” sempre era mantida.
 
Stanislav Korotky #:
O que significa definir duas sessões?

É possível definir as sessões individualmente para cada dia nos sunputs. O programa funcionará com base nelas.
É conectado
#define LoadSessionFromInputs // Leitura das sessões a partir dos inputs

Stanislav Korotky #:
Nesse caso, o SymbolInfoSessionTrade retorna o horário “to” levando em conta os dias adicionais (pelo menos era assim antes — não verifiquei agora), ou seja, a condição“from < to” sempre era mantida.

Ou seja, 20h00 – 32h00?

Se houver um exemplo funcional da corretora, no qual seja possível testar, será possível adaptar a solução a esse exemplo e verificar.
No momento, há uma solução simples: dividir a sessão em duas partes por conta própria, passando pela meia-noite. E é possível especificar em que dia — por exemplo, no sábado até as 8h — o saldo da sexta-feira, ou no domingo a partir das 20h — o início da segunda-feira.

 
Forester #:

Ou seja, das 20h às 32h?

Sim. Não tenho nenhum centro de dados pronto com esse servidor em vista. Preciso procurar em algum lugar na Nova Zelândia.
 
Stanislav Korotky #:
Sim. Não há nenhum centro de dados pronto com esse tipo de servidor em vista. É preciso procurar em algum lugar na Nova Zelândia.

No editor de caracteres personalizados, fiz o seguinte:


 
Forester #:

No editor de símbolos personalizados, fiz o seguinte:

Configurei as sessões com transição para o dia seguinte para as opções mostradas na captura de tela, ou seja, das 20h às 8h.
Alterei a função:
      for (int i = 0; i < this.TradeSessions[DayOfWeek]; i++){//iteração pelas sessões deste dia da semana
         if(( Sec >= this.TradeTimeFrom[i][DayOfWeek] )){ //a sessão começou — encontrar o fim
            if(Sec < this.TradeTimeTo[i][DayOfWeek]){//o fim ainda não chegou, lembre-se disso
               this.NextTradeStop = (datetime)(day * 86400) + this.TradeTimeTo[i][DayOfWeek]; //hora de término da sessão atual; até esse momento, não é necessário verificar a próxima sessão = (início deste dia + hora da sessão) 
               //Print("novo Stop ", this.NextTradeStop);
               return true; 
            }else if (this.TradeTimeTo[i][DayOfWeek] < this.TradeTimeFrom[i][DayOfWeek]){// fim < início; por exemplo, 20h00-04h00 — passagem para o dia seguinte + 1 dia à hora
               this.NextTradeStop = (datetime)((day+1) * 86400) + this.TradeTimeTo[i][DayOfWeek]; //hora de término da sessão atual; até esse momento, não é necessário verificar a próxima sessão = (início deste dia + hora da sessão) 
               //Print("novo Stop ", this.NextTradeStop);
               return true;
            }
         }
      }

O código adicionado verifica se o horário de término é anterior ao horário de início da sessão e, em seguida, simplesmente adiciona 1 dia ao horário de término.

Testei com as seguintes sessões :

Dia: 1 Sessões de negociação: 1: 23:55-00:05
Dia: 2 Sessões de negociação: 1: 00:15-00:17


Primeira sessão com continuidade no dia seguinte:

29/06/2020 23:55:03 29/06/2020 23:55:03
2020.29/06/2020 23:55:09 29/06/2020 23:55:09
29/06/202029/06/2020 23:56:39 29/06/2020 23:56:39
2020.29/06/2020 23:57:01 29/06/2020 23:57:01
29/06/2020 23:59:59 29/06/202029/06/2020 23:59:59
30/06/2020 00:00:00 30/06/2020 00:00:00
2020.30 de junho de 2020, 00:00:08 30 de junho de 2020, 00:00:08
2020.30/06/2020 00:01:52 30/06/2020 00:01:52
30/06/2020 00:02:02 30/06/202030/06/2020 00:02:02
30/06/2020 00:02:30 30/06/2020 00:02:30
2020.30/06/2020 00:03:25 30/06/2020 00:03:25
30/06/202030/06/2020 00:03:31 30/06/2020 00:03:31

Segunda sessão, a habitual em um único dia:
30/06/2020 00:15:29 30/06/2020 00:15:29
30/06/2020 00:16:01 2020.30/06/2020 00:16:01
30/06/2020 00:16:09 30/06/2020 00:16:09

A primeira sessão será daqui a uma semana:
06/07/2020 23:55:01 06/07/2020 23:55:01
06/07/202006/07/2020 23:55:09 06/07/2020 23:55:09