Tabela de todos os ofícios. Acesso via MQL5 - página 4

 
prostotrader:

Eu não penso em profundidade, eu vejo "pegado" das profundezas.

Por que pensar?

Verifique o indicador e veja por si mesmo!

E você sequer lê o que está escrito?

Eu o li, mas agora as negociações estão fechadas, quando eu o iniciar vou verificar novamente em que direção os ticks são baixados (no meu script).
 
Karputov Vladimir:
Eu li, mas a licitação está fechada agora, vou verificar novamente em que direção os carrapatos são baixados (no meu roteiro).

Você não deve verificar o roteiro, mas executar o indicador no RTS-9.16 chavs às - 20-9 horas, horário de Moscou (para ver).

E os carrapatos nem sempre copiam em profundidade, mas somente se o primeiro carrapato em um novo bloco estiver com o tempo do bloco anterior.

Você tem que esperar pelos novos carrapatos (bloco) e não copiar o post factum.

Se você executar seu roteiro, ele estará bem, pois será uma cópia da história e não

Não"esperando" por novos blocos.

 
prostotrader:

É necessário verificar não no roteiro, mas executar o indicador no RTS-9.16 chavs às - 20-9 PM, horário de Moscou.

E os carrapatos nem sempre são copiados em profundidade, mas somente se o primeiro carrapato em um novo bloco for com o tempo do bloco anterior.

Você deve esperar novos tiquetaques (bloco) em vez de copiar o post factum.

Eu tenho um indicador que emite 20-30 últimos tiquetaques. Acho que posso acrescentar um cheque: verifique todos os carrapatos recebidos para ver se estão no histórico de carrapatos com tempo anormal.
 
Karputov Vladimir:
Eu tenho um indicador, ele emite 20-30 últimos tiquetaques. Acho que posso acrescentar um cheque: verifique todos os carrapatos recebidos para ver se estão no histórico de carrapatos com tempo anormal.

Você não poderá "aparafusar" o cheque (não funcionou para mim) porque você não sabe se são carrapatos velhos,

qual é o critério de verificação? Isto só pode ser visto pelo "olho" se o indicador e a fita adesiva forem colocados lado a lado

Mas você terá que esperar muito tempo (como eu disse, copiado em profundidade por apenas um critério)

Lembre-se que o defeito só aparece sob duas condições.

1. Nós "esperamos" por novos carrapatos (bloco)

2. Ele é "encaixado" em profundidade, somente se no novo bloco o primeiro tique tiver o tempo do(s) tique(s) anterior(es) do bloco anterior.

 
prostotrader:

Você não poderá "aparafusar" o cheque (não funcionou para mim) porque você não sabe se são carrapatos velhos,

qual é o critério de verificação? Isto só pode ser visto pelo "olho" se o indicador e a fita adesiva forem colocados lado a lado

Mas você terá que esperar muito tempo (como eu disse, copiado em profundidade por apenas um critério)

Lembre-se que o defeito só aparece sob duas condições.

1. Nós "esperamos" por novos carrapatos (bloco)

2. Ele é "encaixado" em profundidade, somente se no novo bloco o primeiro tique tiver o tempo do(s) tique(s) anterior(es) do bloco anterior.

Cortar coisas desnecessárias - cálculo e renderização do indicador. Deixe apenas pegar e verificar o conjunto de carrapatos. Para procurar por um erro (não importa de quem) é necessário simplificar o código o máximo possível.
 
Karputov Vladimir:
Cortar coisas desnecessárias - o cálculo e desenho do indicador. Deixe apenas a obtenção e verificação da matriz de carrapatos. Para procurar por um erro (não importa de quem) é necessário simplificar o código o máximo possível.

Se houvesse um erro em meu código, ele sempre apareceria.

Mas como está, o indicador funciona corretamente (eu o verifiquei muitas vezes com os dados da tabela)

Isto se vê claramente, se você executar o indicador nos instrumentos de mid-liquid.

E é quase impossível "perder seu caminho através de dois pinheiros" (não há uma única linha neste código que possa ser cortada:( ).

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,start_time,0);
         if(copied>0)
           {
            for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;
}
 
prostotrader:

Se houvesse um erro em meu código, ele sempre apareceria.

Mas como está, o indicador funciona corretamente (eu o verifiquei muitas vezes com os dados da tabela)

Isto se vê claramente, se você executar o indicador nos instrumentos de mid-liquid.

E é quase impossível "perder seu caminho através de dois pinheiros" (não há uma única linha neste código que possa ser cortada :() ).

Você precisa considerar carrapatos previamente carregados na hora de início, caso contrário, a duplicação de carrapatos acontece.

Aqui está um exemplo, a função retorna os últimos tiquetaques, arrancados da minha classe de processamento de histórico de carrapatos, mas acho que tudo ficará claro a partir do código.

int CTickHistory::LastTicks(MqlTick &_ticks[])
{
   if(m_lasttick<=0) return(-1);  //нет загруженной истории
   int n=CopyTicks(m_symbol,tk,COPY_TICKS_TRADE,m_lasttick,TICKHISTORY_MAX_TICKS);
   if(n>m_lastcount)
   {
      n=ArrayResize(_ticks,n-m_lastcount);//размер массива под новые тики
      ArrayCopy(_ticks,tk,0,m_lastcount,n);//копирование только новых тиков
      //определим количество всех тиков, приходящихся на последний момент времени,
      //необходимое для отсечки загруженных тиков при следующем вызове
      if(m_lasttick!=_ticks[n-1].time_msc)
      {
         m_lasttick=_ticks[n-1].time_msc;
         m_lastcount=1;
         for(int i=n-2; i>=0; i--)
         {
            if(_ticks[i].time_msc<m_lasttick) break;
            m_lastcount++;
         }
      }else m_lastcount+=n;
   }else n=0;//нет новых тиков
   return(n);
}
 

Modo de solicitação de carrapatos - último "ticks" de carrapatos - ou seja, o tempo é "0":

   int copied=CopyTicks(_Symbol,tick_array,type,0,ticks);

Um indicador (no gráfico da esquerda) solicita CopyTicks() em OnCalculate(), o segundo indicador (no gráfico da direita) solicita CopyTicks() em OnBookEvent().

E aqui está a imagem:

?

Os ticks são exibidos da seguinte forma: o elemento com índice "0" está na parte inferior da tabela e o tempo do tick-time do elemento com índice "0" é o mais antigo. O elemento com índice "29" tem o tempo mais jovem do tick. Aqui estamos: encontrei, pelo menos nesta figura, duas inconsistências, abaixo está um exemplo para a primeira:

Índice de itenstempo do tickNota



231472205757952Erro: 1472205757952 < 1472205757959
221472205757959É isso mesmo: 1472205757959 !< 1472205757432
211472205757432
Arquivos anexados:
 
Yury Kulikov:
Você precisa levar em conta os carrapatos previamente carregados na hora de início, caso contrário, a duplicação dos carrapatos acontece.

Aqui está um exemplo, a função retorna os últimos tiquetaques, tirados da minha classe de processamento de histórico de carrapatos, mas acho que está claro a partir do código.

Aqui está a prevenção de duplicação no meu código:

if(start_time==ulong(ticks[copied-1].time_msc)) return;
 

COPY_TICKS_ALL a COPY_TICKS_TRADE fixa e parece estar funcionando corretamente,

2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Pred tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 0 time = 2016.08.26 10:42:15.576
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Prev ticks, element 1 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr tiks
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 0 time = 2016.08.26 10:42:15.595
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 1 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 2 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 3 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 4 time = 2016.08.26 10:42:17.225
2016.08.26 10:42:23.685 DealsLent (RTS-9.16,M1) Curr ticks, element 5 time = 2016.08.26 10:42:17.235

if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         sell_vol= 0;
         buy_vol = 0;
         int copied=CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,start_time,0);
         if(copied>0)
           {
             int a_size = ArraySize(prev_ticks);
             if (a_size>0)
             {
               if (prev_ticks[a_size-1].time_msc == ticks[0].time_msc)
               {
                 Print("Pred tiks");
                 for(int i=0; i<a_size; i++)
                 {
                   
                   Print("Prev ticks, element ", i, " time = ", ConvTimeMscToStr( prev_ticks[i].time_msc ) );
                 }
                  Print("Curr tiks");
                 for(int i=0; i<copied; i++)
                 {
                  
                   Print("Curr ticks, element ", i, " time = ", ConvTimeMscToStr(ticks[i].time_msc ));
                 }
               }
               else
               {
                 ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }   
               }
             }
             else
             {
               ArrayResize(prev_ticks, copied);
                 for(int i=0; i<copied; i++)
                 {
                   prev_ticks[i]=ticks[i]; 
                 }
             }
           
           /* for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                  buy_vol+=ticks[i].volume;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                  sell_vol+=ticks[i].volume;
                 }
              }*/
            if(start_time==ulong(ticks[copied-1].time_msc)) return;
            start_time=ulong(ticks[copied-1].time_msc);
            if(( sell_deals==0) && (buy_deals==0)) return;

mas vou continuar verificando. :)

Não posso olhar para a fita estaticamente, então vou esperar pela clareira.

Razão: