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

 
xrust писал (а) >>
Еще вопрос, не будете ли вы против если я в своих функциях буду применять, синтаксис, и названия переменных как у Вас, что бы так сказать стандартизировать.

Делайте то, что считаете нужным.

 

Функция SetLabel().

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

  • nm - Наименование объекта. Обязательный параметр.
  • tx - Текст. Обязательный параметр.
  • cl - Цвет метки. Обязательный параметр.
  • xd - Координата X в пикселах относительно угла привязки. Обязательный параметр.
  • yd - Координата Y в пикселах относительно угла привязки. Обязательный параметр.
  • cr - Номер угла привязки. Допустимые значения: 0-левый верхний угол, 1-правый верхний, 2-левый нижний, 3-правый нижний. Значение по умолчанию - 0.
  • fs - Размер шрифта. Значение по умолчанию - 9.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
 

Примеры использования функции SetLabel().

  • Три синие текстовые метки в левом верхнем углу, шрифт 9.
    SetLabel("Label1", "Текстовая метка", Blue, 5, 15);
    SetLabel("Label2", "Ещё одна текстовая метка", Blue, 5, 30);
    SetLabel("Label3", "Параметр cr=0", Blue, 5, 45);

  • Три сиреневые текстовые метки в правом верхнем углу, шрифт 12.
    SetLabel("Label1", "Текстовая метка", Magenta, 5, 15, 1, 12);
    SetLabel("Label2", "Ещё одна текстовая метка", Magenta, 5, 30, 1, 12);
    SetLabel("Label3", "Параметр cr=1", Magenta, 5, 45, 1, 12);

  • Три зелёные текстовые метки в правом нижнем углу, шрифт 12.
    SetLabel("Label1", "Текстовая метка", Green, 5, 15, 3, 12);
    SetLabel("Label2", "Ещё одна текстовая метка", Green, 5, 30, 3, 12);
    SetLabel("Label3", "Параметр cr=3", Green, 5, 45, 3, 12);


ЗЫ. Во вложении скрипт для тестирования функции SetLabel().

Файлы:
 
SergNF писал (а) >>

Создать файл-"инклудник" (mqh) (наверное 2 - "торговые" и "прочие"), договориться о его названии и заставить "разработчиков" включать его в дистрибутив.

Мысль убить нельзя, дело идет к консолидации уже давно. Моя мечта как непрофессионала - оставить рядовому пользователю только принятие решений, освободив его от программных тонкостей.

Разработки Игоря (потрясающие по последовательности и детализации) подошли к этому максимально близко. Тем более автор не только программирует, но и постоянно держит свои 

советники на реале, что умножает практическую ценность кода.

Хотелось бы услышать мнение Игоря по поводу возможности mqh-оформления его разработок, достоинств и недостатков такой реализации.

 
granit77 писал (а) >>
Хотелось бы услышать мнение Игоря по поводу возможности mqh-оформления его разработок, достоинств и недостатков такой реализации.

пра вазможности...

MQH-файлы у меня уже давно сделаны... Пока не выкладываю... Типа туз в рукаве... Завершающий аккорд будет... Выложу все функции и подведу итог выкладыванием mqh-файлов.

пра дастоинства и нидастатки...

MQH-файлы - это удобно. Можно использовать в разных советниках. Код конкретного советника существенно сокращается. Остаётся только голимая логика и ещё кое-что, а всё навороты и обвёртки снаружи лежат.

Но я mqh-файлами пользуюсь редко, и в основном только одним. Это stdlib.mqh. А все необходимые функции копипастю в файл советника. Мне так удобнее. Привычкой такой обзавёлся, когда писал много на заказ и часто забывал заказчику выслать тот или иной mqh-файл. Да и самому мне удобнее копировать в разные папки терминалов один файл советника, и не тащить за ним целый ворох инклудников.

 
Это не просто радует! Это восхищает! Не за горами день, когда без такой библиотеки дистрибутив будет считаться некомплектным.
 

Может у Вас, в полезных функциях, есть скрипт который смог бы выполнять открытие ордеров описанной в статье http://www.kroufr.ru/content/view/1027/124/.

