Полезные функции и др. в помощь разработчику экспертов

Хранилище собственных творений: индикаторы, скрипты, советники, в общем, все, на что муза вдохновила. Так же полезное ПО, взятое из открытых источников в Интернет.
Бонус за сообщение 0.4$
Ответственный Модератор - Рэндом

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 16 фев 2015, 07:30

Здесь выкладываю собственные разработки (а также заимствованные в своё время из свободного доступа), необходимые разработчику. Однажды написав их, процесс создания экспертов значительно ускорится. Предложения по модернизации приветствуются.
Ф-ия определяет тренд по комбинации 2 МАшек (на последнем закрытом баре):

Код: выделить все
string f_2MATrend(int tf, int pe_F, int pe_S, int me_F, int me_S, int ap_F, int ap_S)                 
/*
   09.03.2014 г.
   Ф-ия определяет тренд по комбинации 2 МАшек (на последнем закрытом баре)
   возвращает "UP" если быстрая МА выше медленной МА
   возвращает "DN" если быстрая МА ниже медленной МА
   возвращает "NO" если тренд не определен
   Параметры:
   tf    -  // таймфрейм (0 - текущий ТФ)
   pe_F  -  // период быстрой МАшки
   pe_S  -  // период медленной МАшки   
   me_F  -  // метод усреднения быстрой МАшки
   me_S  -  // метод усреднения медленной МАшки
   ap_F  -  // тип цены быстрой МАшки
   ap_S  -  // тип цены медленной МАшки
*/
{
double   dblMAF_1,  // значение быстрой MA на предыдущем баре
         dblMAS_1;  // значение медленной MA на предыдущем баре
 
   dblMAF_1 = iMA(NULL, tf, pe_F, 0, me_F, ap_F, 1);
   dblMAS_1 = iMA(NULL, tf, pe_S, 0, me_S, ap_S, 1);
   
   if(dblMAF_1 > dblMAS_1) return("UP");
   if(dblMAF_1 < dblMAS_1) return("DN");
   
return("NO");
}
Последний раз редактировалось Haos 16 фев 2015, 07:33, всего редактировалось 2 раз(а).
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 16 фев 2015, 07:32

Определение тренда на основе одной МАшки и цены:

