Подсчет тиков

 

Привет всем! Подскажите пожалуйста как можно красиво посчитать тики? Я имею ввиду если например мне понадобится узнать какая была цена Bid 30 тиков назад...

Я так прикинул на пару тройку тиков, но получилось как-то по колхозному и не практично вовсе:

   tick_2=tick_1;
   tick_1=tick;
   tick=Bid; 


 а если мне 100 тиков понадобиться?! Не писать же 100 строк...

 
Maksim Neimerik:

Привет всем! Подскажите пожалуйста как можно красиво посчитать тики? Я имею ввиду если например мне понадобится узнать какая была цена Bid 30 тиков назад...

Я так прикинул на пару тройку тиков, но получилось как-то по колхозному и не практично вовсе:


 а если мне 100 тиков понадобиться?! Не писать же 100 строк...

MT5?

 
Evgeny Belyaev:

MT5?

Нет, 4, извиняюсь, не в ту ветку влез... Перепостить?

 
Подозреваю что нужны массивы...
 
Maksim Neimerik:
Подозреваю что нужны массивы...

Как минимум или запись в файл или глобальные переменные терминала.

Через 5-ку проще , там тики можно запросить через штатную функцию.

 

Как один из быстрых вариантов. Создайте массив с размерностью 100 000 и к нему переменную curID.

Появился первый тик, записали Bid в ячейку с индексом 0, curID присвоили значение 0
появился второй тик - записали Bid в ячейку с индексом 1, curID присвоили значение 1
и т.д.

Записалось за полдня 50 000 тиков (т.е. curID = 50000-1), понадобилось узнать, что за цена была 30 тиков назад, идете в ячейку curID-30.

Если нужно сохранять, в конце дня можно обрубать массив по последнему заполненному индексу и сбрасывать массив в файл FileWriteArray().

Ну и предусмотреть, если достигнет curID 99 999, чтобы увеличить размерность массива еще на 20-30 тысяч, смотрите максимумы по тиковым объемам инструмента.

 
Vasiliy Pushkaryov:

Как один из быстрых вариантов. Создайте массив с размерностью 100 000 и к нему переменную curID.

Появился первый тик, записали Bid в ячейку с индексом 0, curID присвоили значение 0
появился второй тик - записали Bid в ячейку с индексом 1, curID присвоили значение 1
и т.д.

Записалось за полдня 50 000 тиков (т.е. curID = 50000-1), понадобилось узнать, что за цена была 30 тиков назад, идете в ячейку curID-30.

Если нужно сохранять, в конце дня можно обрубать массив по последнему заполненному индексу и сбрасывать массив в файл FileWriteArray().

Ну и предусмотреть, если достигнет curID 99 999, чтобы увеличить размерность массива еще на 20-30 тысяч, смотрите максимумы по тиковым объемам инструмента.

Звучит не плохо, надо пробовать... Спасибо!

 

Используйте перезапись массива по кругу, это экономит ресурсы, время, всё экономит. Нужно учится программировать экономно :)

Код написал на коленке без отладки, попробуйте запустить:

//здесь задаёте размер максимального количества истории тиков
int Size=50;
double Ticks[];
//индекс следит за местом последнего тика в массиве
int Index;

int OnInit()
   {
   ArrayResize(Ticks,Size);
   ArrayInitialize(Ticks,0);
   Index=0;
   return(INIT_SUCCEEDED);
   }

//здесь записываете новый тик в массив по кругу, то есть если дошли до конца массива,
//то перезаписываете первый элемент, и так далее
void WriteTick(double &eTicks[], int &eIndex, double eValue)
   {
   eIndex++;
   if(eIndex>=ArraySize(eTicks)) eIndex=0;
   eTicks[eIndex]=eValue;
   }   

//здесь получаете значение нужного тика от индекса последнего записанного
//eShift-это количество тиков от текущего, он не должен превышать Size, который вы задали ранее
double GetTick(double &eTicks[], int eIndex, int eShift)
   {
   return(eTicks[(eIndex-eShift)>=0?(eIndex-eShift):(eIndex-eShift+ArraySize(eTicks))]);
   }

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[])
   {
   //записываем каждый приходящий тик
   WriteTick(Ticks,Index,MarketInfo(Symbol(),MODE_BID));
   //здесь при каких-то условиях получаем цену нужного тика
   double  Bid_5=GetTick(Ticks,Index,5);
   
   return(0);
   }
 
Aleksei Stepanenko:

Используйте перезапись массива по кругу, это экономит ресурсы, время, всё экономит. Нужно учится программировать экономно :)

Код написал на коленке без отладки, попробуйте запустить:

Вы меня извините за вопрос, но вот это выражение: (eIndex-eShift)>=0?(eIndex-eShift):(eIndex-eShift+ArraySize(eTicks))

как его прочитать? Это же if else, нет?

Я просто далеко не профи...

 

да, это короткая запись if else. Здесь смысл в том что если от текущего индекса отнять смещение мы получаем неотрицательно число, значит по этому адресу и лежит цена искомого тика, иначе нужно прибавить размер массива, то есть его значение в массиве находится после текущего индекса. Т.е. мы уже начали перезапись массива по новой, а данные запрашиваются еще со старой партии.

 
понял, спасибо!