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

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

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

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

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


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

Evgeny Belyaev
160217
Evgeny Belyaev  
Maksim Neimerik:

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

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


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

MT5?

Maksim Neimerik
31705
Maksim Neimerik  
Evgeny Belyaev:

MT5?

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

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

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

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

Vasiliy Pushkaryov
7188
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 тысяч, смотрите максимумы по тиковым объемам инструмента.

Maksim Neimerik
31705
Maksim Neimerik  
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 тысяч, смотрите максимумы по тиковым объемам инструмента.

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

Aleksei Stepanenko
1548
Aleksei Stepanenko  

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

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

//здесь задаёте размер максимального количества истории тиков
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);
   }
Maksim Neimerik
31705
Maksim Neimerik  
Aleksei Stepanenko:

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

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

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

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

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

Aleksei Stepanenko
1548
Aleksei Stepanenko  

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

Maksim Neimerik
31705
Maksim Neimerik  
понял, спасибо!
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий