Котирование
Atom
16.01.2015
Иван З.


Как я понимаю есть 2 варианта запустить котирования

  1. из документации http://stocksharp.com/doc/?topic=html/24250c24-029c-4dbc-bc8b-4afde645e483.htm [code=csharp]var strategy = new MarketQuotingStrategy(order, new Unit()); base.ChildStrategies.Add(strategy);[/code] Работает нормально, по крайней мере позиции набирает.

  2. из одного из обновления http://stocksharp.com/forum/2285/Stock--4-0-Release/ [code=csharp] this.OpenPositionByQuoting(10); [/code] Работает не нормально, либо не правильно использую В стратегии просто набираю позицию [SPOILER][code=csharp] using MoreLinq; using StockSharp.Algo.Strategies.Quoting; using StockSharp.BusinessEntities;

namespace Sample { using StockSharp.Algo; using StockSharp.Algo.Candles; using StockSharp.Algo.Indicators; using StockSharp.Algo.Strategies; using StockSharp.Messages;

class MyStrategy : Strategy
{
    public MyStrategy(){}
    protected override void OnStarted()
    {
        Process();
        base.OnStarted();
    }


    private void Process()
    {
        // если наша стратегия в процессе остановки
        if (ProcessState == ProcessStates.Stopping)
        {
            // отменяем активные заявки
            CancelActiveOrders();
            return;
        }
        if (Position == 0)
        {
           //var strat = new MarketQuotingStrategy(Sides.Buy, 10);
           //base.ChildStrategies.Add(strat);
           this.OpenPositionByQuoting(10);
        }

    }
}

} [/code][/SPOILER] В тестовом КВИКе выдает ошибку [img]http://clickscreen.ru/screens/2/a04e66b2.png [/img] Лог приложу Еще раз повторю, что 1й работает а 2й не работает Вопрос: это я не правильно использую или это баг?

log.txt 72 KB (762)

Теги:


Спасибо:


<< < 2 3 4 5  >
Иван З.

Фотография
Дата: 16.02.2015
Ответить


Проверил. MarketQuotingStrategy также не откатывает на лучшую цену. при параметре [code=csharp]PriceOffset = Security.PriceStep, [/code] выставляет заявку на BestPrice а должен перед ней.

BestByPriceQuotingStrategy вообще не выставляет заявку.

остальные не смотрел, завтра посмотрю.

Спасибо:

Mikhail Sukhov

Фотография
Дата: 16.02.2015
Ответить


[quote=Иван З.;32629] остальные не смотрел, завтра посмотрю.[/quote]

Сырцы теперь есть. Предлагаю сразу обсуждать строчки кода, а не что-то абстрактное.

Спасибо:

Иван З.

Фотография
Дата: 18.02.2015
Ответить


