Грааль !!!
Atom
04.01.2014


В соседней ветке задал Михаилу вопрос как Тестер учитывает стаканы , сам на него отвечаю :

Никак!!! Он их видит но не учитывает положение нашего ордера в стакане.

Вот вам доказательство: берем стандартный пример 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;
                }
            }
        }

	
	}
}


и получаем ГРААЛЬ !!!

Запускать на реале не советую , слив гарантирован!!!



Спасибо:


1 2  >
Mikhail Sukhov

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


longtrades Перейти
В соседней ветке задал Михаилу вопрос как Тестер учитывает стаканы , сам на него отвечаю :

Никак!!! Он их видит но не учитывает положение нашего ордера в стакане.


Что подразумевается под словом "положение"? Если имеется ввиду цена заявки относительно цен в стакане, то, конечно же, учитывается. Матчеру вообще не известно, какие заявки пользовательские, а какие из сохраненной истории. Ему просто льется поток и он их матчит между собой.
Спасибо:

longtrades

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


Михаил Сухов Перейти

Что подразумевается под словом "положение"?

Имеется ввиду положение в очереди на даном уровне цены , тоесть если моя заявка пришла 10-той она должна уйти 10-той, не первой и не последней и не когда произойдет прохождение цены сквозь уровень.

Так что для начала нужно сделать хотя бы что бы заявка считалась исполненой когда обьем на даном уловне в стакане равен нулю , ну еще лучше что бы учитывалось положение в очереди заявки на уровне.
Спасибо:

Mikhail Sukhov

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


longtrades Перейти

Имеется ввиду положение в очереди на даном уровне цены , тоесть если моя заявка пришла 10-той она должна уйти 10-той, не первой и не последней и не когда произойдет прохождение цены сквозь уровень.


А, это да. Изначально из-за месседжей не доделали, но после серии багов с эмулятором решили доделать и этот таск. Так что выйдет в новой версии вместе с фиксами на баги. Теперь главное баги отловить быстрее.
Спасибо:

longtrades

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


Ждем с нетерпением новой версии,

Спасибо.

Спасибо:

longtrades

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


Наконец дошли руки проверить работу 4.2.2.2,
Так вот : ГРААЛЬ продолжает показывать потрясающие результаты на тестировании !!!

Так что доверять тестированию по стаканах с использование библиотеки StockSharp пока нельзя !!!

Получается что тестер заглядывает в будущее !!!


Если есть какие-то конструктивные предложения как сделать что-б тестер не заглядывал в будущее прошу высказывать.
Спасибо:

longtrades

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


Попробовал переделать чтобы реагировать не на изменение времени, а на изменение стакана :
Код

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;
                }
            }
        }


    }
}


Стратегия делает несколько сделок и останавливается , заявки идут, а сделки нет.
Спасибо:

Mikhail Sukhov

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


longtrades Перейти

Если есть какие-то конструктивные предложения как сделать что-б тестер не заглядывал в будущее прошу высказывать.


А с чего вы взяли, что проблема в тестере?[biggrin] У нас тестер поточный, а не дискретный. Плюс поток обработки поступающих данных и расчетов - один. Тоесть подглядывание в принципе быть не может, потому что будущее состояние еще не загружено в диска.
Спасибо:

longtrades

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


Других обьяснений такой резко возростающей еквити прочи без просадок у меня нет , причем на такой елементароной стратегии .
Уверен больше чем на 1000% процентов что даная стратегия сольет в реале, даже если ее разместить на М1.
Спасибо:

Mikhail Sukhov

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


А причем тут объяснение? Логи и анализ сделок. Под лежачей камень вода не течет.
Спасибо:

longtrades

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


Встречное предложение , переделать событие МаркетТаймЧендж так что бы оно выдавало не ТаймСпан , Трейдер.КарентТайм и сделать возможность у ХисториТрейдера получать стакан на Определенное время, тогда точно можно будет избежать заглядывания в будущее.
Спасибо:
1 2  >

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

loading
clippy