Báo động giá
Ví dụ
Các đối tượng API báo động giá mở rộng các chức năng thăm dò giá và có thể được sử dụng để thực hiện những việc sau:
- Tạo hệ thống và ứng dụng thông báo giao dịch
- Cấu hình giao dịch có điều kiện trong thuật toán
- Theo dõi tâm lý thị trường
- Cải thiện chiến lược quản lý rủi ro.
Tạo báo động
Mã này cho bạn thấy cách tạo và kích hoạt báo động:
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}");
}
}
}
|
Thực hiện giao dịch bằng báo động
Bạn có thể lập trình một thuật toán để thực hiện giao dịch khi một báo động giá được kích hoạt.
| 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}");
}
|
Quản lý giao dịch động
Bạn có thể lập trình một thuật toán để sửa đổi mức cắt lỗ và chốt lời cho các vị thế mở một cách linh hoạt khi một báo động được kích hoạt. Bằng cách này, các mức cắt lỗ và chốt lời được di chuyển hoặc điều chỉnh khi giá của một ký hiệu tiến gần đến một mức quan trọng, cho phép các giao dịch tiếp tục khi cần thiết.
| 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);
}
}
|
Tạo trình quản lý báo động giá
Plugin này thêm một công cụ để quản lý báo động giá vào Bảng ký hiệu đang hoạt động:
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);
}
}
}
|