У вас не стоит Flash Player
Page 1 of 3 1 2 3 >
Настройки
#4978 - Mon Apr 26 2010 06:27 PM Практические примеры API
anothar Offline
journeyman

Registered: Thu Jan 07 2010
Записи: 85
В данной теме предлагаю выкладывать коды примеров для API. Обсуждение и предложения по примерам просьба приводить в этой теме: http://www.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Number=4273&page=4, чтобы здесь оставались только примеры!

Наверх
#4979 - Mon Apr 26 2010 06:34 PM Re: Практические примеры API [Re: anothar]
anothar Offline
journeyman

Registered: Thu Jan 07 2010
Записи: 85
Первый пример: код с NewOrder. В лаборатории код не будет работать.
Code:
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");
}


Наверх
#4981 - Mon Apr 26 2010 06:48 PM Re: Практические примеры API [Re: anothar]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Не очень хороший пример, он будет на каждом пересчете снимать старые заявки и выставлять новые, даже если цена та же.

Наверх
#4992 - Mon Apr 26 2010 09:00 PM Re: Практические примеры API [Re: Nektodron]
anothar Offline
journeyman

Registered: Thu Jan 07 2010
Записи: 85
ммм я писал-у меня туго с фантазией. Есть предложения по улучшению?

Наверх
#5103 - Wed Apr 28 2010 07:12 PM Re: Практические примеры API [Re: anothar]
anothar Offline
journeyman

Registered: Thu Jan 07 2010
Записи: 85
Пример на сжатие/расжатие:
Code:
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]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Nektodron, можно для примера попросить разместить скрипт блока ТрейСтопАбс. на С#?

Наверх
#5618 - Tue May 11 2010 04:00 PM Re: Практические примеры API [Re: Nektodron]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: Nektodron
Не очень хороший пример, он будет на каждом пересчете снимать старые заявки и выставлять новые, даже если цена та же.
Nektodron, подскажите как учесть/прописать было ли изменение цены?
Как при Интервал пересчёта = Сделка, определить запускался ли скрипт хотя бы раз на текущем баре?

Наверх
#5626 - Tue May 11 2010 06:38 PM Re: Практические примеры API [Re: Craft]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Вероятно никак, хотя правильнее определять закрыт ли уже последний бар, или еще изменяется...
Я думаю, нужно будет вынести серверное время в API. Это не сложно, я сделаю в ближайших билдах

Наверх
#5627 - Tue May 11 2010 06:46 PM Re: Практические примеры API [Re: Nektodron]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Хотя в таком режиме обычно последний бар всегда незакрыт

Наверх
#5629 - Tue May 11 2010 11:58 PM Re: Практические примеры API [Re: Nektodron]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Серверное время - гуд!!!
А по первому вопросу:
Originally Posted By: Nektodron
Не очень хороший пример, он будет на каждом пересчете снимать старые заявки и выставлять новые, даже если цена та же.
Nektodron, подскажите как учесть/прописать было ли изменение цены?

Наверх
#5630 - Wed May 12 2010 12:38 AM Re: Практические примеры API [Re: Craft]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
В последней версии появился метод ISecurity.GetTrades(int barNum)
можно смотреть сделки, менялась цена или нет

Наверх
#9726 - Mon Aug 09 2010 05:41 PM Практические примеры API [Re: Nektodron]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Уважаемые разработчики, можно попросить представить в качестве примера работающий алгоритм для выставления заявок реал-тайм. Имеющийся выше пример, полученный совместными усилиями форумчан, не отличается умением корректыно выставлять необходимое количество ордеров после перовой сделки (начинают подаваться ордера с "0" количеством).
Без возможности торговать реал-тайм, нет возможности использовать Интервал+сделка.

P. S. Может быть есть возможность переделать source.Positions.BuyIfGreater и source.Positions.SellIfLess с возможностью использования bar. При использовании bar алгоритмы корректно размещают ордера на истории, но при попыткае использовать в реальной торговле при bar ордера не выставляются, только при bar + 1.

Наверх
#9734 - Tue Aug 10 2010 10:26 AM Re: Практические примеры API [Re: Craft]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Да, проблема понятна. Нужно дополнительную проверку вставить. Сейчас, чтобы скрипт работал корректно выставьте параметр автооткрытие и автозакрытие 1 бар.

Наверх
#9750 - Tue Aug 10 2010 01:30 PM Re: Практические примеры API [Re: Nektodron]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: Nektodron
Да, проблема понятна. Нужно дополнительную проверку вставить...
Nektodron, поможете с этим?

Originally Posted By: Nektodron
...Сейчас, чтобы скрипт работал корректно выставьте параметр автооткрытие и автозакрытие 1 бар.
Вставил, скрипт корректно работал до открытия позиции и последующего переворота по новому сигналу, после переворота опять появилась проблема с "0" кол-вом ордеров, которые пытаются выставляться по сигналам позиции до переворота.

P. S. И ещё один нюанс при выставлении стопов - к имеющимся в торговле добавляются новые и лишь после этого снимаются старые, а не наоборот, т. е. в торговле непродолжительное время присутствует два стопа - новый и старый.

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

Registered: Thu Jan 21 2010
Записи: 319
Можно от разработчиков ждать помощи в вопросе реализации реал-тайма?

Наверх
#9866 - Wed Aug 11 2010 06:03 PM Re: Практические примеры API [Re: Craft]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
На счет стопов как-то странно. Может пришлете лог? т.к. всегда сначала заявка отменяется, потом выставляется новая.

Что такое проблема с нулевым количеством, как проявляется?

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

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: Nektodron
Что такое проблема с нулевым количеством, как проявляется?
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]
Craft Offline
enthusiast

Registered: Thu Jan 21 2010
Записи: 319
Originally Posted By: Nektodron
На счет стопов как-то странно. Может пришлете лог? т.к. всегда сначала заявка отменяется, потом выставляется новая.
Что такое проблема с нулевым количеством, как проявляется?

Nektodron, на какой э-мэйл отправить логи?

Наверх
#10126 - Mon Aug 16 2010 03:12 PM Re: Практические примеры API [Re: Craft]
ZSE Offline
TSLab
veteran

Registered: Mon Feb 16 2009
Записи: 1367
contact@tslab.ru
с линком на топик в форуме

Наверх
#10131 - Mon Aug 16 2010 03:26 PM Re: Практические примеры API [Re: ZSE]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Вы не используете позиции, а выставляете заявки сами?

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


Moderator:  ViL, sar