Peringatan harga
Contoh
Objek API peringatan harga memperluas fungsionalitas polling harga dan dapat digunakan untuk melakukan hal-hal berikut:
- Membuat sistem notifikasi trading dan aplikasi
- Mengkonfigurasi trading bersyarat dalam algoritma
- Memantau sentimen pasar
- Meningkatkan strategi manajemen risiko.
Membuat peringatan
Kode ini menunjukkan kepada Anda cara membuat dan memicu peringatan:
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}");
}
}
}
|
Mengeksekusi trading menggunakan peringatan
Anda dapat membuat kode algoritma untuk mengeksekusi trading ketika peringatan harga dipicu.
| 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}");
}
|
Mengelola trading secara dinamis
Anda dapat membuat kode algoritma untuk memodifikasi level Stop Loss dan Take Profit untuk posisi terbuka secara dinamis ketika peringatan dipicu. Dengan cara ini, level Stop Loss dan Take Profit dipindahkan atau disesuaikan ketika harga simbol mendekati level kunci, yang memungkinkan trading berjalan lebih jauh sesuai kebutuhan.
| 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);
}
}
|
Membuat manajer peringatan harga
Plugin ini menambahkan alat untuk mengelola peringatan harga ke Panel Simbol Aktif:
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);
}
}
}
|