Ana içeriğe geç

TradeWatch Tab Sample

Genel Bakış

TradeWatch Tab Sample eklentisi, aktif grafikteki sembol için canlı istatistikler ve işlem eylemleri görüntüleyen İşlem Gözlemi'ne yeni bir sekme ekler. Aşağıdaki temel işlevleri sağlar:

  • Eklentiyi İşlem Gözlemi'ne otomatik olarak yeni bir sekme olarak ekler.
  • Canlı işlem istatistiklerini görüntüler.
  • Mevcut grafik sembolü için piyasa emri gerçekleştirmeyi sağlar.
  • Aktif grafik sembolü değiştiğinde otomatik olarak güncellenir.

Eklenti, aktif grafiği yansıtan özel İşlem Gözlemi sekmesi aracılığıyla çalışır. cTrader Windows veya Mac çalışırken aktif kalır ve durdurulduğunda sistem kaynaklarını otomatik olarak serbest bırakır.

Eklenti oluşturma

Adım adım rehberlerimizde C# veya Python kullanarak eklentiler oluşturmayı öğrenin.

TradeWatch Tab Sample eklenti kodu, herkese açık C# ve Python depolarımızda mevcuttur. Aynı kod, cTrader Windows veya Mac'teki algoritma oluşturma sihirbazında bir şablon olarak sağlanmıştır veya aşağıdaki kod parçasını kopyalayıp kullanabilirsiniz:

 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
using cAlgo.API;

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class MyTradeWatchTabSample1 : Plugin
    {
        private SymbolStatsControl _symbolStatsControl;
        private TradeControl _tradeControl;

        protected override void OnStart()
        {
            var tab = TradeWatch.AddTab("Active Chart Symbol Stats");

            var panel = new StackPanel
                {Orientation = Orientation.Vertical, HorizontalAlignment = HorizontalAlignment.Center};

            _symbolStatsControl = new SymbolStatsControl {Margin = 10};
            _tradeControl = new TradeControl {Margin = 10};

            panel.AddChild(_symbolStatsControl);
            panel.AddChild(_tradeControl);

            tab.Child = panel;

            SetSymbolStats();

            _tradeControl.Trade += TradeControlOnTrade;
            ChartManager.ActiveFrameChanged += _ => SetSymbolStats();
        }

        private void TradeControlOnTrade(object sender, TradeEventArgs e)
        {
            ExecuteMarketOrder(e.TradeType, e.SymbolName, e.Volume);
        }

        private void SetSymbolStats()
        {
            if (ChartManager.ActiveFrame is not ChartFrame chartFrame)
                return;

            _tradeControl.Symbol = chartFrame.Symbol;
            _symbolStatsControl.Symbol = chartFrame.Symbol;
        }
    }
}
  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
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import clr
clr.AddReference("cAlgo.API")

from cAlgo.API import *

class TradeWatchTabSample():
    def on_start(self):
        tab = api.TradeWatch.AddTab("Active Chart Symbol Stats")

        panel = StackPanel()
        panel.Orientation = Orientation.Vertical
        panel.HorizontalAlignment = HorizontalAlignment.Center

        self.symbolStatsControl = SymbolStatsControl()
        self.symbolStatsControl.Margin = Thickness(10)
        self.tradeControl = TradeControl(self.on_trade)
        self.tradeControl.Margin = Thickness(10)

        panel.AddChild(self.symbolStatsControl.content)
        panel.AddChild(self.tradeControl.content)

        tab.Child = panel

        self.set_symbol_stats()

        api.ChartManager.ActiveFrameChanged += lambda _ : self.set_symbol_stats()

    def on_trade(self, args):
        api.ExecuteMarketOrder(args["tradeType"], args["symbolName"], args["volume"])

    def set_symbol_stats(self):
        if api.ChartManager.ActiveFrame is None or isinstance(api.ChartManager.ActiveFrame.__implementation__, ChartFrame) == False:
            return;

        chartFrame = ChartFrame(api.ChartManager.ActiveFrame)
        self.tradeControl.set_symbol(chartFrame.Symbol)
        self.symbolStatsControl.set_symbol(chartFrame.Symbol)


