Ana içeriğe geç

cBot işlem operasyonları

Bu kılavuzda, Algo API aracılığıyla geliştirilen bir cBot kullanarak yürütebileceğiniz temel işlem operasyonlarını ayrıntılı olarak açıklıyoruz.

Bunlar cBot'lar için desteklenen operasyonlardan bazılarıdır:

  • Piyasa emirleri gönderme.
  • Bekleyen emirler verme.
  • Bekleyen emirleri ve açık pozisyonları değiştirme.
  • Pozisyonları kapatma ve emirleri iptal etme.
  • İşlem olaylarına abone olma (pozisyonlar, emirler ve ilgili faaliyetler).

Piyasa emirleri gönderin

ExecuteMarketOrder() yöntemi çağrıldığında işlem sunucusuna bir piyasa emri gönderilir. Yeni bir cBot oluşturduktan sonra, bu yöntemi piyasa emrinin (sembol, hacim, kâr al, zarar durdur vb.) birkaç tanımlı özelliğiyle ekleyebilirsiniz. Aşağıdaki örnek, cBot başladığında bir piyasa emri verir.

 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)

İpucu

Örnekte, bazı emir parametreleri kasıtlı olarak tanımsız "" bırakılmıştır. Check Referanslar bölümünü ExecuteMarketOrder() parametrelerinin imzaları ve sırası için kontrol edin.

cBot'u oluşturup bir örnek eklediğinizde, belirtilen parametrelerle bir piyasa emrinin başlangıçta yürütüldüğünü göreceksiniz. İşlem Gözlemi panelindeki Pozisyonlar ve Günlük sekmeleri, ilgili pozisyon ve günlük girişlerini görüntüler.

Pozisyonlar

Log

Bekleyen emirler verin

cTrader, stop emirleri, limitli emirler ve limitli stop emirleri olmak üzere üç tür bekleyen emri destekler. Başlangıçta bekleyen emirler vermek için, önceki cBot örneğindeki piyasa emrini aşağıdaki kod parçacıklarıyla değiştirebilirsiniz.

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)

İpucu

Bir metodun parametrelerini hızlıca incelemek için, metodun adını ve bir açılış parantezini yazmaya başlayın. Ek bilgi içeren bir IntelliSense açılır penceresi göreceksiniz.

Image title

İpucu

cTrader Algo'da bir metoda/parametreye tıklayıp F1 tuşuna basarsanız, kod penceresinin sağındaki yardım paneli eşleşen arama sonuçlarını gösterecektir. Metin imleci kod penceresinin dışında kalır ve F1 tuşuna basarsanız, size yardımcı olmak için Yardım Merkezi penceresi görünecektir.

cBot'u başarıyla oluşturup çalıştırdıktan sonra İşlem Gözlemi panelinde aşağıdaki kayıtları göreceksiniz.

Orders

Log

Bekleyen emirleri ve açık pozisyonları değiştirin

Bekleyen emirler verildiğinde, cBot'unuzun PendingOrders koleksiyonunda kullanılabilir hale gelirler. Bu koleksiyon aracılığıyla onlara erişebilir ve onları değiştirebilirsiniz. Mevcut bekleyen emirler, zarar durdur seviyeleri aşağıdaki gibi ayarlanarak değiştirilebilir.

 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)

İşlem Gözlemi panelinin Günlük sekmesi, üç bekleyen emrin yerleştirildikten hemen sonra başarıyla değiştirildiğini gösterir.

Image title

Farklı emir türleri başarıyla yürütüldükten sonra, hesabınız için pozisyonlar açılacaktır. Tüm açık pozisyonlar, cBot'unuzun Positions koleksiyonunda mevcuttur. Önceki örnekteki bekleyen emirleri değiştirmeye benzer şekilde, açık pozisyonu değiştirebilirsiniz. Piyasa emirleri pozisyon açmanın en hızlı yolu olduğundan, bu kılavuzdaki ilk cBot'a bir pozisyon değiştirme eylemiyle OnBar() metodunu ekleyelim.

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)

Günlükte yansıtıldığı gibi, açık pozisyon ilk açılan barda değiştirildi.

Image title

Pozisyonları kapatın ve emirleri iptal edin

Aşağıda, Cuma günü saat 11:00'de (UTC) OnTick() metodunu çağırarak tüm açık pozisyonları kapatan ve tüm bekleyen emirleri iptal eden bir cBot örneği bulabilirsiniz.

 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

İşlem olaylarına abone olun

cTrader, algoritma geliştiricilerinin, işlem olaylarına abone olmalarına ve bunların bir cBot tarafından mı yoksa manuel olarak mı başlatıldığına bakılmaksızın işlem etkinliğini izlemelerine olanak tanır. Bu, daha önce gösterilen iki koleksiyonda bulunan olayları (Positions ve PendingOrders) dinleyerek başarılır.

Pozisyonlar için üç olay mevcuttur:

  • Open
  • Modified
  • Closed

Hesabınızdaki pozisyonları açtığınızda, değiştirdiğinizde ve kapattığınızda sırasıyla tetiklenirler.

Aşağıdaki kod parçacığında, üç olay OnStart() metodunda bildirilir ve çağrılacak metotlar atanır. Bunlar, kullanmamız için kod imzalarını otomatik olarak oluşturacaktır. Daha sonra, Print() ifadeleri her bir olay metoduna eklenir.

 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")

Open, Modified ve Closed olaylarını siz veya cBot gerçekleştirseniz de, algoritma her seferinde aşağıdaki günlükte gösterildiği gibi basılı mesajlarla onlara ulaşacaktır.

Image title

Benzer şekilde, bekleyen emirlerle ilgili olaylara abone olabilirsiniz. Bekleyen emirler için dört olay mevcuttur:

  • Created
  • Modified
  • Filled
  • Cancelled

Dört olay OnStart() metodunda bildirilir ve olay işleyicileri aşağıdaki gibi eklenir.

 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")

Bekleyen emirlerle ilgili olaylara abone olunursa, cBot hem manuel hem de programlanmış işlem faaliyetlerine tepki verecektir.

Image title

Özet

Sonuç olarak, cTrader algoritma geliştiricilerini cBot'lar tarafından yürütülebilecek etkileyici bir işlem operasyonları cephaneliğiyle donatır. Onları ustaca uygulayarak, özel ve sofistike işlem stratejileri izleyebilirsiniz.

Image title