Иван З.
|
Date: 2/16/2015
Проверил.
MarketQuotingStrategy также не откатывает на лучшую цену.
при параметре [code=csharp]PriceOffset = Security.PriceStep, [/code] выставляет заявку на BestPrice а должен перед ней.
BestByPriceQuotingStrategy вообще не выставляет заявку.
остальные не смотрел, завтра посмотрю.
|
|
|
|
Thanks:
|
|
|
|
|
|
Mikhail Sukhov
|
Date: 2/16/2015
[quote=Иван З.;32629]
остальные не смотрел, завтра посмотрю.[/quote]
Сырцы теперь есть. Предлагаю сразу обсуждать строчки кода, а не что-то абстрактное.
|
|
|
|
Thanks:
|
|
|
|
|
|
Иван З.
|
Date: 2/18/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]
В таком случае, заявка будет всегда переставляться на параметры заданные стратегией. Кроме случая если она уже стоит на нужной цене.
Изучив код подробней этих стратегий, понял что мое представление о том как они должны работать не совпадают с реализованным.
- BestPriceOffset - Отступ от лучшей цены, на который [h]может [/h]уйти котируемая заявка.
Слово может очень сбивает с толку, в стратегии строго забито, что она в любом случае отступит от лучшей цены на значение BestPriceOffset
В моем представлении, если взять для примера BestByPriceQuotingStrategy, то стратегия должна выставлять заявку на лучшую цену(на то это и [h]BestByPrice[/h]QuotingStrategy). Но если заявка уйдет от BestPrice на значение меньшее чем BestPriceOffset то переставляться не будет.
- PriceOffset - Отступ цены для выставляемой заявки. Определяет размер отступа от лучшей котировки (для покупки прибавляется к цене, для продажи - вычитается).
Этот отступ есть у MarketQuotingStrategy если он положительный а сделка Buy, стратегия выставит заявку на BestPrice - BestPriceOffset + PriceOffset. То есть выше описанный BestPriceOffset тоже вычитается.
В общем мне кажется BestPriceOffset сейчас работает не так как надо, а GetAcceptablePriceRange() все таки нужный метод, по крайней мере для BestByPriceQuotingStrategy. Править?
В BestByVolumeQuotingStrategy я исправил один метод NeedQuoting. В коде постарался пояснения написать по подробнее. Протестировал, стратегия работает, выложил в ВК.
|
|
|
|
Thanks:
|
|
|
|
|
|
RomSunZ
|
Date: 2/18/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]
|
|
|
|
Thanks:
|
|
|
|
|
|
Иван З.
|
Date: 2/18/2015
Все это уже было и даже работало[biggrin]
[quote]отступ был рассчитан исходя из уровней стакана, а не тупой дельты от лучшей цены.[/quote]
что вы имеете ввиду?
|
|
|
|
Thanks:
|
|
|
|
|
|
RomSunZ
|
Date: 2/24/2015
А в версии 65 была изменена логика QuotingStrategy?
У меня код:
[code=csharp]
public class myQuotingStrategy : QuotingStrategy
{
protected override Range GetAcceptablePriceRange()
}
[/code]
при построении проекта начал выдавать ошибку "не найден метод, пригодный для переопределения"...
|
|
|
|
Thanks:
|
|
|
|
|
|
RomSunZ
|
Date: 2/26/2015
В версии 4.2.66 проблема осталась. Доступ к переопределению GetAcceptablePriceRange будет, или нужно переделывать логику своего робота?
|
|
|
|
Thanks:
|
|
|
|
|
|
Mikhail Sukhov
|
Date: 3/3/2015
[quote=RomSunZ;32732]В версии 4.2.66 проблема осталась. Доступ к переопределению GetAcceptablePriceRange будет, или нужно переделывать логику своего робота?[/quote]
Второе.
|
|
|
|
Thanks:
|
|
|
|
|
|
Mikhail Sukhov
|
Date: 3/3/2015
По BestByPrice. Залил исправленное. Просьба проверить.
По BestByVolume. Ничего не понял. Лучше не пытаться исправлять код. Лучше написать что с ним не так. Потому что сечас код написан неправильно с точки зрения S#.
|
|
|
|
Thanks:
|
|
|
|
|
|
RomSunZ
|
Date: 3/8/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]
Логичнее было-бы сделать остановку стратегии.
|
|
|
|
Thanks:
|
|
|
|
|