PDA

Просмотр полной версии : Максимальный объём за N-баров



hoz
29.09.2015, 23:19
Пытаюсь реализовать функцию получения максимальной дельты за N-баров. Кто-нить подобное писал?
На данный момент, написан такой индикатор:



#property strict

#property indicator_chart_window // Индикатор выводится в окне графика
#property indicator_buffers 2 // Используется 2 буфера индикатора
//#property indicator_color1 clrBlack // Цвет отображения данных 1-го буфера
//#property indicator_width1 1 // Толщина линий 1-го буфера
//#property indicator_color2 clrRed // Цвет отображения данных 2-го буфера
//#property indicator_width2 1 // Толщина линий 2-го буфера

input int countCamparedBars = 3; // Количество объёма определённого признака в последовательности
double MaxPositiveDelta[]; // Буфер максимальных значений положительной дельты за N-баров
double MaxNegativeDelta[]; // Буфер максимальных значений отрицательной дельты за N-баров

// ================================================== ====== Файлы включения ================================================== =========+
#include <HOZ_Code\Classes\GetIndicatorsData\ClusterDelta.mq h>
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
IndicatorBuffers(2);

// Связывание 1-го буффера с соответствующим массивом и определение его свойств
SetIndexBuffer (0, MaxPositiveDelta);
SetIndexStyle (0, DRAW_ARROW, 0, 3, clrBlack);
SetIndexArrow (0, 241);

// Связывание 2-го буффера с соответствующим массивом и определение его свойств
SetIndexBuffer (1, MaxNegativeDelta);
SetIndexStyle (1, DRAW_ARROW, 0, 3, clrRed);
SetIndexArrow (1, 242);

//---
return (INIT_SUCCEEDED);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Перечисление типов возможных дельт |
//+---------------------------------------------------------------------------------------------------------------------------------------+
enum ENUM_DELTATYPE
{
MAX_POSITIVE_SEQUENCE,
MAX_NEGATIVE_SEQUENCE,
NONE
};
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Определение значение положительной дельты ClusterDelta_Delta |
//+---------------------------------------------------------------------------------------------------------------------------------------+
int ExistencePositiveSequence (int fi_Index, int fi_CountCamparedBars)
{
int cx = 0;

if (ClusterDelta::PositiveDelta (fi_Index) > ClusterDelta::PositiveDelta (fi_Index + 1))
{
cx++;

while (ClusterDelta::PositiveDelta (fi_Index) > ClusterDelta::PositiveDelta (fi_Index + cx + 1))
{
cx++;
if (cx >= fi_CountCamparedBars) return (MAX_POSITIVE_SEQUENCE);
}
}
else if (ClusterDelta::PositiveDelta (fi_Index) < ClusterDelta::PositiveDelta (fi_Index + 1))
{
cx++;

while (ClusterDelta::PositiveDelta (fi_Index) < ClusterDelta::PositiveDelta (fi_Index + cx + 1))
{
cx++;
if (cx >= fi_CountCamparedBars) return (MAX_NEGATIVE_SEQUENCE);
}
}
return (NONE);
}
//+---------------------------------------------------------------------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+---------------------------------------------------------------------------------------------------------------------------------------+
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[])
{
//---
int limit = rates_total - prev_calculated;

while ( (rates_total - limit ) < countCamparedBars + 1)
{
limit--;
}

for (int i = limit; i >= 0; i--)
{
if (ExistencePositiveSequence (i, countCamparedBars) == MAX_POSITIVE_SEQUENCE)
{
MaxPositiveDelta[i] = High[i];
}
else if (ExistencePositiveSequence (i, countCamparedBars) == MAX_NEGATIVE_SEQUENCE)
{
MaxNegativeDelta[i] = Low[i];
}
}

//--- return value of prev_calculated for next call
return (rates_total);
}


Функции ClusterDelta::PositiveDelta (fi_Index) и ClusterDelta::NegativeDelta (fi_Index) получаются из класса верно (проверил на реале).
Этот индюк не корректно показывает данные (рисует стрелки в местах, где должен быть самый большая дельта за countCamparedBars - баров.
Просьб поделится опытом в этом плане, а то уже замучался. Индюки купил и продлеваю регулярно, а вопрос не решает уже неделю.
Мне не принципиально реализация как у меня, главное корректное решение. Хотя индюк то не большой. Тот кто понимает, сможет и у меня найти ошибку.