1. Пожалуйста вставляйте код правильно: при редактировании сообщения нажмите кнопку и во всплывающее окно вставьте свой код
2. Следите за лексикой и не позволяйте грубые выражения
- www.mql5.com
Пример (грубо):
***
// Стохастик пересекает уровень 20 снизу вверх:
***
много примеров можно найти в MQL5 Code Base
Конечно же я искал примеры перед созданием этой темы, но кроме костылей в виде простыней на целую страницу кода для такой элементарной вещи как пересечение индикатора я не нашёл. Меня больше интересует как правильно из буфера значение достать через GetIndicatorHandle.
В mql4 это делается вообще элементарно! А в 5-ом как-то запутанно всё...
Конечно же я искал примеры перед созданием этой темы, но кроме костылей в виде простыней на целую страницу кода для такой элементарной вещи как пересечение индикатора я не нашёл. Меня больше интересует как правильно из буфера значение достать через GetIndicatorHandle.
В mql4 это делается вообще элементарно! А в 5-ом как-то запутанно всё...
может это поможет - я просто сам ученик, тоже пытаюсь на учиться https://www.mql5.com/ru/docs/indicators/istochastic
- www.mql5.com
Конечно же я искал примеры перед созданием этой темы, но кроме костылей в виде простыней на целую страницу кода для такой элементарной вещи как пересечение индикатора я не нашёл. Меня больше интересует как правильно из буфера значение достать через GetIndicatorHandle.
В mql4 это делается вообще элементарно! А в 5-ом как-то запутанно всё...
В MQL5 хендл индикатора СОЗДАЁТСЯ ОДНИ РАЗ и делается это в OnInit. Для получения данных используется CopyBuffer
- www.mql5.com
попытаюсь в месте с Вами разобраться - начало у меня получилось такое
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+
Понятно. Тогда вопрос - какую функцию выполняет второе число после запятой в GetIndicatorHandle?
И можно ли как-то получить значение индикатора на предыдущих барах более простым способом без CopyBuffer?
Понятно. Тогда вопрос - какую функцию выполняет второе число после запятой в GetIndicatorHandle?
Вы ничего не поняли. Попытайтесь запомнить: В MQL5 хендл индикатора СОЗДАЁТСЯ ОДНИ РАЗ и делается это в OnInit
После этого напишите правильный MQL5 код создания хендла индикатора. Без этого дальше что либо говорить рано.
Пример работы со стохастиком
Forum on trading, automated trading systems and testing trading strategies
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:
я продвинулся пока до сюда
у меня вроде получилось!
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пример (грубо):
Почему-то (handle1,0,2) и (handle1,0,1) выдают одинаковые значения! хотя в хелпе написано, что первое значение - это номер индикаторного буфера (0 - основная линия стохастика, а второе число после запятой - индекс значения в буфере).
Вычисления делаются раз в свечу. Почему доступ к предыдущему значению буфера не работает? Как правильно его достать?
(отредактировал)