انتقل إلى المحتوى

ترميز استراتيجيات متعددة الأطر الزمنية

غالبًا ما تحتاج الاستراتيجيات الآلية إلى النظر في المعلومات من أطر زمنية مختلفة قبل اتخاذ قرار التداول. لحسن الحظ، يوفر cTrader الكثير من الأدوات التي تسمح للخوارزميات بالوصول بسهولة إلى البيانات من أطر زمنية متعددة. في هذا الفيديو والمقال المقابل له، سنشرح كيف يمكنك استخدام هذه الأدوات لإنشاء cBot فعال.

إعلان معلمات cBot

سنبدأ بإعلان المعلمات الضرورية للمتوسط المتحرك. سنحتاج إلى الفترة، والإطار الزمني، ونوع المتوسط المتحرك.

1
2
3
4
5
6
7
8
[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; }

ثم يمكننا تعريف المتوسط المتحرك.

1
private MovingAverage _ma1;

يمكننا تهيئة المتوسط المتحرك في طريقة OnStart(). سنستخدم طريقة MarketData.GetBars() للحصول على الشموع الخاصة بالمتوسط المتحرك الأول وتمريرها إلى منشئ المؤشر. طريقة GetBars() مفيدة للحصول على بيانات الشموع لأي إطار زمني وأي رمز تحتاجه.

1
_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 يدخل في مراكز عندما تكون المتوسطات المتحركة متزامنة في نفس الاتجاه ويبقى خارج السوق عندما يشير كل مؤشر إلى اتجاه مختلف.