Правильные уровни поддержки-сопротивления

 

В рамках проекта нужно освоить данную тему. Чисто по своему опыту решил искать минимумы и максимумы цены в заданном диапазоне. Примерно,какна картинке

Потом порылся в кодобазе, выяснилось, что все считают примерно так (взято отсюда). То есть идет обработка OHLC. Вот и думаю, какой подход более правильный. По моим торговым наблюдениям все же цена отскакивает от максимумов/минимумов.

MqlRates _rates[]; 
                     int _ratesCopied = CopyRates(_Symbol,_indicatorTimeFrame,time[i],2,_rates);
                     double LastHigh  = (_ratesCopied==2) ? _rates[0].high  : 0;
                     double LastLow   = (_ratesCopied==2) ? _rates[0].low   : 0;
                     double LastClose = (_ratesCopied==2) ? _rates[0].close : 0;
               
             //
             //---
             //

             if (_ratesCopied==2)
             {               
                P  = (LastHigh+LastLow+LastClose)/3;
                R1 = (2*P)-LastLow;
                S1 = (2*P)-LastHigh;
                R2 = P+(LastHigh - LastLow);
                S2 = P-(LastHigh - LastLow);
                R3 = (2*P)+(LastHigh-(2*LastLow));
                S3 = (2*P)-((2* LastHigh)-LastLow); 
            }               
         }             

         //
         //---
         //
         
         double lower = S3;
         double range = R3-S3;
               if (range!=0)
               {
                  R3Buffer[i] =  1;
                  S3Buffer[i] = -1;
                  R1Buffer[i] = 2.0*((R1      -lower)/range-0.5);
                  S1Buffer[i] = 2.0*((S1      -lower)/range-0.5);
                  R2Buffer[i] = 2.0*((R2      -lower)/range-0.5);
                  S2Buffer[i] = 2.0*((S2      -lower)/range-0.5);
                  PBuffer[i]  = 2.0*((P       -lower)/range-0.5);
                  Price[i]    = 2.0*((close[i]-lower)/range-0.5);
               }
 

Я пока просто ищу максимумы/минимумы. Но возникает вопрос. Один максимум и минммум я могу найти легко, а как найти несколько,с разными уровнями? Пока, чтобы торговать, сделю выставление линий вручную, но хочется автоматизации. Или все же пойти по пути анализа OHLC, как в предыдущем посте. Я в раздумьях..

    struct SPivotPoints
    {
        double      m_HighPivot;
        double      m_LowPivot; 
        datetime    m_HighPivotDatetime;
        datetime    m_LowPivotDatetime;
        int         m_idxHigh;
        int         m_idxLow;
    } m_pivotPoints;

void FindPivotPoints(int copied, MqlRates &rates[])
    {
        if(copied > 0) 
        {
            for(int n = 0; n  < copied; n++)
            {
                if(m_pivotPoints.m_HighPivot < rates[n].high)
                {
                    m_pivotPoints.m_HighPivot = rates[n].high;
                    m_pivotPoints.m_HighPivotDatetime = rates[n].time;
                    m_pivotPoints.m_idxHigh = n;
                }

                if(m_pivotPoints.m_LowPivot > rates[n].low)
                {
                    m_pivotPoints.m_LowPivot = rates[n].low;
                    m_pivotPoints.m_LowPivotDatetime = rates[n].time;
                    m_pivotPoints.m_idxLow = n;
                }
            }    
        }
    }
 
Alexey Volchanskiy:

Я пока просто ищу максимумы/минимумы. Но возникает вопрос. Один максимум и минммум я могу найти легко, а как найти несколько,с разными уровнями? Пока, чтобы торговать, сделю выставление линий вручную, но хочется автоматизации. Или все же пойти по пути анализа OHLC, как в предыдущем посте. Я в раздумьях..

Я ищу уровни от круглых цен. Например 100 и 500. Отскок от уровня считаю с допуском +-сколько то пунктов.


 
Vladimir Tkach:

Я ищу уровни от круглых цен. Например 100 и 500. Отскок от уровня считаю с допуском +-сколько то пунктов.


Да, тоже давно такое замечал, у круглых цен притормаживается цена. Даже давно скрипты сделал для разметки 

Для МТ4

Для МТ5

PriceLines
PriceLines
  • www.mql5.com
Стандартная сетка графика имеет ряд особенностей, не позволяющих с одного взгляда определить движение цены котировки: шаг сетки динамически меняется при переключении таймфрейма, шаг не привязан к базовым уровням, например к 1.12000, как на скриншоте ниже. Скрипт Price Lines размечает уровни цен на графике и служит дополнением к...
 
В алгоритм также включен вес отскока или пересечения. Т.е. чем он дальше, тем вес меньше. Отсюда не целые числа в расчетах числа отскоков/пересечений. На картинке видно.
 
Alexey Volchanskiy:

Я пока просто ищу максимумы/минимумы. Но возникает вопрос. Один максимум и минммум я могу найти легко, а как найти несколько,с разными уровнями?

по моему все равно как алгоритм ЗигЗага будете делать, вот недавно для экспериментов делал ЗЗ просто по пробою запомненного хай/лоу - никаких внутренних баров, мин.кол-ва баров и т.п.

//+------------------------------------------------------------------+
//|                                                     ZigZagZZ.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

// plot ZigZagZZ
#property indicator_label1  "ZigZagZZ"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrDarkBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
// input parameters
input int   Deviation=100;
// indicator buffers
double         ZZBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// indicator buffers mapping
   SetIndexBuffer(0,ZZBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   static bool UP;
   static double max,min;
   static int LastExt=0;
   static const double dev=NormalizeDouble(Deviation*_Point,_Digits);
   int limit=prev_calculated-1;
   if(prev_calculated==0)
     {
      ArrayInitialize(ZZBuffer,0.0);
      limit=2; LastExt=0;
      if(low[0]<high[1]) { min=low[0];  max=high[1];   UP=true;  }
      else               { max=high[0]; min  = low[1]; UP=false; }
     }
   for(int i=limit; i<rates_total; i++)
     {
      ZZBuffer[i]=0.0;
      if(UP)
        {
         if(low[i]-min<=0.0) { min=low[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=min; }
         else
           {
            if(high[i]-min-dev>0.0) { max=high[i]; LastExt=i; ZZBuffer[i]=max; UP=false; }
           }
        }
      else
        {
         if(high[i]-max>=0.0) { max=high[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=max; }
         else
           {
            if(low[i]-max+dev<0.0) { min=low[i]; LastExt=i; ZZBuffer[i]=min; UP=true; }
           }
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

код очень простой получился, задачи вроде как у Вас - поиск экстремумов, но для Вашего случая, кажется пересчет значений в другую сторону нужно будет организовать (от бара№1 в историю)

 
Igor Makanu:

по моему все равно как алгоритм ЗигЗага будете делать, вот недавно для экспериментов делал ЗЗ просто по пробою запомненного хай/лоу - никаких внутренних баров, мин.кол-ва баров и т.п.

код очень простой получился, задачи вроде как у Вас - поиск экстремумов, но для Вашего случая, кажется пересчет значений в другую сторону нужно будет организовать (от бара№1 в историю)

Спасибо, скомпилировал, запустил, интересно, надо подумать.

 
Alexey Volchanskiy:

Спасибо, скомпилировал, запустил, интересно, надо подумать.

если логика кода не читаемая, попробуйте так переписать условия:

if(low[i]-min<=0.0)
if(low[i]<=min)

вроде очень похоже на то что Вы ищете,

я в КБ выкладывал пример как ЗЗ в виде обычного массива использовать, думаю как раз к Вашей задаче в довесок пригодилось бы ;)

 
Alexey Volchanskiy:

В рамках проекта нужно освоить данную тему. Чисто по своему опыту решил искать минимумы и максимумы цены в заданном диапазоне. Примерно,какна картинке

Потом порылся в кодобазе, выяснилось, что все считают примерно так (взято отсюда). То есть идет обработка OHLC. Вот и думаю, какой подход более правильный. По моим торговым наблюдениям все же цена отскакивает от максимумов/минимумов.

Делал когда то уже давно скрипт рисующий уровни. Он рисовал уровни по выбору в местах скопления(максимумы спектральной плотности)):

1. High, Low; 2. Open, Close; 3. верхних или нижних фракталов.4. По масимумам количества пересечений ценой уровня.

Какие уровни лучше не выяснил, так как автоматизацию торговли по уровням не делал. Музыченко считает, что лучше уровни по скоплениям  Open, Close. Может это и правильно, так как часто цена до экстремумов не доходит и разворачивается раньше, ближе к уровням Open, Close.

 

Господа, кидайте картинки, легче обсуждать

Просто неохота вникать как виртуально будет вглядеть работа того или иного индюка.

 
Igor Makanu:

если логика кода не читаемая, попробуйте так переписать условия:

вроде очень похоже на то что Вы ищете,

я в КБ выкладывал пример как ЗЗ в виде обычного массива использовать, думаю как раз к Вашей задаче в довесок пригодилось бы ;)

Немного с запозданием отвечаю, спасибо, идея пригодилась, как один из вариантов )

Так как надо торговать, сделал временный ручной вариант, четыре линии сам двигаю руками исходя из своего опыта. Пока решаю более важную задачу. Например, торгуем тихо-спокойно во флетовом канале. Вдруг цена его прорывает и понеслась вверх или вниз. Соответственно, в канале остались зависшие позиции. Закрывать их жалко, так как в 80% случаев все эти пробои ложные и цена вернется. Для страховки открываю встречную позицию с увеличенным лотом.

Я торгую в ДЦ, где хеджированная маржа нулевая, так что суммарная маржа наоборот уменьшится. Но надо знать, где скальперу все же закрыть или висяки или страхующую позицию. Для этого и нужны эти уровни, это один из ориентиров, а второй скорость изменения цены и ускорение. Надоело все время сидеть и правым глазом, как хамелеон, коситься на торговый монитор, хочу автомат ))

Причина обращения: