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