У вас не стоит Flash Player
Page 3 of 3 < 1 2 3
Настройки
#10288 - Wed Aug 18 2010 01:02 PM Re: Практические примеры API [Re: andy]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
ТЗ на пример скрипта с использованием реал-тайм.

За основу взят скрипт из Темы 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 и доведении этого алгоритма до робастного состояния и использования его в качестве примера другими, идущими тем же тернистым путём познания, что и я сейчас.


Attachments
ТЗ на пример скрипта с использованием реал-тайм.docx (524 downloads)



Отредактировано Craft (Thu Aug 19 2010 01:35 PM)

Наверх
#10309 - Wed Aug 18 2010 10:27 PM Re: Практические примеры API [Re: Craft]
andy Offline

Pooh-Bah

Registered: Mon Feb 16 2009
Записи: 2130
Вечер добрый,

Спасибо за материал.

Завтра проговорим это внутри у себя и я скажу что-то более конкретное по судьбе этого вопроса.

Возможно будут дополнительные вопросы и возможно появятся вопросы во время реализации.

Наверх
#10314 - Wed Aug 18 2010 11:26 PM Re: Практические примеры API [Re: andy]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
andy, спасибо за готовность идти на встречу пользователям.

Ждём результатов обсуждения внутри коллектива.

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

Наверх
#10318 - Thu Aug 19 2010 08:20 AM Re: Практические примеры API [Re: Craft]
usas Offline
Pooh-Bah

Registered: Sun Feb 21 2010
Записи: 2331
Loc: Ухта
Originally Posted By: Craft
andy, спасибо за готовность идти на встречу пользователям.

Ждём результатов обсуждения внутри коллектива.

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

Уважаемые, поясните пожалуйста какой смысл здесь вкладывается в понятие "реал-тайм" ?
Ведь не в "виртуал-тайм" остальные работают? Все здесь и сейчас..

Наверх
#10349 - Thu Aug 19 2010 01:01 PM Re: Практические примеры API [Re: usas]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: usas
Уважаемые, поясните пожалуйста какой смысл здесь вкладывается в понятие "реал-тайм" ?
Выставление заявки реал-тайм по факту исполнения сигналу, а не по закрытию бара.
Originally Posted By: usas
Ведь не в "виртуал-тайм" остальные работают? Все здесь и сейчас..
А у вас заявки исполняются одмоментно с появлением сигнала или по закрытию/открытию бара?

Наверх
#10350 - Thu Aug 19 2010 01:05 PM Re: Практические примеры API [Re: Craft]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
andy, есть результаты относительно обсуждения ТЗ внутри коллектива?

Наверх
#10355 - Thu Aug 19 2010 01:48 PM Re: Практические примеры API [Re: Craft]
usas Offline
Pooh-Bah

