CopyTicks подозрение что пришла пачка тиков - как найти начало пачки?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
182963
Vladimir Karputov  

CopyTicks предполагаю получать ИЛИ только в OnCalculate() ИЛИ в OnBookEvent().

Вот пример, когда в OnCalculate() получаю тики (получаю в индикаторе и использую только два первых захода после запуска индикатора). Параметры индикатора:


Заход №1

#      Time         Bid        Ask       Last    Volume            time_msc            flags
08  10:11:08  107.360  107.365  0.000  0000000  0000001524046268027  02 TICK_FLAG_BID 
07  10:11:08  107.362  107.365  0.000  0000000  0000001524046268012  06 TICK_FLAG_BID  TICK_FLAG_ASK 
06  10:11:07  107.363  107.367  0.000  0000000  0000001524046267574  02 TICK_FLAG_BID 
05  10:11:07  107.362  107.367  0.000  0000000  0000001524046267173  04 TICK_FLAG_ASK 
04  10:11:07  107.362  107.366  0.000  0000000  0000001524046267141  02 TICK_FLAG_BID 
03  10:11:07  107.361  107.366  0.000  0000000  0000001524046267072  06 TICK_FLAG_BID  TICK_FLAG_ASK 
02  10:11:06  107.360  107.365  0.000  0000000  0000001524046266993  04 TICK_FLAG_ASK 
01  10:11:06  107.360  107.364  0.000  0000000  0000001524046266817  02 TICK_FLAG_BID 
00  10:11:03  107.359  107.364  0.000  0000000  0000001524046263744  02 TICK_FLAG_BID 

Заход №2

#      Time         Bid        Ask       Last    Volume            time_msc            flags
08  10:11:09  107.360  107.364  0.000  0000000  0000001524046269434  04 TICK_FLAG_ASK 
07  10:11:08  107.360  107.365  0.000  0000000  0000001524046268027  02 TICK_FLAG_BID 
06  10:11:08  107.362  107.365  0.000  0000000  0000001524046268012  06 TICK_FLAG_BID  TICK_FLAG_ASK 
05  10:11:07  107.363  107.367  0.000  0000000  0000001524046267574  02 TICK_FLAG_BID 
04  10:11:07  107.362  107.367  0.000  0000000  0000001524046267173  04 TICK_FLAG_ASK 
03  10:11:07  107.362  107.366  0.000  0000000  0000001524046267141  02 TICK_FLAG_BID 
02  10:11:07  107.361  107.366  0.000  0000000  0000001524046267072  06 TICK_FLAG_BID  TICK_FLAG_ASK 
01  10:11:06  107.360  107.365  0.000  0000000  0000001524046266993  04 TICK_FLAG_ASK 
00  10:11:06  107.360  107.364  0.000  0000000  0000001524046266817  02 TICK_FLAG_BID 


Понятно, что нужно сравнивать два массива данных - поэлементно. Как это сделать наиболее красиво?

Файлы:
fxsaber
16799
fxsaber  

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Загадочный биржевой индикатор

fxsaber, 2016.10.04 11:28

long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории
int Count = 0;     // Количество тиков в последенем запросе, у которых time_msc == LastTime