class SymbolStatsControl():
    def __init__(self):
        self.__symbol__ = None
        self.content = StackPanel()
        self.content.Orientation = Orientation.Vertical

        self.symbolNameTextBlock = self.get_text_block()
        self.symbolPriceTextBlock = self.get_text_block()

        self.content.AddChild(self.wrap_in_horizontal_panel(self.symbolNameTextBlock, self.symbolPriceTextBlock))

        grid = Grid(10, 2)

        self.spreadTextBlock = self.get_text_block()

        grid.AddChild(self.get_text_block("Spread"), 0, 0)
        grid.AddChild(self.spreadTextBlock, 0, 1)

        self.unrealizedNetProfitTextBlock = self.get_text_block()

        grid.AddChild(self.get_text_block("Unrealized Net Profit"), 1, 0)
        grid.AddChild(self.unrealizedNetProfitTextBlock, 1, 1)

        self.unrealizedGrossProfitTextBlock = self.get_text_block()

        grid.AddChild(self.get_text_block("Unrealized Gross Profit"), 2, 0)
        grid.AddChild(self.unrealizedGrossProfitTextBlock, 2, 1)

        self.commissionTextBlock = self.get_text_block()

        grid.AddChild(self.get_text_block("Commission"), 3, 0)
        grid.AddChild(self.commissionTextBlock, 3, 1)

        self.content.AddChild(grid);

    def get_text_block(self, text = None):
        textBlock = TextBlock()
        textBlock.Margin = Thickness(3)
        textBlock.FontSize = 20
        textBlock.FontWeight = FontWeight.Bold
        textBlock.FontFamily = "Calibri"
        textBlock.Text = text
        return textBlock

    def wrap_in_horizontal_panel(self, *args):
        panel = StackPanel()
        panel.Orientation = Orientation.Horizontal

        for control in args:
            if control.Margin == Thickness(0):
                control.Margin = 3
            panel.AddChild(control)

        return panel

    def get_symbol(self):
        return self.__symbol__

    def set_symbol(self, symbol):
        if symbol is None or symbol == self.__symbol__:
            return

        self.update(symbol)

    def update(self, newSymbol):
        previousSymbol = self.__symbol__;
        self.__symbol__ = newSymbol;

        self.symbolNameTextBlock.Text = f"{newSymbol.Name} ({newSymbol.Description})"
        self.symbolPriceTextBlock.Text = f"Bid: {newSymbol.Bid}, Ask: {newSymbol.Ask}"
        self.spreadTextBlock.Text = f"{self.get_spread_in_pips(newSymbol)} Pips"
        self.unrealizedNetProfitTextBlock.Text = str(newSymbol.UnrealizedNetProfit)
        self.unrealizedGrossProfitTextBlock.Text = str(newSymbol.UnrealizedGrossProfit)
        self.commissionTextBlock.Text = f"{newSymbol.Commission} {newSymbol.CommissionType}"

        if previousSymbol is not None: 
            previousSymbol.Tick -= self.on_symbol_tick

        newSymbol.Tick += self.on_symbol_tick

    def get_spread_in_pips(self, symbol):
        return (symbol.Spread * pow(10, symbol.Digits)) / (symbol.PipSize / symbol.TickSize);

    def on_symbol_tick(self, args):
        self.symbolPriceTextBlock.Text = f"Bid: {args.Bid}, Ask: {args.Ask}"
        self.spreadTextBlock.Text = f"{self.get_spread_in_pips(args.Symbol)} Pips"
        self.unrealizedNetProfitTextBlock.Text = str(args.Symbol.UnrealizedNetProfit)
        self.unrealizedGrossProfitTextBlock.Text = str(args.Symbol.UnrealizedGrossProfit)

class TradeControl():
    def __init__(self, on_trade):
        self.__symbol__ = None
        self.__on_trade__ = on_trade
        self.content = Grid(10, 2)

        self.volumeTextBox = TextBox()
        self.volumeTextBox.MinWidth = 200
        self.volumeTextBox.FontFamily = "Calibri"
        self.volumeTextBox.FontSize = 20
        self.volumeTextBox.FontWeight = FontWeight.Bold
        self.volumeTextBox.Margin = Thickness(3)

        self.content.AddChild(self.get_text_block("Volume"), 0, 0)
        self.content.AddChild(self.volumeTextBox, 0, 1);

        self.tradeTypeComboBox = ComboBox()
        self.tradeTypeComboBox.MinWidth = 200
        self.tradeTypeComboBox.FontFamily = "Calibri"
        self.tradeTypeComboBox.FontSize = 20
        self.tradeTypeComboBox.FontWeight = FontWeight.Bold
        self.tradeTypeComboBox.Margin = Thickness(3)

        self.tradeTypeComboBox.AddItem("Buy")
        self.tradeTypeComboBox.AddItem("Sell")

        self.tradeTypeComboBox.SelectedItem = "Buy"

        tradeTypeTextBlock = self.get_text_block("Trade Type")

        tradeTypeTextBlock.VerticalAlignment = VerticalAlignment.Center

        self.content.AddChild(tradeTypeTextBlock, 1, 0)
        self.content.AddChild(self.tradeTypeComboBox, 1, 1)

        executeButton = Button()
        executeButton.Text = "Execute"
        executeButton.FontFamily = "Calibri"
        executeButton.BackgroundColor = Color.Red

        executeButton.Click += self.on_execute_button_click

        self.content.AddChild(executeButton, 2, 0, 1, 2);

    def get_text_block(self, text = None):
        textBlock = TextBlock()
        textBlock.Margin = Thickness(3)
        textBlock.FontSize = 20
        textBlock.FontWeight = FontWeight.Bold
        textBlock.FontFamily = "Calibri"
        textBlock.Text = text
        return textBlock

    def get_symbol(self):
        return self.__symbol__

    def set_symbol(self, symbol):
        if symbol is None or symbol == self.__symbol__:
            return

        self.__symbol__ = symbol
        self.volumeTextBox.Text = str(self.__symbol__.VolumeInUnitsMin)

    def on_execute_button_click(self, args):
        if self.__symbol__ is None:
            return;

        volume = float(self.volumeTextBox.Text)
        tradeType = TradeType.Buy if self.tradeTypeComboBox.SelectedItem == "Buy" else TradeType.Sell

        self.__on_trade__({"volume": volume, "tradeType": tradeType, "symbolName": self.__symbol__.Name});

