2016-11-17 20 views
0

Я сам изучаю MQL4. Я зарегистрировался в IQOptions для торговли бинарными опционами.Как решить фракталы над периодом N-баров на MQL4, как и индикатор IQOptions Fractals?

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

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

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

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

enter image description here

//+------------------------------------------------------------------+ 
//|              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); 
    } 
+0

Не могли бы вы уточнить, что ваш вопрос - какие проблемы вы сталкиваетесь в MCVE-оф-кода, с помощью которого вы пытались решить некоторые поведение/функции, но предыдущие результаты пока не показали полезности? – user3666197

+0

На самом деле, я решил это, наконец, после того, как пошла специальная фрактальная методология. Снимок экрана, который я опубликовал, является желательным поведением, я не считаю его реальной фрактальной логикой. Мы можем достичь этого, найдя каждое (i + 20/2) свечу с высоким/низким значением и проверяя, все ли i + 20 до i + 10 свечей и i + 10 к i свечи поднимаются/опускаются ниже, чем высота свечи i + 10/низкое значение – VyshuRam

ответ

0

Я предполагаю, что вы хотите достичь, чтобы найти фракталы в последние 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 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^