Хранилище собственных творений: индикаторы, скрипты, советники, в общем, все, на что муза вдохновила. Так же полезное ПО, взятое из открытых источников в Интернет.
Бонус за сообщение 0.4$
Ответственный Модератор - Рэндом
Сообщений: 44
•
1, 2, 3, 4, 5
Полезные функции и др. в помощь разработчику экспертов
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 раз.
Кто сейчас на форуме?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 432
Права доступа к форуму
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения