Commit c2896c36 authored by hetao's avatar hetao

Update 自定义绩效指标.md

parent abcabe52
下面是QuantBox插件实现的一个交易手续费的绩效指标,OpenQuant 里面的自定义绩效指标需要
从 PortfolioStatisticsItem 继承类型,ICustomStatisticsType 是 QuantBox 插件设计的
一个接口方便安装自定义绩效指标。
## 自定义绩效指标
在 AllInOne 的 CustomStatistics 有一个完整的示例,OpenQuant 里面的自定义绩效指标需要
从 PortfolioStatisticsItem 继承类型,ICustomStatisticsType 是 QuantBox 插件设计的一个接口
方便安装自定义绩效指标。
## 安装使用
在场景文件中通过调用`framework.StatisticsManager.Change()` 来安装使用
`Change` 方法需要指定一个被替换的指标,就是用自定义的指标去替换系统自带的指标。
这么做是因为 OpenQuant 的实现有问题,如果直接使用`AddStatisticsItem`方法添加
一个新的指标会引发系统异常OpenQuant崩溃,只能是替换系统自带指标来使用自定义指标。
```c#
public class TradesCost : PortfolioStatisticsItem, ICustomStatisticsType
public override void Run()
{
// 把 MARRatio 指标替换成 TradesCommission 指标
framework.StatisticsManager.Change(PortfolioStatisticsType.MARRatio, new TradesCommission());
}
```
## 引用其他指标
如果需要在指标中使用其他指标的数据可以在构造函数中调用 `Subscribe` 订阅,`Subscribe`
的参数是一个`int`代表一个指标的类型,系统自带的类型在 `PortfolioStatisticsType`有定义
可以直接使用。
订阅的示例:
```c#
public class TestStatistics : PortfolioStatisticsItem, ICustomStatisticsType
{
public static int TypeId;
//一次进出场完成
protected override void OnRoundTrip(TradeInfo trade)
public TestStatistics()
{
//订阅净收益指标
Subscribe(PortfolioStatisticsType.NetProfit);
//订阅交易次数
Subscribe(PortfolioStatisticsType.NumOfTrades);
}
protected override void OnStatistics(PortfolioStatisticsItem statistics)
{
var cost = trade.EntryCost + trade.ExitCost;
if (trade.IsLong) {
longValue += cost;
longValues.Add(Clock.DateTime, longValue);
if(statistics.Type == PortfolioStatisticsType.NetProfit)
{
}
else {
shortValue += cost;
shortValues.Add(Clock.DateTime, shortValue);
if(statistics.Type == PortfolioStatisticsType.NumOfTrades)
{
}
totalValue += cost;
totalValues.Add(Clock.DateTime, totalValue);
Emit();
}
}
public override string Category
{
......@@ -37,7 +65,7 @@
{
get
{
return "Trades Cost";
return "Test";
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment