Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 575

 

Прошу помощи в поиске функции по расчету стандартного RSI, требования к ней простые:

1. Возвращать значение RSI на заданном баре

2. Производить расчет показателя только для тех баров(по необходимости), которые запрошены (желательно)

3. Уметь считать по заданному ТФ

4. Работает за счет пункта 2 быстрей индикатора

 

Хочу интегрировать в советник функцию, если есть у кого готовая, то прошу Вас поделится.

Спрашиваю, так как индикатор очень распространен и не является тайной.

 
-Aleks-:

Прошу помощи в поиске функции по расчету стандартного RSI, требования к ней простые:

1. Возвращать значение RSI на заданном баре

2. Производить расчет показателя только для тех баров(по необходимости), которые запрошены (желательно)

3. Уметь считать по заданному ТФ

4. Работает за счет пункта 2 быстрей индикатора

 

Хочу интегрировать в советник функцию, если есть у кого готовая, то прошу Вас поделится.

Спрашиваю, так как индикатор очень распространен и не является тайной.

А чем Вас стандартная iRSI не устраивает? Недостаточно секретная?
 
Vasiliy Sokolov:
А чем Вас стандартная iRSI не устраивает? Недостаточно секретная?
Есть мои изменения, которые мне надо внести будет в функцию...
 
-Aleks-:
Есть мои изменения, которые мне надо внести будет в функцию...

Возьмите тогда готовую и измените ее согласно Вашим требованиям:

//+------------------------------------------------------------------+
//|                                                          RSI.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Relative Strength Index"
//--- indicator settings
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1 30
#property indicator_level2 70
#property indicator_buffers 3
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  DodgerBlue
//--- input parameters
input int InpPeriodRSI=14; // Period
//--- indicator buffers
double    ExtRSIBuffer[];
double    ExtPosBuffer[];
double    ExtNegBuffer[];
//--- global variable
int       ExtPeriodRSI;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- check for input
   if(InpPeriodRSI<1)
     {
      ExtPeriodRSI=12;
      Print("Incorrect value for input variable InpPeriodRSI =",InpPeriodRSI,
            "Indicator will use value =",ExtPeriodRSI,"for calculations.");
     }
   else ExtPeriodRSI=InpPeriodRSI;
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtRSIBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtPosBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,ExtNegBuffer,INDICATOR_CALCULATIONS);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodRSI);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"RSI("+string(ExtPeriodRSI)+")");
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   int    i;
   double diff;
//--- check for rates count
   if(rates_total<=ExtPeriodRSI)
      return(0);
//--- preliminary calculations
   int pos=prev_calculated-1;
   if(pos<=ExtPeriodRSI)
     {
      //--- first RSIPeriod values of the indicator are not calculated
      ExtRSIBuffer[0]=0.0;
      ExtPosBuffer[0]=0.0;
      ExtNegBuffer[0]=0.0;
      double SumP=0.0;
      double SumN=0.0;
      for(i=1;i<=ExtPeriodRSI;i++)
        {
         ExtRSIBuffer[i]=0.0;
         ExtPosBuffer[i]=0.0;
         ExtNegBuffer[i]=0.0;
         diff=price[i]-price[i-1];
         SumP+=(diff>0?diff:0);
         SumN+=(diff<0?-diff:0);
        }
      //--- calculate first visible value
      ExtPosBuffer[ExtPeriodRSI]=SumP/ExtPeriodRSI;
      ExtNegBuffer[ExtPeriodRSI]=SumN/ExtPeriodRSI;
      if(ExtNegBuffer[ExtPeriodRSI]!=0.0)
         ExtRSIBuffer[ExtPeriodRSI]=100.0-(100.0/(1.0+ExtPosBuffer[ExtPeriodRSI]/ExtNegBuffer[ExtPeriodRSI]));
      else
        {
         if(ExtPosBuffer[ExtPeriodRSI]!=0.0)
            ExtRSIBuffer[ExtPeriodRSI]=100.0;
         else
            ExtRSIBuffer[ExtPeriodRSI]=50.0;
        }
      //--- prepare the position value for main calculation
      pos=ExtPeriodRSI+1;
     }
