1

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

你如何声明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
}

你怎么看?欢迎任何建议!

4

3 回答 3

0

我会有这样的东西

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 实现)

于 2011-12-11T14:57:25.183 回答
0

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

 interface Indicator {
     Event processEvent(MarketDataEvent e);
 } 

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

于 2013-10-15T09:58:39.233 回答
0

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

因此,如果您实际上不需要接口,我就不会使用。然而,作为 NinjaTrader 中的一个工作示例,我们创建了一个名为“TradeZone”的自定义绘图工具。此绘图工具具有需要对其他指标可用的特定功能。

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

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

我们首先检查它是否是绘图工具。如果不是,我们忽略它。

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

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

于 2021-08-12T20:24:08.587 回答