Полезные функции от KimIV - страница 116

 

Функция SetChannel().

Эта функция выполняет установку объекта OBJ_CHANNEL равноудалённый канал на текущем графике.

  • cl - Цвет объекта. Обязательный параметр.
  • t[] - Массив трёх значений по оси времени. Обязательный параметр.
  • p[] - Массив трёх значений по оси цены. Обязательный параметр.
  • nm - Наименование объекта. При передаче умолчательного значения - "" в качестве имени используется время открытия текущего бара.
  • ry - Флаг свойства ЛУЧ. Значение по умолчанию False.
  • st - Стиль линий. Допустимые значения STYLE_SOLID (по умолчанию), STYLE_DASHSTYLE_DOTSTYLE_DASHDOTSTYLE_DASHDOTDOT.
  • wd - Толщина линий. Значение по умолчанию - 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 21.03.2013                                                     |
//|  Описание : Установка объекта OBJ_CHANNEL Равноудаленный канал.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl  - цвет линии                                                        |
//|    t[] - время открытия бара                                               |
//|    p[] - ценовой уровень                                                   |
//|    nm  - наименование              (  ""  - время открытия текущего бара)  |
//|    ry  - луч                       (False - по умолчанию)                  |
//|    st  - стиль линии               (  0   - простая линия)                 |
//|    wd  - ширина линии              (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetChannel(color cl, datetime& t[], double& p[],
                string nm="", bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t[0]<=0) t[0]=Time[20];
  if (p[0]<=0) p[0]=High[20];
  if (t[1]<=0) t[1]=Time[0];
  if (p[1]<=0) p[1]=High[0];
  if (t[2]<=0) t[2]=Time[15];
  if (p[2]<=0) p[2]=Low[15];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_CHANNEL, 0, 0,0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t[0]);
  ObjectSet(nm, OBJPROP_PRICE1, p[0]);
  ObjectSet(nm, OBJPROP_TIME2 , t[1]);
  ObjectSet(nm, OBJPROP_PRICE2, p[1]);
  ObjectSet(nm, OBJPROP_TIME3 , t[2]);
  ObjectSet(nm, OBJPROP_PRICE3, p[2]);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
ЗЫ. Во вложении скрипт для тестирования функции SetChannel().
Файлы:
 

Добрый день.

Использую функцию SetTLine() от KimIV https://forum.mql4.com/ru/38949/page6#434255 .  Проблема в том, что нужно две линии (верхняя и нижняя), но мне не получается. Сделал еще одну функцию SetTLine1() с другими переменными, но всё равно не получилось.  Как это сделать?

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime d1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
d1=StrToTime(TimeToStr(d1, TIME_DATE));
datetime d2=d1-24*60*60;
while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
d2=StrToTime(TimeToStr(d2, TIME_DATE));
int b2=iBarShift(NULL, 0, d2);     // номер бара начала второго дня
int b1=iBarShift(NULL, 0, d1);     // номер бара начала первого дня
int b0=iBarShift(NULL, 0, d0);     // номер бара начала текущего дня
int n2=iLowest(NULL, 0, MODE_LOW, b2-b1-1, b1);
int n1=iLowest(NULL, 0, MODE_LOW, b1-b0-1, b0);
datetime t1=Time[n2];
double   p1=Low[n2];
datetime t2=Time[n1];
double   p2=Low[n1];
SetTLine(Magenta, "", t1, p1, t2, p2, True, STYLE_SOLID, 3);   


datetime di0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
datetime di1=TimeCurrent()-24*60*60;
while (TimeDayOfWeek(di1)==0 || TimeDayOfWeek(di1)==6) di1-=24*60*60;
di1=StrToTime(TimeToStr(di1, TIME_DATE));
datetime di2=di1-24*60*60;
while (TimeDayOfWeek(di2)==0 || TimeDayOfWeek(di2)==6) di2-=24*60*60;
di2=StrToTime(TimeToStr(di2, TIME_DATE));
int bi2=iBarShift(NULL, 0, di2);     // номер бара начала второго дня
int bi1=iBarShift(NULL, 0, di1);     // номер бара начала первого дня
int bi0=iBarShift(NULL, 0, di0);     // номер бара начала текущего дня
int ni2=iHighest(NULL, 0, MODE_HIGH, bi2-bi1-1, bi1);
int ni1=iHighest(NULL, 0, MODE_HIGH, bi1-bi0-1, bi0);
datetime t1i=Time[ni2];
double   p1i=High[ni2];
datetime t2i=Time[ni1];
double   p2i=High[ni1];
SetTLine1(Magenta, "", t1i, p1i, t2i, p2i, True, STYLE_SOLID, 3);
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}


void SetTLine1(color cli, string nmi="",
              datetime t1i=0, double p1i=0, datetime t2i=0, double p2i=0,
              bool ryi=False, int sti=0, int wdi=1) {
  if (nmi=="") nmi=DoubleToStr(Time[0], 0);
  if (t1i<=0) t1i=Time[10];
  if (p1i<=0) p1i=Low[10];
  if (t2i<=0) t2i=Time[0];
  if (p2i<=0) p2i=Bid;
  if (ObjectFind(nmi)<0) ObjectCreate(nmi, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nmi, OBJPROP_TIME1 , t1i);
  ObjectSet(nmi, OBJPROP_PRICE1, p1i);
  ObjectSet(nmi, OBJPROP_TIME2 , t2i);
  ObjectSet(nmi, OBJPROP_PRICE2, p2i);
  ObjectSet(nmi, OBJPROP_COLOR , cli);
  ObjectSet(nmi, OBJPROP_RAY   , ryi);
  ObjectSet(nmi, OBJPROP_STYLE , sti);
  ObjectSet(nmi, OBJPROP_WIDTH , wdi);
}
 

