C# 交易:如何声明'Indicator'接口

C# 交易:如何声明'Indicator'接口,c#,trading,algorithmic-trading,domain-data-modelling,C#,Trading,Algorithmic Trading,Domain Data Modelling,我曾试图在quantitive finance提出这个问题,但似乎这是一个更好的地方,因为这个问题更多的是关于编程而不是交易 如何声明指示器接口?建立指标模型的正确方法是什么 我使用的是c,我想像这样声明指示符接口: interface Indicator { double Value { get; } event Action<Void> ValueUpdated; } interface Indicator { event Action<Doubl

我曾试图在quantitive finance提出这个问题,但似乎这是一个更好的地方,因为这个问题更多的是关于编程而不是交易

如何声明指示器接口?建立指标模型的正确方法是什么

我使用的是c,我想像这样声明指示符接口:

interface Indicator
{
    double Value { get; }
    event Action<Void> ValueUpdated;
}
interface Indicator
{
    event Action<Double> ValueUpdated;
}
MA示例:

class MovingAverage : Indicator {
    private PriceIndicator price;

    public MovingAverage(PriceIndicator price, int period) {
        ....
    }

    // when price.ValueUpdated event occurs need to recalculate MA and raise ValueUpdated event
}

你觉得怎么样?欢迎提出任何建议

我想要这样的东西

public interface IIndicator
{
      double Calculate();
}
因此,组成的指标可以是

public class CompositeIndicator: IIndicator
{
     private MovingAverage _ma;

     public CompositeIndicator(/* your parameters here */)
     {
         _ma = new MovingAverage();
     }

     public double Calculate()
     {
         var mavalue = _ma.Calculate();
         //do more stuff
         return mavalue;
     }
}
然后,知道需要计算的所有指标的组件将在每次价格发生变化时调用此方法,并在图表或其他地方反映该方法


实际上,这个问题已经在许多现有的应用程序中得到了解决,您可以检查的一些示例是用C实现的Ninjatrader或用C实现的Metatrader,据我所知,指示器应该在市场数据中发生有趣的事情后执行一些操作。这意味着界面必须在所有感兴趣的事件上发出警报,这些事件可能是纯市场数据事件或由其他指标触发的事件。我只是有一个非常简单的界面,它接收市场数据事件,并返回一些事件供系统的其他部分解释。此事件将被调度到大型内部事件队列

 interface Indicator {
     Event processEvent(MarketDataEvent e);
 } 

因此,MarketDataEvents流直接从市场或其他指标进入,然后一旦processEvent方法中满足某个阈值或条件,该方法将返回一个非null事件以部署到内部事件队列,否则该方法将只返回null值。

Ok,但你真正的问题是什么?你的代码不起作用吗?我一定是遗漏了什么-实际问题是什么?您发布的接口声明很好。问题是如何声明指标接口和相应的实现,例如移动平均值。是否考虑纯价格作为指标是好还是不好。如果有人知道一些代码的链接,这些代码已经声明了指标移动平均值等。在C链接上,你可能想看看Ninjatrader,看看它是如何实现的。我不会因为一个事件而让指示器自动更新自己,我会有另一个类来做它,指示器的抽象意味着它知道如何计算一个值,但它不需要知道何时做。但是如果你的解决方案没有更多的上下文,真的很难说出来!但如何解决计算过多的问题呢?假设我有100个策略,每个策略都使用sp500上相同的指标MA,这是一个很好的例子。当新的一组数据到达时,所有100个策略都需要新的值,这将导致对相同数据进行100次计算,这在hft中非常糟糕。那么,您可以像在示例中一样在构造函数中发送实例,并且对所有指标只使用一个实例。或者,您可以使用缓存,以便在当前baralso没有值的情况下,MA只会重新计算自身。因此,对于MA,不清楚计算是如何工作的。当我在收到新值时更新值时,我只需要丢弃最旧的值并添加新值,这是O1操作。在你的情况下,MA将开启,且常数更差-实际上是100*On而不是1*O1。我刚刚发布了一个示例,当然,一个指标将需要以某种方式共享价格序列数据。再次,我建议你看看一个指标是如何在metatrader中实现的。我不知道从哪里下载metatrader或ninjatrader源文件,我想这是一个有私有资源的私有项目
 interface Indicator {
     Event processEvent(MarketDataEvent e);
 }