[Erro em obter o tempo do TF sênior no temporizador! - página 12

 
Taras Slobodyanik:

Não vejo o problema. Uma nova vela aparece - recalculamos a última vela no indicador/conselheiro.
Há mais de uma vela nova - fazemos um recálculo completo do indicador/conselheiro.
O mesmo acontece - aparece uma nova vela.

Outra coisa - os períodos necessários devem ser constantemente "puxados" para atualizá-los.
Se não há ninguém trabalhando no período do símbolo (as citações não são verificadas, o indicador não está funcionando), então ele "dorme" porque é considerado desnecessário.

Estamos puxando, estamos puxando. Fazemos um pedido, recebemos um erro, saímos. Mas aqui, veja, outra "peculiaridade" vem à tona - o erro não é reinicializado após a reinicialização. Se isso acontecesse, não haveria problema. Mas a devolução de dados incorretos é o problema. E eu posso vê-lo muito claramente.

Todo o sistema de verificação de erros vai por água abaixo neste exemplo.

 

Como o terminal sabe que os últimos dados estão desatualizados?
Porque a história está lá - ela está lá.
O pedido é enviado para o corretor... o mais rápido possível.

Aparece uma nova barra - os dados são atualizados.

 
Taras Slobodyanik:

Como o terminal sabe que os últimos dados estão desatualizados?
Afinal de contas, existe uma história - existe.
O pedido ao corretor é enviado... Tão logo seja assim.

Aparece uma nova barra - os dados são atualizados.

A comunicação com o servidor é estabelecida. Ao solicitar dados da TF sênior, se os dados não estiverem prontos - erro ou retorno 0. Se os dados estiverem prontos - retornar SOMENTE dados reais. Isso é tudo. Se os dados não estiverem prontos por muito tempo - deixe-os retornar erro ou 0.

 
Taras Slobodyanik:

A propósito, você não respondeu à sua pergunta sobre a versão terminal.

 
Alexey Kozitsyn:

A propósito, você não respondeu à pergunta sobre a versão terminal.

O que a versão terminal tem a ver com isso? Novos dados, estão lá ou não estão. E nenhuma versão os salvará se eles não vierem do servidor.
O indicador simplesmente começa antes que os novos dados cheguem. Alternativamente, passe os cheques para a OnCalculate, que é acionada quando um novo tick é recebido.

 
Konstantin Nikitin:

Alternativamente, mova os cheques para OnCalculate, que é acionado quando um novo tick é recebido.

foi sugerido várias vezes, assim como a administração

no indicadorOnCalculate() será iniciado no início do indicador, mas a segunda vez OnCalculate() será iniciada no recebimento do tick - aqui é necessário iniciar o temporizador e baixar novos dados OHLC

 
Igor Makanu:

ele já foi oferecido várias vezes, assim como a administração

o indicador iniciará OnCalculate() no início do indicador, mas a segunda vez OnCalculate() será iniciada no recebimento do tick - aqui é necessário iniciar o temporizador e baixar novos dados OHLC

Dê uma olhada no meu último código publicado. Não se trata de timer, tudo já foi movido para OnCalculate(). Ainda não funciona quando o terminal inicia.

 
//--- Проверяем связь с сервером
if(firstrun)
{
 firstrun=false;                // первый запуск индикатора
 return(0);
}   
if(!IsConnected())                              // Если не удалось установить связь с сервером
     {
      //--- Сбрасываем флаг соединения с сервером
      _isConnected=false;
      //--- Выходим
      return( 0 );
     }
Eu também verificaria GetTickCount() para dar tempo para o terminal carregar, gerar gráficos e estabelecer comunicação com o servidor; você também precisa rastrear o reinício do terminal, eu não sei como rastreá-lo, mas você precisa dar tempo
 
Alexey Kozitsyn:

Dê uma olhada no último código que publiquei. Não se trata mais do temporizador, tudo já foi movido para OnCalculate(). Ainda não funciona quando se inicia o terminal.

Pular o primeiro passe na partida

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   static bool res = false;
   if( !res )
     {
      res = true;
      return( rates_total );
     }
   /* работаем */
   return( rates_total );
  }
 
Konstantin Nikitin:

Pular o primeiro passe na partida

Leia o ponto 1.