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

تنبيهات الأسعار

مثال

توسع كائنات API لتنبيهات الأسعار وظائف استطلاع الأسعار ويمكن استخدامها للقيام بما يلي:

  • إنشاء أنظمة وتطبيقات إشعارات التداول
  • تكوين التداولات المشروطة في الخوارزميات
  • مراقبة معنويات السوق
  • تحسين استراتيجيات إدارة المخاطر.

إنشاء التنبيهات

يوضح هذا الكود كيفية إنشاء وتشغيل التنبيهات:

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

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class SimplePriceAlert : Plugin
    {
        private PriceAlert _upperAlert;
        private PriceAlert _lowerAlert;

        protected override void OnStart()
        {
            PriceAlerts.Added += OnAlertAdded;
            PriceAlerts.Updated += OnAlertUpdated;
            PriceAlerts.Removed += OnAlertRemoved;
            PriceAlerts.Triggered += OnAlertTriggered;

            var symbol = Symbols.GetSymbol("EURUSD");
            var pip = symbol.PipSize;

            _upperAlert = PriceAlerts.Add(
                symbol,
                symbol.Ask + 2 * pip,
                PriceAlertQuoteType.Ask,
                PriceAlertCondition.HigherOrEqual
            );

            _lowerAlert = PriceAlerts.Add(
                symbol,
                symbol.Bid - 2 * pip,
                PriceAlertQuoteType.Bid,
                PriceAlertCondition.LowerOrEqual
            );

            Print($"Added upper alert at Ask >= {symbol.Ask + 2 * pip}");
            Print($"Added lower alert at Bid <= {symbol.Bid - 2 * pip}");
        }

        private void OnAlertAdded(PriceAlertAddedEventArgs args)
        {
            Print($"Alert added. Id: {args.PriceAlert.Id}, Price: {args.PriceAlert.Price}");
        }
        private void OnAlertUpdated(PriceAlertUpdatedEventArgs args)
        {
            Print($"Alert updated. Id: {args.PriceAlert.Id}");
        }
        private void OnAlertRemoved(PriceAlertRemovedEventArgs args)
        {
            Print($"Alert removed. Id: {args.PriceAlert.Id}");
        }
        private void OnAlertTriggered(PriceAlertTriggeredEventArgs args)
        {
            Print($"Alert triggered! Id: {args.PriceAlert.Id}, Symbol: {args.PriceAlert.Symbol.Name}, Target: {args.PriceAlert.Price}");
        }
    }
}

تنفيذ التداولات باستخدام التنبيهات

يمكنك برمجة خوارزمية لتنفيذ التداولات عند تشغيل تنبيه السعر.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnStart()
{
    PriceAlerts.Triggered += PriceAlerts_Triggered;
}

private void PriceAlerts_Triggered(PriceAlertTriggeredEventArgs obj)
{
    var symbol = obj.PriceAlert.Symbol;
    ExecuteMarketOrder(TradeType.Buy, symbol.Name, 10000);  
    Print($"Price alert triggered, trade executed for {symbol.Name}");
}

إدارة التداولات بشكل ديناميكي

يمكنك برمجة خوارزمية لتعديل مستويات إيقاف الخسارة وجني الأرباح للمراكز المفتوحة بشكل ديناميكي عند تشغيل تنبيه. بهذه الطريقة، يتم نقل أو تعديل مستويات إيقاف الخسارة وجني الأرباح عندما يقترب سعر الرمز من مستوى رئيسي، مما يسمح للتداولات بالاستمرار لفترة أطول حسب الحاجة.

1
2
3
4
5
6
7
8
private void PriceAlerts_Triggered(PriceAlertTriggeredEventArgs obj)
{
    var positions = Positions.FindAll("My position", obj.PriceAlert.Symbol.Name, TradeType.Buy);
    foreach (var position in positions)
    {
        position.ModifyStopLossPrice(obj.PriceAlert.Price - 50 * obj.PriceAlert.Symbol.PipSize);
    }
}

إنشاء مدير تنبيهات الأسعار