Код: выделить все
string f_MATrend(string sy, int tf, int pe, int msh, int me, int ap, int sh, double pr)
{
/*
   Определяет тренд на основе одной МАшки и цены 
   "UP" - цена выше МАшки;
   "DN" - цена ниже МАшки;
   "NO" - сигнал не определен;
   Параметры:
   sy - // имя символа  (NULL - текущий символ)
   tf - // таймфрейм    (0 - текущий ТФ)
   pe - // период
   msh - // сдвиг средней
   me - // метод усреднения
   ap - // тип цены
   sh - // сдвиг
   pr - // цена
   
*/   
   double dblMA = iMA(sy, tf, pe, msh, me, ap, sh);
   if(pr > dblMA) return ("UP");
   if(pr < dblMA) return ("DN");

return("NO");
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 16 фев 2015, 07:35

Ф-ия определяет сигнал по пересечению 2 МАшек (на последнем закрытом баре):

Код: выделить все
string f_2MASyg(int tf, int pe_F, int pe_S, int me_F, int me_S, int ap_F, int ap_S)                 
/*
   09.03.2014 г.
   Ф-ия определяет сигнал по пересечению 2 МАшек (на последнем закрытом баре)
   возвращает "UP" если быстрая МА пересекла вверх медленную МА
   возвращает "DN" если быстрая МА пересекла вниз медленную МА
   возвращает "NO" если нет пересечения
   Параметры:
   tf    -  // таймфрейм (0 - текущий ТФ)
   pe_F  -  // период быстрой МАшки
   pe_S  -  // период медленной МАшки   
   me_F  -  // метод усреднения быстрой МАшки
   me_S  -  // метод усреднения медленной МАшки
   ap_F  -  // тип цены быстрой МАшки
   ap_S  -  // тип цены медленной МАшки
   Пример: AlligatorJawsBuffer[i] = iMA(NULL, 0, 13, 8, MODE_SMMA, PRICE_MEDIAN, i);
*/
{
double   dblMAF_1,   // значение быстрой MA на предыдущем баре
         dblMAF_2,   // значение быстрой MA два бара назад
         dblMAS_1,   // значение медленной MA на предыдущем баре
         dblMAS_2;   // значение медленной MA два бара назад
 
   dblMAF_1 = iMA(NULL, tf, pe_F, 0, me_F, ap_F, 1);
   dblMAF_2 = iMA(NULL, tf, pe_F, 0, me_F, ap_F, 2);
   dblMAS_1 = iMA(NULL, tf, pe_S, 0, me_S, ap_S, 1);
   dblMAS_2 = iMA(NULL, tf, pe_S, 0, me_S, ap_S, 2);
   
   if(dblMAF_1 > dblMAS_1 && dblMAF_2 < dblMAS_2) return("UP");
   if(dblMAF_1 < dblMAS_1 && dblMAF_2 > dblMAS_2) return("DN");
   
return("NO");
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 16 фев 2015, 14:26

Иногда нужно чтобы в советнике Стохастик выступал в качестве фильтра сигнала на вход в рынок (т.е. сигнал на вход формируется каким-то способом, но Стохастик должен отфильтровать его).
Например, продавать только когда обе линии Стохастика выше уровня "50" или вообще в зоне перекупленности. Данная функция позволит получить положение обоих линий Стохастика относительно уровней:
Функция возвращает выше (ниже) какого уровня линии Стохастика:

Код: выделить все
string f_StochSyg(string sy, int tf, int kpe, int dpe, int slo, int sh)
{
/* Сигнал на значения линий (обоих!) Стохастика выше (ниже) уровня.
   Параметры:                                                               
   sy   - наименование инструмента   (NULL - текущий символ)               
   tf   - торгуемый таймфрейм графика (0 - текущий ТФ)
   kpe  - Период для вычисления линии %K Стохастика
   dpe  - Период усреднения для вычисления линии %D Стохастика
   slo  - Значение замедления Стохастика
   sh   - Индекс получаемого значения из индикаторного буфера (сдвиг относительно
                  текущего бара на указанное количество периодов назад).
   Уровни: (20, 50, 80,)
   Возвращаемые значения:
   Y > 80.0  ("Yh")
   50.0 < Y < 80.0 ("Ym2")
   20.0 < Y < 50.0 ("Ym1")
   Y < 20.0  ("Yl")
   iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0);
*/   
   string   strRes = "NO SIGNAL";
   if(sy == "0") sy = Symbol();
   double dblStochMain = iStochastic(sy, tf, kpe, dpe, slo, MODE_SMA, 0, MODE_MAIN,   sh);
   double dblStochSygn = iStochastic(sy, tf, kpe, dpe, slo, MODE_SMA, 0, MODE_SIGNAL, sh);
   
   if(dblStochMain > 80.0 && dblStochSygn > 80.0) strRes = "Yh";
   if(dblStochMain > 50.0 && dblStochSygn > 50.0 && dblStochMain < 80.0 &&
      dblStochSygn < 80.0) strRes = "Ym2";
   if(dblStochMain > 20.0 && dblStochSygn > 20.0 && dblStochMain < 50.0 &&
      dblStochSygn < 50.0) strRes = "Ym1";
   if(dblStochMain < 20.0 && dblStochSygn < 20.0) strRes = "Yl";   
   
return(strRes);
}

В качестве уровней рассмотрены 20, 50, 80. Функция возвращает строковую величину в соответствие с обозначениями в описании функции.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение mfcoder » 16 фев 2015, 14:48

Haos писал(а):В качестве уровней рассмотрены 20, 50, 80. Функция возвращает строковую величину в соответствие с обозначениями в описании функции.


тогда уж и уровни должны идти в виде параметров, чтоб они могли быть настраиваемыми :-):
Аватар пользователя
mfcoder
 
Сообщений: 1531
Зарегистрирован: 29 июл 2013, 11:55
Средств на руках: 26.85 Доллар
Группа: Базовая
Благодарил (а): 78 раз.
Поблагодарили: 423 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 16 фев 2015, 14:51

mfcoder писал(а):
Haos писал(а):В качестве уровней рассмотрены 20, 50, 80. Функция возвращает строковую величину в соответствие с обозначениями в описании функции.


тогда уж и уровни должны идти в виде параметров, чтоб они могли быть настраиваемыми :-):

