4. 策略 - 4.1 开始第一个策略

优质
小牛编辑
129浏览
2023-12-01

Solution:解决方案

Project:项目

一个解决方案下可以有多个项目,但是只有一个启动项

双击cs文件可以打开编辑代码

新建策略

在菜单栏File->New->Solution,新建一个解决方案

4.1 开始第一个策略 - 图1

4.1 开始第一个策略 - 图2

选择新建SmartQuant Instrument Strategy Solution模式的解决方案

Solution的类型说明
SmartQuant Instrument Strategy Solution合约标的策略解决方案:为订阅的每个合约创建一个实例,每个实例处理一个合约的数据,互不干扰。
SmartQuant Strategy Solution策略解决方案:可以在一个策略实例中处理多个合约的数据。
SmartQuant Sell Side Strategy Solution卖方策略解决方案:新建后,除了 Backtest 以外,会有 2 个策略项目,MySellSideStrategy卖方策略可以理解为是 MyBuySideStrategy 买方策略的一个插件,在买方策略和经纪服务商之间添加了一个策略接口,实现一些可以解耦的功能。
Empty Solution空解决方案:新建后可以自行创建策略项目。
Class Library新建类库:可以供策略使用。
Console Application控制台应用程序:功能与 VisualStudio 的控制台应用程序相同。

Name是解决方案的名称

Location 是解决方案(代码)保存的位置

单击OK按钮即新建完成,在解决方案资源管理器我们看到新建好的解决方案,而且也可以在相应的目录下找到代码文件

4.1 开始第一个策略 - 图3

4.1 开始第一个策略 - 图4

编写Hello OpenQuant策略

OpenQaunt代码编辑器支持语法高亮、格式化、自动完成,如下所示(自动完成)

4.1 开始第一个策略 - 图5

1. 编写场景

在解决方案资源管理器中,可以看到Backtest项目名称是黑体加粗(右键项目名称->Set as StartUP Project可以设置启动项,每个解决方案只有一个启动项),这表示Backtest项目为启动项,而Backtest项目又以Program.cs中的Main函数为入口。

Program.cs->Main函数:

  1. static void Main(string[] args)
  2. {
  3. Scenario scenario = new MyScenario(Framework.Current);
  4. scenario.Run();
  5. }

上面代码可以看出,Main函数会调用MyScenario.cs里面的Run函数。

打开Backtest项目中MyScenario.cs(场景文件),找到Run函数,添加订阅合约的代码,

我们以订阅IF1705为例。场景文件主要目的就是订阅合约、设置Bar周期等作用。

  1. public override void Run()
  2. {
  3. //这里的合约是需要在Instruments中存在的合约
  4. Instrument instrument = InstrumentManager.Instruments["IF1705"];
  5. strategy = new MyStrategy(framework, "Backtest");
  6. //订阅合约
  7. strategy.AddInstrument(instrument);
  8. Initialize();
  9. StartStrategy();
  10. }

strategy = new MyStrategy(framework, “Backtest”);这行代码就代表了我们的策略代码是MyStartegy.cs文件中的MyStrategy类

2. 编写策略代码

在已经编写好的场景文件中,可以看到Run函数new了MyStrategy实例,并且调用了StartStrategy()函数,这就表示开始启动MyStrategy策略了。OpenQuant的策略执行机制是事件机制,即触发了某事件则会调用相应的处理函数,具体各个事件和相应的处理函数后面会详细介绍,在编写实际交易策略时,这些事件和处理函数是必须了解的。

打开MyStrategy.cs,可以看到如下代码:

  1. using System;
  2. using SmartQuant;
  3. namespace OpenQuant
  4. {
  5. public class MyStrategy : InstrumentStrategy
  6. {
  7. public MyStrategy(Framework framework, string name)
  8. : base(framework, name)
  9. {
  10. }
  11. protected override void OnStrategyStart()
  12. {
  13. System.Console.WriteLine("Hello OpenQuant");
  14. }
  15. protected override void OnBar(Instrument instrument, Bar bar)
  16. {
  17. }
  18. }
  19. }

我们在OnStrategyStart()函数中,添加System.Console.WriteLine(“Hello OpenQuant”),至此我们第一个策略完成,运行策略可以看到结果。

4.1 开始第一个策略 - 图6