Mesa de todos los oficios. Acceso a través de MQL5 - página 4

 
prostotrader:

No pienso en profundidad, veo "hilvanado" desde las profundidades.

¿Por qué pensar?

Ejecute el indicador y compruébelo usted mismo.

¿Y acaso lees lo que está escrito?

Lo leí, pero ahora las operaciones están cerradas, cuando lo inicie comprobaré de nuevo en qué dirección se descargan los ticks (en mi script).
 
Karputov Vladimir:
Lo he leído, pero la puja ya está cerrada, volveré a comprobar en qué dirección se descargan los ticks (en mi script).

Usted no debe comprobar en la secuencia de comandos, pero ejecutar el indicador en RTS-9.16 chavs en - 8-9 pm, hora de Moscú (para ver).

Y los ticks no siempre se copian en profundidad, sino sólo si el primer tick de un nuevo bloque está con el tiempo del bloque anterior.

Hay que esperar a los nuevos ticks (bloque) y no copiar post factum.

Si ejecuta su script, estará bien, porque estará copiando del historial y no

No"esperar" nuevos bloques.

 
prostotrader:

Es necesario comprobar no en la secuencia de comandos, pero el indicador de ejecución en RTS-9.16 chavs en - 8-9 PM, hora de Moscú.

Y los ticks no siempre se copian en profundidad, sino sólo si el primer tick de un nuevo bloque está con el tiempo del bloque anterior.

Debería esperar nuevos ticks (bloque) en lugar de copiar post factum.

Tengo un indicador que emite 20-30 últimos ticks. Creo que puedo añadir una comprobación: comprobar todos los ticks recibidos para ver si están en el historial de ticks con tiempo anormal.
 
Karputov Vladimir:
Tengo un indicador, que emite 20-30 últimos ticks. Creo que puedo añadir una comprobación: comprobar todos los ticks recibidos para ver si están en el historial de ticks con tiempo anormal.

No podrás "atornillar" el cheque (a mí no me funcionó) porque no sabes si son garrapatas antiguas,

¿cuál es el criterio de comprobación? Esto sólo puede verse a "ojo" si el indicador y la cinta se colocan uno al lado del otro

Pero tendrás que esperar mucho tiempo (como he dicho, copiado en profundidad por un solo criterio)

Recuerde que el defecto sólo aparece bajo dos condiciones.

1. Esperamos a que se produzcan nuevos ticks (bloque)

2. Se "clava" en profundidad, sólo si en el nuevo bloque el 1er tick tiene la hora del/los tick(s) anterior(es) del bloque anterior.

 
prostotrader:

No podrás "atornillar" el cheque (a mí no me funcionó) porque no sabes si son garrapatas antiguas,

¿cuál es el criterio de comprobación? Esto sólo puede verse a "ojo" si el indicador y la cinta se colocan uno al lado del otro

Pero tendrás que esperar mucho tiempo (como he dicho, copiado en profundidad por un solo criterio)

Recuerde que el defecto sólo aparece bajo dos condiciones.

1. Esperamos a que se produzcan nuevos ticks (bloque)

2. Se "clava" en profundidad, sólo si en el nuevo bloque el 1er tick tiene la hora del/los tick(s) anterior(es) del bloque anterior.

Cortar las cosas innecesarias: el cálculo y la representación del indicador. Deje sólo obtener y comprobar la matriz de garrapatas. Para buscar un error (no importa de quién) hay que simplificar el código al máximo.
 
Karputov Vladimir:
Cortar las cosas innecesarias: el cálculo y el dibujo del indicador. Deja sólo la obtención y comprobación de la matriz de garrapatas. Para buscar un error (no importa de quién) hay que simplificar el código al máximo.

Si había un error en mi código, siempre aparecía.

Pero tal y como está, el indicador funciona correctamente (lo he comprobado muchas veces con los datos de la tabla)

Esto se ve claramente, si se ejecuta el indicador en los instrumentos de líquido medio.

Y es casi imposible "perderse entre dos pinos" (no hay una sola línea en este código que se pueda cortar:( ).

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:

Si había un error en mi código, siempre aparecía.

Pero tal y como está, el indicador funciona correctamente (lo he comprobado muchas veces con los datos de la tabla)

Esto se ve claramente, si se ejecuta el indicador en los instrumentos de líquido medio.

Y es casi imposible "perderse entre dos pinos" (no hay una sola línea en este código que se pueda cortar :() ).

Hay que tener en cuenta los ticks cargados previamente en start_time, de lo contrario se produce la duplicación de ticks.

Aquí hay un ejemplo, la función devuelve los últimos ticks, sacado de mi clase de procesamiento de la historia de los ticks, pero creo que, todo estará claro en el 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 solicitud de ticks - últimos "ticks" de ticks - es decir, el tiempo es "0":

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

Un indicador (en el gráfico de la izquierda) solicita CopyTicks() en OnCalculate(), el segundo indicador (en el gráfico de la derecha) solicita CopyTicks() en OnBookEvent().

Y aquí está la imagen:

?

Los ticks se muestran de la siguiente manera: el elemento con índice "0" está en la parte inferior del gráfico y el tiempo de tick del elemento con índice "0" es el más antiguo. El elemento con índice "29" tiene el tiempo de tick más joven. Aquí estamos: he encontrado, al menos en esta figura, dos incoherencias, a continuación hay un ejemplo para la primera:

Índice de artículostiempo de tictacNota



231472205757952Error: 1472205757952 < 1472205757959
221472205757959Así es: 1472205757959 !< 1472205757432
211472205757432
Archivos adjuntos:
 
Yury Kulikov:
Hay que tener en cuenta los ticks cargados previamente en start_time, de lo contrario se duplican los ticks.

Aquí hay un ejemplo, la función devuelve los últimos ticks, sacado de mi clase de procesamiento del historial de ticks, pero creo que está claro en el código.

Aquí está la prevención de la duplicación en mi código:

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

Se ha cambiado COPY_TICKS_ALL por COPY_TICKS_TRADE y parece que funciona correctamente,

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;

pero seguiré comprobando. :)

No puedo mirar la cinta estáticamente, así que esperaré a que se aclare.