Вручную занимает много времени.Если нет,то посоветуйте где найти.спасибо. .

 

Функция CrossPointOfLines().

Эта функция вычисляет координаты точки пересечения двух прямых. Каждая прямая задаётся парой координат своих точек. В функцию в качестве параметров передаются три массива:

  • x - Массив абсцисс. Должен содержать четыре элемента: x[0], x[1] - абсциссы первой прямой, x[2], x[3] - абсциссы второй прямой.
  • y - Массив ординат. Должен содержать четыре элемента: y[0], y[1] - ординаты первой прямой, y[0], y[1] - ординаты второй прямой.
  • t - Массив координат искомой точки пересечения двух прямых. После нормального исполнения функции данный массив будет содержать два элемента: t[0] - абсцисса искомой точки пересечения двух прямых и t[1] - ордината этой же точки.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Вычисляет координаты точки пересечения двух прямых.            |
//|             Каждая прямая задаётся парой координат своих точек.            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    x - массив абсцисс              x[0], x[1] - первая прямая              |
//|                                    x[2], x[3] - вторая прямая              |
//|    y - массив ординат              y[0], y[1] - первая прямая              |
//|                                    y[0], y[1] - вторая прямая              |
//|    t - массив искомых координат    t[0]       - абсцисса                   |
//|                                    t[1]       - ордината                   |
//+----------------------------------------------------------------------------+
void CrossPointOfLines(double& x[], double& y[], double& t[]) {
  double z=(y[3]-y[2])*(x[1]-x[0])-(y[1]-y[0])*(x[3]-x[2]);
  ArrayResize(t, 2);
  ArrayInitialize(t, 0.0);

  if (z==0) Print("CrossPointOfLines(): Не удалось найти точку пересечения!");
  else {
    double xy1=x[1]*y[0]-x[0]*y[1];
    double xy2=x[3]*y[2]-x[2]*y[3];
    t[0]=NormalizeDouble((xy1*(x[3]-x[2])-xy2*(x[1]-x[0]))/z, 0);
    t[1]=(xy1*(y[3]-y[2])-xy2*(y[1]-y[0]))/z;
  }
}
 

Пример использования функции CrossPointOfLines().

В качестве примера использования функции CrossPointOfLines() я традиционно предлагаю свой скрипт (см. вложение). Чтобы скрипт правильно отработал, нужно на текущем графике нарисовать две пересекающиеся прямые, любого из следующих типов: вертикальная, горизонтальная, трендовая. А потом набросить на график скрипт. Результатом работы скрипта будет левая ценовая метка в точке пересечения двух прямых.

ЗЫ. Во вложении скрипт для тестирования функции CrossPointOfLines().

Файлы:
 

Функция SetRegression().

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

  • cl - Цвет объекта. Обязательный параметр.
  • nm - Наименование объекта. При передаче умолчательного значения - "" в качестве имени используется время открытия текущего бара.
  • t1 - Первая координата времени установки объекта. Значение по умолчанию - 0 - время открытия десятого бара.
  • t2 - Вторая координата времени установки объекта. Значение по умолчанию - 0 - время открытия текущего бара.
  • ry - Флаг свойства ЛУЧ. Значение по умолчанию False.
  • st - Стиль линии. Допустимые значения STYLE_SOLID (по умолчанию), STYLE_DASH, STYLE_DOT, STYLE_DASHDOT, STYLE_DASHDOTDOT.
  • wd - Толщина линии. Значение по умолчанию - 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_REGRESSION канал линейной регрессии.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ( ""   - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10])                      |
//|    t2 - время открытия бара        (  0   - Time[0])                       |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetRegression(color cl, string nm="", datetime t1=0, datetime t2=0,
                    bool ry=False, int st=STYLE_SOLID, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (t2<=0) t2=Time[0];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_REGRESSION, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1, t1);
  ObjectSet(nm, OBJPROP_TIME2, t2);
  ObjectSet(nm, OBJPROP_COLOR, cl);
  ObjectSet(nm, OBJPROP_RAY  , ry);
  ObjectSet(nm, OBJPROP_STYLE, st);
  ObjectSet(nm, OBJPROP_WIDTH, wd);
}
Причина обращения: