Ana içeriğe geç

Python'da işlem robotu nasıl oluşturulur

Bu makale ve video, Python'da bir işlem robotu oluşturmak için adım adım talimatlar sunar.

Not

cTrader, yerel Python desteğine sahip tek büyük işlem platformudur ve doğrudan cTrader Windows veya Mac'te Python'da kod yazarak botlar, teknik göstergeler ve araçlar oluşturmanıza olanak tanır. Adaptör veya karmaşık bir geçici çözüm gerekmez.

Bir işlem robotu oluştur

Algo uygulamasının cBots sekmesinde, yeni bir işlem robotu oluşturmaya başlamak için Yeni düğmesine tıklayın.

cBot'a bir ad verin ve programlama dili olarak Python'ı seçin.

Not

cTrader, Python'da çok çeşitli stratejileri ve otomatik işlem eylemlerini kapsayan çeşitli hazır algoritmalar sunar. Bu algoritma şablonları, işlem mantığı ve özelleştirilebilir parametreler içerir ve kaydettikten ve derledikten sonra çalışmaya hazırdır.

Oluşturma yöntemi olarak Şablon kullanarak'ı seçin, Grid Örneği'ni seçin, ardından Oluştur'a tıklayın.

Grid cBot, bir sembol için birden fazla alım veya satım emrinin düzenli fiyat aralıklarında veya adımlarında yerleştirildiği, pozisyonlar ızgarasıyla sonuçlanan bir grid işlem stratejisi uygular.

Kodunu doğrulamak için cBot'umuzu derleyelim.

Ctrl+B tuşlarına basın veya Derle'ye tıklayın.

Cmd+B tuşlarına basın veya Derle simgesine tıklayın.

Gösterge ekle

Doğruluğunu artırmak için işlem robotumuza bir gösterge entegre edelim.

Relative Strength Index (RSI), piyasadaki aşırı alım veya aşırı satım koşullarını işaret eden popüler bir göstergedir. Bu gösterge, piyasa tek bir yönde gerildiğinde cBot'umuzun yeni pozisyon açmaktan kaçınmasına yardımcı olabilir.

RSI'yı robot mantığına entegre edin. Göstergeyi varsayılan 14 dönemiyle başlatın ve aşırı alım ve aşırı satım seviyelerini sırasıyla 70 ve 30 olarak ayarlayın. RSI'yı oluşturmak için sembolün kapanış fiyatlarını kullanın.

1
2
3
4
self.rsi_period = getattr(api, "RsiPeriod", 14)
self.rsi_overbought = getattr(api, "RsiOverbought", 70)
self.rsi_oversold = getattr(api, "RsiOversold", 30)
self.rsi = api.Indicators.RelativeStrengthIndex(api.Bars.ClosePrices, self.rsi_period)

Pozisyon açmadan önce RSI koşullarının bir işleme izin verip vermediğini kontrol etmek için mantığı ekleyin. Filtre işlemi engellerse, mevcut RSI değerini gösteren bir mesaj kaydedin.

1
2
3
4
5
6
if len(self.get_grid_positions()) == 0:
    # self.open_position()
    if self.passes_rsi_filter():
        self.open_position()
    else:
        api.Print("RSI filter blocked initial entry (RSI={:.2f})".format(self.get_rsi_value()))

Grid pozisyonunun yalnızca fiyat yeterince hareket ettiyse ve RSI değeri nötr bir aralıkta ise açılmasını sağlayan kodu yazın. İstikrar için son kapanan çubuk RSI değerini kullanın ve RSI filtresi tarafından engellendiğinde bir mesaj yazdırın.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
if distance >= api.StepPips:
    # self.open_position()
    if self.passes_rsi_filter():
        self.open_position()
    else:
        api.Print("RSI filter: no new entry (RSI={:.2f}, range {}-{})"
                    .format(self.get_rsi_value(), self.rsi_oversold, self.rsi_overbought))

def get_rsi_value(self):
    # Use the last CLOSED bar for stability
    return self.rsi.Result.Last(1)

def passes_rsi_filter(self):
    r = self.get_rsi_value()
    return (r > self.rsi_oversold) and (r < self.rsi_overbought)

Mevcut piyasa fiyatı ile bir pozisyonun giriş fiyatı arasındaki pip cinsinden mesafe için hesaplama mantığını ayarlayın.

1
2
3
4
5
6
7
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
    if position.TradeType == TradeType.Buy:
        diff = position.EntryPrice - api.Symbol.Ask
    else:
        diff = api.Symbol.Bid - position.EntryPrice
    return diff / api.Symbol.PipSize

Entegre RSI göstergesine sahip tam Python kodunu aşağıdan kopyalayabilirsiniz:

 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
import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class SupercBot():
    def on_start(self):
        self.volumeInUnits = api.Symbol.QuantityToVolumeInUnits(api.VolumeInLots)
        self.enoughMoney = True

        self.rsi_period = getattr(api, "RsiPeriod", 14)
        self.rsi_overbought = getattr(api, "RsiOverbought", 70)
        self.rsi_oversold = getattr(api, "RsiOversold", 30)
        self.rsi = api.Indicators.RelativeStrengthIndex(api.Bars.ClosePrices, self.rsi_period)

        if len(self.get_grid_positions()) == 0:
            if self.passes_rsi_filter():
                self.open_position()
            else:
                api.Print("RSI filter blocked initial entry (RSI={:.2f})".format(self.get_rsi_value()))

    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:
                if self.passes_rsi_filter():
                    self.open_position()
                else:
                    api.Print("RSI filter: no new entry (RSI={:.2f}, range {}-{})"
                              .format(self.get_rsi_value(), self.rsi_oversold, self.rsi_overbought))

    def get_rsi_value(self):
        # Use the last CLOSED bar for stability
        return self.rsi.Result.Last(1)

    def passes_rsi_filter(self):
        r = self.get_rsi_value()
        return (r > self.rsi_oversold) and (r < self.rsi_overbought)

    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):
        if position.TradeType == TradeType.Buy:
            diff = position.EntryPrice - api.Symbol.Ask
        else:
            diff = api.Symbol.Bid - position.EntryPrice
        return diff / api.Symbol.PipSize

Bir örnek başlat

cBot'umuza geri dönelim ve derleyelim. Şimdi, herhangi bir örnek için cBot'u Başlat simgesine tıklayın ve işlem robotu çalışmaya başlayacaktır.

Alternatif olarak, Örnek ekle'ye tıklayabilir, tercih ettiğiniz örnek parametrelerini belirtebilir, yeni örneği ekleyebilir ve başlatabilirsiniz.

Yeni örnekleri ekleyerek ve özelleştirerek cBot'u farklı semboller, dönemler veya parametreler üzerinde eş zamanlı olarak çalıştırabilirsiniz.

Botu başka bir yerde çalıştır

Bulutta eşitleme etkinleştirildiğinde, cBot, cTID'nizin etkin olduğu tüm cTrader uygulamalarında otomatik olarak görünür. Aynı işlem robotunu cTrader Mobile ve Web dahil olmak üzere herhangi bir cTrader uygulamasında bulutta başlatabiliriz.

cTrader Algo'da cBot'u başlatın.

Bu makale, bir Python işlem robotu oluşturmayı ve başlatmayı göstererek stratejilerinizi otomatikleştirmenize ve algoritmaları herhangi bir cihazda çalıştırmanıza olanak sağlamıştır.

Image title