跳转至

价格提醒

示例

价格提醒 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);
        }
    }
}