Langkau tajuk talian

Pemberitahuan tersuai

API pemberitahuan tersuai termasuk jenis yang membolehkan algoritma dagangan menyampaikan makluman timbul masa nyata secara langsung dalam cTrader. Makluman timbul ini membolehkan cBot, indikator dan plugin berkomunikasi kemajuan, kejayaan, ralat atau maklumat umum kepada pengguna secara visual dan kontekstual.

Dengan sokongan API pemberitahuan tersuai, cBot tidak lagi perlu bergantung pada tab Log, objek carta atau jambatan Telegram luaran untuk komunikasi. Algo hanya memberitahu pedagang apa yang sedang berlaku secara langsung melalui sistem pemberitahuan standard dalam cTrader. Pembangun algoritma dan pengguna mendapat manfaat daripada kelajuan, kebolehpercayaan dan kejelasan tanpa sebarang persediaan yang kompleks.

Antara muka API yang berkaitan termasuk:

  • INotifications.ShowPopup(caption, message, state) untuk memaparkan pemberitahuan timbul dengan tajuk, mesej dan keadaan yang diberikan (PopupNotificationState).
  • Antara muka PopupNotification untuk kawalan berprogram pemberitahuan jangka panjang atau progresif dengan memanggil .Complete() untuk mengemas kini keadaan akhir mereka.

Mesej yang disampaikan oleh API pemberitahuan tersuai muncul dengan serta-merta, dikodkan warna mengikut keadaan dan boleh dilengkapkan kemudian. Keadaan pemberitahuan ditakrifkan menggunakan enum PopupNotificationState:

  • InProgress untuk mewakili proses jangka panjang atau keadaan tertangguh. Contoh:

  • Success untuk menunjukkan bahawa operasi telah selesai dengan jayanya. Contoh:

  • Error untuk menandakan kegagalan atau pengecualian. Contoh:

  • Partial untuk menyampaikan hasil yang sebahagiannya berjaya (contohnya beberapa pesanan berjaya). Contoh:

  • Information untuk makluman umum, kemas kini atau maklum balas. Contoh:

Petua

Gunakan pemberitahuan timbul untuk menjejak aktiviti dagangan, nyahpepijat aliran logik, maklumkan pengguna tentang peristiwa pasaran atau ralat data dan sampaikan maklum balas UI dinamik semasa operasi strategi secara langsung atau manual.

Objek API Pemberitahuan boleh digunakan untuk melakukan perkara berikut:

Ciri atau operasi Contoh
Penjejakan dan maklum balas pesanan Paparkan maklum balas pelaksanaan pesanan
Sahkan keluar TP/SL
Jejak pengubahsuaian henti jejak
Amaran berasaskan risiko dan peraturan Beri amaran tentang tahap margin rendah
Tunjukkan amaran untuk dagangan yang disekat
Kemajuan dan diagnostik Tunjukkan kemajuan analisis dengan tetingkap timbul
Interaksi dagangan manual Berikan maklum balas untuk tindakan dagangan
Beri amaran tentang pengatasan atau campur tangan manual
Peristiwa pasaran dan isyarat amaran Isyarat persilangan penunjuk
Umumkan pembukaan sesi atau lonjakan harga
Penyahpepijatan dan ketelusan strategi Jejak langkah strategi/logik secara visual
Laporkan kegagalan logik

Contoh asas

Apabila satu contoh cBot ini ditambah pada carta, ia menyediakan lima butang, satu untuk setiap keadaan pemberitahuan. Mengklik butang mencetuskan pemberitahuan tetingkap timbul.

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

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None, AddIndicators = true)]
    public class PopupNotificationStatesDemo : Robot
    {
        protected override void OnStart()
        {
            var panel = new StackPanel
            {
                Orientation = Orientation.Vertical,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center
            };

            // InProgress
            var inProgressBtn = new Button { Text = "Show: InProgress", Margin = 5 };
            inProgressBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "In progress",
                    "Starting a long-running task…",
                    PopupNotificationState.InProgress
                );
            };
            panel.AddChild(inProgressBtn);

            // Success
            var successBtn = new Button { Text = "Show: Success", Margin = 5 };
            successBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Success",
                    "The operation completed successfully.",
                    PopupNotificationState.Success
                );
            };
            panel.AddChild(successBtn);

            // Error
            var errorBtn = new Button { Text = "Show: Error", Margin = 5 };
            errorBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Error",
                    "Something went wrong. Please check the logs or try again.",
                    PopupNotificationState.Error
                );
            };
            panel.AddChild(errorBtn);

            // Partial
            var partialBtn = new Button { Text = "Show: Partial", Margin = 5 };
            partialBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Partial result",
                    "Completed with partial success (e.g. some orders filled).",
                    PopupNotificationState.Partial
                );
            };
            panel.AddChild(partialBtn);

            // Information
            var infoBtn = new Button { Text = "Show: Information", Margin = 5 };
            infoBtn.Click += _ =>
            {
                Notifications.ShowPopup(
                    "Information",
                    "General update: your settings were saved.",
                    PopupNotificationState.Information
                );
            };
            panel.AddChild(infoBtn);

            Chart.AddControl(panel);
        }

        protected override void OnTick()
        {
            // Handle price updates here if needed
        }

        protected override void OnStop()
        {
            // Cleanup if needed
        }
    }
}