Не нужно делать две функции. Нужно вызывать одну с разными параметрами. Вы вызывали две функции, но в обе передавали пустое имя объекта ЛИНИЯ. По умолчанию в качестве имени функция SetTLine() ставит время открытия текущего бара. В Вашем случае, это приводило к тому, что сколько бы Вы ни вызывали функцию SetTLine(), каждый раз создаётся объект с одним и тем же именем, то есть ОДИН объект ЛИНИЯ.

Я переделал Ваш код. Смотрите вложение. Ну и для примера того, что Ваш код рисует, картинка

  

Файлы:
 
KimIV:

Не нужно делать две функции. Нужно вызывать одну с разными параметрами. Вы вызывали две функции, но в обе передавали пустое имя объекта ЛИНИЯ. По умолчанию в качестве имени функция SetTLine() ставит время открытия текущего бара. В Вашем случае, это приводило к тому, что сколько бы Вы ни вызывали функцию SetTLine(), каждый раз создаётся объект с одним и тем же именем, то есть ОДИН объект ЛИНИЯ.

Я переделал Ваш код. Смотрите вложение. Ну и для примера того, что Ваш код рисует, картинка

  


Ясно, спасибо.

 

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

Скажу сразу БОЛЬШОЕ СПАСИБО за Вашу работу . С Вашего сайта Я скачал 2 файла((ByMarketBuy(Sell) + e-SARTrailing ) для постройки системы для торговли . Я бросаю скрипт ByMarketBuy(Sell) на пару EUR/USD на 1 экран Зарание прописав MAGIC 30  для одного ордера и MAGIC 60 для другого ордера(соответственно М30 и Н1) , а на 2  и 3 экране стоит советник e-SARTrailing  с настройками SAR.TF=30 и 60 соответственно. И так как два ордера открыты по одной валютной паре значит они идут сонаправленно и получается ,что без MagicNumber советники e-SARTrailing на двух экранах будут конфликтовать друг с другом. У меня к Вам ОГРОМНАЯ ПРОСЬБА могли бы ВЫ  подправить советник(дописать) такую функцию как MagicNumber возможно такое дополнение оценили бы многие. И получится ,что этот советник сможет работать на всех таймфреймах одновременно без конфликтов между собой не зависемо от сонаправленности. 

  Заранее Благодарен !

 
tim-time:

У меня к Вам ОГРОМНАЯ ПРОСЬБА могли бы ВЫ  подправить советник(дописать) такую функцию как MagicNumber.

Благодарю за подсказку. Добавил фильтр по магикам...
 

Функция GetTimeOpenBar().

Эта функция возвращает время открытия бара произвольного символа и произвольного таймфрейма. В общем-то, это просто комбинация базовых функций iBarShift() и iTime(). Поэтому ничего нового тут нет и применение того или иного варианта - вопрос удобства. В функцию можно передать следующие необязательные параметры:

  • sy - Наименование торгового инструмента (символа). Значения "" и NULL означают текущий символ. Значение по умолчанию - "".
  • tf - Таймфрейм. Значение по умолчанию - 0 - текущий таймфрейм.
  • dt - Дата и время. Значение по умолчанию - 0 - текущее время.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.01.2012                                                     |
//|  Описание : Возвращает время открытия бара.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий)                 |
//|    dt - дата/время                 (    0       - текущее)                 |
//+----------------------------------------------------------------------------+
datetime GetTimeOpenBar(string sy="", int tf=0, int dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf==0) tf=Period();
  if (dt==0) dt=TimeCurrent();
  
  int sh=iBarShift(sy, tf, dt, False);

  return(iTime(sy, tf, sh));
}

 
KimIV:
Благодарю за подсказку. Добавил фильтр по магикам...

  ЗДРАВСТВУЙТЕ!

ОГО !!! ВОТ ЭТО ТЕМП !!! (Сам такой делаю или сразу говорю НЕТ)

С ОГРОМНЫМ УВАЖЕНИЕМ ОТНОШУСЬ К ПРОФЕССИОНАЛОМ! (Профессионал должен знать все мельчайшие детали+упорный труд по своему направлению и естественно ОПЫТ который накапливается с Годами).

Я занимаюсь встроенной мебелью уже 4 пятилетку и 1 пятилетку заканчиваю трейдинга на форекс(упорный труд+Опыт удачных и не удачных моментов в торговле, остаётся узнать МАКСИМУМ мельчайших деталий ).

МОЯ  ЦЕЛЬ СТАТЬ ПРОФЕССИОНАЛОМ В ТРЕЙДИНГЕ.

БЛАГОДАРЮ ВАС ЗА ПОМОЩЬ!

С УВАЖЕНИЕМ! 

 

Скомпоновал функцию ErrorRU(), возвращающую краткое или подробное русскоязычное описание ошибки по её коду. Опознаются как ошибки, возвращаемые торговым сервером, так ошибки выполнения MQL-программ. Не для всех, правда, ошибок есть подробное описание с рекомендациями "Что делать", но что уж есть.

Функцию публикую в составе скрипта для её тестирования.

Если кому-то нужна вариация в виде MQH-файла, то берите с моего сайта

Файлы:
 

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

 Скажите пожалуйста есть ли возможность дописать PUSH-уведомления в ВАШ советник  e-SignalOfTrade ?

 https://www.mql5.com/ru/forum/6960

 https://www.mql5.com/ru/docs/common/sendnotification 

(Арендованный VPS сервер отказывается  дать данные SMTP-сервера которые нужно указать в настройках почты МТ4 для работы советника с включением функции UseSendMail=True - Электронная почта. ) 

   Заранее Благодарен !