Özelleştirme seçenekleri

Bu eklenti, gerçek zamanlı grafik bağlamını İşlem Gözlemi paneli aracılığıyla işlem gerçekleştirmeye bağlar. Aşağıdaki tablo, temel bileşenlerini ve işlevlerini özetlemektedir:

Parametre Açıklama Olası değerler
TradeWatch.AddTab İşlem Gözlemi paneli için sekme yapılandırması. Active chart symbol stats
StackPanel.Orientation Kullanıcı arayüzü öğelerinin yığınlama yönünü tanımlar. Dikey veya yatay
HorizontalAlignment Paneldeki sekmenin yatay hizalamasını tanımlar. Merkez, sol, sağ, vb.
SymbolStatsControl.Margin Sembol istatistikleri kontrol öğesinin etrafındaki kenar boşluğunu ayarlar. 10, 12, 14, vb.
TradeControl.Margin İşlem kontrol öğesinin etrafındaki kenar boşluğunu ayarlar. 10, 12, 14, vb.
SymbolStatsControl.Symbol Sembol istatistikleri kontrol öğesini belirli bir grafik sembolüne bağlar. chartframe.symbol, eurusd, gbpjpy, vb.
TradeControl.Symbol TradeControl'ü işlem eylemleri için bir sembole bağlar. chartframe.symbol, eurusd, gbpjpy, vb.
ChartManager.ActiveFrameChanged Grafik çerçevesi değiştiğinde sembol istatistik güncellemelerini tetikleyen olay. _ => setsymbolstats()
TradeControl.Trade Kontrol panelinden bir işlem eylemi gerçekleştirildiğinde tetiklenen olay. tradecontrolontrade veya null
ExecuteMarketOrder Çağrıldığında bir işlemi gerçekleştirir. e.tradetype, e.symbolname, e.volume

Kullanım durumları

TradeWatch Tab Sample eklentisi, gerçek zamanlı grafik bağlamını işlem gerçekleştirmeyle bağlayarak cTrader'ı geliştirmenin basit bir yolunu sunar. İşlem iş akışlarını kolaylaştıran pratik uygulamaları destekler. Aşağıda, eklentinin işlem deneyimini nasıl geliştirebileceğini gösteren pratik kullanım durumları bulunmaktadır.

Kullanım durumu Senaryo Değer
Sembol kilidi Eklenti sekmesini, her grafik değişiminde güncellenmek yerine her zaman EURUSD gibi sabit bir sembolü gösterecek şekilde ayarlayın. Grafik bağlamından bağımsız olarak tek bir enstrümanı tutarlı bir şekilde takip etmenize ve işlem yapmanıza yardımcı olur.
Grafiğe bağlı işlem paneli İlgili istatistikleri ve işlem seçeneklerini her zaman göstermek için eklentiyi aktif grafik sembolüyle senkronize tutun. Araçları veya panelleri değiştirmeden grafik analizine hızlı bir şekilde yanıt vermenizi sağlar.
Sabit hacimli işlem Emir işleyicideki varsayılan hacmi sabit veya tercih edilen bir lot boyutuna ayarlayın. Hacmi her seferinde ayarlama ihtiyacını ortadan kaldırarak gerçekleştirmeyi basitleştirir.
Hızlı eylem terminali Kolaylaştırılmış bir işlem paneli için kontrolleri yatay olarak yeniden konumlandırın ve merkeze hizalayın. Kompakt kurulumlarda hem istatistiklere hem de işlem düğmelerine daha hızlı erişim sağlar.

Özet

TradeWatch Tab Sample, gerçek zamanlı istatistikleri ve işlem kontrollerini İşlem Gözlemi içindeki özel bir sekmede birleştirerek işlem iş akışlarını basitleştirir. Aktif grafik ile otomatik olarak güncellenir ve düzeni, sembol davranışı ve işlem ayarları farklı işlem stillerine veya odak alanlarına uyacak şekilde özelleştirilebilir.

Daha fazla geliştirme ayrıntısı için eklenti belgelerimize bakın.