//--- the main loop of calculations
   for(i=pos;i<rates_total && !IsStopped();i++)
     {
      diff=price[i]-price[i-1];
      ExtPosBuffer[i]=(ExtPosBuffer[i-1]*(ExtPeriodRSI-1)+(diff>0.0?diff:0.0))/ExtPeriodRSI;
      ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(ExtPeriodRSI-1)+(diff<0.0?-diff:0.0))/ExtPeriodRSI;
      if(ExtNegBuffer[i]!=0.0)
         ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]);
      else
        {
         if(ExtPosBuffer[i]!=0.0)
            ExtRSIBuffer[i]=100.0;
         else
            ExtRSIBuffer[i]=50.0;
        }
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Vasiliy Sokolov:

Возьмите тогда готовую и измените ее согласно Вашим требованиям:

Так яж знаю, что есть индикатор в коде... вопрос был в том, кто мож уже менял...
 
Vasiliy Sokolov:

Вот мой вариант решения задачи по поиску повторений:

Василий, у меня при открытии #include <Dictionary.mqh>, открывается тоже самое, что и в теле советника. Так и должно быть? или там внутри должен быть другой еще какой-то код?

Потому что в том, коде, что я вижу, не ясно как он ищет повторы ((  

 
Artyom Trishkin:

// строку int searchPeriod=(Search_Period<1)?1:Search_Period;
// можно расписать так:

input int Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройках
int searchPeriod;           // Сюда будем записывать входной параметр
if(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен нулю
else searchPeriod=Search_Period;    // иначе примем входной параметр

// соответственно и строку int delta=(Delta<0)?0:Delta;
// можно расписать точно так же

Правильно я понял, что тут опечатка? должен быть 0 вместо 1. 

вот так:  int searchPeriod=(Search_Period<1)?0:Search_Period;

и еще дальше уже в исполняемом скрипте:

int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей 

тут же по идее мы уже должны использовать переменную: searchPeriod. так? 

------ 

Еще вопрос, что делает эта строчка? для чего нужна? Нашел, что каждый элемент структуры обнуляет. И тут я не могу понять зачем и что мы обнуляем, если мы по-идее эти данные только что записали и дальше должны использовать.

ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре 

 
Andrey Koldorkin:

Правильно я понял, что тут опечатка? должен быть 0 вместо 1. 

вот так:  int searchPeriod=(Search_Period<1)?0:Search_Period;

и еще дальше уже в исполняемом скрипте:

int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей 

тут же по идее мы уже должны использовать переменную: searchPeriod. так? 

------ 

Еще вопрос, что делает эта строчка? для чего нужна? Нашел, что каждый элемент структуры обнуляет. И тут я не могу понять зачем и что мы обнуляем, если мы по-идее эти данные только что записали и дальше должны использовать.

ZeroMemory(dataCandle);                                        // Обнуляем данные в структуре 


"вот так:  int searchPeriod=(Search_Period<1)?0:Search_Period;"

Нет, не так. Так у вас (дословно): если Search_Period задан пользователем в настройках меньше единицы, то searchPeriod будет равен нолю, иначе searchPeriod будет равен заданному пользователем в настройках значению Search_Period. Это же не верно. Диапазон поиска, равный нолю нам не нужен. Так вот, если этот диапазон задан пользователем 0 или меньше ноля (меньше единицы), то зададим этот диапазон, равным минимальному - единице.


"int copy_bars=(int)fmin(Search_Period,Bars(Symbol(),Period()));   // количество копируемых свечей
тут же по идее мы уже должны использовать переменную: searchPeriod. так? "

Да, так, опечатка вышла.


"Еще вопрос, что делает эта строчка? для чего нужна? Нашел, что каждый элемент структуры обнуляет. И тут я не могу понять зачем и что мы обнуляем, если мы по-идее эти данные только что записали и дальше должны использовать. ZeroMemory(dataCandle);   // Обнуляем данные в структуре"

Мы это делаем перед заполнением структуры данными. Сначала обнуляем, а уже потом заполняем. Посмотрите - мы обнуляем перед циклом. А далее в цикле заполняем структуру данными.

 

Здравствуйте.

Скажите, пожалуйста, можно ли средствами терминала скопировать в буфер обмена текст из советника, например, по условию, текст аллерта.

Если да, то как это сделать?

 
mila.com:

Здравствуйте.

Скажите, пожалуйста, можно ли средствами терминала скопировать в буфер обмена текст из советника, например, по условию, текст аллерта.

Если да, то как это сделать?

Нет. Работа с буфером обмена - это системные функции (Windows API). В MQL5 нет прямого доступа к WinAPI. И зачем работать с буфером обмена? Ведь Вы сами формируете сообщение - значит у Вас есть и исходный текст сообщения.