#4948 - Mon Apr 26 2010 11:18 AM
Re: Выставление ордеров через API TSLab
[Re: Craft]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
anothar, да не вопрос, создай тему, что-нибудь: Практические примеры использования API.
Спасибо за пример, будем мучить и ждём сжатие/разжатие.
|
Наверх
|
|
|
|
#4949 - Mon Apr 26 2010 11:25 AM
Re: Выставление ордеров через API TSLab
[Re: anothar]
|
addict
Registered: Tue Mar 23 2010
Записи: 415
|
Эх жалко нельзя посты редактировать. Почему нельзя? можно. Кнопка "Edit". И еще можно код записывать между тегами [ code ] и [ / code ] - без пробелов, тогда он будет лучше отображаться!
|
Наверх
|
|
|
|
#4980 - Mon Apr 26 2010 06:38 PM
Re: Выставление ордеров через API TSLab
[Re: ast]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
Спасибо, ast. Я только заметил кнопочку edit-она оказывается у старых постов не появляется только у относительно новых( что в общем то логично). Craft, можно не только ждать но и предлагать, какую стратегию написать (желательно с четким описанием)- а то у меня иногда с фантазией сложно, а совсем уж белиберду писать не хочется.
|
Наверх
|
|
|
|
#4995 - Mon Apr 26 2010 10:04 PM
Re: Выставление ордеров через API TSLab
[Re: anothar]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Craft, можно не только ждать но и предлагать, какую стратегию написать (желательно с четким описанием)- а то у меня иногда с фантазией сложно, а совсем уж белиберду писать не хочется. anothar, сделай пожалуйста пример скрипта сжатия таймфрейма на основе имеющегося алгоритма Hi_Low, он хорошо всеми изучен и понятен, как используя сжатие (с 1 мин. на 15 мин.) получить максимум за желаемый период?
|
Наверх
|
|
|
|
#4997 - Mon Apr 26 2010 10:40 PM
Re: Выставление ордеров через API TSLab
[Re: anothar]
|
Carpal Tunnel
Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
|
Спасибо, ast. Я только заметил кнопочку edit-она оказывается у старых постов не появляется только у относительно новых( что в общем то логично). Craft, можно не только ждать но и предлагать, какую стратегию написать (желательно с четким описанием)- а то у меня иногда с фантазией сложно, а совсем уж белиберду писать не хочется. Доброго времени суток! Вдруг будет интересно, идея трендовой стратегии: 1. Осцилятор TRIX(b)-TRIX(b)[i-1]. Период b настраивается один раз(в год, в два) для одного эммитента 2. Амплитуда колебаний первого осцилятора T(b) за период времени может макс и минимум 3.Покупка, продажа: TRIX(n)-TRIX(n)[i-1] пересечение с его средней построенной по принципу (EMA1+EMA2+EMA3)/3(3 средних - для более тонкой настройки, что бы например поймать значение EMA 3,33, настраивается один раз для одного эмитента) 4. Период (n)=K*F(T(b)max/min). K - множитель константа для определенных эмитентов. Не знаю, понятно ли мысль излагаю? Суть в том, что замечена закономерность между амплитудами колебаний некоторых осциляторов и их "лучшими периодами", с точки зрения рынка. 5. Вход в позицию путем выставления заявки по цене, которая была в момент пересечения. Настраиваемое время ожидания, если не исполняется, по рынку. Переворот. Стопов по идее никаких не надо. трудности - Отрицательные значения TRIX. мысли - Возможно необходимо в множители добавить скоростные осциляторы. Если кому-то интересно пишите мысли.
Отредактировано 777 (Mon Apr 26 2010 10:46 PM)
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика» Дизраэли.
|
Наверх
|
|
|
|
#5000 - Mon Apr 26 2010 11:56 PM
Re: Выставление ордеров через API TSLab
[Re: 777]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Господа, давайте сначала с ордерами разберёмся. anothar, почему при попытке запустить предложенный скрипт с Лимитными ордерами, выскакивает такая ошибка?
Элемент 'ВнешниСкрипт' содержит ошибку: c:\Users\Пользователь\Documents\SharpDevelop Projects\Limit.cs(16,21) : error CS1955: Невызываемый член "System.Collections.Generic.ICollection<TSLab.Script.Bar>.Count" не может использоваться в качестве метода.
|
Наверх
|
|
|
|
#5010 - Tue Apr 27 2010 12:45 PM
Re: Выставление ордеров через API TSLab
[Re: Craft]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Разобрался убрал () в int i = sec.Bars.Count() - 1; - заработало. Заменил + на - и наоборот в условиях сделки (buyQueue[0].Price + 0.01) и увеличил отступ, чтобы ордера не исполнялись по лучшему условию, а разносились подальше от лучших бидов и асков. anothar - респект и уважуха (жаль на этом форуме нельзя звёзды для рейтинга раздавать, от меня 5 была бы точно  ), Лимитники выставляются на каждом баре предварительно отменяя прошлые, ast будет в восторге. anothar, объясни мне тёмному, как такую штуку сделать для Стоп/Стоп-Лимит ордеров???
|
Наверх
|
|
|
|
#5011 - Tue Apr 27 2010 02:07 PM
Re: Выставление ордеров через API TSLab
[Re: Craft]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
Craft, всегда пож.))) ТО есть нужен еще пример на Стоп/Стоп-Лимит? Ок. Будет, но не сразу)))
|
Наверх
|
|
|
|
#5021 - Tue Apr 27 2010 02:23 PM
Re: Выставление ордеров через API TSLab
[Re: Craft]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Получилось увидеть в терминале при открытии бара Условную заявку (Стоп-Лимит): public 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 lotsBalance = 0;
//пробегаемся по всем исполненным лимитникам-нам необходимо текущее число лотов
foreach (IOrder order in secRt.Orders)
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 + 500, 1, "Long");
//ставим лимитник на продажу-хотим ниже всех
secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, buyQueue[0].Price - 500, 1, "Short");
}
else
if (lotsBalance < 0)
{
//закрываем отрицательный баланс покупкой
secRt.NewOrder(TSLab.DataSource.OrderType.Growth, true, buyQueue[0].Price + 500, -lotsBalance, "Long");
}
else
{
//закрываем положительный баланс лотов продажей
secRt.NewOrder(TSLab.DataSource.OrderType.Fall, false, buyQueue[0].Price - 500, lotsBalance, "Short");
}
} anothar, подскажи, что сделать чтобы сначала отменялись старые выставленные ордера (с Лимитниками, всё в порядке - отменились/выставились, а с Условными получается - +выставились новые/отменились старые)? Появились вопросы к разработчикам, Nektodron, как сделать чтобы:1. Выставляемые ордера были действительно условными, т. е. цена и стоп были не равны - проскальзывание в свойствах скрипта не реагирует? 2. Выставляемые ордера были чистыми Стоп-ами (поле Цена - пустым; поле Стоп - необходимое значение)? 3. Выставляемые ордера были не DAY, а GTC, чтобы ордеры можно было переносить через ночь?
|
Наверх
|
|
|
|
#5028 - Tue Apr 27 2010 05:03 PM
Re: Выставление ордеров через API TSLab
[Re: Craft]
|
addict
Registered: Tue Mar 23 2010
Записи: 415
|
Лимитники выставляются на каждом баре предварительно отменяя прошлые, ast будет в восторге. Я еще не пробовал, некогда пока, но от таких слов - я уже в восторге! Прибавляю свои 5 звездочек 
|
Наверх
|
|
|
|
#5034 - Tue Apr 27 2010 05:53 PM
Re: Выставление ордеров через API TSLab
[Re: ast]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
Мерси, ast. Craft со стопарями конечно есть еще один вопрос: как потом отлавливать лимитник, который выставится. Я в этом вопросе пока не разбирался-в идеале по полю Comment, но я совершенно не представляю, что в нем будет... Пример с Hi-Low наверное будет нелучшим в плане иллюстрации-я не знаю зачем там сжатие, если можно просто выбрать другой фрейм?
|
Наверх
|
|
|
|
#5036 - Tue Apr 27 2010 06:05 PM
Re: Выставление ордеров через API TSLab
[Re: Nektodron]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
Nektodron, а есть ли ограничения по полю Comment?
|
Наверх
|
|
|
|
#5054 - Wed Apr 28 2010 12:48 AM
Re: Выставление ордеров через API TSLab
[Re: anothar]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Пример с Hi-Low наверное будет нелучшим в плане иллюстрации-я не знаю зачем там сжатие, если можно просто выбрать другой фрейм? anothar, за последнее время кое-что изменилось  главный козырь в использовании сжатия был из-за непонимания механизма выставления Лимита и Стопа при открытии бара... Теперь всё становится яснее и нет необходимости в сжатии для получения необходимой оперативности - исполнения по факту. Но для развития кругозора, сжатие интересно, и для пользователя, вроде меня (с интуитивным, но безнавыковым пониманием языка С#), важен пример оформления строки целиком с использованием служебных слов (как образец) - СЖАТИЕ, ФУНКЦИЯ/МАКС/МИН/ИНДИКАТОР/ФОРМУЛА, ОЖИДАЕМЫЙ РЕЗУЛЬТАТ. P. S., но не маловажное - как сделать чтобы в первую очередь отменялись старые выставленные ордеры (с Лимитниками, всё в порядке: отменились/выставились, а с Условными получается: + выставились новые/отменились старые)?
|
Наверх
|
|
|
|
#5055 - Wed Apr 28 2010 12:57 AM
Re: Выставление ордеров через API TSLab
[Re: Craft]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Уважаемые разработчики, вопросы остаются открытыми: 1. Как сделать, чтобы выставляемые ордеры были действительно условными, т. е. цена и стоп были не равны - проскальзывание в свойствах скрипта не реагирует? 2. Как сделать, чтобы выставляемые ордеры были чистыми Стоп-ами (поле Цена - пустым; поле Стоп - необходимое значение)? Возможно этот вопрос вытекает из первого. 3. Как сделать, чтобы выставляемые ордеры были не DAY, а GTC - чтобы ордеры можно было переносить через ночь? Внесу подсказку - практичней, чтобы выставляемые ордеры по умолчанию были - GTC, т. к. интрадейщики внутри дня пятьдесят раз отменят Стопы и выставят поновой вне зависимости DAY это или GTC (уловите суть)!!! А для желающих перенести через ночь, GTC - единственный верный вариант.
|
Наверх
|
|
|
|
#5071 - Wed Apr 28 2010 11:14 AM
Re: Выставление ордеров через API TSLab
[Re: Nektodron]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Nektodron: 1. Ок, проверьте. 2. Спасибо. 3. Понимаю - логично, но это печально не иметь возможность переносить позу через ночь со Стопом...
|
Наверх
|
|
|
|
#5085 - Wed Apr 28 2010 12:47 PM
Re: Выставление ордеров через API TSLab
[Re: Craft]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
Ну вот и пример, правда(как всегда) при его написании возник вопрос по сжатию - для определения конца дня. Вот сабж: http://www.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=5084#Post5084. А вот код, применяющий сжатие:
public void Execute(IContext ctx, ISecurity sec)
{
//"сжимаем" до дневок-то есть получаем дневные данные
ISecurity dailySec = sec.CompressTo(1440);
//если мало баров-выходим, чтобы не было ошибки
if (dailySec.Bars.Count < 1) return;
//номер бара предыдущего дня
int prevDateBarNum = 0;
double dailyHigh;
double dailyLow;
DateTime curDate;
for (int i = 0; i < sec.Bars.Count; i++)
{
//дата текущего бара
curDate=sec.Bars[i].Date.Date;
//получаем номер дневного бара текущего дня
while (prevDateBarNum<dailySec.Bars.Count&&
dailySec.Bars[prevDateBarNum].Date.Date < curDate)
prevDateBarNum++;
//тут возникает проблема: поскольку мы выставляем ордера на закрытии,
//то на последнем баре дня нужно выставить заявку уже с
//учетом хая текущего дневного бара.
if (((i + 1) < sec.Bars.Count && sec.Bars[i + 1].Date.Date == curDate)
|| prevDateBarNum == dailySec.Bars.Count)
{
//все нормально-у нас не последний бар текущего дня
prevDateBarNum--;
}
if (prevDateBarNum < 0)
{
prevDateBarNum = 0;
continue;
}
//номер дневного бара предыдущего дня
dailyHigh = dailySec.HighPrices[prevDateBarNum];
dailyLow = dailySec.LowPrices[prevDateBarNum];
//условие того, что сегодня открывалось не более одной позиции
if (sec.Positions.LastPositionActive == null ||
sec.Positions.LastPositionActive.EntryBar.Date.Date != curDate ||
sec.Positions.LastPositionClosed == null
|| sec.Positions.LastPositionClosed.EntryBar.Date.Date != curDate)
{
bool sell;
bool buy;
if(sec.Positions.LastPositionActive==null)
{
//если мы еще ни разу не делали сделок, то ставим двойную.
//предполагаем, что обе заявки в течение одного бара
//выполниться не смогут!
buy=true;
sell=true;
}
else
{
buy=sec.Positions.LastPositionActive.IsShort;
sell=sec.Positions.LastPositionActive.IsLong;
}
if (buy)
sec.Positions.BuyIfGreater(i + 1, 1, dailyHigh, "Long");
if(sell)
sec.Positions.SellIfLess(i+1,1,dailyLow,"Short");
}
}
}
|
Наверх
|
|
|
|
|
|