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

Grid cBot

نظرة عامة على الاستراتيجية

ينفذ Grid cBot استراتيجية تداول شبكية حيث يتم وضع أوامر شراء أو بيع متعددة لرمز معين على فترات سعرية منتظمة أو "خطوات"، مما يشكل "شبكة" من المراكز. مع تغير سعر الرمز، يتم فتح مراكز جديدة باستمرار للاستفادة من التقلبات.

يستخدم Grid cBot مزيجًا من العمليات الحسابية البسيطة والفحوصات المنطقية لفتح المراكز وحساب الأرباح وإدارة عمليات التداول الخاصة به. وهو أكثر فعالية في الأسواق المحصورة في نطاق أو الأسواق الجانبية. كما أنه يؤدي بشكل جيد في ظروف التقلب المنخفض والأسواق ذات مستويات المقاومة والدعم المعروفة.

إنشاء cBot

تعلم كيفية إنشاء cBots، باستخدام إما C# أو Python، في دلائلنا خطوة بخطوة.

كود Grid cBot متاح في مستودعاتنا العامة لـ C# و Python. يتم توفير نفس الكود كقالب في معالج إنشاء الخوارزميات في cTrader لنظامي Windows أو Mac، أو يمكنك ببساطة نسخ واستخدام المقتطف أدناه:

 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class Grid : Robot
    {
        [Parameter("Volume (lots)", DefaultValue = 0.01, MinValue = 0.01, Step = 0.01)]
        public double VolumeInLots { get; set; }

        [Parameter("Trade Side")]
        public TradeType TradeType { get; set; }

        [Parameter("Step (pips)", DefaultValue = 5, MinValue = 0.1, Step = 0.1)]
        public double StepPips { get; set; }

        [Parameter("Target Profit", DefaultValue = 20)]
        public double TargetProfit { get; set; }

        private bool enoughMoney = true;

        protected override void OnStart()
        {
            if (GridPositions.Length == 0)
                OpenPosition();
        }

        protected override void OnTick()
        {
            if (GridPositions.Sum(p => p.NetProfit) >= TargetProfit)
            {
                Print("Target profit is reached. Closing all grid positions");
                CloseGridPositions();
                Print("All grid positions are closed. Stopping cBot");
                Stop();
            }
            if (GridPositions.Length > 0 && enoughMoney)
            {
                var lastGridPosition = GridPositions.OrderBy(p => p.Pips).Last();
                var distance = CalculateDistanceInPips(lastGridPosition);

                if (distance >= StepPips)
                    OpenPosition();
            }
        }

        private Position[] GridPositions
        {
            get
            {
                return Positions
                    .Where(p => p.SymbolName == SymbolName && p.TradeType == TradeType)
                    .ToArray();
            }
        }

        private double CalculateDistanceInPips(Position position)
        {
            if (position.TradeType == TradeType.Buy)
                return (position.EntryPrice - Symbol.Ask) / Symbol.PipSize;
            else
                return (Symbol.Bid - position.EntryPrice) / Symbol.PipSize;
        }

        private void OpenPosition()
        {
            var result = ExecuteMarketOrder(TradeType, SymbolName, Symbol.QuantityToVolumeInUnits(VolumeInLots), "Grid");
            if (result.Error == ErrorCode.NoMoney)
            {
                enoughMoney = false;
                Print("Not enough money to open additional positions");
            }
        }

        private void CloseGridPositions()
        {
            while (GridPositions.Length > 0)
            {
                foreach (var position in GridPositions)
                {
                    ClosePosition(position);
                }
            }
        }
    }
}
 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
38
39
40
41
42
43
44
45
46
47
48
49
50
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class GridSample():
    def on_start(self):
        self.volumeInUnits = api.Symbol.QuantityToVolumeInUnits(api.VolumeInLots)
        self.enoughMoney = True
        if len(self.get_grid_positions()) == 0:
            self.open_position()

    def on_tick(self):
        grid_positions = self.get_grid_positions()
        net_profit_sum = sum([p.NetProfit for p in grid_positions])
        if net_profit_sum >= api.TargetProfit:
            api.Print("Target profit is reached. Closing all grid positions")
            self.close_grid_positions()
            api.Print("All grid positions are closed. Stopping cBot")
            api.Stop()

        if len(grid_positions) > 0 and self.enoughMoney == True:
            position_with_highest_pips = sorted(grid_positions, key=lambda pos: pos.Pips, reverse=True)[0]
            distance = self.get_distance_in_pips(position_with_highest_pips)          
            if distance >= api.StepPips:
                self.open_position()

    def get_grid_positions(self):
        return [pos for pos in api.Positions if pos.SymbolName == api.SymbolName and pos.TradeType == api.TradeType]

    def open_position(self):
        result = api.ExecuteMarketOrder(api.TradeType, api.SymbolName, self.volumeInUnits, "Grid")
        if result.Error == ErrorCode.NoMoney:
            self.enoughMoney = False
            api.Print("Not enough money to open additional positions")

    def close_grid_positions(self):
        for position in self.get_grid_positions():
            position.Close()

        if len(self.get_grid_positions()) > 0:
            self.close_grid_positions()

    def get_distance_in_pips(self, position):
        return (position.EntryPrice - api.Symbol.Ask if position.TradeType == TradeType.Buy else api.Symbol.Bid - position.EntryPrice) / api.Symbol.PipSize