تضيف هذه الإضافة أداة لإدارة تنبيهات الأسعار إلى لوحة الرمز النشط:

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

namespace cAlgo.Plugins
{
    [Plugin(AccessRights = AccessRights.None)]
    public class PriceAlertsTest : Plugin
    {
        private PriceAlert _priceAlert;

        protected override void OnStart()
        {
            var panel = new StackPanel { Orientation = Orientation.Vertical };

            var addButton = new Button { Text = "Add Alert" };

            addButton.Click += addButton_Click;

            panel.AddChild(addButton);

            var removeButton = new Button { Text = "Remove Alert" };

            removeButton.Click += removeButton_Click; ;

            panel.AddChild(removeButton);

            var updateButton = new Button { Text = "Update Alert" };

            updateButton.Click += updateButton_Click;

            panel.AddChild(updateButton);

            var showSymbolAlertsCountButton = new Button { Text = "Show # Of Active Chart Symbol Alerts" };

            showSymbolAlertsCountButton.Click += showSymbolAlertsCountButton_Click;

            panel.AddChild(showSymbolAlertsCountButton);

            var findAddedAlertButton = new Button { Text = "Find Added Alert" };

            findAddedAlertButton.Click += findAddedAlertButton_Click;

            panel.AddChild(findAddedAlertButton);

            var block = Asp.SymbolTab.AddBlock("Price Alerts Test");

            block.Child = panel;

            PriceAlerts.Added += PriceAlerts_Added;
            PriceAlerts.Removed += PriceAlerts_Removed;
            PriceAlerts.Updated += PriceAlerts_Updated;
            PriceAlerts.Triggered += PriceAlerts_Triggered;

            Print($"Price Alerts #: {PriceAlerts.Count}");
        }

        private void findAddedAlertButton_Click(ButtonClickEventArgs obj)
        {
            Print($"Added Alert Id: {PriceAlerts.Find(_priceAlert.Id).Id}");
        }

        private void showSymbolAlertsCountButton_Click(ButtonClickEventArgs obj)
        {
            if (ChartManager.ActiveFrame is not ChartFrame {Chart: var chart})
                return;

            var symbol = chart.Symbol;

            Print($"Active chart symbol '{symbol.Name}' price alerts count: {PriceAlerts.FindAll(symbol.Name).Length}");
        }

        private void PriceAlerts_Triggered(PriceAlertTriggeredEventArgs obj)
        {
            Print($"Price alert triggered, Id: {obj.PriceAlert.Id}");
        }

        private void PriceAlerts_Updated(PriceAlertUpdatedEventArgs obj)
        {
            Print($"Price alert updated, Id: {obj.PriceAlert.Id}");
        }

        private void PriceAlerts_Removed(PriceAlertRemovedEventArgs obj)
        {
            Print($"Price alert removed, Id: {obj.PriceAlert.Id}");
        }

        private void PriceAlerts_Added(PriceAlertAddedEventArgs obj)
        {
            Print($"Price alert added, Id: {obj.PriceAlert.Id}");
        }

        private void removeButton_Click(ButtonClickEventArgs obj)
        {
            PriceAlerts.Remove(_priceAlert);
        }

        private void updateButton_Click(ButtonClickEventArgs obj)
        {
            if (ChartManager.ActiveFrame is not ChartFrame {Chart: var chart})
                return;

            var symbol = chart.Symbol;

            _priceAlert.Update(symbol, symbol.Ask - (100 * symbol.PipSize), PriceAlertQuoteType.Ask, PriceAlertCondition.LowerOrEqual, true, "Updated message");   
        }

        private void addButton_Click(ButtonClickEventArgs obj)
        {
            if (ChartManager.ActiveFrame is not ChartFrame {Chart: var chart})
                return;

            var symbol = chart.Symbol;

            _priceAlert = PriceAlerts.Add(symbol, symbol.Bid + (100 * symbol.PipSize), PriceAlertQuoteType.Bid, PriceAlertCondition.HigherOrEqual);
        }
    }
}