Таблица всех сделок. Доступ через MQL5 - страница 4

 
prostotrader:

Я не думаю, что в глубь, а вижу, что "прихватываются" из глубины. 

Зачем думать?

Запустите индикатор и сами всё увидите!

И Вы вообще читаете, что написано?

Я читал, но сейчас торги закрыты, вот запустятся - проверю ещё раз в каком направлении скачиваются тики (на своём скрипте).
 
Karputov Vladimir:
Я читал, но сейчас торги закрыты, вот запустятся - проверю ещё раз в каком направлении скачиваются тики (на своём скрипте).

Нужно проверять не на скрипте, а запустить индикатор на RTS-9.16 чавов в- 8- 9 вечера, по Москве (чтобы увидеть)

И тики не всегда копируютя вглубь, а только, если в новом блоке первый тик со временем предыдущего блока.

Нужно имеено, как бы ожидать новые тики ( блок), а не копировать постфактум.

Если Вы запустите ваш скрипт, то будет всё нормально, потому что будет копирование из истории, а

не "ожидание" новых блоков. 

 
prostotrader:

Нужно проверять не на скрипте, а запустить индикатор на RTS-9.16 чавов в- 8- 9 вечера, по Москве

И тики не всегда копируютя вглубь, а только, если в новом блоке первый тик со временем предыдущего блока.

Нужно имеено ожидать новые тики ( блок), а не копировать постфактум.

У меня есть индикатор, он выводит 20-30 последних тиков. Думаю, могу прикрутить к нему проверку: проверять все полученные тики на предмет попадания в историю тиков в аномальным временем.
 
Karputov Vladimir:
У меня есть индикатор, он выводит 20-30 последних тиков. Думаю, могу прикрутить к нему проверку: проверять все полученные тики на предмет попадания в историю тиков в аномальным временем.

Вы не сможете "прикрутить" проверку (у меня не получилось), потому что не известно, что это старые тики,

по какому критерию проверять? Это видно только на "глаз", если индикатор и ленту поместить рядом

 

 

Но ждать придётся долго (как говорил, копируется в глубь только по одному признаку) 

Помните, что дефект проявляется только при двух условиях.

1. Мы "ожидаем" новые тики (блок)

2. "Прихватывантся" вглубь, толко если в новом блоке 1-ый тик имеет время предыдущего тика(ов) предыдущего блока. 

 
prostotrader:

Вы не сможете "прикрутить" проверку (у меня не получилось), потому что не известно, что это старые тики,

по какому критерию проверять? Это видно только на "глаз", если индикатор и ленту поместить рядом

 

 

Но ждать придётся долго (как говорил, копируется в глубь только по одному признаку) 

Помните, что дефект проявляется только при двух условиях.

1. Мы "ожидаем" новые тики (блок)

2. "Прихватывантся" вглубь, толко если в новом блоке 1-ый тик имеет время предыдущего тика(ов) предыдущего блока. 

Отсеките лишнее - просчёт и отрисовку индикатора. Оставьте только получение и проверку массива тиков. Чтобы искать ошибку (не важно чью) нужно максимально упрощать код.
 
Karputov Vladimir:
Отсеките лишнее - просчёт и отрисовку индикатора. Оставьте только получение и проверку массива тиков. Чтобы искать ошибку (не важно чью) нужно максимально упрощать код.

Если бы в моём коде была ошибка, то она проявлялась бы всегда.

А так индикатор работает правильно (много раз проверял с данными из таблицы)

Это хорошо видно, если запускать индикатор на среднеликвидных инструментах.

И "потеряться в двух соснах" практически невоможно (в этом коде ниодной строчки нельзя сократить :( )

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:

Если бы в моём коде была ошибка, то она проявлялась бы всегда.

А так индикатор работает правильно (много раз проверял с данными из таблицы)

Это хорошо видно, если запускать индикатор на среднеликвидных инструментах.

И "потеряться в двух соснах" практически невоможно (в этом коде ниодной строчки нельзя сократить :( )

Вам необходимо учитывать ранее загруженные тики приходившиеся на start_time, иначе происходит дублирование тиков.

Вот пример, функция возвращает последние тики, выдернута из моего класса обработки тиковой истории, но думаю из кода все будет понятно.

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);
}
 

Режим запроса тиков - последние "ticks" тиков - то есть время равно "0":

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

Один индикатор (на левом графике) запрашивает CopyTicks() в функции OnCalculate(), второй индикатор (на правом графике) запрашивает CopyTicks() в функции OnBookEvent().

И вот какая картинка:

?

Тики выводятся так: элемент с индексом "0" в самом низу графика и время тика элемента с индексом "0" самое старое. Элемент с индексом "29" имеет самое молодое время тика. Что имеем: я обнаружил, по крайней мере на этом рисунке, сразу два несоответствия, ниже пример для первого:

Индекс элементаВремя тикаПримечание



231472205757952Ошибка: 1472205757952 < 1472205757959 
221472205757959Все верно: 1472205757959 !< 1472205757432
211472205757432
Файлы:
 
Yury Kulikov:
Вам необходимо учитывать ранее загруженные тики приходившиеся на start_time, иначе происходит дублирование тиков.

Вот пример, функция возвращает последние тики, выдернута из моего класса обработки тиковой истории, но думаю из кода все будет понятно.

Вот же в моём коде предотвращение дублирования:

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

Исправил COPY_TICKS_ALL на COPY_TICKS_TRADE и, кажется зароботало как надо,

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;

 

но буду ещё проверять. :)

Ленту просмотреть в статике нельзя, буду дожидаться клиринга