ТЗ на пример скрипта с использованием реал-тайм.За основу взят скрипт из Темы High-Low (channel breakout) + скользящий стоп (Модификация скрипта Hi-Lo) по адресу:
http://www.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=7211#Post7211 90% технических вопросов в нём уже предусмотрены.
Основная задача - переделать скрипт под исполнение ордеров реал-тайм. При составлении ТЗ для упрощения и лучшей наглядности были объеденены high1 и high2 - остался high1, аналогично с low1 и low2 – остаётся только low1, а также изменена для упрощения и наглядности формула вычисления скользящего стопа, который теперь больше соответствует закрытию части позиции по безубытку.
1. Условия входа. Подробнее можно ? =открытие и переворот позиции с переносом стопа в случае не исполнения на следующий бар=Весь алгоритм четко нужно описать. Как входим, как переворачиваемся. Какими заявками. Какие нюансы.
3. Условия закрытия позиции.
Ответ по пп. 1 и 3 объеденены, т. к. они взаимосвязаны и дополняют друг-друга.
Для лонга:- Если нет активной длинной позиции, выставляем условный ордер на открытее новой длинной позиции на ценовом уровне high1[bar];
- Если есть активная длинная позиция и MaxPrice-Цена открытия позиции >=Otskok, рассчитываем значение LongStopPrice на закрытие выбранного пользователем количества контрактов (пользователь выбирает сам закрыть один, часть, половину или все контракты – это для использования в примере расчёта количества оставшихся контрактов в качестве примера), при котировке равной значению LongStopPrice выставляется рыночный ордер;
- Выставляем условный ордер на закрытие длинной позиции по значению low1[bar], если до это сработал рыночный ордер - закрываются оставшиеся контракты, если рыночный ордер не сработал – закрываются все открытые контракты;
Формулы расчёта значений:
IList<double> high1 = ctx.GetData("Highest", new[] {High1Period.ToString()},
delegate { return Series.Highest(source.HighPrices, High1Period); });
LongStopPrice = Цена открытия позиции + Безубыток;
IList<double> low1 = ctx.GetData("Lowest", new[] {Low1Period.ToString()},
delegate { return Series.Lowest(source.LowPrices, Low1Period); });
Otskok = задаётся пользователем;
Безубыток = задаётся пользователем;
Для шорта:- Если нет активной короткой позиции, выставляем условный ордер на открытие новой короткой позиции на ценовом уровне low1[bar];
- Если есть активная короткая позиция и Цена открытия позиции - MinPrice >=Otskok, рассчитываем значение ShortStopPrice на закрытие выбранного пользователем количества контрактов (пользователь выбирает сам закрыть один, часть, половину или все контракты – это для использования в примере расчёта количества оставшихся контрактов в качестве примера), при котировке равной значению ShortStopPrice выставляется рыночный ордер;
- Выставляем условный ордер на закрытие короткой позиции по значению high1[bar], если до это сработал рыночный ордер - закрываются оставшиеся контракты, если рыночный ордер не сработал – закрываются все открытые контракты;
Формулы расчёта значений:
IList<double> low1 = ctx.GetData("Lowest", new[] {Low1Period.ToString()},
delegate { return Series.Lowest(source.LowPrices, Low1Period); });
ShortStopPrice = Цена открытия позиции - Безубыток;
IList<double> high1 = ctx.GetData("Highest", new[] {High1Period.ToString()},
delegate { return Series.Highest(source.HighPrices, High1Period); });
Otskok = задаётся пользователем;
Безубыток = задаётся пользователем;
2. Условия ведения позиции.
- Частичное закрытие - что имеется ввиду? Заявка имеет случайный обьем неисполнения? Что делаем с невошедшим по сигналу остатком? Убиваем или докупаем?
Частичное закрытие позиции - пользователь выбирает сам закрыть один, часть, половину или все контракты – это для использования в примере расчёта количества оставшихся контрактов. В качестве примера, очень, полезно последующим поколениям. Исполнение ордера по маркету.
- Что есть скользящий стоп? Какой принцип его работы реализовать?
Для наглядности формула вычисления скользящего стопа была изменена, предлагается закрывать часть позиции по безубытку – это для использования в примере цены открытия позиции, что тоже очень полезно для последующих поколений.
Резюме:
Алгоритм упрощён для наглядности и простоты реализации со стороны разработчиков и в тоже время позволит пользователям увидеть пример, в котором кроме отработки торговых сигналов в реал-тайме с использованием ордеров Стоп и Маркет (пример исполнения маркета один раз при возможном множественном срабатывании условия сигнала, тоже очень важен и необходим в примере), присутствует расчёт количества контрактов/акций и определение цены открытия позиции, что, не сомневаюсь, будет многим полезно при адаптации своих скриптов под реал-тайм.
P. S. В прикреплённом файле ТЗ в ворде.
P. P. S. На написание ТЗ с последующей его практической реализации для пользвоателей разработчиками меня подвигли, Вы - andy. Я был готов удовлетворится скромной помощью в исправлении ошибки из поста
http://www.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=10210#Post10210 и доведении этого алгоритма до робастного состояния и использования его в качестве примера другими, идущими тем же тернистым путём познания, что и я сейчас.