Penjejakan dan maklum balas pesanan

Paparkan maklum balas pelaksanaan pesanan

Gunakan pemberitahuan tetingkap timbul untuk melihat dengan segera sama ada pesanan pasaran anda berjaya atau tidak. Sebagai contoh, selepas cBot anda meletakkan pesanan beli, ia menunjukkan tetingkap timbul berjaya jika dagangan anda diisi atau tetingkap timbul ralat jika broker anda menolaknya.

1
2
3
var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
var state = result.IsSuccessful ? PopupNotificationState.Success : PopupNotificationState.Error;
Notifications.ShowPopup("Order Execution", $"Order result: {result.Error}", state);

Sahkan keluar TP atau SL

Dapatkan pemberitahuan apabila dagangan cBot anda keluar disebabkan ambilan untung atau henti rugi. Tetingkap timbul menunjukkan sebab keluar bersama dengan keuntungan atau kerugian daripada posisi yang ditutup. Maklum balas masa nyata pada saat keluar ini membantu anda menjejak dagangan dan sentiasa mengikuti perkembangan hasil posisi aktif anda.

1
2
3
4
5
6
protected override void OnPositionClosed(PositionClosedEventArgs args)
{
    var pos = args.Position;
    var reason = pos.ClosingReason.ToString();
    Notifications.ShowPopup("Position Closed", $"Closed due to {reason}. PnL: {pos.GrossProfit}", PopupNotificationState.Information);
}

Jejak pengubahsuaian henti jejak

Lihat tetingkap timbul setiap kali henti jejak mengemaskini henti rugi untuk posisi anda. Pemberitahuan ini termasuk nilai henti rugi baharu dan menunjukkan bagaimana henti jejak menjejaki tindakan harga. Amaran ini membolehkan anda memantau bagaimana perlindungan dagangan anda disesuaikan tanpa membuka sebarang panel.

1
2
3
4
5
6
7
protected override void OnPositionModified(PositionModifiedEventArgs args)
{
    if (args.Reason == PositionModificationReason.TrailingStop)
    {
        Notifications.ShowPopup("Trailing Stop Moved", $"New SL: {args.Position.StopLoss}", PopupNotificationState.Information);
    }
}

Amaran berasaskan risiko dan peraturan

Beri amaran tentang tahap margin rendah

Terima amaran tetingkap timbul apabila tahap margin akaun anda jatuh di bawah ambang kritikal (contohnya 80%). Amaran ini membantu anda mengambil tindakan tepat pada masanya, seperti menutup posisi atau menambah dana, untuk mengelakkan pembubaran paksa atau panggilan margin. Tetingkap timbul bertindak sebagai perlindungan automatik berdasarkan data risiko masa nyata.

1
2
3
4
5
6
7
protected override void OnTick()
{
    if (Account.MarginLevel < 80)
    {
        Notifications.ShowPopup("Low Margin Warning", $"Current margin level: {Account.MarginLevel:0.00}%", PopupNotificationState.Error);
    }
}

Tunjukkan amaran untuk dagangan yang disekat

Sesetengah cBot diprogramkan untuk berhenti meletakkan dagangan apabila peraturan keselamatan dalaman, seperti ekuiti rendah atau penurunan berlebihan, dicetuskan. Tetingkap timbul boleh menjelaskan sekatan dan menunjukkan kepada anda syarat mana yang dilanggar. Pemberitahuan ini memastikan anda memahami mengapa isyarat dilangkau dan mengukuhkan tingkah laku strategi yang berdisiplin.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnBar()
{
    if (Account.Equity < 100)
    {
        Notifications.ShowPopup("Trade Blocked", "Equity too low to place trade", PopupNotificationState.Error);
        return;
    }

    ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000);
}

Kemajuan dan diagnostik

Tunjukkan kemajuan analisis dengan tetingkap timbul

Gunakan tetingkap timbul InProgress untuk menunjukkan permulaan proses yang memakan masa lama, seperti pengesahan data atau persediaan untuk ujian belakang. Sebaik sahaja operasi selesai, kemas kini tetingkap timbul kepada keadaan Success atau Error. Laporan kemajuan yang dipaparkan memastikan anda sentiasa dimaklumkan tanpa perlu memeriksa log atau mesej penyahpepijatan.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
private PopupNotification _progressPopup;

protected override void OnStart()
{
    _progressPopup = Notifications.ShowPopup("Analysis Started", "Running analysis...", PopupNotificationState.InProgress);
    Timer.Start(4); // Simulate 4-second task
}

protected override void OnTimer()
{
    _progressPopup.Complete(PopupNotificationState.Success);
    Timer.Stop();
}

Interaksi dagangan manual

Maklumkan pengguna selepas dagangan dicetuskan butang

