Aller au contenu

Alertes de prix

Exemple

Les objets API d'alertes de prix étendent les fonctionnalités de surveillance des prix et peuvent être utilisés pour effectuer les opérations suivantes :

  • Créer des systèmes et applications de notification de trades
  • Configurer des trades conditionnels dans les algorithmes
  • Surveiller les sentiments du marché
  • Améliorer les stratégies de gestion des risques.

Créer des alertes

Ce code vous montre comment créer et déclencher des alertes :

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

Exécuter des trades à l'aide d'alertes

Vous pouvez coder un algorithme pour exécuter des trades lorsqu'une alerte de prix est déclenchée.

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

Gérer les trades de manière dynamique

Vous pouvez coder un algorithme pour modifier dynamiquement les niveaux de stop loss et de take profit pour les positions ouvertes lorsqu'une alerte est déclenchée. De cette façon, les niveaux de stop loss et de take profit sont déplacés ou ajustés lorsque le cours d'un symbole approche d'un niveau clé, ce qui permet aux trades de se poursuivre davantage si nécessaire.

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

Créer un gestionnaire d'alertes de prix

Ce plug-in ajoute un outil de gestion des alertes de prix au Panneau de symbole actif :

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