دمج المؤشر

لا يعتمد Grid cBot على أي مؤشر لتحديد استراتيجية الشبكة الخاصة به؛ فهو لا يحاول التنبؤ بما إذا كان سعر الرمز سيرتفع أو ينخفض. بدلاً من ذلك، يستهدف التداولات المربحة من تحركات الأسعار في أي اتجاه.

ينفذ cBot التداولات بناءً على هذه القاعدة البسيطة: إذا تحرك سعر الرمز بما يتجاوز عددًا محددًا من النقاط (المحدد بواسطة معلمة StepPips)، يفتح cBot مركزًا جديدًا.

الحساب والمنطق

تنفيذ التداول الأولي

عند بدء cBot، يتحقق مما إذا كانت هناك أي مراكز مفتوحة في الشبكة. إذا لم تكن هناك مراكز مفتوحة، يفتح cBot المركز الأول على الفور من خلال طريقة OpenPosition(). تضمن هذه الخطوة الأولى أن تبدأ الشبكة بتداول أولي بناءً على جانب التداول المحدد (TradeType).

مراقبة الربح

في كل نقرة (على سبيل المثال، كل تحديث للسعر)، يتحقق cBot مما إذا كان صافي الربح التراكمي لجميع مراكز الشبكة المفتوحة يلبي أو يتجاوز الربح المستهدف المحدد (TargetProfit). إذا تم الوصول إلى الربح المستهدف، يتم إغلاق جميع المراكز المفتوحة، ويتوقف cBot عن التشغيل.

الربح المستهدف هو مجموع صافي الربح من كل مركز في الشبكة.

\[ \text{إجمالي الربح الصافي} = \sum_{i=1}^{n} \text{NetProfit}(p_i) \]

\(n\) – عدد المراكز المفتوحة في الشبكة

\(\text{NetProfit}(p_i)\) – صافي ربح المركز \(i\)

فتح المراكز

إذا لم يتم الوصول إلى الربح المستهدف وكانت هناك مراكز مفتوحة، يحسب cBot المسافة (بالنقاط) بين آخر مركز شبكة تم فتحه وسعر السوق الحالي.

بالنسبة لمراكز الشراء:

\[ D_b = \frac{P_e - P_a}{S} \]

بالنسبة لمراكز البيع:

\[ D_s = \frac{P_b - P_e}{S} \]

\(D_b\) – المسافة بالنقاط بين سعر الدخول وسعر الطلب الحالي.

\(D_s\) – المسافة بالنقاط بين سعر العرض الحالي وسعر الدخول.

\(P_e\) – السعر الذي تم فتح آخر مركز شراء للرمز عنده.

\(P_a\) – سعر الطلب الحالي للرمز.

\(P_b\) – سعر العرض الحالي للرمز.

\(S\) – قيمة نقطة واحدة للرمز.

إذا كانت المسافة المحسوبة أكبر من أو تساوي حجم الخطوة المحدد (StepPips)، يتم فتح مركز جديد باستخدام طريقة OpenPosition().

في كل مرة قبل فتح مركز جديد، يتحقق cBot ويؤكد وجود أموال كافية للعملية. إذا كانت الأموال غير كافية، يتوقف cBot عن محاولة فتح مراكز جديدة ويسجل رسالة "لا توجد أموال كافية لفتح مراكز إضافية".

إغلاق المراكز

بمجرد الوصول إلى TargetProfit، يسجل cBot رسالة "تم الوصول إلى الربح المستهدف. إغلاق جميع مراكز الشبكة".

ثم تقوم طريقة CloseGridPositions() بالمرور على جميع المراكز المفتوحة في الشبكة وإغلاقها، ثم يسجل cBot رسالة "تم إغلاق جميع مراكز الشبكة. إيقاف cBot". ثم يتم إيقاف cBot.

المعلمات

المعلمة الوحدة التعريف نصائح
الكمية لوت حجم كل تداول. قد يحدد المتداولون المحافظون أحجام صفقات صغيرة لتقليل التعرض وإدارة المخاطرة بعناية، خاصة في سوق متقلب. بهذه الطريقة، يتم تقليل أي خسارة محتملة إذا تحرك السوق ضد الشبكة.

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

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

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

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

التطبيق

الأسواق المحصورة في نطاق أو الجانبية

Grid cBot هو الأكثر فعالية في الأسواق المحصورة في نطاق حيث يتذبذب السعر بين مستويات الدعم والمقاومة. في مثل هذه الأسواق، حيث تتحرك الأسعار بشكل متكرر صعودًا وهبوطًا ضمن نطاق محدد، يفتح cBot المراكز بانتظام ويستفيد من التقلبات.

حالة استخدام

ضع في اعتبارك سيناريو حيث يبقى زوج EURUSD في النطاق بين 1.1000 و 1.1100. يفتح cBot مراكز شراء عندما ينخفض السعر بالقرب من 1.1000 ويفتح مراكز بيع بالقرب من 1.1100. مع تذبذب السعر بين هذه المستويات، يلتقط cBot الأرباح من كل تأرجح.

أفضل الممارسات

  • حدد حجم خطوة صغير لالتقاط تأرجحات الأسعار المتكررة.
  • حدد ربحًا مستهدفًا متواضعًا بحيث تغلق الشبكة بشكل متكرر، مما يتيح لك تأمين أرباح صغيرة ومتسقة.
  • راقب أخبار السوق أو الأحداث القادمة التي قد تؤدي إلى اختراق النطاق وتسبب انخفاضات كبيرة.

أسواق التقلبات المنخفضة

في الأسواق منخفضة التقلب، تميل حركات الأسعار إلى أن تكون بطيئة وأقل وضوحًا. مع تحرك السعر تدريجيًا، يحصل Grid cBot على وقت كافٍ لفتح مراكز متعددة دون مواجهة مخاطر تحركات السوق الكبيرة والسريعة.

حالة استخدام

ضع في اعتبارك سيناريو حيث يُظهر زوج USDJPY تقلبًا منخفضًا كما يحدث غالبًا خلال جلسة التداول الآسيوية. يمكن لـ Grid cBot فتح مراكز بحجم خطوة صغير والتقاط حركات الأسعار الصغيرة والتدريجية التي تحدث خلال تلك الساعات الهادئة.

أفضل الممارسات

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

الأسواق ذات المستويات المعروفة

يمكن أن يعمل Grid cBot بشكل جيد في الأسواق ذات مستويات الدعم والمقاومة القوية والمحددة بوضوح. تعمل تلك المستويات كحواجز سعرية وتتسبب في ارتداد السوق بشكل متكرر، مما يؤدي إلى نطاق يمكن لـ cBot استغلاله.

حالة استخدام

ضع في اعتبارك سيناريو حيث يتذبذب سعر الذهب (XAUUSD) بين مستوى دعم قوي عند 2,000 دولار أمريكي ومستوى مقاومة عند 2,050 دولار أمريكي. يفتح Grid cBot أوامر شراء بالقرب من 2,000 دولار أمريكي وأوامر بيع بالقرب من 2,050 دولار أمريكي، مستفيدًا من ارتداد السعر بين هذه المستويات.

أفضل الممارسات

  • قم بتعيين حجم الخطوة بناءً على تقلبات السوق. قد يتطلب السوق عالي التقلب أحجام خطوات أكبر، بينما يمكن للأسواق منخفضة التقلب استخدام خطوات أصغر.
  • استخدم Grid cBot حول الأسواق ذات مستويات الدعم والمقاومة الراسخة لتجنب الوقوع في اختراق.
  • كن حذرًا من الأحداث أو الأخبار التي قد تسبب اختراقًا لتجنب الخسائر الكبيرة. cBot غير مستعد للتعامل مع اختراق السوق لمستويات الدعم أو المقاومة.

الأسواق غير الاتجاهية

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

حالة استخدام

ضع في اعتبارك سيناريو حيث يتحرك EURCHF بطريقة غير اتجاهية، وهو أمر شائع نظرًا لاستقرار منطقة اليورو واقتصاد سويسرا. يمكن لـ Grid cBot فتح مراكز بحجم خطوة صغير، مما يحقق أرباحًا من التقلبات المتكررة دون القلق بشأن الاتجاهات الكبيرة.

أفضل الممارسات

  • استخدم حجم خطوة صغير لالتقاط تحركات الأسعار المتكررة.
  • فكر في تعيين حجم تداول منخفض لإدارة المخاطر في حالة اختراق السوق إلى اتجاه.

الملخص

يعمل Grid cBot على افتراض أنه خلال الأسواق الصاعدة والهابطة، سيكون هناك تراجعات أو انخفاضات. يشتري بسعر منخفض ويبيع بسعر مرتفع في الأسواق الصاعدة ويبيع بسعر مرتفع ويشتري بسعر منخفض في الأسواق الهابطة؛ يحقق cBot الأرباح عندما يستأنف السوق الاتجاه الأساسي بعد التراجعات.

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

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

بالإضافة إلى تكوين cBot لتطبيق استراتيجياتهم الشخصية، قد يفكر المتداولون في إدخال مؤشرات لتصفية الصفقات بناءً على ظروف السوق:

  • يمكن أن تساعد Moving Averages (MA) في تحديد اتجاه السوق، مما يسمح لـ cBot بالتداول فقط في اتجاه الاتجاه.
  • يمكن أن يشير Relative Strength Index (RSI) إلى حالات التشبع الشرائي أو البيعي، مما يساعد cBot على تجنب فتح مراكز جديدة عندما يكون السوق ممتدًا في اتجاه واحد.
  • يمكن أن توفر Bollinger Bands رؤية حول تقلبات الأسعار، مما يسمح لـ cBot بضبط تباعد الشبكة أو الامتناع عن التداول خلال فترات التقلبات العالية.