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

عمليات التداول في cBot

في هذا الدليل، نشرح بالتفصيل عمليات التداول الرئيسية التي يمكنك تنفيذها باستخدام cBot تم تطويره عبر Algo API.

هذه بعض العمليات المدعومة لـ cBots:

  • إرسال أوامر السوق.
  • وضع أوامر معلقة.
  • تعديل الأوامر المعلقة والمراكز المفتوحة.
  • إغلاق المراكز وإلغاء الأوامر.
  • الاشتراك في أحداث التداول (المراكز والأوامر والنشاط ذي الصلة).

إرسال أوامر السوق

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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 TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
        }       
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import clr

clr.AddReference("cAlgo.API")

from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)

نصيحة

في المثال، تم ترك العديد من معلمات الأمر غير محددة عمدًا "". راجع المراجع للتوقيعات وترتيب جميع معلمات ExecuteMarketOrder().

عند بناء cBot وإضافة مثيل، سترى أنه تم تنفيذ أمر سوق بالمعلمات المحددة عند البدء. تعرض علامات التبويب Positions وLog في لوحة Trade Watch إدخالات المركز والسجل المقابلة.

Positions

Log

وضع الأوامر المعلقة

يدعم cTrader ثلاثة أنواع من الأوامر المعلقة، وهي أوامر الإيقاف، وأوامر الحد، وأوامر حد الإيقاف. لوضع أوامر معلقة في البداية، يمكنك استبدال أمر السوق بمقتطفات الكود التالية في مثال cBot السابق.

1
2
3
PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);
1
2
3
api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

نصيحة

للتحقق السريع من معلمات الطريقة، ابدأ بكتابة اسم الطريقة وقوس فتح. سترى نافذة منبثقة IntelliSense مع معلومات إضافية.

Image title

نصيحة

إذا نقرت على طريقة/معلمة في cTrader Algo وضغطت على F1، فسيعرض لوح المساعدة على يمين نافذة الكود نتائج البحث المطابقة. إذا بقي مؤشر النص خارج نافذة الكود وضغطت على F1، ستظهر نافذة مركز المساعدة لمساعدتك.

سترى السجلات التالية في لوحة Trade Watch بعد البناء والتشغيل الناجح لـ cBot.

Orders

Log

تعديل الأوامر المعلقة والمراكز المفتوحة

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnStart()
{
    PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask - (Symbol.PipSize * 10), "", 10, 10, null, "", false);
    PlaceStopLimitOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), 2, "", 10, 10, null, "", false);

    foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
    {
        order.ModifyStopLossPips(20);
    }
}     
1
2
3
4
5
6
7
8
def on_start(self):
    api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask - (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)
    api.PlaceStopLimitOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), 2, "", 10, 10, None, "", False)

    for order in api.PendingOrders:
        if order.SymbolName == api.SymbolName:
            order.ModifyStopLossPips(20)

تعرض علامة التبويب Log في لوحة Trade Watch أن الأوامر المعلقة الثلاثة تم تعديلها بنجاح مباشرة بعد وضعها.

Image title

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

1
2
3
4
5
6
7
protected override void OnBar()
{
    foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
    {
        position.ModifyTakeProfitPips(20);
    }
}
1
2
3
4
def on_bar(self):
    for position in api.Positions:
        if position.SymbolName == api.SymbolName:
            position.ModifyTakeProfitPips(20)

كما هو موضح في السجل، تم تعديل المركز المفتوح في أول شمعة مفتوحة.

Image title

إغلاق المراكز وإلغاء الأوامر