Вообще-то да (по крайней мере, два из них. так как полтинник так и так задействован. Меня несколько смутила количества параметров в ф-ии и, типа, руки не дошли. Для прогера можно же и в ф-ии их "прошить" в виде переменных и менять по мере необходимости. Ну, в общем, можно и оптимизировать ф-ию, введя их в качестве параметров. Спс. за совет! :-):
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 18 фев 2015, 11:28

Усовершенствованная версия ф-ии f_StochSyg.
Добавлена возможность вводить три уровня Стохастика в качестве параметров.

Код: выделить все
string f_StochSygL(string sy, int tf, int kpe, int dpe, int slo, int sh, double ll,
                     double ml, double hl)
{
/* Усовершенствованная версия ф-ии f_StochSyg.
   Добавлена возможность вводить три уровня Стохастика.
   Сигнал на значения линий (обоих!) Стохастика выше (ниже) уровня.
   Параметры:                                                               
   sy   - наименование инструмента   (NULL - текущий символ)               
   tf   - торгуемый таймфрейм графика (0 - текущий ТФ)
   kpe  - Период для вычисления линии %K Стохастика
   dpe  - Период усреднения для вычисления линии %D Стохастика
   slo  - Значение замедления Стохастика
   sh   - Индекс получаемого значения из индикаторного буфера (сдвиг относительно
                  текущего бара на указанное количество периодов назад).
   ll   - Нижней уровень Стохастика (обычно 20 или 30).
   ml   - Средний уровень Стохастика (обычно 50).
   hl   - Верхний уровень Стохастика (обычно 70 или 80).
   Возвращаемые значения:
   Y > hl  ("Yh")
   ml < Y < hl ("Ym2")
   ll < Y < ml ("Ym1")
   Y < ll  ("Yl")
   iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0);
*/   
   string   strRes = "NO SIGNAL";
   if(sy == "0") sy = Symbol();
   double dblStochMain = iStochastic(sy, tf, kpe, dpe, slo, MODE_SMA, 0, MODE_MAIN,   sh);
   double dblStochSygn = iStochastic(sy, tf, kpe, dpe, slo, MODE_SMA, 0, MODE_SIGNAL, sh);
   
   if(ll < ml && ll > 0.0 && ml < hl && hl < 100.0) // Проверка допустимости вводимых значений
   {
      if(dblStochMain > hl && dblStochSygn > hl) strRes = "Yh";
      if(dblStochMain > ml && dblStochSygn > ml && dblStochMain < hl &&
         dblStochSygn < hl) strRes = "Ym2";
      if(dblStochMain > ll && dblStochSygn > ll && dblStochMain < ml &&
         dblStochSygn < ml) strRes = "Ym1";
      if(dblStochMain < ll && dblStochSygn < ll) strRes = "Yl";   
   }
return(strRes);
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 18 фев 2015, 11:35

Функция рассчитывает где находится цена относительно полос Болинджера.

Код: выделить все
string f_BBSyg(string sy, int tf, int pe, int de, int ap, int par_Sh, double par_Pr)
{
/* функция возвращает значения:
   На основе индикатора Полосы Болинджера
   "Yh"  - цена выше верхней линии ВВ;
   "Ymh" - цена между средней и верхней линией ВВ;
   "Yml" - цена между средней и нижней линией ВВ;
   "Yl"  - цена ниже нижней  линии ВВ;
   "NO SIGNAL"    - любое другое (неопределенное) положение цены;
   Параметры:                                                               
   sy   - наименование инструмента   (NULL - текущий символ)               
   tf   - торгуемый таймфрейм графика (0 - текущий ТФ).
   pe   - Период усреднения основной линии индикатора (NULL - текущий период)
   de   - Отклонение от основной линии ВВ
   ap   - Используемая цена
   par_Sh   - Индекс получаемого значения из индикаторного буфера
   par_Pr   - значение цены
   Средней линией индикатора ВВ является SMA с аналогичным периодом
*/
   double   dblBBH, // Значение индикатора ВВ верхней линии
            dblBBM,  // Значение индикатора ВВ средней линии
            dblBBL;  // Значение индикатора ВВ нижней линии
         
   if(sy == "0") sy = Symbol();
   
   dblBBH = iBands(sy, tf, pe, de, 0, ap, MODE_UPPER, par_Sh);
   dblBBL = iBands(sy, tf, pe, de, 0, ap, MODE_LOWER, par_Sh);
   dblBBM = iMA(sy, tf, pe, 0, MODE_SMA, ap, par_Sh);
           
   if(par_Pr < dblBBL) return("Yl");
   if(par_Pr > dblBBL && par_Pr < dblBBM) return("Yml");
   if(par_Pr > dblBBM && par_Pr < dblBBH) return("Ymh");
   if(par_Pr > dblBBH) return("Yh");

return("NO SIGNAL");
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 07 мар 2015, 07:23

Часто (если не всегда) нужно знать сколько открыто позиций на данный момент. Данная функция решает эту проблему.
Функция возвращает количество открытых позиций.

Код: выделить все
int GetNumderOfPositions(string sy, int op, int mn)
{
/*
   Автор прототипа Ким Игорь В. aka KimIV.
   Модификации (и в дальнейшем) Haos.
   Версия   : 11.02.2014 г.                                                 
   Описание : Возвращает количество позиций (покупок или продаж)             
   Параметры:                                                               
   sy - наименование инструмента   (""  - любой символ, "0" - текущий символ)             
   op - операция {OP_BUY; OP_SELL}
   mn - MagicNumber  ("-1" - любой маджик)               
*/
   int n = 0;
   
   if(sy == "0") sy = Symbol();
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == sy || sy == "")
         {
            if(mn < 0 || OrderMagicNumber() == mn)
            {
               if(OrderType()== op) n++;
            } 
         }
      }
   }
