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

 

Привет!

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

Недавно реализовал интересный подход выявления тренда в индикаторе, сравнивая значение открытий свечей на промежутке, считаю процент ушедших вверх и опустившихся вниз.

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

Для реализации алгоритма открытия пробовал задать советнику время. Но в 12:00 открылось 100 сделок. На каждом тике... А мне нужна одна за свечу на любом таймфрейме. Вторая попытка был более успешной. Открывал по объему, если он равен единице, то открытие. Работал лучше, но на четырехчасовке бывает не открывается вообще. Полагаю, тогда, когда между первым и вторым тиком экстремально короткий промежуток.

Теперь вопрос.

Как реализовать вход в рынок на открытии свечи, так чтобы:

  1. За таймфрем открывалась одна свеча,
  2. Гарантировано было открытие хотя бы одной свечи?

Спасибо, ребята! Если кому помощь нужна в чем-то, обращайтесь, пожалуйста! Я, кстати, бесплатные сайты для портфолио делаю. Без движка. На основе Microsoft Publisher, но, при этом, я - копирайтер, так что наполняю сайт тоже бесплатно! Сроки не выдерживаю, сами понимаете, это не основное занятие, но стараюсь выполнить все просьбы. Так что, кому надо, может знакомым, там - обращайтесь, пожалуйста!


30.01.2014 23:29

Очень хороший вариант предложил уважаемый Алексей (tara) Рейтинг: 5149.
По ссылке рассказывается о хитром счетчике, который пуст до тех пор, пока ордер не открыт, а как только это произошло, переменной присваивается значение времени свечи. Далее, проводится проверка: если счетчик больше или равен времени свечи, то советник отключается.
Нужно упомянуть, что проверку надо размещать в конце кода, иначе, ничего хорошего не выйдет, и советник не выполнит все операции. Не нужно забывать, что переменную придется объявить, строкой "datetime переменная;".

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

 
Просто замечательно, если у тебя готовый советник. Но в моём случае этого недостаточно. Так как если робот, как у меня, в разработке, то, периодически, он отключается для внесения изменений, а сделки болтаются открытыми. Выходит, что подключенный отлаженный советник откроет ещё одну, так как не видит, тех, что "идут в рост". Мой вариант с открытием по объему выглядит хоть и не таким же изящным, но, вполне, конкурентоспособным.
 
cichiniov:
Просто замечательно, если у тебя готовый советник. Но в моём случае этого недостаточно. Так как если робот, как у меня в разработке, то, периодически, он отключается для внесения изменений, а сделки болтаются открытыми. Выходит, что подключенный отлаженный советник откроет ещё одну, так как не видит, тех, что "идут в рост". Мой вариант с открытием по объему выглядит хоть и не таким же изящным, но, вполне, конкурентоспособным.
ВЫ принимаете наркотики?
 
зачем через время.. зачем через обьем.. а не просто ли считать и записать в переменную цену открытия бара..?
 
tara:
ВЫ принимаете наркотики?


Не, брат! Извини! Не чем порадовать! :)

Может, я не так выразился. Робота периодически нужно отключать для доработки. Это приводит к повторному открытию сделки при включении.

 
vlad6k:
зачем через время.. зачем через обьем.. а не просто ли считать и записать в переменную цену открытия бара..?

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

Правильней будет отслеживать ордера при каждом тике.

1. Записываешь цену открытого ордера и время на каждом тике.

2. Сравниваешь время с ременем открытия и принимаешь решение - открывать еще один ордер или нет.

Такой подход будет работать независимо от того когда запустился терминал, перезапустился и переконектился.

При открытии ордера необходимо ставить задержку скажем в 5 секунд. чтоб ордер однозначно открылся и засветился в терминале.

Если есь еще вопросы - отвечу, помогу закодить.

 
cichiniov:

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


Вариант

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(NumberOfBarOpenLastPos()!=0)  //если на 0 баре не открывались
      {
      // то открываемся
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}
 
dimeon:

Правильней будет отслеживать ордера при каждом тике.

1. Записываешь цену открытого ордера и время на каждом тике.

2. Сравниваешь время с ременем открытия и принимаешь решение - открывать еще один ордер или нет.

Такой подход будет работать независимо от того когда запустился терминал, перезапустился и переконектился.

При открытии ордера необходимо ставить задержку скажем в 5 секунд. чтоб ордер однозначно открылся и засветился в терминале.

Если есь еще вопросы - отвечу, помогу закодить.


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


Вариант


Этот вариант показал себя замечательно! Осталось решить только одну задачу. При отсутствии ордеров советник открывается не по открытию, а в момент включения...
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(NumberOfBarOpenLastPos()!=0)  //если на 0 баре не открывались
      {
      // то открываемся
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
Причина обращения: