Mikhail Sukhov
|
Date: 1/4/2014
longtrades В соседней ветке задал Михаилу вопрос как Тестер учитывает стаканы , сам на него отвечаю :
Никак!!! Он их видит но не учитывает положение нашего ордера в стакане.
Что подразумевается под словом "положение"? Если имеется ввиду цена заявки относительно цен в стакане, то, конечно же, учитывается. Матчеру вообще не известно, какие заявки пользовательские, а какие из сохраненной истории. Ему просто льется поток и он их матчит между собой.
|
|
Thanks:
|
|
|
|
|
longtrades
|
Date: 1/4/2014
Михаил Сухов Что подразумевается под словом "положение"?
Имеется ввиду положение в очереди на даном уровне цены , тоесть если моя заявка пришла 10-той она должна уйти 10-той, не первой и не последней и не когда произойдет прохождение цены сквозь уровень. Так что для начала нужно сделать хотя бы что бы заявка считалась исполненой когда обьем на даном уловне в стакане равен нулю , ну еще лучше что бы учитывалось положение в очереди заявки на уровне.
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 1/4/2014
longtrades Имеется ввиду положение в очереди на даном уровне цены , тоесть если моя заявка пришла 10-той она должна уйти 10-той, не первой и не последней и не когда произойдет прохождение цены сквозь уровень.
А, это да. Изначально из-за месседжей не доделали, но после серии багов с эмулятором решили доделать и этот таск. Так что выйдет в новой версии вместе с фиксами на баги. Теперь главное баги отловить быстрее.
|
|
Thanks:
|
|
|
|
|
longtrades
|
Date: 1/4/2014
Ждем с нетерпением новой версии,
Спасибо.
|
|
Thanks:
|
|
|
|
|
longtrades
|
Date: 1/25/2014
Наконец дошли руки проверить работу 4.2.2.2, Так вот : ГРААЛЬ продолжает показывать потрясающие результаты на тестировании !!!
Так что доверять тестированию по стаканах с использование библиотеки StockSharp пока нельзя !!!
Получается что тестер заглядывает в будущее !!!
Если есть какие-то конструктивные предложения как сделать что-б тестер не заглядывал в будущее прошу высказывать.
|
|
Thanks:
|
|
|
|
|
longtrades
|
Date: 1/25/2014
|
|
|
|
Попробовал переделать чтобы реагировать не на изменение времени, а на изменение стакана : Code
namespace SampleHistoryTesting
{
using Ecng.Common;
using System.Collections.Generic;
using System.Linq;
using StockSharp.Algo;
using StockSharp.Algo.Candles;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Indicators.Trend;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Testing;
using StockSharp.Logging;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
class SmaStrategy : Strategy
{
private readonly CandleSeries _series;
private bool _isShortLessThenLong;
public SmaStrategy(CandleSeries series, SimpleMovingAverage longSma, SimpleMovingAverage shortSma)
{
_series = series;
LongSma = longSma;
ShortSma = shortSma;
}
public SimpleMovingAverage LongSma { get; private set; }
public SimpleMovingAverage ShortSma { get; private set; }
protected override void OnStarted()
{
Connector.MarketDepthsChanged += items => ProcessDepth(items);
// this.Connector.MarketTimeChanged += t => ProcessDepth();
// запоминаем текущее положение относительно друг друга
_isShortLessThenLong = ShortSma.GetCurrentValue() < LongSma.GetCurrentValue();
base.OnStarted();
}
Order buy_order = null;
Order sell_order = null;
private void ProcessDepth(IEnumerable<MarketDepth> depths)
{
var depth = depths.Last();
var Volume = 1;
if (this.Position <= 0)
{
if (buy_order != null)
{
if (buy_order.State == OrderStates.Done || buy_order.State == OrderStates.Failed)
{
buy_order = this.CreateOrder(OrderDirections.Buy, depth.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
else
if (buy_order.Price != Security.BestBid.Price)
{
this.CancelOrder(buy_order);
buy_order = this.CreateOrder(OrderDirections.Buy, depth.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
}
else
{
buy_order = this.CreateOrder(OrderDirections.Buy, depth.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
}
else
{
if (buy_order != null)
{
this.CancelOrder(buy_order);
buy_order = null;
}
}
if (this.Position >= 0)
{
if (sell_order != null)
{
if (sell_order.State == OrderStates.Done || sell_order.State == OrderStates.Failed)
{
sell_order = this.CreateOrder(OrderDirections.Sell, depth.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
else
if (sell_order.Price != Security.BestAsk.Price)
{
this.CancelOrder(sell_order);
sell_order = this.CreateOrder(OrderDirections.Sell, depth.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
}
else
{
sell_order = this.CreateOrder(OrderDirections.Sell, depth.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
}
else
{
if (sell_order != null)
{
this.CancelOrder(sell_order);
sell_order = null;
}
}
}
}
}
Стратегия делает несколько сделок и останавливается , заявки идут, а сделки нет.
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 1/25/2014
longtrades Если есть какие-то конструктивные предложения как сделать что-б тестер не заглядывал в будущее прошу высказывать.
А с чего вы взяли, что проблема в тестере?[biggrin] У нас тестер поточный, а не дискретный. Плюс поток обработки поступающих данных и расчетов - один. Тоесть подглядывание в принципе быть не может, потому что будущее состояние еще не загружено в диска.
|
|
Thanks:
|
|
|
|
|
longtrades
|
Date: 1/25/2014
Других обьяснений такой резко возростающей еквити прочи без просадок у меня нет , причем на такой елементароной стратегии . Уверен больше чем на 1000% процентов что даная стратегия сольет в реале, даже если ее разместить на М1.
|
|
Thanks:
|
|
|
|
|
Mikhail Sukhov
|
Date: 1/25/2014
А причем тут объяснение? Логи и анализ сделок. Под лежачей камень вода не течет.
|
|
Thanks:
|
|
|
|
|
longtrades
|
Date: 1/25/2014
Встречное предложение , переделать событие МаркетТаймЧендж так что бы оно выдавало не ТаймСпан , Трейдер.КарентТайм и сделать возможность у ХисториТрейдера получать стакан на Определенное время, тогда точно можно будет избежать заглядывания в будущее.
|
|
Thanks:
|
|
|
|