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

 
KimIV:
khorosh:
в функции bool idPriceLevel(), входящей в советник e-TFL_v2 есть ошибка: в последнем по тексту условии дважды повторяется gdUpPrice==0, наверно, во втором случае Вы хотели написать gdDnPrice==0.

Благодарю! Исправленную версию советника e-TFL_v2 залил на сайт.


khorosh:
Почему то это советник работает у меня в тестере в визуальном режиме, но на демо-счёте позиции не открывает, хотя в комментариях сообщает об уровнях продажи и покупки. Может подскажете в чём дело.

Не знаю... этот советник я только-что закончил тестировать на демо НортФинанс. Вчера звонил знакомый из Москвы. Пожаловался на этот же советник. Мол он открывает позицию от линии, а потом ещё, и ещё, пока его не остановишь, может много поз наоткрывать. Поэтому целей проверки было две:

1. По Вашему вопросу. Проверка общей работоспособности.

2. По вопросу моего знакомого. Открытие от одной линии только одной позиции.

Для проверки я поставил советник e-TFL_v2 на 5-ти минутные ТФ EURUSD, GBPUSD, USDCHF и USDJPY. Трендовыми линиями нарисовал каналы по последним 20-30 барам. В результате советник отработал, как и должен был. Евра была куплена от нижней линии, а йена продана от верхней. По фунту и чифу тоже всё правильно было отработано. Так что проверяйте у себя. Советник рабочий.

KimIV:
khorosh:
в функции bool idPriceLevel(), входящей в советник e-TFL_v2 есть ошибка: в последнем по тексту условии дважды повторяется gdUpPrice==0, наверно, во втором случае Вы хотели написать gdDnPrice==0.

Благодарю! Исправленную версию советника e-TFL_v2 залил на сайт.


khorosh:
Почему то это советник работает у меня в тестере в визуальном режиме, но на демо-счёте позиции не открывает, хотя в комментариях сообщает об уровнях продажи и покупки. Может подскажете в чём дело.

Не знаю... этот советник я только-что закончил тестировать на демо НортФинанс. Вчера звонил знакомый из Москвы. Пожаловался на этот же советник. Мол он открывает позицию от линии, а потом ещё, и ещё, пока его не остановишь, может много поз наоткрывать. Поэтому целей проверки было две:

1. По Вашему вопросу. Проверка общей работоспособности.

2. По вопросу моего знакомого. Открытие от одной линии только одной позиции.

Для проверки я поставил советник e-TFL_v2 на 5-ти минутные ТФ EURUSD, GBPUSD, USDCHF и USDJPY. Трендовыми линиями нарисовал каналы по последним 20-30 барам. В результате советник отработал, как и должен был. Евра была куплена от нижней линии, а йена продана от верхней. По фунту и чифу тоже всё правильно было отработано. Так что проверяйте у себя. Советник рабочий.

Я может не совсем понял логику советника, но мне кажется, если используется одна линия, то условие, в котором была ошибка, выполнится и функция idPriceLevel() примет значение False, а это не позволит открыть позицию. Поясните,если я не прав.

 
khorosh:

если используется одна линия, то условие, в котором была ошибка, выполнится и функция idPriceLevel() примет значение False, а это не позволит открыть позицию.

Да, всё верно. Советнику для нормальной работы нужны две линии: одна выше цены, а вторая - ниже текущей цены. На сайте описание я поправил. Спасибо!

 
KimIV:
khorosh:

если используется одна линия, то условие, в котором была ошибка, выполнится и функция idPriceLevel() примет значение False, а это не позволит открыть позицию.

Да, всё верно. Советнику для нормальной работы нужны две линии: одна выше цены, а вторая - ниже текущей цены. На сайте описание я поправил. Спасибо!

Вот поэтому у меня позиция не открывалась, так как я работал с одной линией. Теперь стало всё понятно. Спасибо за Ваш бескорыстный труд. Ваши функции сделаны очень чётко и ясно описаны. Наверно в большинстве, создаваемых в настоящее время советников, теперь используются Ваши функции.

 

Функция ExistOPNearMarket().

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

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

  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if ((OrderSymbol()==sy) && (op<0 || ot==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP) {
            if (MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) return(True);
          }
          if (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
            if (MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) return(True);
          }
        }
      }
    }
  }
  return(False);
}
ЗЫ. В прицепе скрипт для экспериментов с функцией ExistOPNearMarket().
Файлы:
 

Функция ExistPosByPrice().

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

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. Значение по умолчанию "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
  • pp - Цена открытия позиции. Значение по умолчанию 0 означает любую цену.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг существования позиций по цене открытия         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pp - цена                       ( 0   - любая цена)                     |
//+----------------------------------------------------------------------------+
bool ExistPosByPrice(string sy="", int op=-1, int mn=-1, double pp=0) {
  double px, py;
  int    d, 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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            d=MarketInfo(OrderSymbol(), MODE_DIGITS);
            px=NormalizeDouble(pp, d);
            py=NormalizeDouble(OrderOpenPrice(), d);
            if (pp<=0 || px==py) return(True);
          }
        }
      }
    }
  }
  return(False);
}
ЗЫ. В прицепе скрипт для тестирования функции ExistPosByPrice().
Файлы:
 

Функция GetAmountLotFromOpenPos().

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

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает сумму лотов открытых позиций                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=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=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              l+=OrderLots();
            }
          }
        }
      }
    }
  }
  return(l);
}
ЗЫ. В аттаче скрипт для тестирования функции GetAmountLotFromOpenPos().
 

Функция GetIndexByTicket().

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

  • ti - Тикет ордера, позиции. Значение данного параметра не может быть пустым или нулевым.
  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип ордера или позиции. Допустимые значения: OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает индекс ордера или позиции по тикету.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ti - тикет ордера, позиции                                              |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetIndexByTicket(int ti, string sy="", int op=-1, int mn=-1) {
  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=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTicket()==ti) return(i);
      }
    }
  }
  return(-1);
}
PS. Во вложении скрипт для тестирования функции GetIndexByTicket().
Файлы:
 

Здравствуй

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

 
scorpionk:

Здравствуй

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

нет... но у меня есть интерес к этой теме. Если Вы предоставите формулы расчёта корреляции, то я напишу функцию.


ЗЫ. Сам искать формулы я не буду. По ссылкам с материалами тоже не пойду. То есть у меня нет желания разбираться в теме. Есть только желание по готовым формулам написать функцию.

 
KimIV:
scorpionk:

Здравствуй

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

нет... но у меня есть интерес к этой теме. Если Вы предоставите формулы расчёта корреляции, то я напишу функцию.


ЗЫ. Сам искать формулы я не буду. По ссылкам с материалами тоже не пойду. То есть у меня нет желания разбираться в теме. Есть только желание по готовым формулам написать функцию.


Формула корреляции

Причина обращения: