Примеры: Управление ордерами – это просто

 

New article Управление ордерами – это просто has been published:

Статья описывает разнообразные способы контроля открытых позиций и отложенных ордеров и призвана облегчить написание экспертов.

Author: Andrey Khatimlianskii

 

Вау сколько кода! :)

 
njel:

Вау сколько кода! :)


И главное - весь работает! =)))
 

Здравствуйте!
У меня вопрос по функции пункта №3 Одна позиция одного типа.
Мне понятно, что если у меня ордера по двум магическим числам, то простое решение сделать две таких функции с magic1 и magic2.
Но мне необходимо это сделать в одной функции.
Если можно, покажите схематично.

С уважением, Вячеслав.

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

datetime GetLastOpenTime(int type) {
 
  datetime tm = -1;
 
  int cnt = OrdersTotal();
  for (int i=0; i<cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    
    if (OrderSymbol() != Symbol()) continue;
        
    if (OrderType() != type) continue;
    
    tm = MathMax(tm, OrderOpenTime());
  }
 
  cnt = HistoryTotal();
  for (i=0; i<cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
 
    if (OrderSymbol() != Symbol()) continue;
       
    if (OrderType() != type) continue;
    
    tm = MathMax(tm, OrderOpenTime());
  }
 
  return (tm);
}

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

С уважением, Вячеслав.

 
Vyacheslav:

Здравствуйте!
У меня вопрос по функции пункта №3 Одна позиция одного типа.
Мне понятно, что если у меня ордера по двум магическим числам, то простое решение сделать две таких функции с magic1 и magic2.
Но мне необходимо это сделать в одной функции.
Если можно, покажите схематично.

Есть 2 варианта:
- вызываем функцию OneTypeOrdersInit для magic1, обрабатываем первую часть ордеров, а потом вызываем её же с magic2, и обрабатываем 2-ю часть.
- копируем функцию OneTypeOrdersInit, переименовываем её и все переменные, объявленные на глобальном уровне, и вызываем последовательно OneTypeOrdersInit и OneTypeOrdersInit_1 (например).

Оба варианта - не самые правильные...
Для вашего случая была создана функция AllOrdersInit - с её помощью можно управлять любым количеством ордеров ;)
 
Vyacheslav:
Если можно, то поясните, пожалуйста, еще такой вопрос.
Мне необходимо, каждый раз как появляется сигнал на продажу или покупку, сравнить его с предыдущим сигналом, точнее сравнить уровни на которых эти сигналы находятся. Кроме этого необходимо вести и еще другие арифметические подсчеты. Я пробовал различные варианты, но без успешно.
Проще всего - сохранять необходимые цифры в глобальные или статические переменные.


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

Нет разницы, где находится функция - во включаемом файле, или в коде эксперта.
Мне кажется, вы не совсем понимаете назначение директивы include. .. Почитайте справку, ответы на многие вопросы вы найдете там.

 
komposter:
Для вашего случая была создана функция AllOrdersInit - с её помощью можно управлять любым количеством ордеров ;)
Спасибо, за ответы.
Вопрос, но уже по функции AllOrdersInit я вынес на форум, чтобы не "засорять" место для коментариев.

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

С уважением, Вячеслав.
 

Просьба к автору!
Нельзя ли показать работу последней функции с массивами на примере вашего же советника, использованного для примера в данной статье, предположив что вместо 2 отложенных ордеров необходимо выставить 4 или более, но на других уровнях.
Для меня очень важен пример использования данной функции с массивами в торгующем советнике.
С уважением, Вячеслав.

 
Vyacheslav:

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

Не совсем понимаю, в чем проблема...

Эксперт с использованием этой функции будет очень похож на обычный, только вместо перебора ордеров "от 0 до OrdersTotal()-1" будет перебор ордеров "от 0 до _ExpertOrdersTotal-1". Значение параметров ордеров во втором случае будут получаться не с помощью функций OrderType(), OrderLots() и подобных, а напрямую из массивов _OrderType[], _OrderLots[], и т.д.

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

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

Удачи ;)