交易:如何声明“指标”接口

本文关键字:指标 接口 声明 何声明 交易 | 更新日期: 2023-09-27 18:17:34

我试着在"量化金融"上问这个问题,但似乎这是一个更好的地方,因为这个问题更多的是关于编程而不是交易

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

我使用c#,我想声明Indicator接口如下:

interface Indicator
{
    double Value { get; }
    event Action<Void> ValueUpdated;
}

或者甚至可能像这样:

interface Indicator
{
    event Action<Double> ValueUpdated;
}

我认为"纯价格"也是一个微不足道的指标:

class PriceIndicator : Indicator {
    PriceIndicator(string ticker) {
        ....
    }
}

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;
     }
}

那么一个知道所有需要计算的指标的组成部分会在每次价格变化时调用这个方法,并在图表或其他地方反映出来。

实际上这个问题已经在许多现有的应用程序中解决了,一些你可以检查的例子是Ninjatrader(在c#中实现)或Metatrader(用C实现)

就我的理解而言,指标应该在市场数据中发生一些有趣的事情后执行一些操作。这意味着接口必须对所有有趣的事件发出警报,这些事件可能是纯粹的市场数据事件或由其他指标触发的事件。我只需要一个非常简单的接口,它接收市场数据事件并返回一些事件,由系统的其他部分进行解释。此事件将被分派到一个大的内部事件队列。

 interface Indicator {
     Event processEvent(MarketDataEvent e);
 } 

因此,MarketDataEvents流要么直接来自市场,要么来自其他一些指标,然后一旦满足processsevent方法中的某个阈值或条件,该方法将返回一个非空事件,以部署到内部事件队列,否则该方法将只返回空值。

首先,我会弄清楚你是否真的有一个需要解决的问题。接口是一种契约,它保证特定的功能(方法、属性等)在消费者调用时存在。

所以如果你实际上不需要接口,我不会使用它。然而,作为一个在NinjaTrader中工作的例子,我们创建了一个名为tradezone的自定义DrawingTool。此绘图工具具有特定的功能,需要为其他指标提供。

保证被检查的绘图工具具有所需功能的唯一方法是使用接口。例如,看看下面的代码,它遍历图表中的对象。

for (int i = chartControl.ChartObjects.Count - 1; i >= 0; i--)
{
    Gui.NinjaScript.IChartObject chartObject = chartControl.ChartObjects[i];
    if ((chartObject is DrawingTool) == false) continue;
    if (chartObject is ITradeZone)
    {
        ITradeZone tradeZone = chartObject as ITradeZone;
        if (tradeZone.CreatedByTradeManager)
        {
            // Do stuff with the tradeZone object...
        }
    }
}

我们首先检查它是否是一个DrawingTool。如果不是,我们忽略它。

然后检查它是否实现了我们的ITradeZone接口。如果是这样,那么我们知道我们可以调用由该接口保证的特定功能,在本例中是CreatedByTradeManager属性。

(注意,还可以检查对象实例的类型名称甚至标记值,但标记可以由用户更改,如果对象的名称发生变化,那么这也可能是一个失败的条件。)