Tretyakov Rostyslav #: В кодбазе где-то есть индикатор эквити
Вы уверены, что просадка там может посчитаться из подгружаемой истории, а не с того момента, когда начал работать индикатор? Если да, то поделитесь ссылкой. // Ссылки с кодобазы можно постить.
Вы уверены, что просадка там может посчитаться из подгружаемой истории, а не с того момента, когда начал работать индикатор? Если да, то поделитесь ссылкой. // Ссылки с кодобазы можно постить.
Подскажите, пожалуйста, в чём ошибка? Пытаюсь посчитать размер линий ЗигЗага. Индикатор правильно считает размеры только при первом запуске. Дальше, онлайн, начинает переписывать значения, накладывать друг на друга, предыдущие не удалять. А на истории всё хорошо
// Основная функция расчета индикатораintOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i, limit, counterZ, whatlookfor = 0;
int back, pos, lasthighpos = 0, lastlowpos = 0;
double extremum;
double curlow = 0.0, curhigh = 0.0, lasthigh = 0.0, lastlow = 0.0;
// Проверка наличия достаточного количества данныхif (rates_total < InpDepth || InpBackstep >= InpDepth)
return0;
if(rates_total<InpDepth || InpBackstep>=InpDepth)
return(0);
// Первоначальный расчетif (prev_calculated == 0)
limit = InitializeAll();
else
{
// Поиск первого экстремума в глубине ExtLevel или в последних 100 барах
i = counterZ = 0;
while (counterZ < ExtLevel && i < 100)
{
if (ExtZigzagBuffer[i] != 0.0)
counterZ++;
i++;
}
// Если экстремумы не найдены - пересчет с началаif (counterZ == 0)
limit = InitializeAll();
else
{
// Установка начальной позиции на найденный экстремум
limit = i - 1;
// Определение вида экстремумаif (ExtLowBuffer[i] != 0.0)
{
// Нижний экстремум
curlow = ExtLowBuffer[i];
// Поиск следующего верхнего экстремума
whatlookfor = 1;
}
else
{
// Верхний экстремум
curhigh = ExtHighBuffer[i];
// Поиск следующего нижнего экстремума
whatlookfor = -1;
}
// Очистка остальных данныхfor (i = limit - 1; i >= 0; i--)
{
ExtZigzagBuffer[i] = 0.0;
ExtLowBuffer[i] = 0.0;
ExtHighBuffer[i] = 0.0;
}
}
}
// Основной цикл расчетаfor (i = limit; i >= 0; i--)
{
// Поиск наименьшего минимума в глубине баров
extremum = low[iLowest(NULL, 0, MODE_LOW, InpDepth, i)];
// Если текущий минимум уже был найденif (extremum == lastlow)
extremum = 0.0;
else
{
// Установка нового последнего минимума
lastlow = extremum;
// Отбрасывание минимума, если текущий минимум слишком высокif (low[i] - extremum > InpDeviation * Point)
extremum = 0.0;
else
{
// Очистка предыдущих экстремумов в задних барахfor (back = 1; back <= InpBackstep; back++)
{
pos = i + back;
if (ExtLowBuffer[pos] != 0 && ExtLowBuffer[pos] > extremum)
ExtLowBuffer[pos] = 0.0;
}
}
}
// Если найденный минимум равен текущему минимумуif (low[i] == extremum)
ExtLowBuffer[i] = extremum;
else
ExtLowBuffer[i] = 0.0;
// Поиск наибольшего максимума в глубине баров
extremum = high[iHighest(NULL, 0, MODE_HIGH, InpDepth, i)];
// Если текущий максимум уже был найденif (extremum == lasthigh)
extremum = 0.0;
else
{
// Установка нового последнего максимума
lasthigh = extremum;
// Отбрасывание максимума, если текущий максимум слишком низокif (extremum - high[i] > InpDeviation * Point)
extremum = 0.0;
else
{
// Очистка предыдущих экстремумов в задних барахfor (back = 1; back <= InpBackstep; back++)
{
pos = i + back;
if (ExtHighBuffer[pos] != 0 && ExtHighBuffer[pos] < extremum)
ExtHighBuffer[pos] = 0.0;
}
}
}
// Если найденный максимум равен текущему максимумуif (high[i] == extremum)
ExtHighBuffer[i] = extremum;
else
ExtHighBuffer[i] = 0.0;
}
// Завершающая часть расчетаif (whatlookfor == 0)
{
lastlow = 0.0;
lasthigh = 0.0;
}
else
{
lastlow = curlow;
lasthigh = curhigh;
}
// Построение графика ZigZag for(i=limit; i>=0; i--)
{
switch(whatlookfor)
{
case0: // Поиск вершины или впадиныif(lastlow==0.0 && lasthigh==0.0)
{
if(ExtHighBuffer[i]!=0.0)
{
lasthigh=High[i];
lasthighpos=i;
whatlookfor=-1;
ExtZigzagBuffer[i]=lasthigh;
}
if(ExtLowBuffer[i]!=0.0)
{
lastlow=Low[i];
lastlowpos=i;
whatlookfor=1;
ExtZigzagBuffer[i]=lastlow;
}
}
break;
case1: // Поиск вершиныif(ExtLowBuffer[i]!=0.0 && ExtLowBuffer[i]<lastlow && ExtHighBuffer[i]==0.0)
{
ExtZigzagBuffer[lastlowpos]=0.0;
lastlowpos=i;
lastlow=ExtLowBuffer[i];
ExtZigzagBuffer[i]=lastlow;
// Отрисовка размера линииif (i < 1000)
{
n--;
ObjectDelete(n);
n++;
t = iTime(_Symbol, PERIOD_CURRENT, i);
ObjectCreate(0,n,OBJ_TEXT,0, t, lastlow);
string text = DoubleToString((lasthigh - lastlow) * pow(10, _Digits), 0);
ObjectSetString(0,n,OBJPROP_TEXT,text);
ObjectSetInteger(0,n,OBJPROP_ANCHOR,ANCHOR_UPPER);
n++;
}
}
if(ExtHighBuffer[i]!=0.0 && ExtLowBuffer[i]==0.0)
{
lasthigh=ExtHighBuffer[i];
lasthighpos=i;
ExtZigzagBuffer[i]=lasthigh;
// Отрисовка размера линииif (i < 1000)
{
t = iTime(_Symbol, PERIOD_CURRENT, i);
ObjectCreate(0,n,OBJ_TEXT,0, t, lasthigh);
string text = DoubleToString((lasthigh - lastlow) * pow(10, _Digits), 0);
ObjectSetString(0,n,OBJPROP_TEXT,text);
ObjectSetInteger(0,n,OBJPROP_ANCHOR,ANCHOR_LOWER);
n++;
}
whatlookfor=-1;
}
break;
case -1: // Поиск впадиныif(ExtHighBuffer[i]!=0.0 && ExtHighBuffer[i]>lasthigh && ExtLowBuffer[i]==0.0)
{
ExtZigzagBuffer[lasthighpos]=0.0;
lasthighpos=i;
lasthigh=ExtHighBuffer[i];
ExtZigzagBuffer[i]=lasthigh;
// Отрисовка размера линииif (i < 1000)
{
n--;
ObjectDelete(n);
n++;
t = iTime(_Symbol, PERIOD_CURRENT, i);
ObjectCreate(0,n,OBJ_TEXT,0, t, lasthigh);
string text = DoubleToString((lasthigh - lastlow) * pow(10, _Digits), 0);
ObjectSetString(0,n,OBJPROP_TEXT,text);
ObjectSetInteger(0,n,OBJPROP_ANCHOR,ANCHOR_LOWER);
n++;
}
}
if(ExtLowBuffer[i]!=0.0 && ExtHighBuffer[i]==0.0)
{
lastlow=ExtLowBuffer[i];
lastlowpos=i;
ExtZigzagBuffer[i]=lastlow;
// Отрисовка размера линииif (i < 1000)
{
t = iTime(_Symbol, PERIOD_CURRENT, i);
ObjectCreate(0,n,OBJ_TEXT,0, t, lastlow);
string text = DoubleToString((lasthigh - lastlow) * pow(10, _Digits), 0);
ObjectSetString(0,n,OBJPROP_TEXT,text);
ObjectSetInteger(0,n,OBJPROP_ANCHOR,ANCHOR_UPPER);
n++;
}
whatlookfor=1;
}
break;
}
}
//--- donereturn(rates_total);
}
Artyom Trishkin #: Чтобы подсчитать просадку по ордерам в истории нужна тиковая история за интересующий период. И этого будет мало для точного рассчëта
Не понял зачем тики. Хай лоу данные разве не дадут значение минуса плюса от цены открытия ордера/позиции?
Artyom Trishkin #: Чтобы подсчитать просадку по ордерам в истории нужна тиковая история за интересующий период. И этого будет мало для точного рассчëта
Я думаю не обязательно тиковую историю. Достаточно high low за период от открытия ордера до его закрытия.
Если орер BUY то можно посчитать пункты от цены открытия до low и это будет просадка.
А вот если одновременно открыто несколько ордеров, да ещё и разнонаправленных, то это уже сложней. Так сложно, что я не возьмусь даже предполагать алгоритм…
Я думаю не обязательно тиковую историю. Достаточно high low за период от открытия ордера до его закрытия.
Если орер BUY то можно посчитать пункты от цены открытия до low и это будет просадка.
А вот если одновременно открыто несколько ордеров, да ещё и разнонаправленных, то это уже сложней. Так сложно, что я не возьмусь даже предполагать алгоритм…
Добро. Продажа. Закрывается по аск. Много тебе дадут бары, строящиеся по бид?
Просадка по средствам не считается от открытия до закрытия. А именно между. Хай, Лоу, опен, клоуз бара не дадут всей картины - там аск нужен. Просто расширение спреда может слить всë.
Никому не попадалась функция расчёта просадки по ордерам в истории?
Интересно на МТ4 глянуть
Никому не попадалась функция расчёта просадки по ордерам в истории?
Интересно на МТ4 глянуть
Никому не попадалась функция расчёта просадки по ордерам в истории?
Интересно на МТ4 глянуть
В кодбазе где-то есть индикатор эквити
Вы уверены, что просадка там может посчитаться из подгружаемой истории, а не с того момента, когда начал работать индикатор? Если да, то поделитесь ссылкой. // Ссылки с кодобазы можно постить.
Вы уверены, что просадка там может посчитаться из подгружаемой истории, а не с того момента, когда начал работать индикатор? Если да, то поделитесь ссылкой. // Ссылки с кодобазы можно постить.
Чтобы подсчитать просадку по ордерам в истории нужна тиковая история за интересующий период. И этого будет мало для точного рассчëта
Чтобы подсчитать просадку по ордерам в истории нужна тиковая история за интересующий период. И этого будет мало для точного рассчëта
Я думаю не обязательно тиковую историю. Достаточно high low за период от открытия ордера до его закрытия.
Если орер BUY то можно посчитать пункты от цены открытия до low и это будет просадка.
А вот если одновременно открыто несколько ордеров, да ещё и разнонаправленных, то это уже сложней. Так сложно, что я не возьмусь даже предполагать алгоритм…
Я думаю не обязательно тиковую историю. Достаточно high low за период от открытия ордера до его закрытия.
Если орер BUY то можно посчитать пункты от цены открытия до low и это будет просадка.
А вот если одновременно открыто несколько ордеров, да ещё и разнонаправленных, то это уже сложней. Так сложно, что я не возьмусь даже предполагать алгоритм…