// Возвращает свежие тики, пришедшие после предыдущего вызова
int GetFreshTicks( MqlTick &Ticks[], const uint flags = COPY_TICKS_TRADE, const uint count = 100000 )
{
  int Res = 0;

  MqlTick NewTicks[];
  const int NewAmount = CopyTicks(Symbol(), NewTicks, flags, LastTime, count);

  if ((NewAmount > 0) && (Count < NewAmount))
  {
    Res = ArrayCopy(Ticks, NewTicks, 0, Count);

    // Взяли крайнее время из текущей истории
    LastTime = NewTicks[NewAmount - 1].time_msc;
    Count = 1;

    // Находим (Count) в текущей истории количество тиков со временем LastTime
    for (int i = NewAmount - 2; i >= 0; i--)
    {
      if (NewTicks[i].time_msc < LastTime)
        break;

      Count++;
    }
  }

  return(Res);
}

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[] )
{
  if (prev_calculated == 0)
  {
    // возьмем тики с начала утренней сессии
    LastTime = (TimeCurrent() - (TimeCurrent() % (24 * 3600))) * 1000;

    Count = 0;
  }

  MqlTick Ticks[];

  // Взяли свеженькие тики
  const int Amount = GetFreshTicks(Ticks);

  if (Amount > 0)
  {
Igor Makanu
9572
Igor Makanu  
Vladimir Karputov:

Как это сделать наиболее красиво?

напишите структуру в которой будет храниться Ваш массив тиков (ну может быть флаг новый тик? ) и перезагрузите операции != и ==

в теле программы красивее == или != не придумаешь :)

ЗЫ: не знаю как сейчас, раньше единственным способом не пропускать тики было написание зацикленного скрипта черезwhile(!IsStopped())  - (Sleep(100) обязателен в теле ибо терминалу лучше передавать иногда управление), а из скрипта уже раздавайте тики... "на лево и на право" :)

Vladimir Karputov
Модератор
182963
Vladimir Karputov  
Igor Makanu:

напишите структуру в которой будет храниться Ваш массив тиков (ну может быть флаг новый тик? ) и перезагрузите операции != и ==

в теле программы красивее == или != не придумаешь :)

ЗЫ: не знаю как сейчас, раньше единственным способом не пропускать тики было написание зацикленного скрипта черезwhile(!IsStopped())  - (Sleep(100) обязателен в теле ибо терминалу лучше передавать иногда управление), а из скрипта уже раздавайте тики... "на лево и на право" :)

Вы точно код выше смотрели???

Для справки: CopyTicks - получение РЕАЛЬНЫХ ТИКОВ прямо в терминале. 

Denis Kirichenko
11730
Denis Kirichenko  
Василий Соколов писал статью, там есть такой инструмент.  См. раздел "Синхронизация тикового потока и таблицы заявок".
Igor Makanu
9572
Igor Makanu  
Vladimir Karputov:

Вы точно код выше смотрели???

Для справки: CopyTicks - получение РЕАЛЬНЫХ ТИКОВ прямо в терминале. 

не смотрел, но на вопрос "как красиво" я ответил?

вот у себя нашел, про что пишу:

#define HIGHFR  0
#define LOWFR   1
#define MAXFR   100

struct FR
  {
   int               HLF[MAXFR,2];
   int               count;
   bool operator!=(const FR &x)const
     {
      bool res=true;
      for(int i=0;i<MAXFR;i++)
        {
         if(this.HLF[i,HIGHFR] != x.HLF[i,HIGHFR]){res = false; break;}
         if(this.HLF[i,LOWFR]  != x.HLF[i,LOWFR]) {res = false; break;}
        }
      return(!res);
     }
   bool operator==(const FR &x)const
     {
      bool res=true;
      for(int i=0;i<MAXFR;i++)
        {
         if(this.HLF[i,HIGHFR] != x.HLF[i,HIGHFR]){res = false; break;}
         if(this.HLF[i,LOWFR]  != x.HLF[i,LOWFR]) {res = false; break;}
        }
      return(res);
     }
  };

в моем пример перезагрузка == и != написаны одинаково - когда писал, боялся накосячить и не хотел потом искать ошибки )))) - можно из != вызвать == и код будет еще красивее ))))

зато потом в теле программы пишите обычное сравнение

FR x,y;

if(x==y)...

конструктор специально не стал писать - мне нужно присваивать и сравнивать структуры, с присвоением структур mql отлично справился - проверил, а сравнение перезагрузил, зато в теле программы теперь так красиво! ))))


ЗЫ: я вроде и ЗЫ пишу ибо офтоплю

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий