Skip to content

Price alerts

Example

Price alerts API objects expand on price polling functionalities and can be used to do the following:

  • Create trade notification systems and applications
  • Configure conditional trades in algorithms
  • Monitor market sentiments
  • Improve risk management strategies.

Create alerts

This code shows you how to create and trigger alerts:

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

Execute trades using alerts

You can code an algorithm to execute trades when a price alert is triggered.

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

Manage trades dynamically

You can code an algorithm to modify stop-loss and take-profit levels for open positions dynamically when an alert is triggered. This way, stop-loss and take-profit levels are moved or adjusted when a symbol price approaches a key level, which allows trades to run further as needed.

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);
    }
}

Create price alerts manager

This plugin adds a tool for managing price alerts to Active Symbol Panel:

  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);
        }
    }
}