return(n);
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Полезные функции и др. в помощь разработчику экспертов

Сообщение Haos » 07 мар 2015, 07:27

Модификация одного (предварительно выбранного ордера).

Код: выделить все
void ModifyOrder(double pp, double sl, double tp, datetime ex)
{
/*
   Автор прототипа Ким Игорь В. aka KimIV.
   Версия   : 12.02.2014                                                     
   Описание : Модификация одного предварительно выбранного ордера.           
   Параметры:                                                               
   pp - цена установки ордера   (-1 -> не менять)                                           
   sl - ценовой уровень стопа   (-1 -> не менять)                                           
   tp - ценовой уровень тейка   (-1 -> не менять)                                           
   ex - дата истечения          (0  -> любая)                                       
*/
   bool   fm;
   double op, pa, pb, os, ot;
   int    dg = (int)MarketInfo(OrderSymbol(), MODE_DIGITS),
          it;

   if(pp < 0)  pp = OrderOpenPrice();
   if(sl < 0 ) sl = OrderStopLoss();
   if(tp < 0 ) tp = OrderTakeProfit();
 
   pp = NormalizeDouble(pp, dg);
   sl = NormalizeDouble(sl, dg);
   tp = NormalizeDouble(tp, dg);
   op = NormalizeDouble(OrderOpenPrice(), dg);
   os = NormalizeDouble(OrderStopLoss(), dg);
   ot = NormalizeDouble(OrderTakeProfit(), dg);

   if(pp != op || sl != os || tp != ot)
   {
      for(it = 1; it <= NumberOfTry; it++)
      {
         if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
         while(!IsTradeAllowed()) Sleep(5000);
         RefreshRates();
         fm = OrderModify(OrderTicket(), pp, sl, tp, ex, CLR_NONE);
         if(fm)
         {
            if(UseSound) PlaySound(SoundSuccess); break;
         }
         else
         {
            if(UseSound) PlaySound(SoundError);
            pa = MarketInfo(OrderSymbol(), MODE_ASK);
            pb = MarketInfo(OrderSymbol(), MODE_BID);
            Sleep(1000 * 10);
         }
      }
   }
}
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в Творческая мастерская

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения