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

TheXpert
18324
TheXpert  
KimIV >>:

Функция IIFc().

...

Попытка сделать отсутствующий тернарный оператор?

Зачот, спасибо, с моей привычкой ставить фигурные скобки везде, где можно, будет очень полезно.

Igor Kim
2729
Igor Kim  
CMEPTHiK писал (а) >>
Читал книгу В.Якимкин. "Рынок форекс - ваш путь к успеху" и наткнулся на такие строчки "...дифференциал от (DJI x Nikkei)..." Подскажите Игорь это возможно реализовать и вывести в форме индикатора...

Дифференциал - это скорость, которую показывает индикатор ROC.

Aleksandr Volotko
15160
Aleksandr Volotko  

Игорь, а не завалялась ли часом у Вас в закромах функция закрытия всех позиций разом, в том числе закрытия с учетом наличия встречных позиций?

Т.е. чтобы закрывала сначала все встречные, на сколько это возможно, с учетом несоответствия лотов встречных позиций, потом убыточные, профитные..

Igor Kim
2729
Igor Kim  
alexx_v писал(а) >>

Игорь, а не завалялась ли часом у Вас в закромах функция закрытия всех позиций разом, в том числе закрытия с учетом наличия встречных позиций?

Т.е. чтобы закрывала сначала все встречные, на сколько это возможно, с учетом несоответствия лотов встречных позиций, потом убыточные, профитные..

Нет, пока такой нету...

Igor Kim
2729
Igor Kim  

Функция ExistInHistoryCloseBetween().

Возвращает флаг существования в истории позиции или ордера, закрытой (удалённого) между датами. Функция ExistInHistoryCloseBetween() принимает следующие параметры:

  • sy - Наименование рыночного инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию "".
  • op - Торговая операция. Допустимые значения: -1, OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP. Значение по умолчанию -1 - любая операция.
  • mn - Идентификатор торговых операций, MagicNumber. Значение по умолчанию -1 - любой магик.
  • d1 - Время закрытия позиции (удаления отложенного отреда). Значение по умолчанию - 0 - любое время закрытия (удаления). Время d1 должно быть меньше времени d2.
  • d2 - Время закрытия позиции (удаления отложенного отреда). Значение по умолчанию - 0 - любое время закрытия (удаления). Время d2 должно быть больше времени d1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.08.2008                                                     |
//|  Описание : Возвращает флаг существования в истории позиции или ордера,    |
//|           : закрытой (удалённого) между датами.                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая операция)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    d1 - время закрытия             ( 0   - любое время закрытия)           |
//|    d2 - время закрытия             ( 0   - любое время закрытия)           |
//+----------------------------------------------------------------------------+
bool ExistInHistoryCloseBetween(string sy="", int op=-1, int mn=-1,
                                datetime d1=0, datetime d2=0) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (d1<=OrderCloseTime() && (d2==0 || d2>=OrderCloseTime())) return(True);
        }
      }
    }
  }
  return(False);
}
Igor Kim
2729
Igor Kim  

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

  1. Наличие закрытых вчера позиций или удалённых вчера ордеров любого типа с MagicNumber=0 по символу текущего графика.
    datetime d1=iTime(NULL, PERIOD_D1, 1);
    datetime d2=iTime(NULL, PERIOD_D1, 0)-1;
    Message(IIFs(ExistInHistoryCloseBetween(NULL, -1, -1, d1, d2), "Есть", "Нет"));
  2. Наличие любых позиций или ордеров закрытых (удалённых) за последние три часа.
    datetime d1=TimeCurrent()-3*60*60;
    Message(IIFs(ExistInHistoryCloseBetween("", -1, -1, d1), "Есть", "Нет"));
  3. Закрывалась ли покупка евры в течение последних 5-ти минут.
    datetime d1=TimeCurrent()-5*60;
    Message(IIFs(ExistInHistoryCloseBetween("EURUSD", OP_BUY, -1, d1), "Да", "Нет"));

P.S. Во вложении скрипт для тестирования функции ExistInHistoryCloseBetween().

Igor Kim
2729
Igor Kim  

Функция ExistInHistoryOpenBetween().

Возвращает флаг существования в истории позиции или ордера, открытой (установленного) между датами. Функция ExistInHistoryOpenBetween() принимает следующие параметры:

  • sy - Наименование инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию "".
  • op - Торговая операция. Допустимые значения: -1, OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP. Значение по умолчанию -1 - любая операция.
  • mn - Идентификатор торговых операций, MagicNumber. Значение по умолчанию -1 - любой магик.
  • d1 - Время открытия позиции (установки отложенного ордера). Значение по умолчанию - 0 - любое время открытия (установки). Время d1 должно быть меньше времени d2.
  • d2 - Время открытия позиции (установки отложенного ордера). Значение по умолчанию - 0 - любое время открытия (установки). Время d2 должно быть больше времени d1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 27.08.2008                                                     |
//|  Описание : Возвращает флаг существования в истории позиции или ордера,    |
//|           : открытой (установленного) между датами.                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    d1 - время открытия             ( 0   - любое время открытия)           |
//|    d2 - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistInHistoryOpenBetween(string sy="", int op=-1, int mn=-1,
                               datetime d1=0, datetime d2=0) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (d1<=OrderOpenTime() && (d2==0 || d2>=OrderOpenTime())) return(True);
        }
      }
    }
  }
  return(False);
}
Duke3D
53
Duke3D  

Доброго времени суток!

Игорь, не могли бы вы сказать как можно закрасить бар в нужный мне цвет.

Раскажу с начала. Пишу индикатор по зональной торговле - четвертое измерение рынка Б Вильямса. А там надо чтобы бары закрашивались либо в зелёный, либо в красный, либо в серый цвет.

Индикатор написал, вот что получилось:

Это не то что я хотел. Как сделать так чтобы бар закрашивался ровно посередине. В качестве способа закрашивания я использую прямоугольник с двумя координатами. Вот в этом и есть у меня вся проблема, как выбрать координаты начала и конца прямоугольника.

Подскажите пожадуйста.

Код индикатора прилогаю.

Файлы:
Igor Kim
2729
Igor Kim  
Duke3D писал(а) >>
Игорь, не могли бы вы сказать как можно закрасить бар в нужный мне цвет.
...
Как сделать так чтобы бар закрашивался ровно посередине.

Посмотрите индикатор Heiken Ashi. Его исходник есть в составе MetaTrader 4.

Igor Kim
2729
Igor Kim  

Функция ExistInHistoryToDay().

Возвращает флаг существования в истории позиции или ордера, открытой (установленного) сегодня. Функция ExistInHistoryToDay() принимает следующие параметры:

  • sy - Наименование инструмента. "" - любой символ, NULL - текущий символ. Значение по умолчанию "".
  • op - Торговая операция. Допустимые значения: -1, OP_BUY, OP_SELL, OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP. Значение по умолчанию -1 - любая операция.
  • mn - Идентификатор торговых операций, MagicNumber. Значение по умолчанию -1 - любой магик.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.08.2008                                                     |
//|  Описание : Возвращает флаг наличия ордера или позиции в истории за сегодня|
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool ExistInHistoryToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (op<0 || OrderType()==op) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (TimeDay  (OrderOpenTime())==Day()
            &&  TimeMonth(OrderOpenTime())==Month()
            &&  TimeYear (OrderOpenTime())==Year()) return(True);
          }
        }
      }
    }
  }
  return(False);
}