Не получается сделать пересечение индикатора, что я делаю не так???

 

Пример (грубо):

 handle1 = iStochastic(NULL, NULL,Stoch_K,1,Stoch_Slowing,0,0);

int Stoch_Level = 20, Stoch_K=25, Stoch_Slowing=5;


// Стохастик пересекает уровень 20 снизу вверх:

if (GetIndicator(handle1,0,2) <= Stoch_Level  && GetIndicator(handle1,0,1) > Stoch_Level)

Почему-то  (handle1,0,2) и (handle1,0,1) выдают одинаковые значения! хотя в хелпе написано, что первое значение - это номер индикаторного буфера (0 - основная линия стохастика, а второе число после запятой - индекс значения в буфере).

Вычисления делаются раз в свечу. Почему доступ к предыдущему значению буфера не работает? Как правильно его достать?


(отредактировал)

 
John Smith:


1.  Пожалуйста вставляйте код правильно: при редактировании сообщения нажмите кнопку    Code и во всплывающее окно вставьте свой код 

2. Следите за лексикой и не позволяйте грубые выражения

MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • www.mql5.com
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
 
John Smith:

Пример (грубо):

***


// Стохастик пересекает уровень 20 снизу вверх:

***


много примеров можно найти в MQL5 Code Base

John Smith

MQL5 Code Base
MQL5 Code Base
  • www.mql5.com
Библиотека исходных кодов на языке MQL5 для MetaTrader 5
 
SanAlex:

много примеров можно найти в MQL5 Code Base


Конечно же я искал примеры перед созданием этой темы, но кроме костылей в виде простыней на целую страницу кода для такой элементарной вещи как пересечение индикатора я не нашёл. Меня больше интересует как правильно из буфера значение достать через GetIndicatorHandle.

В mql4 это делается вообще элементарно! А в 5-ом как-то запутанно всё...

 
John Smith:

Конечно же я искал примеры перед созданием этой темы, но кроме костылей в виде простыней на целую страницу кода для такой элементарной вещи как пересечение индикатора я не нашёл. Меня больше интересует как правильно из буфера значение достать через GetIndicatorHandle.

В mql4 это делается вообще элементарно! А в 5-ом как-то запутанно всё...

может это поможет - я просто сам ученик, тоже пытаюсь на учиться    https://www.mql5.com/ru/docs/indicators/istochastic

Документация по MQL5: Технические индикаторы / iStochastic
Документация по MQL5: Технические индикаторы / iStochastic
  • www.mql5.com
iStochastic - Технические индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
John Smith:

Конечно же я искал примеры перед созданием этой темы, но кроме костылей в виде простыней на целую страницу кода для такой элементарной вещи как пересечение индикатора я не нашёл. Меня больше интересует как правильно из буфера значение достать через GetIndicatorHandle.

В mql4 это делается вообще элементарно! А в 5-ом как-то запутанно всё...

В MQL5 хендл индикатора СОЗДАЁТСЯ ОДНИ РАЗ и делается это в OnInit. Для получения данных используется  CopyBuffer

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
CopyBuffer - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

попытаюсь в месте с Вами разобраться - начало у меня получилось такое 

//+------------------------------------------------------------------+
//|                                            TradingStochastic.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input int                  Kperiod=5;                 // K-период (количество баров для расчетов)
input int                  Dperiod=3;                 // D-период (период первичного сглаживания)
input int                  slowing=3;                 // период для окончательного сглаживания
input ENUM_MA_METHOD       ma_method=MODE_SMA;        // тип сглаживания
input ENUM_STO_PRICE       price_field=STO_LOWHIGH;   // способ расчета стохастика

//--- переменная для хранения хэндла индикатора iStochastic
int    handle=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- получение хендла индикатора Stochastic
   handle=iStochastic(_Symbol,_Period,Kperiod,Dperiod,slowing,ma_method,price_field);
   if(handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iStochastic");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| Заполняем индикаторные буферы из индикатора iStochastic          |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &main_buffer[],    // индикаторный буфер значений Stochastic Oscillator
                           double &signal_buffer[],  // индикаторный буфер сигнальной линии
                           int ind_handle,           // хэндл индикатора iStochastic
                           int amount                // количество копируемых значений
                          )
  {
//--- сбросим код ошибки
   ResetLastError();
//--- заполняем часть массива StochasticBuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle,MAIN_LINE,0,amount,main_buffer)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iStochastic, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива SignalBuffer значениями из индикаторного буфера под индексом 1
   if(CopyBuffer(ind_handle,SIGNAL_LINE,0,amount,signal_buffer)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iStochastic, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- все получилось
   return(true);
  }

//+------------------------------------------------------------------+


 

 
Vladimir Karputov:

 Для получения данных используется  CopyBuffer

Понятно. Тогда вопрос - какую функцию выполняет второе число после запятой в GetIndicatorHandle?

И можно ли как-то получить значение индикатора на предыдущих барах более простым способом без CopyBuffer?

 
John Smith:

Понятно. Тогда вопрос - какую функцию выполняет второе число после запятой в GetIndicatorHandle?


Вы ничего не поняли. Попытайтесь запомнить:  В MQL5 хендл индикатора СОЗДАЁТСЯ ОДНИ РАЗ и делается это в OnInit

После этого напишите правильный MQL5 код создания хендла индикатора. Без этого дальше что либо говорить рано.

 

Пример работы со стохастиком

Forum on trading, automated trading systems and testing trading strategies

How to start with MQL5

Vladimir Karputov, 2020.04.20 15:31

An example of get values from the iStochastic indicator

Code: iStochastic get value.mq5

Do not forget the rules: create the indicator handle ONCE in OnInit, use CopyBuffer to get the data.

//+------------------------------------------------------------------+
//|                                        iStochastic get value.mq5 |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property version   "1.001"
//--- input parameters
input group "Stochastic"
input ENUM_TIMEFRAMES   Inp_STO_period       = PERIOD_CURRENT; // Stochastic: timeframe
input int               Inp_STO_Kperiod      = 5;              // Stochastic: K-period (number of bars for calculations)
input int               Inp_STO_Dperiod      = 3;              // Stochastic: D-period (period of first smoothing)
input int               Inp_STO_slowing      = 3;              // Stochastic: final smoothing
input ENUM_MA_METHOD    Inp_STO_ma_method    = MODE_SMA;       // Stochastic: type of smoothing
input ENUM_STO_PRICE    Inp_STO_price_field  = STO_LOWHIGH;    // Stochastic: stochastic calculation method
input group "Service parameters"
input bool              InpPrintLog          = false;          // Print log
//---
int    handle_iStochastic;                   // variable for storing the handle of the iStochastic indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iStochastic
   handle_iStochastic=iStochastic(Symbol(),Inp_STO_period,
                                  Inp_STO_Kperiod,Inp_STO_Dperiod,Inp_STO_slowing,
                                  Inp_STO_ma_method,Inp_STO_price_field);
//--- if the handle is not created
   if(handle_iStochastic==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iStochastic indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Inp_STO_period),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double main[],signal[];
   ArraySetAsSeries(main,true);
   ArraySetAsSeries(signal,true);
   int start_pos=0,count=2;
   if(!iGetArray(handle_iStochastic,MAIN_LINE,start_pos,count,main) ||
      !iGetArray(handle_iStochastic,SIGNAL_LINE,start_pos,count,signal))
     {
      return;
     }
//---
   string text="";
   int limit=(count>2)?2:count;
   for(int i=0; i<limit; i++)
     {
      text=text+
           " bar #"+IntegerToString(i)+": "+
           " main "+DoubleToString(main[i],2)+
           " signal "+DoubleToString(signal[i],2)+"\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);
  }
//+------------------------------------------------------------------+


Result:

iStochastic get value


 

я продвинулся пока до сюда 

 

у меня вроде получилось!

John Smith 3

//+------------------------------------------------------------------+
//|                                            TradingStochastic.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input int                  Kperiod=5;                 // K-период (количество баров для расчетов)
input int                  Dperiod=3;                 // D-период (период первичного сглаживания)
input int                  slowing=3;                 // период для окончательного сглаживания
input ENUM_MA_METHOD       ma_method=MODE_SMA;        // тип сглаживания
input ENUM_STO_PRICE       price_field=STO_LOWHIGH;   // способ расчета стохастика


int    m_uno;
//--- переменная для хранения хэндла индикатора iStochastic
int    handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---- получение хендла индикатора Stochastic
   handle=iStochastic(_Symbol,_Period,Kperiod,Dperiod,slowing,ma_method,price_field);
   if(handle==INVALID_HANDLE)
      Print(" Не удалось получить хендл индикатора iStochastic");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double StochasticBuffer[],SignalBuffer[];
   ArraySetAsSeries(StochasticBuffer,true);
   ArraySetAsSeries(SignalBuffer,true);
//--- количество копируемых значений из индикатора iStochastic
   int values_to_copy=1;
//--- заполняем массивы значениями из индикатора iStochastic
//--- если FillArraysFromBuffers вернула false, значит данные не готовы - завершаем работу
   if(!FillArraysFromBuffers(StochasticBuffer,SignalBuffer,handle,values_to_copy))
      return;
//---
   if(StochasticBuffer[0]>80 && StochasticBuffer[0]<SignalBuffer[0])
     {
      if(m_uno<0)
         Alert(" SELL ");
      m_uno=+1;
      return;
     }
//---
   if(StochasticBuffer[0]<20 && StochasticBuffer[0]>SignalBuffer[0])
     {
      if(m_uno>0)
         Alert(" BUY ");
      m_uno=-1;
      return;
     }
  }
//+------------------------------------------------------------------+
//| Заполняем индикаторные буферы из индикатора iStochastic          |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &main_buffer[],    // индикаторный буфер значений Stochastic Oscillator
                           double &signal_buffer[],  // индикаторный буфер сигнальной линии
                           int ind_handle,           // хэндл индикатора iStochastic
                           int amount                // количество копируемых значений
                          )
  {
//--- сбросим код ошибки
   ResetLastError();
//--- заполняем часть массива StochasticBuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle,MAIN_LINE,0,amount,main_buffer)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iStochastic, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива SignalBuffer значениями из индикаторного буфера под индексом 1
   if(CopyBuffer(ind_handle,SIGNAL_LINE,0,amount,signal_buffer)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iStochastic, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- все получилось
   return(true);
  }

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