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

 

Здравствуйте, Андрей!

  1. Для цены открытия на данный момент уже есть три функции:
    • ExistPosByPrice() - Существование позиций по цене открытия.
    • PriceOpenLastPos() - Цена открытия последней открытой позиций.
    • PriceOpenNearPos() - Цена открытия ближайшей позиции.
  2. Для тикетов тоже есть функции. Их две:
    • GetTicketLastPos() - Тикет последней открытой позиции или -1.
    • TicketNearPos() - Тикет ближайшей к рынку позиции по цене открытия или 0.
В этих функциях, Андрей, есть всё, что Вам нужно, кроме отбора по размеру лота. Сделаю в ближайшее время другие функции, в которых цену открытия и тикет можно будет получать по размеру лота.

 
KimIV:

Здравствуйте, Андрей!

  1. Для цены открытия на данный момент уже есть три функции:
    • ExistPosByPrice() - Существование позиций по цене открытия.
    • PriceOpenLastPos() - Цена открытия последней открытой позиций.
    • PriceOpenNearPos() - Цена открытия ближайшей позиции.
  2. Для тикетов тоже есть функции. Их две:
    • GetTicketLastPos() - Тикет последней открытой позиции или -1.
    • TicketNearPos() - Тикет ближайшей к рынку позиции по цене открытия или 0.
В этих функциях, Андрей, есть всё, что Вам нужно, кроме отбора по размеру лота. Сделаю в ближайшее время другие функции, в которых цену открытия и тикет можно будет получать по размеру лота.
     Возможно они являются для меня избыточными и приходится избавляться от лишних условий, таких как:   цена открытия ближайшей позиции,   последней открытой,  ближайшей к рынку. И не всегда это получается корректно. К тому же в сравнении правильных вариантов быстрее придёт понимание всех этих премудростей. Спасибо буду ждать.  
 

Функция GetOpenPriceByLot().

Эта функция возвращает цену открытия позиции или ордера по размеру лота. Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции или ордера. Допустимые значения: OP_BUYOP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 означает любую торговую операцию.
  • mn - Идентификатор позиции или ордера, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
  • lo - Лот. Значение по умолчанию 0 означает любой лот.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.03.2013                                                     |
//|  Описание : Возвращает цену открытия позиции или ордера по размеру лота.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая операция)                 |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//|    lo - лот                        (  0  - любой лот)                      |
//+----------------------------------------------------------------------------+
double GetOpenPriceByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((op<0 || OrderType()==op) && OrderType()<6) {
          if (lo==0 || lo==NormalizeLot(OrderLots())) p=OrderOpenPrice();
        }
      }
    }
  }
  return(p);
}
ЗЫ. Во вложении скрипт для тестирования функции GetOpenPriceByLot().
Файлы:
 

Функция GetTicketByLot().

Эта функция возвращает тикет позиции или ордера по размеру лота. Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции или ордера. Допустимые значения: OP_BUYOP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP или -1. Значение по умолчанию -1 означает любую торговую операцию.
  • mn - Идентификатор позиции или ордера, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
  • lo - Лот. Значение по умолчанию 0 означает любой лот. 
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.03.2013                                                     |
//|  Описание : Возвращает тикет позиции или ордера по размеру лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая операция)                 |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//|    lo - лот                        (  0  - любой лот)                      |
//+----------------------------------------------------------------------------+
int GetTicketByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), t;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
        if ((op<0 || OrderType()==op) && OrderType()<6) {
          if (lo==0 || lo==NormalizeLot(OrderLots())) t=OrderTicket();
        }
      }
    }
  }
  return(t);
}

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


Файлы:
 

Здравствуйте, Игорь!

Спасибо Вам большое за новые функции и что всё так оперативно. Очень всё замечательно. Функция возвращает,  например тиккет  ордера по условиям, которые можно задать внешними переменными или можно их не использовать. Мне немного не понятна вот эта строка:

                                                         if ((op<0 || OrderType()==op) && (OrderType()>1 && OrderType()<6)) 

здесь идёт проверка условия оператора if, то есть  если внешняя переменная <0 , то доступен любой тип ордера ИЛИ если в вызове функции пишем, например  OP_BUY , то выбор будет идти из ордеров  типа  OP_BUY. С этим условием понятно, а вот дальше идёт равнозначное условие, прописанное через   && в котором говорится, что  OrderType() должен находиться в диапазоне отложенных ордеров, то есть от 1 до 5. Наш тип OP_BUY не входит в этот диапазон и поэтому условие оператора должно быть ложным и управление должно перейти  оператору, следующему за оператором if-else, то есть мне трудно сказать куда, куда-то за фигурную стрелку тела. Мне кажется, что здесь должно прописываться условие для функции рыночных ордеров и отдельной  такой же функции отложенных ордеров. То есть если я хочу сделать выбор из рыночных ордеров и не знаю его  точный тип, то  беру  внешнюю переменную <0, но обращаюсь к функции, в которой прописаны условия от 0 до 1. Аналогично для отложенных ордеров. То есть я пришел к выводу, что для каждой категории типов ордеров при использовании этого полезного  условия нужно использовать свою функцию.

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

Мне немного не понятна вот эта строка:

                                                         if ((op<0 || OrderType()==op) && (OrderType()>1 && OrderType()<6)) 

Благодарю! Исправил... Это последствия копипаста, то есть использования заготовки другой функции, предназначенной для работы только с лимитными и стоповыми ордерами

00007:

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

Я, кстати, свои библиотеки в виде файлов MQH не использую. В советник я обычно копирую нужные мне функции, то есть мой обычный готовый советник представляет собой один MQ4-файл. Всё нужное внутри этого файла. Да, есть повторяемость кода. Но зато нет проблем с версиями функций.

 

     Я тоже кстати уже заметил, что у Вас для каждой функции идут скрипты для тестов, а в них есть все нужные  дополнительные функции , которые можно просто добавить в свой  советник вместе с функцией и будет всё в одном файле и ничего лишнего. Функции получились простые и полезные, но для себя я с Вашего разрешения сделаю их четыре: две для отложек и две для позицый. Они получатся более универсальными как раз для тонких потребностей моего советника. Но теперь я вижу как просто это можно сделать. Спасибо Вам большое Игорь.

С уважением Андрей. 

 

Функция TimeOpenFirstPos().

Эта функция возвращает время открытия первой открытой позиций. Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUYOP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.01.2012                                                     |
//|  Описание : Возвращает время открытия первой открытой позиций.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime TimeOpenFirstPos(string sy="", int op=-1, int mn=-1) {
  datetime t=TimeCurrent();
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t>OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(t);
}
Использование функции аналогично TimeOpenLastPos()
 

Здраствуйте

Как на ваш SetRegression() (https://www.mql5.com/ru/forum/107476/page35 ) канал добавить фибу.

 

 
gince:

Здраствуйте

Как на ваш SetRegression() (https://www.mql5.com/ru/forum/107476/page35 ) канал добавить фибу. 

Дак, легко:

  1. Задаёте первую точку фибо-линии (вычисляете, откуда надо).
  2. Принимаете решение, на каком баре получить вторую точку.
  3. Потом с помощью функции EquationDirect() получаете цену.
  4. Имея координаты двух точек, проводите через них прямую с помощью функции SetTLine().