Грааль !!!
Atom
1/4/2014
longtrades


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

[color=red][u][b]Никак!!! Он их видит но не учитывает положение нашего ордера в стакане.[/b][/u][/color]

Вот вам доказательство: берем стандартный пример SampleHistoryTesting в настройка трейдера изменяем :

MarketTimeChangedInterval = TimeSpan.FromMilliseconds(10);

теперь содержимое SmaStrategy.cs изменяем так что-бы каждые 10мс мы проверяли свои ордера на покупку и продажу и переставляли их на лучший бид и офер + контроль позиции.

[code=csharp] 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;
            }
        }
    }


}

} [/code]

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

[color=red][b]Запускать на реале не советую , слив гарантирован!!![/b][/color]




Thanks:


< 1 2 
Mikhail Sukhov

Avatar
Date: 1/25/2014
Reply


[quote=longtrades;29319]Встречное предложение , переделать событие МаркетТаймЧендж так что бы оно выдавало не ТаймСпан , Трейдер.КарентТайм и сделать возможность у ХисториТрейдера получать стакан на Определенное время, тогда точно можно будет избежать заглядывания в будущее.[/quote]

Объясняю еще раз. Стаканы не хранятся. Алгоритм такой. Загрузили стакана. Передали в матчер + стратегию. Удалили стакан. Начало цикла. То, что у вас что-то не так работает, вам нужно смотреть в своем коде. Как смотреть я уже сказал.

Thanks:

Евгений Гович

Avatar
Date: 1/25/2014
Reply


МАшки рулят)))

Thanks: Mikhail Sukhov

Mikhail Sukhov

Avatar
Date: 1/25/2014
Reply


[quote=Евгений Гович;29322]МАшки рулят)))[/quote]

А я о чем? Человеку нужно очередь в банке занимать за кредитом.[lol]

Thanks:

Rebelion

Avatar
Date: 1/25/2014
Reply


Михаил, а можно ли будет к какой-либо версии новой S#.API в TrendMarketDepthGenerator прикрутить контейнер, который бы содержал информацию о текущем стакане и событие, к которому можно было бы подписаться, чтобы получить обновлённый стакан после генерации оного заново? Это для логирования - и Вам будет полезнее, т.к. мы сможем логи присылать. Или это реализовано уже, а я просто не знаю о подобном функционале генерируемого стакана?

Thanks:

Mikhail Sukhov

Avatar
Date: 1/25/2014
Reply


[quote=Rebelion;29327]Михаил, а можно ли будет к какой-либо версии новой S#.API в TrendMarketDepthGenerator прикрутить контейнер, который бы содержал информацию о текущем стакане и событие[/quote]

Это не требуется в принципе. Генераторы, как и матчер, как и стратегия пользовательская, пропускается через каждое сообщение Message, что загружается из истории (тоесть, вообще вся информация). Поэтому в генераторе нужно или логировать все входящее в него, или как-то накапливать изменения самостоятельно.

Thanks:

longtrades

Avatar
Date: 1/25/2014
Reply


[quote=Михаил Сухов;29323][quote=Евгений Гович;29322]МАшки рулят)))[/quote]

А я о чем? Человеку нужно очередь в банке занимать за кредитом.[lol][/quote]

Не знаю что такое МАшки , а Грааль я дарю вам без притензий на авторское право , так что можете бежать в банк :)

А если серйозно, то слишком много багов с каждой новой версией вашей библиотеки ... потому и осторожно отношусь уже к ней.

Thanks:

Mikhail Sukhov

Avatar
Date: 1/25/2014
Reply


[quote=longtrades;29332] А если серйозно, то слишком много багов с каждой новой версией вашей библиотеки ... потому и осторожно отношусь уже к ней. [/quote]

Бага у вас в коде. Это даже видно невооруженным глазом.

Утомили вы меня. Все ваши следующие вопросы будут без ответа.[wink]

Thanks:

longtrades

Avatar
Date: 1/26/2014
Reply


[quote=Михаил Сухов;29333]Бага у вас в коде. Это даже видно невооруженным глазом. [/quote]

Баги в коде нет, если б была, вы б на нее указали и диалог можно б было не продолжать.

[quote=Михаил Сухов;29333]Утомили вы меня. Все ваши следующие вопросы будут без ответа.[wink] [/quote]

Ваше право. Я лишь хотел помочь вам улучшить ваше детище, что б на нем и хфт тестировать можно было , если вам не интересно можете не овечать.

Thanks:
< 1 2 

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy