Индикаторы: Fractals Corridor Breakdown - страница 2

 
VVT:
Здравствуйте Владимир!
Подскажите пожалуйста как получить из советника сигнал этого индикатора в момент изменения цвета свечи. какой буфер и как правильно использовать?

Вот все индикаторные буфера:

   SetIndexBuffer(0,UpBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,DownBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,BreakdownOpenBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,BreakdownHighBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,BreakdownLowBuffer,INDICATOR_DATA);
   SetIndexBuffer(5,BreakdownCloseBuffer,INDICATOR_DATA);
   SetIndexBuffer(6,BreakdownColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(7,FractalUpBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(8,FractalDownBuffer,INDICATOR_CALCULATIONS);

Свеча (стиль рисования DRAW_COLOR_CANDLES) рисуется, если в четырёх буферах НЕ НОЛЬ. И вот если там не ноль, только тогда нужно смотреть в буфер цвета.

И обратите внимание на нумерацию буферов.

 
Vladimir Karputov:

Вот все индикаторные буфера:

Свеча (стиль рисования DRAW_COLOR_CANDLES) рисуется, если в четырёх буферах НЕ НОЛЬ. И вот если там не ноль, только тогда нужно смотреть в буфер цвета.

И обратите внимание на нумерацию буферов.

Спасибо! Свеча со значением цвета не 0 выдаёт сигнал на всех подряд свечах, это логично, ведь у них уже есть какой либо цвет) По коду цвета не реагирует, добавлю два новых буфера на основе Ваших расчётов, думаю так будет проще. Спасибо 

 

Пример кода:

//+------------------------------------------------------------------+
//|                        Fractals Corridor Breakdown Get Value.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.00"
#property tester_indicator "MyInd\\Fractals\\Fractals Corridor Breakdown"
//--- input parameters
input group    "Additional features"
input bool        InpPrintLog       = false;             // Print log
//---
int    handle_iCustom;                                   // variable for storing the handle of the iCustom indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iCustom
   handle_iCustom=iCustom(Symbol(),Period(),"MyInd\\Fractals\\Fractals Corridor Breakdown");
//--- if the handle is not created
   if(handle_iCustom==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iCustom indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   if(handle_iCustom!=INVALID_HANDLE)
      IndicatorRelease(handle_iCustom);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double open_buffer[],high_buffer[],low_buffer[],close_buffer[],color_buffer[];
   ArraySetAsSeries(open_buffer,true);
   ArraySetAsSeries(high_buffer,true);
   ArraySetAsSeries(low_buffer,true);
   ArraySetAsSeries(close_buffer,true);
   ArraySetAsSeries(color_buffer,true);
   int start_pos=0,count=2;
   if(!iGetArray(handle_iCustom,2,start_pos,count,open_buffer)  ||
      !iGetArray(handle_iCustom,3,start_pos,count,high_buffer)  ||
      !iGetArray(handle_iCustom,4,start_pos,count,low_buffer)   ||
      !iGetArray(handle_iCustom,5,start_pos,count,close_buffer) ||
      !iGetArray(handle_iCustom,6,start_pos,count,color_buffer))
      return;
//---
   string text="";
   int limit=(count>2)?2:count;
   for(int i=0; i<limit; i++)
     {
      text=text+
           " bar #"+IntegerToString(i)+": "+
           " Open "+DoubleToString(open_buffer[i],Digits())+
           " High "+DoubleToString(high_buffer[i],Digits())+
           " Low "+DoubleToString(low_buffer[i],Digits())+
           " Close "+DoubleToString(close_buffer[i],Digits())+
           " Color "+DoubleToString(color_buffer[i],0)+
      "\n";
     }
   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+


и результат:

Fractals Corridor Breakdown Get Value

 
Vladimir Karputov:

Пример кода:

Спасибо большое за пример.

Теперь копирование, буфер динамический и видимо я неправильно копирую, будьте добры подскажите пожалуйста правильный метод копирования

CopyBuffer(handle_iCustom,2,0,Shift1+2,fr1);
CopyBuffer(handle_iCustom,3,0,Shift1+2,fr2);
CopyBuffer(handle_iCustom,4,0,Shift1+2,fr3);
CopyBuffer(handle_iCustom,5,0,Shift1+2,fr4);
CopyBuffer(handle_iCustom,6,0,Shift1+2,fr5);

иногда даже срабатывает, но после выдаёт ошибку в тестере ...  array out of range in 'Fractals Corridor Breakdown.mq5' (173,30)

 
VVT:

Спасибо большое за пример.

Теперь копирование, буфер динамический и видимо я неправильно копирую, будьте добры подскажите пожалуйста правильный метод копирования

иногда даже срабатывает, но после выдаёт ошибку в тестере ...  array out of range in 'Fractals Corridor Breakdown.mq5' (173,30)

Я дал пример. Пример кода и функция копирования уже готовая.
 
Vladimir Karputov:
Я дал пример. Пример кода и функция копирования уже готовая.

Пробовал Вашим методом ничего не получилось -> ошибка ...  array out of range in 'Fractals Corridor Breakdown.mq5' (173,30),

пробовал другим методом получал 1-2 сигнала и потом сбивалось на ошибку ...  array out of range in 'Fractals Corridor Breakdown.mq5' (173,30)

Когда будет время и желание подскажите пожалуйста как мне правильно получить выход 6 color_buffer в 0 баре

 
VVT:

Пробовал Вашим методом ничего не получилось -> ошибка ...  array out of range in 'Fractals Corridor Breakdown.mq5' (173,30),

пробовал другим методом получал 1-2 сигнала и потом сбивалось на ошибку ...  array out of range in 'Fractals Corridor Breakdown.mq5' (173,30)

Когда будет время и желание подскажите пожалуйста как мне правильно получить выход 6 color_buffer в 0 баре

Напомню - здесь технический форум, а не клуб телепатов. Хотите ответ - правильно задайте вопрос.
 
Vladimir Karputov:
Напомню - здесь технический форум, а не клуб телепатов. Хотите ответ - правильно задайте вопрос.

Прекрасно понимаю, что Вы устали от таких как я) но я вроде бы понятно написал;

"Когда будет время и желание подскажите пожалуйста как мне правильно получить выход 6 буфера color_buffer в 0 баре"...

Воспроизводить текст в окне меня не интересует, я пытаюсь получить сигнал и прошу Вас помочь так как у меня не получается и выходит ошибка

 
VVT:

Прекрасно понимаю, что Вы устали от таких как я) но я вроде бы понятно написал;

