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


где-то в программе пытаюсь остановить стратегию
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[] { message });
}
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