Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2237

 

Никому не попадалась функция расчёта просадки по ордерам в истории?

Интересно на МТ4 глянуть

 
Vitaliy Kuznetsov #:

Никому не попадалась функция расчёта просадки по ордерам в истории?

Интересно на МТ4 глянуть

Чтобы подсчитать просадку по ордерам в истории нужна тиковая история за интересующий период. И этого будет мало для точного рассчëта
 
Vitaliy Kuznetsov #:

Никому не попадалась функция расчёта просадки по ордерам в истории?

Интересно на МТ4 глянуть

В кодбазе где-то есть индикатор эквити
 
Tretyakov Rostyslav #:
В кодбазе где-то есть индикатор эквити

Вы уверены, что просадка там может посчитаться из подгружаемой истории, а не с того момента, когда начал работать индикатор? Если да, то поделитесь ссылкой. // Ссылки с кодобазы можно постить.

 
Vitaliy Kuznetsov #:

Вы уверены, что просадка там может посчитаться из подгружаемой истории, а не с того момента, когда начал работать индикатор? Если да, то поделитесь ссылкой. // Ссылки с кодобазы можно постить.

Ищите...мне лень.
 
Подскажите, пожалуйста, в чём ошибка? Пытаюсь посчитать размер линий ЗигЗага. Индикатор правильно считает размеры только при первом запуске. Дальше, онлайн, начинает переписывать значения, накладывать друг на друга, предыдущие не удалять. А на истории всё хорошо


// Основная функция расчета индикатора
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 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)
      return 0;

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)
        {
         case 0: // Поиск вершины или впадины
            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;  
         case 1: // Поиск вершины
            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;               
        }
     }


   
//--- done
   return(rates_total);
  }





 
Artyom Trishkin #:
Чтобы подсчитать просадку по ордерам в истории нужна тиковая история за интересующий период. И этого будет мало для точного рассчëта
Не понял зачем тики. Хай лоу данные разве не дадут значение минуса плюса от цены открытия ордера/позиции?
 
Artyom Trishkin #:
Чтобы подсчитать просадку по ордерам в истории нужна тиковая история за интересующий период. И этого будет мало для точного рассчëта

Я думаю не обязательно тиковую историю. Достаточно high low за период от открытия ордера до его закрытия.

Если орер BUY то можно посчитать пункты от цены открытия до low и это будет просадка.

А вот если одновременно открыто несколько ордеров, да ещё и разнонаправленных, то это уже сложней. Так сложно, что я не возьмусь даже предполагать алгоритм…

 
Alexey Viktorov #:

Я думаю не обязательно тиковую историю. Достаточно high low за период от открытия ордера до его закрытия.

Если орер BUY то можно посчитать пункты от цены открытия до low и это будет просадка.

А вот если одновременно открыто несколько ордеров, да ещё и разнонаправленных, то это уже сложней. Так сложно, что я не возьмусь даже предполагать алгоритм…

Добро. Продажа. Закрывается по аск. Много тебе дадут бары, строящиеся по бид? 
 
Просадка по средствам не считается от открытия до закрытия. А именно между. Хай, Лоу, опен, клоуз бара не дадут всей картины - там аск нужен. Просто расширение спреда может слить всë. 
Причина обращения: