行情被输入到算法中的方式如下: 1)经纪商软件触发市场数据事件到我的软件中称为ConnectionStatus的客户端类。当市场数据事件被触发时,从Bid、Ask等静态变量的当前值构建一个Quote对象。 一旦报价建立完成,我会尝试将其发送到正在运行的每个策略算法中。以下是我用来执行此操作的代码:
foreach (StrategyAssembler assembler in StrategyAssembleList.GetStrategies())
{
BackgroundWorker thread = strategyThreadPool.GetFreeThread();
if (thread != null)
{
thread.DoWork += new DoWorkEventHandler(assembler.NewIncomingQuote);
thread.RunWorkerAsync(quote);
}
}
StrategyAssembler是一个类,它创建了一个StrategyManager类的实例,而后者又创建了包含实际算法的策略的实例。可能会有4到6个不同的StrategyAssembler实例,每个实例都被添加到StrategyAssembleList的Singleton实例中,该实例是一个BindingList。
传入的报价对象被传递到StrategyAssembler类的NewIncomingQuote方法中。代码如下:
public void NewIncomingQuote(object sender, DoWorkEventArgs e)
{
Quote QUOTE = e.Argument as Quote;
lock (QuoteLocker)
{
manager.LiveQuote(QUOTE);
priorQuote = QUOTE;
}
}
我认为,在将报价传递到manager.LiveQuote(Quote quote)方法之前使用锁定,可以使得“下游”使用该报价的所有对象以线程安全的方式进行消费,但测试结果表明并非如此。有没有一种方式可以将每个StrategyAssembler实例放在自己的线程中,以确保由Strategy Assembler创建的所有对象都是线程安全的,然后将报价馈送到StrategyAssembler?这种思路是否是处理这种情况的适当方式?
感谢您提前给予任何反馈或帮助。
Learning1
manager.LiveQuote()
是做什么的?它是您的策略方法的接口吗?QuoteLocker
是StrategyAssembler
实例成员吗?