Сразу сорри, за запрос халявы, блин времени нет, может у кого есть кусок кода.
Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.
Понятно, что MqlTick нужно использовать, но потом как-то перебирать этот массив чтобы сложить сделки по бару.. История интересна только с начала дня.
Сразу сорри, за запрос халявы, блин времени нет, может у кого есть кусок кода.
Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.
Понятно, что MqlTick нужно использовать, но потом как-то перебирать этот массив чтобы сложить сделки по бару.. История интересна только с начала дня.
Я кончено могу и ошибаться, но разве тиковый объем это не есть аналог количества сделок?
Alexey Volchanskiy:
При чем тут MqlTick? Нужно просто пройтись по сделкам и получать их время закрытия. Дальше смотреть попадание в нужный бар. Проще всего использовать СБ, класс CDealInfo
Спасибо, попробую. СБ - стандартная библиотека?
Я кончено могу и ошибаться, но разве тиковый объем это не есть аналог количества сделок? Мне для ФОРТС, я думал - тиковый объем, это кол-во контрактов за тик (сделку) прошло, а мне нужен сам факт сделки.
Vitalie Postolache:
Есть же реальный объем. CopyRealVolume() для чего?
Я не совсем понимаю, при чем тут объем, если мне нужно кол-во сделок, в сделке может быть какой угодно объем! я не совсем понимаю, что показывает CopyRealVolume Функция получает в массив volume_array исторические данные торговых объемов для указанной пары символ-период. Что такое торговый объем ?
Я не совсем понимаю, при чем тут объем, если мне нужно кол-во сделок, в сделке может быть какой угодно объем! я не совсем понимаю, что показывает CopyRealVolume Функция получает в массив volume_array исторические данные торговых объемов для указанной пары символ-период. Что такое торговый объем ?
Я так думаю, что 1 тик это и есть 2 сделки. Один купил второй ему продал цена изменилась в результате генерируется тик и на клиентский терминал отправляется новая цена.
Тиковый объем – отражает количество тиков в единицу времени, а сам «тик» — это ни что иное, как изменение цены инструмента на один базовый пункт. Фактически, данная разновидность объема представляет собой обычный счетчик колебаний и никак не привязана к объемам сделок.
Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2016.10.04 11:28
// Индикатор в виде гистограммы показывает проторгованный оборот BUY и SELL #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 #property indicator_label1 "TurnOver_BUY" #property indicator_type1 DRAW_HISTOGRAM #property indicator_style1 STYLE_SOLID #property indicator_color1 clrYellow #property indicator_label2 "TurnOver_SELL" #property indicator_type2 DRAW_HISTOGRAM #property indicator_style2 STYLE_SOLID #property indicator_color2 clrRed long LastTime = 0; // time_msc-время последнего тика (самого свежего), полученного из истории int Count = 0; // Количество тиков в последенем запросе, у которых time_msc == LastTime double Buffer0[]; double Buffer1[]; // Возвращает свежие тики, пришедшие после предыдущего вызова 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); } // Ширина гистограммы void SetScale() { const int Width = 9 / (1 << (5 - (int)ChartGetInteger(0, CHART_SCALE))); if (Width != PlotIndexGetInteger(0, PLOT_LINE_WIDTH)) { PlotIndexSetInteger(0, PLOT_LINE_WIDTH, Width); PlotIndexSetInteger(1, PLOT_LINE_WIDTH, Width); ChartRedraw(); } } void OnInit() { SetIndexBuffer(0, Buffer0); SetIndexBuffer(1, Buffer1); } void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam ) { if (id == CHARTEVENT_CHART_CHANGE) SetScale(); } // Заполняет бар соответствующими ему тиками void SetBarData( const datetime TimeBar, const MqlTick &Ticks[], int &Pos, double &TurnOverBuy, double &TurnOverSell ) { const datetime NextTime = TimeBar + PeriodSeconds(); const int Amount = ArraySize(Ticks); while (Pos < Amount) { const MqlTick Tick = Ticks[Pos]; if (Tick.time >= NextTime) break; if ((bool)(Tick.flags & TICK_FLAG_BUY)) TurnOverBuy += (double)Tick.volume; else if ((bool)(Tick.flags & TICK_FLAG_SELL)) TurnOverSell -= (double)Tick.volume; Pos++; } return; } 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; } // Зануляем новые бары if (rates_total > prev_calculated) { ArrayFill(Buffer0, prev_calculated, rates_total - prev_calculated, 0); ArrayFill(Buffer1, prev_calculated, rates_total - prev_calculated, 0); } MqlTick Ticks[]; // Взяли свеженькие тики const int Amount = GetFreshTicks(Ticks); if (Amount > 0) { int Pos; const datetime LastTime2 = Ticks[0].time - (Ticks[0].time % PeriodSeconds()); // Находим бар (Pos), включающий первый свежий тик for (Pos = rates_total - 1; Pos >= 0; Pos--) if (time[Pos] == LastTime2) break; if (Pos >= 0) { int i = 0; // Заполняем бары своими тиками while ((Pos < rates_total) && (i < Amount)) { SetBarData(time[Pos], Ticks, i, Buffer0[Pos], Buffer1[Pos]); Pos++; } } } return(rates_total); }
TurnOverBuy += 1;
else if ((bool)(Tick.flags & TICK_FLAG_SELL))
TurnOverSell -= 1;
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сразу сорри, за запрос халявы, блин времени нет, может у кого есть кусок кода.
Нужен индикатор в виде гистограммы, ну как индикатор объема, только значения его это кол-во сделок (тиков приведших к сделке) в баре, в зависимости от ТФ, интересует чтобы работал хотя бы на М1. Никаких объемов, просто кол-во сделок прошедших за бар при выбранном ТФ.
Понятно, что MqlTick нужно использовать, но потом как-то перебирать этот массив чтобы сложить сделки по бару.. История интересна только с начала дня.