#4979 - Mon Apr 26 2010 06:34 PM
Re: Практические примеры API
[Re: anothar]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
Первый пример: код с NewOrder. В лаборатории код не будет работать.
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.Limit, true, buyQueue[0].Price + 0.01, 1, "Long");
//ставим лимитник на продажу-хотим ниже всех
secRt.NewOrder(TSLab.DataSource.OrderType.Limit, false, sellQueue[0].Price - 0.01, 1, "Short");
}
else
if (lotsBalance < 0)
{
//закрываем отрицательный баланс покупкой secRt.NewOrder(TSLab.DataSource.OrderType.Limit, true, buyQueue[0].Price + 0.01, -lotsBalance, "Long");
}
else
{
//закрываем положительный баланс лотов продажей
secRt.NewOrder(TSLab.DataSource.OrderType.Limit, false, sellQueue[0].Price - 0.01, lotsBalance, "Short");
}
|
Наверх
|
|
|
|
#4992 - Mon Apr 26 2010 09:00 PM
Re: Практические примеры API
[Re: Nektodron]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
ммм я писал-у меня туго с фантазией. Есть предложения по улучшению?
|
Наверх
|
|
|
|
#5103 - Wed Apr 28 2010 07:12 PM
Re: Практические примеры API
[Re: anothar]
|
journeyman
Registered: Thu Jan 07 2010
Записи: 85
|
Пример на сжатие/расжатие:
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");
}
}
}
|
Наверх
|
|
|
|
#5304 - Mon May 03 2010 05:50 PM
Re: Практические примеры API
[Re: anothar]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Nektodron, можно для примера попросить разместить скрипт блока ТрейСтопАбс. на С#?
|
Наверх
|
|
|
|
#5618 - Tue May 11 2010 04:00 PM
Re: Практические примеры API
[Re: Nektodron]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Не очень хороший пример, он будет на каждом пересчете снимать старые заявки и выставлять новые, даже если цена та же. Nektodron, подскажите как учесть/прописать было ли изменение цены? Как при Интервал пересчёта = Сделка, определить запускался ли скрипт хотя бы раз на текущем баре?
|
Наверх
|
|
|
|
#5629 - Tue May 11 2010 11:58 PM
Re: Практические примеры API
[Re: Nektodron]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Серверное время - гуд!!! А по первому вопросу: Не очень хороший пример, он будет на каждом пересчете снимать старые заявки и выставлять новые, даже если цена та же. Nektodron, подскажите как учесть/прописать было ли изменение цены?
|
Наверх
|
|
|
|
#9726 - Mon Aug 09 2010 05:41 PM
Практические примеры API
[Re: Nektodron]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Уважаемые разработчики, можно попросить представить в качестве примера работающий алгоритм для выставления заявок реал-тайм. Имеющийся выше пример, полученный совместными усилиями форумчан, не отличается умением корректыно выставлять необходимое количество ордеров после перовой сделки (начинают подаваться ордера с "0" количеством). Без возможности торговать реал-тайм, нет возможности использовать Интервал+сделка.
P. S. Может быть есть возможность переделать source.Positions.BuyIfGreater и source.Positions.SellIfLess с возможностью использования bar. При использовании bar алгоритмы корректно размещают ордера на истории, но при попыткае использовать в реальной торговле при bar ордера не выставляются, только при bar + 1.
|
Наверх
|
|
|
|
#9750 - Tue Aug 10 2010 01:30 PM
Re: Практические примеры API
[Re: Nektodron]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Да, проблема понятна. Нужно дополнительную проверку вставить... Nektodron, поможете с этим? ...Сейчас, чтобы скрипт работал корректно выставьте параметр автооткрытие и автозакрытие 1 бар. Вставил, скрипт корректно работал до открытия позиции и последующего переворота по новому сигналу, после переворота опять появилась проблема с "0" кол-вом ордеров, которые пытаются выставляться по сигналам позиции до переворота. P. S. И ещё один нюанс при выставлении стопов - к имеющимся в торговле добавляются новые и лишь после этого снимаются старые, а не наоборот, т. е. в торговле непродолжительное время присутствует два стопа - новый и старый.
|
Наверх
|
|
|
|
#9854 - Wed Aug 11 2010 05:24 PM
Re: Практические примеры API
[Re: Craft]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Можно от разработчиков ждать помощи в вопросе реализации реал-тайма?
|
Наверх
|
|
|
|
#9930 - Thu Aug 12 2010 01:49 PM
Re: Практические примеры API
[Re: Nektodron]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
Что такое проблема с нулевым количеством, как проявляется? Nektodron, погоняйте скрипт из второго поста сверху заменив TSLab.DataSource.OrderType.Limit на TSLab.DataSource.OrderType.Growth/TSLab.DataSource.OrderType.Fall. Если логик этого скрипта не оптимальна, подскажите работающую схему, у Вас из опыта работы с программой, наверное, возникали такие задачи и возможно имеются примеры реализации.
|
Наверх
|
|
|
|
#10125 - Mon Aug 16 2010 03:10 PM
Re: Практические примеры API
[Re: Nektodron]
|
enthusiast
Registered: Thu Jan 21 2010
Записи: 319
|
На счет стопов как-то странно. Может пришлете лог? т.к. всегда сначала заявка отменяется, потом выставляется новая. Что такое проблема с нулевым количеством, как проявляется? Nektodron, на какой э-мэйл отправить логи?
|
Наверх
|
|
|
|
#10126 - Mon Aug 16 2010 03:12 PM
Re: Практические примеры API
[Re: Craft]
|
TSLab
veteran
Registered: Mon Feb 16 2009
Записи: 1367
|
contact@tslab.ru с линком на топик в форуме
|
Наверх
|
|
|
|
|
|