代码多时间框架策略
通常,自动化策略在做出交易决策之前需要考虑不同时间框架的信息。 幸运的是,cTrader 提供了许多工具,允许算法轻松访问多个时间框架的数据。 在本视频及其对应的文章中,我们将解释如何使用这些工具创建一个有效的 cBot。
声明 cBot 参数
我们将从声明移动平均线所需的参数开始。 我们需要周期、时间框架和移动平均线类型。
| [Parameter("MA 1 Period", DefaultValue = 14, Group = "Moving Averages")]
public int MA1Period { get; set; }
[Parameter("MA 1 Timeframe", DefaultValue = "Hour", Group = "Moving Averages")]
public TimeFrame MA1Timeframe { get; set; }
[Parameter("MA 1 Type", Group = "Moving Averages")]
public MovingAverageType MA1Type { get; set; }
|
然后,我们可以定义移动平均线。
| private MovingAverage _ma1;
|
我们可以在 OnStart() 方法中初始化移动平均线。 我们将使用 MarketData.GetBars() 方法获取第一个移动平均线的柱,并将其传递给指标构造函数。 GetBars() 方法可用于获取任何时间框架和任何符号的柱数据。
| _ma1 = Indicators.MovingAverage(MarketData.GetBars(MA1Timeframe).ClosePrices, MA1Period, MA1Type);
|
我们将为其他两个移动平均线重复此过程。 您可以简单地复制并粘贴下面的代码以继续。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | Parameter("MA 1 Period", DefaultValue = 14, Group = "Moving Averages")]
public int MA1Period { get; set; }
[Parameter("MA 1 Timeframe", DefaultValue = "Hour", Group = "Moving Averages")]
public TimeFrame MA1Timeframe { get; set; }
[Parameter("MA 1 Type", Group = "Moving Averages")]
public MovingAverageType MA1Type { get; set; }
[Parameter("MA 2 Period", DefaultValue = 14, Group = "Moving Averages")]
public int MA2Period { get; set; }
[Parameter("MA 2 Timeframe", DefaultValue = "Hour2", Group = "Moving Averages")]
public TimeFrame MA2Timeframe { get; set; }
[Parameter("MA 2 Type", Group = "Moving Averages")]
public MovingAverageType MA2Type { get; set; }
[Parameter("MA 3 Period", DefaultValue = 14, Group = "Moving Averages")]
public int MA3Period { get; set; }
[Parameter("MA 3 Timeframe", DefaultValue = "Hour4", Group = "Moving Averages")]
public TimeFrame MA3Timeframe { get; set; }
[Parameter("MA 3 Type", Group = "Moving Averages")]
public MovingAverageType MA3Type { get; set; }
private MovingAverage _ma1;
private MovingAverage _ma2;
private MovingAverage _ma3;
protected override void OnStart()
{
_ma1 = Indicators.MovingAverage(MarketData.GetBars(MA1Timeframe).ClosePrices, MA1Period, MA1Type);
_ma2 = Indicators.MovingAverage(MarketData.GetBars(MA2Timeframe).ClosePrices, MA2Period, MA2Type);
_ma3 = Indicators.MovingAverage(MarketData.GetBars(MA3Timeframe).ClosePrices, MA3Period, MA3Type);
}
|
实现交易逻辑
此时,我们可以实现交易逻辑。 我们的策略将在所有移动平均线上升时持有买入头寸,在移动平均线下降时持有卖出头寸。 以下是所有买入逻辑的代码。
1
2
3
4
5
6
7
8
9
10
11
12 | if (_ma1.Result.IsRising() && _ma2.Result.IsRising() && _ma3.Result.IsRising())
{
if (Positions.Count(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Buy) == 0)
ExecuteMarketOrder(TradeType.Buy, SymbolName, 100000);
}
else
{
foreach (var position in Positions.Where(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Buy))
{
position.Close();
}
}
|
以下是卖出逻辑的代码。
1
2
3
4
5
6
7
8
9
10
11
12 | if (_ma1.Result.IsFalling() && _ma2.Result.IsFalling() && _ma3.Result.IsFalling())
{
if (Positions.Count(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Sell) == 0)
ExecuteMarketOrder(TradeType.Sell, SymbolName, 100000);
}
else
{
foreach (var position in Positions.Where(p => p.SymbolName == SymbolName && p.TradeType == TradeType.Sell))
{
position.Close();
}
}
|
回测多时间框架策略
最后,我们应该回测我们的新 cBot。 我们可以看到,当移动平均线同步到同一方向时,cBot 会进入市场,而当每个指标指向不同方向时,cBot 会保持观望。