"Когда будет время и желание подскажите пожалуйста как мне правильно получить выход 6 буфера color_buffer в 0 баре"...

Воспроизводить текст в окне меня не интересует, я пытаюсь получить сигнал и прошу Вас помочь так как у меня не получается и выходит ошибка

Просто скопируйте мой код. Там уже есть и объявление буферов и копирование в них информации и спец.функции для копирования. Пример состоит из пяти строк -

   double open_buffer[],high_buffer[],low_buffer[],close_buffer[],color_buffer[];
   ArraySetAsSeries(open_buffer,true);
   ArraySetAsSeries(high_buffer,true);
   ArraySetAsSeries(low_buffer,true);
   ArraySetAsSeries(close_buffer,true);
   ArraySetAsSeries(color_buffer,true);
   int start_pos=0,count=2;
   if(!iGetArray(handle_iCustom,2,start_pos,count,open_buffer)  ||
      !iGetArray(handle_iCustom,3,start_pos,count,high_buffer)  ||
      !iGetArray(handle_iCustom,4,start_pos,count,low_buffer)   ||
      !iGetArray(handle_iCustom,5,start_pos,count,close_buffer) ||
      !iGetArray(handle_iCustom,6,start_pos,count,color_buffer))
      return;

неужели так трудно скопировать???

 
Vladimir Karputov:
Я дал пример. Пример кода и функция копирования уже готовая.

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

if((high_buffer[0]>0 && low_buffer[0]) && (Ask<low_buffer[0] || Ask >high_buffer[0])
Alert(Произошло пересечение уровня фрактала);

Такое решение не совсем правильное, на мой взгляд.
 

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