Registered: Sun Feb 21 2010
Записи: 2331
Loc: Ухта
Originally Posted By: Craft Выставление заявки реал-тайм по факту исполнения сигналу, а не по закрытию бара.
[quote=usas
Ведь не в "виртуал-тайм" остальные работают? Все здесь и сейчас..
А у вас заявки исполняются одмоментно с появлением сигнала или по закрытию/открытию бара? [/quote]
Если "по рынку", то выставление/исполнение можно считать одним понятием и тогда по объяснению Н-дрона где-то здесь раньше происходит это одномоментно на закрытии предыдущего бара и открытии следующего..
Я так понял..

Наверх
#10365 - Thu Aug 19 2010 03:24 PM Re: Практические примеры API [Re: usas]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: usas
Если "по рынку", то выставление/исполнение можно считать одним понятием и тогда по объяснению Н-дрона где-то здесь раньше происходит это одномоментно на закрытии предыдущего бара и открытии следующего..
Я так понял..
Вот, на закрытии бара, а при торговле реал-тайм, заявка исполняется по факту появления сигнала внутри бара.

Наверх
#10366 - Thu Aug 19 2010 03:58 PM Re: Практические примеры API [Re: Craft]
profit Offline
Pooh-Bah

Registered: Wed Jan 13 2010
Записи: 1835
Давно хочется такой вариант выставления заявки практически с первых шагов это пытались реализовать.
_________________________
Делаю простые вещи.

Наверх
#10371 - Thu Aug 19 2010 04:57 PM Re: Практические примеры API [Re: Craft]
andy Offline

Pooh-Bah

Registered: Mon Feb 16 2009
Записи: 2130
Originally Posted By: Craft
andy, есть результаты относительно обсуждения ТЗ внутри коллектива?


Craft приветствую !

Будет реализован пример, демонстрирующий те элементы, о которых было упомянуто в обсуждении, а именно:

1. работа в режиме реальных торгов (реал-тайм)
2. отработка условных и рыночных заявок
3. контроль текущей позиции
4. механика работы с дробными позициями, то есть не «на все», а заданными частями
5. реализация стоп-лосс
В качестве базового алгоритма будет использован Hi-Low (пробой канала).

Наверх
#10375 - Thu Aug 19 2010 05:18 PM Re: Практические примеры API [Re: andy]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Спасибо вам, други - это именно то с чем хотелось бы научиться работать (пожалуйста, включите в пример возможность работы с ценой открытия позиции, к примеру при реализации стоп-лосс (или как вам удобно) - если цена открытия +/- предусмотренный убыток, тогда стоп-лосс).
Когда можно будет ожидать пример?

Наверх
#10389 - Thu Aug 19 2010 07:19 PM Re: Практические примеры API [Re: Craft]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Originally Posted By: Craft
Originally Posted By: usas
Уважаемые, поясните пожалуйста какой смысл здесь вкладывается в понятие "реал-тайм" ?
Выставление заявки реал-тайм по факту исполнения сигналу, а не по закрытию бара.
Originally Posted By: usas
Ведь не в "виртуал-тайм" остальные работают? Все здесь и сейчас..
А у вас заявки исполняются одмоментно с появлением сигнала или по закрытию/открытию бара?

Я наверно что то не понимаю, но если выставить интервал пересчёта "сделка" (на достаточно ликвидном рынке), разве заявка не выставится внутри бара, если кол-во сделок и пересчётов внутри бара будет много?
_________________________


Наверх
#10394 - Thu Aug 19 2010 08:22 PM Re: Практические примеры API [Re: uprav]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: uprav
Я наверно что то не понимаю, но если выставить интервал пересчёта "сделка" (на достаточно ликвидном рынке), разве заявка не выставится внутри бара, если кол-во сделок и пересчётов внутри бара будет много?
uprav, а Вы пробовали выставить условный ордер в режиме Интервал пересчета "Сделка"?
Есть ещё ньансы с исполнение ордеров на i-том баре, либо как через визуальный редактор на i+1.

Наверх
#11358 - Tue Aug 31 2010 04:20 PM Re: Практические примеры API [Re: Nektodron]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: Nektodron
Алгоритм работать не будет. Я уже вам писал, что нельзя смешивать ручное управление заявками и позиции. Либо то, либо другое.
sec.Positions.LastPositionActive - это использовать нельзя.
Nektodron, вернёмся к нашим баранам. Дело не в sec.Positions.LastPositionActive, встроил предложенный Вами метод определения значения/цены открытой позиции и кол-ва контрактов (пробовал подставлять значения lotsBalance и curQty(вариант ниже)), но всё-равно после открытия позиции, на каждом баре вместо ордера на переворот (или частичное закрытие) в ТСлаб проходит сообщение: 11:15:30.00:Скрипт: RT2. Не могу создать заявку с нулевым количеством!

Прошу попробовать, как это работает:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;
using TSLab.Script.Realtime;

namespace TSLab.Samples
{
	public class Final : IExternalScript
	{
		public OptimProperty Contracts = new OptimProperty(2, 1, 1, 1);
		public OptimProperty OtskokL = new OptimProperty(5, 1, 1, 1);
		public OptimProperty buL = new OptimProperty(2, 1, 1, 1);
		public OptimProperty OtskokS = new OptimProperty(5, 1, 1, 1);
		public OptimProperty buS = new OptimProperty(2, 1, 1, 1);
		
		private double CalcCurrentPrice(ISecurityRt rtSec, out double curQty, out double curPrice)
		{
			curQty = 0;
			curPrice = 0;
			if (rtSec != null)
			{
				var orders = rtSec.Orders.OrderBy(ord => ord.Date);
				foreach (var order in orders)
				{
					if (order.IsExecuted)
					{
						int bs = (order.IsBuy ? 1 : -1);
						double qty = order.Quantity * bs;
						double price = order.Price;
						double newQty = curQty + qty;
						bool isGrowPos = Math.Abs(newQty) > Math.Abs(curQty);
						if (isGrowPos)
						{
							curPrice = newQty == 0 ? 0 : (curQty*curPrice + qty*price)/newQty;
						}
						curQty = newQty;
					}
				}
			}
			curPrice = curQty == 0 ? 0 : curPrice;
			return curPrice;
		}
		
		public virtual void Execute(IContext ctx, ISecurity sec)
		{
			
			// Торговля.
			if (!sec.Positions.IsRealtime) return;
			{
				int i = sec.Bars.Count - 1;
				if (i < 0) return;
				IList<IQueueData> buyQueue=sec.GetBuyQueue(i);//получаем биржевой стакан
				IList<IQueueData> sellQueue = sec.GetSellQueue(i);//получаем биржевой стакан
				ISecurityRt secRt = sec as ISecurityRt;
				if (secRt == null) return;
				
				double curQty; // объявляем переменные
				double curPrice;
				CalcCurrentPrice(secRt, out curQty, out curPrice); // и вызываем метод				
				
				//текущая позиция. если больше нуля-в лонге. меньше нуля-в шорте
				double lotsBalance = 0;
				//пробегаемся по всем исполненным ордерам. необходимо текущее число лотов
				foreach (IOrder order in secRt.Orders)
				//Проверка что мы на этом баре не ставили заявки!!!
				if (order.Date >= sec.Bars[i].Date) return;
				else
				if (order.OrderType == TSLab.DataSource.OrderType.Limit)
				{					
					lotsBalance += order.IsBuy ? (order.Quantity-order.RestQuantity) :
					(-order.Quantity+order.RestQuantity);
					//для примера-если ордер не исполнился-убиваем
					if (!order.IsExecuted) secRt.CancelOrder(order);
				}
					//условие-у нас нулевой баланс лотов
				if (lotsBalance == 0)
				{
					//ставим стоп-лимит на бай
					secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, buyQueue[0].Price, Contracts, "LE");
					//ставим стоп-лимит на селл
					secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, sellQueue[0].Price, Contracts, "SE");
				}
				else
				if (lotsBalance < 0)
				{
					//закрываем отрицательный баланс покупкой
					secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, buyQueue[0].Price+10, -curQty + Contracts, "SXLE");
					{
					
						//если есть промежуточный профит закрываем один контракт
						if (sec.LowPrices[i] <= curPrice - OtskokS)
						secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, curPrice - buS, 1, "SXTP");
					}
				}
				else
				{
					//закрываем положительный баланс лотов продажей
					secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, sellQueue[0].Price-10, curQty - Contracts, "LXSE");
					{
						//если есть промежуточный профит закрываем один контракт
						if (sec.HighPrices[i] >= curPrice + OtskokL)
						secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, curPrice + buL, 1, "LXTP");
					}
				}
			}
		}
	}
}

Какие ещё есть идеи?

P. S. Ещё момент, сначала выставляются новые ордера, потом отменяются старые.

Наверх
#11360 - Tue Aug 31 2010 04:56 PM Re: Практические примеры API [Re: Craft]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492

Наверх
#11374 - Tue Aug 31 2010 06:39 PM Re: Практические примеры API [Re: Nektodron]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: Nektodron
Премного благодарен после, почти, месячного ожидания (http://www.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=9726#Post9726), а как на счёт - P. S.

Наверх
#25691 - Thu Apr 14 2011 03:12 AM Re: Практические примеры API [Re: Craft]
VDV Offline
newbie

Registered: Wed Apr 13 2011
Записи: 32
Originally Posted By: Craft
Originally Posted By: Nektodron
Алгоритм работать не будет. Я уже вам писал, что нельзя смешивать ручное управление заявками и позиции. Либо то, либо другое.
sec.Positions.LastPositionActive - это использовать нельзя.
Nektodron, вернёмся к нашим баранам. Дело не в sec.Positions.LastPositionActive, встроил предложенный Вами метод определения значения/цены открытой позиции и кол-ва контрактов (пробовал подставлять значения lotsBalance и curQty(вариант ниже)), но всё-равно после открытия позиции, на каждом баре вместо ордера на переворот (или частичное закрытие) в ТСлаб проходит сообщение: 11:15:30.00:Скрипт: RT2. Не могу создать заявку с нулевым количеством!

Прошу попробовать, как это работает:
Code:
...
		
		private double CalcCurrentPrice(ISecurityRt rtSec, out double curQty, out double curPrice)
		{
			curQty = 0;
			curPrice = 0;
			if (rtSec != null)
			{
				var orders = rtSec.Orders.OrderBy(ord => ord.Date);
				foreach (var order in orders)
				{
					if (order.IsExecuted)
					{
						int bs = (order.IsBuy ? 1 : -1);
						double qty = order.Quantity * bs;
						double price = order.Price;
						double newQty = curQty + qty;
						bool isGrowPos = Math.Abs(newQty) > Math.Abs(curQty);
						if (isGrowPos)
						{
							curPrice = newQty == 0 ? 0 : (curQty*curPrice + qty*price)/newQty;
						}
						curQty = newQty;
					}
				}
			}
			curPrice = curQty == 0 ? 0 : curPrice;
			return curPrice;
		}
		

...
				CalcCurrentPrice(secRt, out curQty, out curPrice); // и вызываем метод				
				
...


Какие ещё есть идеи?

P. S. Ещё момент, сначала выставляются новые ордера, потом отменяются старые.


Может сообщение "не могу выставить заявку с нулевым значением появляется потому что в методе CalcCurrentPrice () после строки
return curPrice; //возвращаем значение текущей цены
забыли добавить строку
return curQty //возвращаем значение текущего количества

и как результат когда вызываем метод, то получаем правильное значение цены и всегда нулевое значение количества???

Или причина в чем-то другом?
_________________________
Телеграм - канал для алготрейдеров: t-do.ru/TradingLaboratory

Наверх
#25692 - Thu Apr 14 2011 03:17 AM Re: Практические примеры API [Re: Nektodron]
VDV Offline
newbie

Registered: Wed Apr 13 2011
Записи: 32
Originally Posted By: Nektodron
Вероятно никак, хотя правильнее определять закрыт ли уже последний бар, или еще изменяется...
Я думаю, нужно будет вынести серверное время в API. Это не сложно, я сделаю в ближайших билдах


Скажите, а серверное время в API уже внесено? Дайте, плз., ссылочку где об этом можно почитать.
_________________________
Телеграм - канал для алготрейдеров: t-do.ru/TradingLaboratory

Наверх
#25693 - Thu Apr 14 2011 03:31 AM Re: Практические примеры API [Re: andy]
VDV Offline
newbie

Registered: Wed Apr 13 2011
Записи: 32
Originally Posted By: andy
Originally Posted By: Craft
andy, есть результаты относительно обсуждения ТЗ внутри коллектива?


Craft приветствую !

Будет реализован пример, демонстрирующий те элементы, о которых было упомянуто в обсуждении, а именно:

1. работа в режиме реальных торгов (реал-тайм)
2. отработка условных и рыночных заявок
3. контроль текущей позиции
4. механика работы с дробными позициями, то есть не «на все», а заданными частями
5. реализация стоп-лосс
В качестве базового алгоритма будет использован Hi-Low (пробой канала).


Дайте, плз., ссылку на этот пример - очень хочется посмотреть... Или ещё не был реализован?
_________________________
Телеграм - канал для алготрейдеров: t-do.ru/TradingLaboratory

Наверх
#25703 - Thu Apr 14 2011 10:30 AM Re: Практические примеры API [Re: VDV]
ViL Offline
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8137

Наверх
Page 3 of 3 < 1 2 3


Moderator:  ViL, sar