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

 
KimIV:
B_Dima:
если значение CCI стало больше 100 то открывать позицию на покупку до того момента пока значение не станет меньше -100, а когда станет меньше -100 открывать продажи до момента пока не станет больше 100.

Вам, Дима, я могу предложить такую вот функцию:

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

Эта функция возвращает 1, когда нужно покупать и -1, когда нужно продавать. Условия покупки/продажи соответствуют Вашим пожеланиям. Вам теперь нужно всего лишь на каждом тике выполнять следующее:

1. Получать значение функции GetTradeSignal().

2. Если полученное значение ==0, то ничего не делать.

3. Если полученное значение >0, то закрывать все продажи и покупать.

4. Если полученное значение <0, то закрывать все покупки и продавать.

:))) конечно спасибо за помощь, но моя ошибка, я не достаточно точно объяснил, индикатор CCI с интервалом в 50 показывает направление и смену тренда, а открытие происходит при касании ценой EMA 8, а также используется стоп-лосс и тейк-профит и другие индикаторы для определения коррекции. Картина такая, когда CCI пробивает +100 открытие позиции на покупку происходит при касании ЕMA и не важно где находится CCI (+10 или-20), главное, что при пересечении -100 начинаются продажи. За промежуток времени между CCI>=+100 и CCI<=-100 может пройти 100 свечек и открыто 10 и более позиций. Надеюсь понятно. Если сможете подсказать буду рад.

 
B_Dima писал (а):
моя ошибка, я не достаточно точно объяснил,

Ну что ж... Ваша ошибка - Вам и исправлять :-)

Направление я Вам указал точное. К цели оно приведёт. Так что дерзайте...

 
KimIV:

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

Самыми первыми я решил дать примеры, о которых меня уже спрашивали неоднократно. Это открытие позиций в условиях рыночного исполнения торговых заявок Market Watch. Это когда нельзя одновременно отдать приказ на открытие позиции по рыночной цене и прикрепить к ней отложенный ордер. Такое открытие в условиях Market Watch нужно выполнять в два этапа: сначала открывать позицию, а потом прикреплять к ней отложенные ордера, то есть устанавливать ценовые уровни StopLoss и TakeProfit.

1. Купить 0.1 лота текущего инструмента и установить стоп 30 пунктов

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Продать 0.15 лота текущего инструмента и установить SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
В прицепе работающий скрипт с примерами.


Игорь, пожалуйста, проверьте еще раз - скрипт не работает:

1) В обычных ДЦ нет ограничения по количеству открытых ордеров (бесконечно открывается)

2) В ДЦ, у которых ордера открываются по маркету - (Error131). Можете протестировать, например у НортФинанс.

 

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


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

 
Set777 писал (а):
Игорь, пожалуйста, проверьте еще раз - скрипт не работает:
1) В обычных ДЦ нет ограничения по количеству открытых ордеров (бесконечно открывается)
2) В ДЦ, у которых ордера открываются по маркету - (Error131). Можете протестировать, например у НортФинанс.

1. В скрипте нет проверки на количество открытых позиций. Сколько раз Вы запустите скрипт, столько позиций он и откроет.

2. Ошибка 131 - Неправильный объём, размер лота. Возможно, дело в числе 0.15. Замените его на 0.2

 
kharko писал (а):
Столько полезных функций выложили...

Ещё даже одной пятой части не выложил из того, что задумал... Я тут до осени буду всем надоедать. Так что терпите...

kharko писал (а):
Может есть желание написать некий шаблон для написания торгующего советника, который сможет открывать и закрывать отложенные ордера, позиции, выставлять тейк и стоплос, модифицировать ордера и позиции, в зависимости от заданных пользователем условий...
шаблон... шаблон... Хорошая мысль! Спасибо! Но сначала функции...
 

Функция DistMarketAndPos().

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

  • 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      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  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)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
 

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

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

  1. Купили или продали. Рынок пошёл в нашу сторону. И как только он проходит некоторое расстояние, существующие позиции набрали определённую прибыль, так сразу же делаем доливку - входим ещё раз в ту же сторону.
  2. Купили или продали. Рынок пошёл в нашу сторону. И как только он проходит некоторое расстояние, а существующие позиции набрали определённую прибыль, так сразу же мы понимаем, что всё! Разворот близок! Пора переворачиваться. Закрываем текущие позиции и открываемся в противоположную сторону.
  3. Купили или продали. Рынок пошёл против нас. Но мы почему-то уверены в своей правоте и на некотором расстоянии от точки ближайшего входа, то есть на некотором уровне убытка усредняемся - открываемся в ту же сторону.
  4. Купили или продали. Рынок пошёл против нас. И мы поняли, что со входом вышла ошибочка. Поэтому фиксируемся на определённом уровне убытка и открываемся в другую сторону.

ЗЫ. Если кому-то нужна конкретная реализация любого из перечисленных вариантов, пишите сюда заявки. Выполню все пожелания в рамках того, что я перечислил выше.

ЗЫ-ЗЫ. В прицепе скрипт-заготовка для экспериментирования с функцией DistMarketAndPos().

Файлы:
 
Уважаемый KimIV, в функции bool idPriceLevel(), входящей в Ваш советник e-TFL_v2 есть ошибка: в последнем по тексту условии дважды повторяется gdUpPrice==0, наверно, во втором случае Вы хотели написать gdDnPrice==0. Почему то это советник работает у меня в тестере в визуальном режиме, но на демо-счёте позиции не открывает, хотя в комментариях сообщает об уровнях продажи и покупки. Может подскажете в чём дело.
 
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 барам. В результате советник отработал, как и должен был. Евра была куплена от нижней линии, а йена продана от верхней. По фунту и чифу тоже всё правильно было отработано. Так что проверяйте у себя. Советник рабочий.