Selepas anda mengklik kawalan atau butang tersuai, cBot anda boleh meletakkan pesanan dan segera menunjukkan tetingkap timbul dengan hasilnya. Pemberitahuan mengesahkan sama ada tindakan manual anda berjaya atau gagal dan memaparkan sebarang ralat yang dikembalikan oleh broker. Maklum balas visual ini mengurangkan tekaan dan meningkatkan keyakinan anda dalam campur tangan manual.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
protected override void OnStart()
{
    var panel = new StackPanel();
    var button = new Button { Text = "Manual Buy" };

    button.Click += args =>
    {
        var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
        var status = result.IsSuccessful ? PopupNotificationState.Success : PopupNotificationState.Error;
        Notifications.ShowPopup("Manual Trade", $"Buy order result: {result.Error}", status);
    };

    panel.AddChild(button);
    Chart.AddControl(panel);
}

Beri amaran tentang pengatasan atau campur tangan manual

Apabila anda mengatasi logik automatik atau melakukan pengatasan manual (contohnya memaksa dagangan semasa keadaan disekat), tetingkap timbul boleh mengakui tindakan tersebut.

1
2
3
4
5
button.Click += args =>
{
    Notifications.ShowPopup("Manual Override", "User manually triggered a trade", PopupNotificationState.Information);
    ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000);
};

Peristiwa pasaran dan isyarat amaran

Isyarat persilangan penunjuk

Pantau peristiwa teknikal utama seperti persilangan purata bergerak atau ambang RSI dan tunjukkan amaran tetingkap timbul apabila ia berlaku. Pemberitahuan menyerlahkan penunjuk dan syarat yang dipenuhi, seperti persilangan menaik. Ini memastikan anda dimaklumkan tentang isyarat teknikal dan menjadikan strategi anda lebih telus dan boleh dijejaki.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
private MovingAverage _fast, _slow;

protected override void OnStart()
{
    _fast = Indicators.MovingAverage(MarketSeries.Close, 5, MovingAverageType.Exponential);
    _slow = Indicators.MovingAverage(MarketSeries.Close, 20, MovingAverageType.Exponential);
}

protected override void OnBar()
{
    int i = MarketSeries.Close.Count - 1;
    if (_fast.Result[i] > _slow.Result[i] && _fast.Result[i - 1] <= _slow.Result[i - 1])
    {
        Notifications.ShowPopup("MA Crossover", "Fast MA crossed above Slow MA", PopupNotificationState.Information);
    }
}

Amaran pembukaan sesi atau lonjakan harga

Cipta tetingkap timbul yang dicetuskan apabila peristiwa pasaran penting berlaku, seperti pembukaan sesi London atau pergerakan harga yang pesat dalam tempoh yang singkat. Pemberitahuan ini bertindak sebagai alat kesedaran situasi dan membantu anda bertindak balas terhadap potensi turun naik atau bersedia untuk aktiviti pasaran.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBar()
{
    var time = Server.Time;
    if (time.TimeOfDay.Hours == 8 && time.TimeOfDay.Minutes == 0)
    {
        Notifications.ShowPopup("London Session Open", "London market has opened", PopupNotificationState.Information);
    }

    if (Math.Abs(Symbol.Bid - Symbol.Ask) / Symbol.PipSize > 15)
    {
        Notifications.ShowPopup("Spread Spike", "Spread exceeded 15 pips!", PopupNotificationState.Warning);
    }
}

Penyahpepijatan dan ketelusan strategi

Jejak langkah strategi secara visual

Gunakan urutan tetingkap timbul untuk menunjukkan aliran logik strategi anda. Sebagai contoh, paparkan mesej semasa memeriksa trend, mengesahkan isyarat atau mengesahkan risiko. Setiap tetingkap timbul mewakili titik semakan tertentu, yang membolehkan anda mengikuti bagaimana strategi membuat keputusan dalam masa nyata.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBar()
{
    Notifications.ShowPopup("Step 1", "Checking market condition", PopupNotificationState.Information);

    if (MarketSeries.Close.Last(1) > MarketSeries.Open.Last(1))
    {
        Notifications.ShowPopup("Step 2", "Bullish candle detected", PopupNotificationState.Information);
    }

    Notifications.ShowPopup("Step 3", "Trade logic complete", PopupNotificationState.Success);
}

Laporkan kegagalan logik atau data yang tidak dijangka

Apabila strategi anda menghadapi ralat atau data tidak sah, seperti ketidakpadanan harga atau penunjuk yang tidak tersedia, gunakan tetingkap timbul untuk menunjukkan isu yang tepat. Persediaan ini membantu anda mengenal pasti pepijat atau jurang data semasa pembangunan dan dagangan demo/langsung, menghasilkan penyahpepijatan yang lebih cepat dan logik yang lebih berdaya tahan.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
protected override void OnBar()
{
    try
    {
        // Assume some strategy logic
        if (Symbol.Bid < 0) throw new Exception("Invalid price feed");

        Notifications.ShowPopup("Logic OK", "Price validation passed", PopupNotificationState.Success);
    }
    catch (Exception ex)
    {
        Notifications.ShowPopup("Logic error", ex.Message, PopupNotificationState.Error);
    }
}