проблемы с остановкой стратегии

проблемы с остановкой стратегии
Atom
24.08.2010
Serg


где-то в программе пытаюсь остановить стратегию if (strat.ProcessState == StrategyProcessStates.Stopped) strat.Start(); else strat.Stop();

... в моей производной стратегии от Strategy ... protected override void OnStopping() { Trader.QuotesChanged -= _trader_QuotesChanged; }

после выхода из этого метода программа зависает(чаще чем не виснет) по непонятным для меня причинам. Если кто сталкивался подскажите в чем может быть проблема? спс


Теги:


Спасибо:


1 2 3  >
Tauler

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


Вы просто в момент остановки стратегии (когда она Stopped) заново ее стартуете, а когда она Runned - останавливаетете. получается вечный цикл - старт - остановка-старт-остановка

Спасибо:

Serg

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


Не совсем понимаю почему... ведь первая часть кода вызывается при нажатии кнопки и никак не должна зацикливаться... или я не прав?

Спасибо:

Mikhail Sukhov

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


А что за стратегия? Собственная или из примеров?

Спасибо:

Serg

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


ÓÏÂÓÔ×ÅÎÎÁÑ. public class Arbitrage : Strategy { ... ÐÅÒÅÍÅÎÎÙÅ ... public Arbitrage(QuikTrader trader, TradeSec ts1, TradeSec ts2, double spreadInPercent, int minimalQty, int maxiQty) : base() { _trader = trader; this.Interval = TimeSpan.FromSeconds(1); minQty = minimalQty; maxQty = maxiQty; Portf1 = ts1.p; Portf2 = ts2.p; ClientCode1 = ts1.client; ClientCode2 = ts2.client; Sec1 = ts1.s; Sec2 = ts2.s; k1 = ts1.koef; k2 = ts2.koef; Spread = spreadInPercent; md1 = new MarketDepth(Sec1); md2 = new MarketDepth(Sec2); _trader.RegisterQuotes(Sec1); _trader.RegisterQuotes(Sec2); _trader.QuotesChanged += new Action<MarketDepth>(_trader_QuotesChanged); }

   void _trader_QuotesChanged(MarketDepth md)
    {
        if (md.Security == Sec1)
        {
            md1 = md;
        }
        if (md.Security == Sec2)
        {
            md2 = md;
        }
    }

   protected override bool OnProcess()
    {
        if (this.ProcessState == StrategyProcessStates.Stopping)
        {
            return false;
        }
        if (!this.buzzy)
        {
            this.buzzy = true;
            var ords = AlgoSpread();
            if (ords != null && ords.Length >= 2)
            {
                // done ËÌÉÒÉÎÇ?
                if (!Sec1.Exchange.IsTradeTime(Trader) || !

Sec2.Exchange.IsTradeTime(Trader)) { AddLog(ErrorState, "îÅÔÏÒÇÏ×ÒÅ ×ÒÅÍÑ", this); return true; }

               foreach (Order o in ords)
                {
                    if (o.Portfolio == Portf1)
                        _trader.ClientCode = ClientCode1 + "//" +

orderParNum.ToString(); else if (o.Portfolio == Portf2) _trader.ClientCode = ClientCode2 + "//" + orderParNum.ToString(); else _trader.ClientCode = "X";

                   AddLog(ErrorState, "new order " +

o.Direction.ToString() + " " + o.Security.Code + " " + o.Price + " " + o.Volume, this);

                   try
                    {
                        RegisterOrder(o);
                    }
                    catch (Exception regOrderError)
                    {
                        AddLog(this.ErrorState, " ïÛÉÂËÁ

×ÙÓÔÁ×ÌÅÎÉÑ ÚÁÑ×ËÉ", this); AddLog(ErrorState, regOrderError.Message, this); } } } this.buzzy = false; } return true; }

   protected override void OnRunned()
    {
        base.OnRunned();
        buzzy = false;
    }

   void QuotesChanged(OrderDirections arg1, IDictionary<int,

Quote> arg2) { if (!buzzy) this.OnProcess(); }

   protected override void OnStopping()
    {
        Trader.QuotesChanged -= _trader_QuotesChanged;
        base.OnStopping();
    }

×ÏÔ ÐÒÉÍÅÒÎÏ ÔÁË. ÓÔÁÒÁÌÓÑ ÄÅÌÁÔØ ËÁË × ÐÒÉÍÅÒÁÈ ÎÏ ×ÉÄÉÍÏ ÞÔÏÔÏ ÕÐÕÓÔÉÌ.

Спасибо:

Serg

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


после выхода из OnStopping() сразу завис :(

Спасибо:

Mikhail Sukhov

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


А что значит завис? В чем это проявилось?

Спасибо:

Serg

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


прога виснет. в логах вижу что стратегия останавливается но не вижу что она остановилась. еще раз повторюсь такая ситуация проявляется не регулярно но довольно часто.

Спасибо:

Mikhail Sukhov

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


Так прога виснет или стратегия не нотифицирует о своей остановке? Какая версия S#?

Спасибо:

Serg

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


кажется разобрался. я видимо заумно (не правильно) использовал Strategy.Log вот как было:

private void ToLog(string message) { if (this.messageBox.InvokeRequired) { SetTextDeleg d = new SetTextDeleg(ToLog); this.Invoke(d, new object[] ); } else

messageBox.AppendText(DateTime.Now.ToString("HH:mm:ss.fff")+ ": " + message + "\r\n"); }

void Log(Strategy arg1, StrategyErrorStates arg2, string arg3) { ToLog(arg3); }

strat = new Arbitrage(quik, t1, t2, Convert.ToDouble(textBox1.Text), 1, 20); strat.Log += new Action<Strategy, StrategyErrorStates, string>(Log);

избавившись от strat.Log += ... все стало работать нормально. осталось понять где ошибка. думаю в методе ToLog...

Спасибо:

Serg

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


Михаил, а в чем может быть причина того что во время выполнения стратегии метод ToLog работает нормально, а после OnStopping происходит зависание?

Спасибо:
1 2 3  >

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

loading
clippy