กลยุทธ์หลายช่วงเวลาด้วยโค้ด
บ่อยครั้งที่กลยุทธ์อัตโนมัติต้องพิจารณาข้อมูลจากกรอบเวลาที่แตกต่างกันก่อนที่จะตัดสินใจเทรด โชคดีที่ 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);
}
|
เขียนโค้ดตรรกะการเทรด
ณ จุดนี้ เราสามารถนำตรรกะการเทรดไปใช้ได้ กลยุทธ์ของเราจะถือโพสิชัน Buy เมื่อค่าเฉลี่ยเคลื่อนที่ทั้งหมดกำลังเพิ่มขึ้น และโพสิชัน Sell เมื่อค่าเฉลี่ยเคลื่อนที่กำลังลดลง นี่คือโค้ดสำหรับตรรกะฝั่ง Buy ทั้งหมด
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();
}
}
|
และนี่คือโค้ดสำหรับตรรกะฝั่ง Sell
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();
}
}
|
กลยุทธ์หลายกรอบเวลา backtesting
สุดท้าย เราควรทดสอบย้อนหลัง cBot ใหม่ของเรา เราสามารถเห็นได้ว่า cBot เข้าสู่โพสิชันเมื่อค่าเฉลี่ยเคลื่อนที่ถูกซิงโครไนซ์ไปในทิศทางเดียวกัน และอยู่นอกตลาดเมื่อแต่ละอินดิเคเตอร์ชี้ไปในทิศทางที่แตกต่างกัน