По стратегиям из последней версии BestByPriceQuotingStrategy и MarketQuotingStrategy Так как MarketQuotingStrategy унаследована от BestByPriceQuotingStrategy, метод NeedQuoting у них общий. Проблема с тем, что заявка не откатывается у них общая [SPOILER][code=csharp] if (QuotingDirection == Sides.Sell) { //Здесь если BestPrice > currentPrice то ни чего происходить не будет, и заявка не откатится назад if (currentPrice == null || (decimal)(price + BestPriceOffset) < currentPrice) return price + (decimal)BestPriceOffset / 2; } else { //Здесь если BestPrice < currentPrice то ни чего происходить не будет, и заявка не откатится назад if (currentPrice == null || (decimal)(price - BestPriceOffset) > currentPrice) return price - (decimal)BestPriceOffset / 2; } [/code][/SPOILER] Можно вылечить так [SPOILER][code=csharp] if (QuotingDirection == Sides.Sell) { var newPrice = Security.ShrinkPrice((decimal) price + (decimal) BestPriceOffset/2); if (currentPrice == null || (newPrice != currentPrice)) return newPrice; } else { var newPrice = Security.ShrinkPrice((decimal) price - (decimal) BestPriceOffset/2); if (currentPrice == null || (newPrice != currentPrice)) return newPrice; } [/code][/SPOILER] В таком случае, заявка будет всегда переставляться на параметры заданные стратегией. Кроме случая если она уже стоит на нужной цене. Изучив код подробней этих стратегий, понял что мое представление о том как они должны работать не совпадают с реализованным.

  1. BestPriceOffset - Отступ от лучшей цены, на который [h]может [/h]уйти котируемая заявка. Слово может очень сбивает с толку, в стратегии строго забито, что она в любом случае отступит от лучшей цены на значение BestPriceOffset

В моем представлении, если взять для примера BestByPriceQuotingStrategy, то стратегия должна выставлять заявку на лучшую цену(на то это и [h]BestByPrice[/h]QuotingStrategy). Но если заявка уйдет от BestPrice на значение меньшее чем BestPriceOffset то переставляться не будет.

  1. PriceOffset - Отступ цены для выставляемой заявки. Определяет размер отступа от лучшей котировки (для покупки прибавляется к цене, для продажи - вычитается). Этот отступ есть у MarketQuotingStrategy если он положительный а сделка Buy, стратегия выставит заявку на BestPrice - BestPriceOffset + PriceOffset. То есть выше описанный BestPriceOffset тоже вычитается.

В общем мне кажется BestPriceOffset сейчас работает не так как надо, а GetAcceptablePriceRange() все таки нужный метод, по крайней мере для BestByPriceQuotingStrategy. Править?

В BestByVolumeQuotingStrategy я исправил один метод NeedQuoting. В коде постарался пояснения написать по подробнее. Протестировал, стратегия работает, выложил в ВК.

Спасибо:

RomSunZ

Фотография
Дата: 18.02.2015
Ответить


Что вы паритесь? GetAcceptablePriceRange: [code=csharp] if (this.Order != null) _bestprice = this.Order.Price; else return base.GetAcceptablePriceRange(); if (_bestprice == 0) return new Range(0m, 0m); var limit = QuotingDirection == Sides.Buy ? (decimal)(_bestprice + BestPriceOffset) : (decimal)(_bestprice - BestPriceOffset); //var md = GetFilteredQuotes(QuotingDirection); var md11 = Connector.GetFilteredMarketDepth(this.Security); var md = QuotingDirection == Sides.Buy ? md11.Bids : md11.Asks;

        if (md != null)
        {
            int i = 0;
            foreach (var q in md)
            {
                if (QuotingDirection == Sides.Buy && q.Price <= _bestprice
                    || QuotingDirection == Sides.Sell && q.Price >= _bestprice)
                {
                    i -= (int)BestPriceOffset.Value;

                    if (i < 0) i = 0;
                    limit = QuotingDirection == Sides.Buy ?
                        Math.Max(limit, md.ElementAt(i).Price)
                        : Math.Min(limit, md.ElementAt(i).Price);
                    break;
                }
                i++;
            }
        }
        var range = QuotingDirection == Sides.Buy
                        ? new Range<decimal>(_bestprice.Value, limit)
                        : new Range<decimal>(limit, _bestprice.Value);


        return range;

[/code] Цикл можете убрать. Для меня было интересно, чтобы отступ был рассчитан исходя из уровней стакана, а не тупой дельты от лучшей цены.

P.S. Возможно придется также изменить NeedQuoting:

[code=csharp] var _bestprice = BestPrice; if (_bestprice == null || _bestprice == 0) return null;

        if (!acceptablePriceRange.Contains((decimal)_bestprice) || currentVolume != newVolume)
            return _bestprice;
        else
            return null;

[/code]

Спасибо:

Иван З.

Фотография
Дата: 18.02.2015
Ответить


Все это уже было и даже работало[biggrin] [quote]отступ был рассчитан исходя из уровней стакана, а не тупой дельты от лучшей цены.[/quote] что вы имеете ввиду?

Спасибо:

RomSunZ

Фотография
Дата: 24.02.2015
Ответить


А в версии 65 была изменена логика QuotingStrategy? У меня код: [code=csharp] public class myQuotingStrategy : QuotingStrategy { protected override Range GetAcceptablePriceRange() } [/code] при построении проекта начал выдавать ошибку "не найден метод, пригодный для переопределения"...

Спасибо:

RomSunZ

Фотография
Дата: 26.02.2015
Ответить


В версии 4.2.66 проблема осталась. Доступ к переопределению GetAcceptablePriceRange будет, или нужно переделывать логику своего робота?

Спасибо:

Mikhail Sukhov

Фотография
Дата: 03.03.2015
Ответить


[quote=RomSunZ;32732]В версии 4.2.66 проблема осталась. Доступ к переопределению GetAcceptablePriceRange будет, или нужно переделывать логику своего робота?[/quote]

Второе.

Спасибо:

Mikhail Sukhov

Фотография
Дата: 03.03.2015
Ответить


По BestByPrice. Залил исправленное. Просьба проверить.

По BestByVolume. Ничего не понял. Лучше не пытаться исправлять код. Лучше написать что с ним не так. Потому что сечас код написан неправильно с точки зрения S#.

Спасибо:

RomSunZ

Фотография
Дата: 08.03.2015
Ответить


Коннектор Quik Lua, АПИ 4.2.68. В стратегии QuotingStrategy если котируемая заявка была снята в ручную или системой (например на вечернем клиринге), то стратегия никак не отрабатывает этот момент. В логе по этой заявке только такие строки: [quote] 16:12:35.712| |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) принята биржей. ... 16:12:57.155|Debug |LQS_SBER@TQBR_10182|Правило 'Отмена заявки 58272625/811066918 (0xEF627A) OR Полное исполнение 58272625/811066918 (0x311387F) OR Все сделки заявки 58272625/811066918 (0x1C20C5F) OR Ошибка регистрации заявки 58272625/811066918 (0x31E27EC)'. Активация. 16:12:57.155| |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) больше не активна. ... 16:13:06.165| |LQS_SBER@TQBR_10182|Отмена заявки 58272625 (0xF5B24E). 16:13:06.165| |LQS_SBER@TQBR_10182|Отмена заявки 58272625 (0xF5B24E). 16:13:06.165|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:13:16.176|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:13:16.176|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:13:16.176|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:13:16.186|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:13:16.186|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:13:16.186|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:13:16.191|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:13:16.191|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:13:16.191|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:13:16.194|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:13:16.194|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:13:16.194|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:13:16.198|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:13:16.198|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:13:16.198|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:13:16.211|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:13:16.211|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:13:16.211|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:13:16.217|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:13:16.217|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:13:16.217|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. ... 16:16:49.933|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:16:49.933|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:16:49.933|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:16:52.980|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:16:52.980|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:16:52.980|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:16:53.968|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:16:53.968|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:16:53.968|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:16:58.015|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:16:58.015|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:16:58.015|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:17:00.090|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:17:00.090|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:17:00.090|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:17:02.904|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:17:02.904|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:17:02.904|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:17:04.136|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:17:04.136|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. 16:17:04.136|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0xC06E73) OR Изменение стакана инструмента LKOH@TQBR (0x1CC831B)'. Активация. 16:17:05.122|Debug |LQS_SBER@TQBR_10182|Правило 'Изменение стакана инструмента SBER@TQBR (0x3F19E1D) OR Изменение стакана инструмента LKOH@TQBR (0x25EE953)'. Активация. 16:17:05.122|Debug |LQS_SBER@TQBR_10182|Заявка 58272625 (0xF5B24E) в процессе снятия. [/quote] Логичнее было-бы сделать остановку стратегии.

Спасибо:
<< < 2 3 4 5  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy