В соседней ветке задал Михаилу вопрос как Тестер учитывает стаканы , сам на него отвечаю :
<u>Никак!!! Он их видит но не учитывает положение нашего ордера в стакане.</u>
Вот вам доказательство: берем стандартный пример SampleHistoryTesting в настройка трейдера изменяем :
MarketTimeChangedInterval = TimeSpan.FromMilliseconds(10);
теперь содержимое SmaStrategy.cs изменяем так что-бы каждые 10мс мы проверяли свои ордера на покупку и продажу и переставляли их на лучший бид и офер + контроль позиции.
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()
{
this.Security.Trader.NewMyTrades += trades => NewMyTrades(trades);
this.Trader.MarketTimeChanged += t => ProcessDepth();
// запоминаем текущее положение относительно друг друга
_isShortLessThenLong = ShortSma.GetCurrentValue() < LongSma.GetCurrentValue();
base.OnStarted();
}
private void NewMyTrades(IEnumerable<MyTrade> trades)
{
foreach (var tr in trades)
{
if (tr.Order.GetTrades().Sum(x => x.Trade.Volume) > tr.Order.Volume)
{
var Trtrades = this.Trader.MyTrades;
var stp = 0;
}
}
}
Order buy_order = null;
Order sell_order = null;
private void ProcessDepth()
{
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, Security.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
else
if (buy_order.Price != Security.BestBid.Price)
{
this.CancelOrder(buy_order);
buy_order = this.CreateOrder(OrderDirections.Buy, Security.BestBid.Price, Volume);
RegisterOrder(buy_order);
}
}
else
{
buy_order = this.CreateOrder(OrderDirections.Buy, Security.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, Security.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
else
if (sell_order.Price != Security.BestAsk.Price)
{
this.CancelOrder(sell_order);
sell_order = this.CreateOrder(OrderDirections.Sell, Security.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
}
else
{
sell_order = this.CreateOrder(OrderDirections.Sell, Security.BestAsk.Price, Volume);
RegisterOrder(sell_order);
}
}
else
{
if (sell_order != null)
{
this.CancelOrder(sell_order);
sell_order = null;
}
}
}
}
}
и получаем ГРААЛЬ !!!
Запускать на реале не советую , слив гарантирован!!!
Kommentare (18)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Что подразумевается под словом "положение"? Если имеется ввиду цена заявки относительно цен в стакане, то, конечно же, учитывается. Матчеру вообще не известно, какие заявки пользовательские, а какие из сохраненной истории. Ему просто льется поток и он их матчит между собой.
Так что для начала нужно сделать хотя бы что бы заявка считалась исполненой когда обьем на даном уловне в стакане равен нулю , ну еще лучше что бы учитывалось положение в очереди заявки на уровне.
А, это да. Изначально из-за месседжей не доделали, но после серии багов с эмулятором решили доделать и этот таск. Так что выйдет в новой версии вместе с фиксами на баги. Теперь главное баги отловить быстрее.
Ждем с нетерпением новой версии,
Спасибо.
Наконец дошли руки проверить работу 4.2.2.2, Так вот ::[ГРААЛЬ продолжает показывать потрясающие результаты на тестировании !!!]
Так что доверять тестированию по стаканах с использование библиотеки StockSharp пока нельзя !!!
Получается что тестер заглядывает в будущее !!!
Если есть какие-то конструктивные предложения как сделать что-б тестер не заглядывал в будущее прошу высказывать.
А с чего вы взяли, что проблема в тестере?😀 У нас тестер поточный, а не дискретный. Плюс поток обработки поступающих данных и расчетов - один. Тоесть подглядывание в принципе быть не может, потому что будущее состояние еще не загружено в диска.
Других обьяснений такой резко возростающей еквити прочи без просадок у меня нет , причем на такой елементароной стратегии . Уверен больше чем на 1000% процентов что даная стратегия сольет в реале, даже если ее разместить на М1.
Попробовал переделать чтобы реагировать не на изменение времени, а на изменение стакана :
Стратегия делает несколько сделок и останавливается , заявки идут, а сделки нет.
А причем тут объяснение? Логи и анализ сделок. Под лежачей камень вода не течет.
Встречное предложение , переделать событие МаркетТаймЧендж так что бы оно выдавало не ТаймСпан , Трейдер.КарентТайм и сделать возможность у ХисториТрейдера получать стакан на Определенное время, тогда точно можно будет избежать заглядывания в будущее.
Объясняю еще раз. Стаканы не хранятся. Алгоритм такой. Загрузили стакана. Передали в матчер + стратегию. Удалили стакан. Начало цикла. То, что у вас что-то не так работает, вам нужно смотреть в своем коде. Как смотреть я уже сказал.
МАшки рулят)))
А я о чем? Человеку нужно очередь в банке занимать за кредитом.😂
Не знаю что такое МАшки , а Грааль я дарю вам без притензий на авторское право , так что можете бежать в банк :)
А если серйозно, то слишком много багов с каждой новой версией вашей библиотеки ... потому и осторожно отношусь уже к ней.
Бага у вас в коде. Это даже видно невооруженным глазом.
Утомили вы меня. Все ваши следующие вопросы будут без ответа.😉
Баги в коде нет, если б была, вы б на нее указали и диалог можно б было не продолжать.
Ваше право. Я лишь хотел помочь вам улучшить ваше детище, что б на нем и хфт тестировать можно было , если вам не интересно можете не овечать.
Михаил, а можно ли будет к какой-либо версии новой S#.API в TrendMarketDepthGenerator прикрутить контейнер, который бы содержал информацию о текущем стакане и событие, к которому можно было бы подписаться, чтобы получить обновлённый стакан после генерации оного заново? Это для логирования - и Вам будет полезнее, т.к. мы сможем логи присылать. Или это реализовано уже, а я просто не знаю о подобном функционале генерируемого стакана?
Это не требуется в принципе. Генераторы, как и матчер, как и стратегия пользовательская, пропускается через каждое сообщение Message, что загружается из истории (тоесть, вообще вся информация). Поэтому в генераторе нужно или логировать все входящее в него, или как-то накапливать изменения самостоятельно.