Как решить Fractals за период N-баров в MQL4, аналогично индикатору IQOptions Fractals?

Сам изучаю MQL4. Я зарегистрировался в IQOptions для торговли бинарными опционами.

Я планирую сам написать несколько индикаторов для своей торговой системы. Мне очень нравятся фракталы, не из фрактальной логики, поддерживаемой MQL4, но мне очень нравится конкретная IQOptions.

В MQL4 для поиска фрактала используется iFractal(), который не принимает никаких параметров, кроме смещения.

Я убедил себя, что фрактал просто находит через 3 бара. Проделав большую домашнюю работу, я понял, что индикатор IQOptions делает больше, чем фрактал. Пожалуйста, найдите приложенный снимок экрана.

Я написал много программ, к которым недавно добавил. Мне нужна помощь, чтобы выяснить, что там было. Изображение, которое я прикрепил, взято из скриншота IQOption с фракталами более 20 бар.

введите описание изображения здесь

//+------------------------------------------------------------------+
//|                                                        Bulls.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Fractals Tanya"
#property strict

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green
#property indicator_width1 1
#property indicator_width2 1
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
//--- input parameter
input int B_F=20;
//extern int AllB=240; 

//--- buffers
double ExtFractalsUPBuffer[];
double ExtFractalsDownBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit(void)
  {

//--- 1 additional buffer used for counting.
   IndicatorBuffers(2);
   IndicatorDigits(Digits);
//--- indicator line
   SetIndexBuffer( 0, ExtFractalsUPBuffer );
   SetIndexStyle( 0, DRAW_ARROW );
   SetIndexArrow( 0, 234 ); 
   SetIndexLabel( 0, NULL );
   SetIndexEmptyValue( 0, 0.0 );

   SetIndexBuffer( 1, ExtFractalsDownBuffer );
   SetIndexStyle( 1, DRAW_ARROW );
   SetIndexArrow( 1, 233 ); 
   SetIndexLabel( 1, NULL );
   SetIndexEmptyValue( 1, 0.0 );

   SetIndexDrawBegin(0,B_F);
   SetIndexDrawBegin(1,B_F);

   IndicatorShortName( "FractalsTanya" );
   IndicatorDigits( Digits );
  }
//+------------------------------------------------------------------+
//| Bulls Power                                                      |
//+------------------------------------------------------------------+
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;
//---
   if(rates_total<=B_F || B_F<=0)
      return(0);
//---
   if(prev_calculated>0)
      limit++;
   int i=0,j=0,k=0;
   double upFratal=0.0;
   double downFratal=0.0;
   int x=0; int y=0;
    for(int t=0; t<limit+B_F; t++)
     {
     double upTempFractal=iFractals(NULL,Period(),MODE_UPPER,t);
     double downTempFractal=iFractals(NULL,Period(),MODE_LOWER,t);
     if(upTempFractal!=0&&upTempFractal>upFratal)
     {
      upFratal=upTempFractal;
      j=t;
     }
     if(downTempFractal!=0.0&&downFratal==0.0)
     {
         downFratal=downTempFractal;
     }
     if(downTempFractal!=0.0&&downTempFractal<=downFratal)
     {
         downFratal=downTempFractal;
         k=t;
     }
         i++;
         if(i==B_F)
         {
        if(upFratal!=0.0)
            {
            if(x==0||(j-x)>=B_F)
            {
              x=j;
              ExtFractalsUPBuffer[j]=upFratal;
            }
            }
            if(downFratal!=0.0)
            {
            if(y==0||(k-y)>=B_F)
            {
               y=k;
               ExtFractalsDownBuffer[k]=downFratal;
            }

            }
            i=0;
            upFratal=0.0;
            downFratal=0.0;
         }
     }

     /*for(int t=0; t<limit; t++)
     {
      double upFratal=iFractals(NULL,Period(),MODE_UPPER,t);
      double downFratal=iFractals(NULL,Period(),MODE_LOWER,t);
      if(upFratal!=0.0)ExtFractalsUPBuffer[t]=upFratal;
      else if(downFratal!=0.0)ExtFractalsDownBuffer[t]=downFratal;
     }*/
   return(rates_total);
  }

person VyshuRam    schedule 17.11.2016    source источник
comment
Не могли бы вы пояснить, в чем заключается ваш вопрос - с какой проблемой вы сталкиваетесь в MCVE-кода, с помощью которого вы пытались решить какое-то поведение / функцию, но ваши предыдущие результаты пока не показали полезности?   -  person user3666197    schedule 17.11.2016
comment
Собственно, я решил это окончательно после того, как перешел на нестандартную фрактальную методологию. Скриншот, который я опубликовал, хотя и является желаемым, я не думаю, что это настоящая фрактальная логика. Мы можем добиться этого, найдя максимальное / минимальное значение каждой (i + 20/2) свечи и проверив, все ли свечи от i + 20 до i + 10 и от i + 10 до i соответствуют максимумам / минимумам свечей меньше максимума i + 10 свечи. / низкое значение   -  person VyshuRam    schedule 18.11.2016


Ответы (1)


Я предполагаю, что вы хотите найти фракталы в последних X барах. У меня была такая же проблема, и в моем случае я хотел найти самые последние фракталы, как вверх, так и вниз, это функция, которую я создал. Я использовал его для расчета трейлинг-стопа. Немного изменив функцию, можно найти самый высокий и самый низкий фракталы.

надеюсь, это поможет

// ---------------------------------------------------------------------
bool   FractalsUp        = False;
bool   FractalsDown      = False;
double FractalsUpPrice   = 0;
double FractalsDownPrice = 0;

// -----------------------------------------------Number of bars to scan
int    FractalsLimit     = 15;

void FindFractals(){
// ------------------------------------------(re)-Initialization of the variables
   FractalsUp        = False;
   FractalsDown      = False;
   FractalsUpPrice   = 0;
   FractalsDownPrice = 0;
/* --------------------------------------A for(){...} loop to scan
                                                      the last FractalsLimit
                                                      candles, starting from
                                                      the oldest and finishing
                                                      with the most recent one */
   for ( int i = FractalsLimit; i >= 0; i-- ){
      // ----------------------------------------------------------------------------
         double fu = iFractals( NULL, 0, MODE_UPPER, i );
         double fl = iFractals( NULL, 0, MODE_LOWER, i );
                                             /* If there is a POSACK of fractal on the candle
                                                   the value will be greater than zero
                                                   and equal to the highest or lowest price */
      // ---------------------------------------------------------------------------
         if (  fu >  0 ){                    // If there is an upper fractal
               FractalsUpPrice   = fu;       //    store the value and
               FractalsUp        = True;     //    set True the FractalsUp variable
               FractalsDown      = False;    //    set False on POSACK_UP
         }
      // ----------------------------------------------------------------------------
         if (  fl >  0 ){                    // If there is an lower fractal
               FractalsDownPrice = fl;       //    store the value and
               FractalsUp        = False;    //    set False on POSACK_LO
               FractalsDown      = True;     //    set True the FractalsDown variable
         }
      // ----------------------------------------------------------------------------
         if (  fu >  0                       // If the candle has both upper
            && fl >  0                       //    and lower fractal
               ){
               FractalsUpPrice   = fu;       //    the values are stored 
               FractalsDownPrice = fl;
               FractalsUp        = False;    //    but we do not, on NACK,
               FractalsDown      = False;    //    consider it as last fractal
         }
   }
}
person Spino Trading Automation    schedule 30.11.2016