يمكنك العثور على مثال cBot أدناه يغلق جميع المراكز المفتوحة ويلغي جميع الأوامر المعلقة يوم الجمعة الساعة 11:00 (بتوقيت UTC) باستدعاء طريقة OnTick().

 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
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class TradeOperations : Robot
    {
        protected override void OnStart()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "", 10, 10, "", false);
            PlaceStopOrder(TradeType.Buy, SymbolName, 1000, Symbol.Ask + (Symbol.PipSize * 10), "", 10, 10, null, "", false);
        }  

        protected override void OnTick()
        {
            if(Server.Time.DayOfWeek == DayOfWeek.Friday && Server.Time.Hour >= 11)
            {
                foreach(var position in Positions.Where(p => p.SymbolName == SymbolName))
                {
                    position.Close();    
                }

                foreach(var order in PendingOrders.Where(p => p.SymbolName == SymbolName))
                {
                    order.Cancel();
                }
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class TradeOperations():
    def on_start(self):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "", 10, 10, "", False)
        api.PlaceStopOrder(TradeType.Buy, api.SymbolName, 1000, api.Symbol.Ask + (api.Symbol.PipSize * 10), "", 10, 10, None, "", False)

    def on_tick(self):
        # Friday == 5 (Sunday=0)
        if api.Server.Time.DayOfWeek == 5 and api.Server.Time.Hour >= 11:
            for position in api.Positions:
                if position.SymbolName == api.SymbolName:
                    position.Close()
            for order in api.PendingOrders:
                if order.SymbolName == api.SymbolName:
                    order.Cancel()

Image title

الاشتراك في أحداث التداول

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

هناك ثلاثة أحداث متاحة للمراكز:

  • Open
  • Modified
  • Closed

يتم تشغيلها عند فتح وتعديل وإغلاق المراكز على حسابك، على التوالي.

في مقتطف الكود أدناه، يتم إعلان الأحداث الثلاثة في طريقة OnStart() ويتم تعيين الطرق التي سيتم استدعاؤها. سيؤدي ذلك تلقائيًا إلى إنشاء توقيعات الكود لنستخدمها. بعد ذلك، تتم إضافة عبارات Print() إلى كل من طرق الحدث.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
protected override void OnStart()
{
    Positions.Opened += Positions_Opened;
    Positions.Modified += Positions_Modified;
    Positions.Closed += Positions_Closed;                    
}  

private void Positions_Opened(PositionOpenedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was opened");
}

private void Positions_Modified(PositionModifiedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was modified");
}

private void Positions_Closed(PositionClosedEventArgs obj)
{
    Print("Position with ID " + obj.Position.Id + " was closed");
}   
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
def on_start(self):
    api.Positions.Opened += self.positions_opened
    api.Positions.Modified += self.positions_modified
    api.Positions.Closed += self.positions_closed

def positions_opened(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was opened")

def positions_modified(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was modified")

def positions_closed(self, obj):
    api.Print("Position with ID " + str(obj.Position.Id) + " was closed")

سواء كنت أنت أو cBot من يقوم بتنفيذ أحداث Open و Modified و Closed، ستصل الخوارزمية إليها في كل مرة مع رسائل مطبوعة كما هو موضح في السجل أدناه.

Image title

وبالمثل، يمكنك الاشتراك في الأحداث المتعلقة بالأوامر المعلقة. هناك أربعة أحداث متاحة للأوامر المعلقة:

  • Created
  • Modified
  • Filled
  • Cancelled

يتم إعلان الأحداث الأربعة في طريقة OnStart()، وتتم إضافة معالجات الأحداث على النحو التالي.

 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
protected override void OnStart()
{
    PendingOrders.Created += PendingOrders_Created;
    PendingOrders.Modified += PendingOrders_Modified;
    PendingOrders.Filled += PendingOrders_Filled;
    PendingOrders.Cancelled += PendingOrders_Cancelled;
}

private void PendingOrders_Created(PendingOrderCreatedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was created");
}

private void PendingOrders_Modified(PendingOrderModifiedEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was modified");
}

private void PendingOrders_Filled(PendingOrderFilledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was filled");
}

private void PendingOrders_Cancelled(PendingOrderCancelledEventArgs obj)
{
    Print("Pending order with ID " + obj.PendingOrder.Id + " was cancelled");
}       
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def on_start(self):
    api.PendingOrders.Created += self.pending_orders_created
    api.PendingOrders.Modified += self.pending_orders_modified
    api.PendingOrders.Filled += self.pending_orders_filled
    api.PendingOrders.Cancelled += self.pending_orders_cancelled

def pending_orders_created(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was created")

def pending_orders_modified(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was modified")

def pending_orders_filled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was filled")

def pending_orders_cancelled(self, obj):
    api.Print("Pending order with ID " + str(obj.PendingOrder.Id) + " was cancelled")

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

Image title

الملخص

في الختام، يزود cTrader مطوري الخوارزميات بترسانة مثيرة للإعجاب من عمليات التداول التي يمكن تنفيذها بواسطة cBots. من خلال تطبيقها بمهارة، يمكنك متابعة استراتيجيات تداول مخصصة ومتطورة.

Image title