Перейти к содержанию

Настроение по инструменту

Интерфейс SymbolSentiment и класс SymbolSentimentUpdatedEventArgs позволяют получать доступ к данным о настроениях рынка в реальном времени через API. Для любого заданного инструмента:

  • Symbol.Sentiment.BuyPercentage предоставляет совокупный процент активности покупок, в то время как Symbol.Sentiment.SellPercentage возвращает совокупный процент активности продаж.
  • SymbolSentimentUpdatedEventArgs — это носитель данных для событий обновления настроений. Этот класс позволяет получить доступ к обновленным данным о настроениях для соответствующего инструмента.

Предупреждение

Объекты API настроений по инструменту поддерживаются только в алгоритмах .NET 6 и не функционируют в облаке или cTrader CLI.

Совет

Интегрируйте данные о настроениях рынка в автоматизированные торговые стратегии, чтобы улучшить принятие решений, повысить вероятность прибыльных сделок и усилить управление рисками.

Объекты API настроений по инструменту могут использоваться для следующего в алгоритмах:

Функция или операция Примеры
Торговля на основе настроений Торговля с учетом настроений
Торговля против экстремальных настроений
Сочетание настроений со свечами
Выход при расхождении настроений
Адаптивная настройка рисков Фильтрация шумных сделок
Масштабирование сделок с учетом настроений
Регулирование стратегии на основе рыночной активности
Установка стоп-лосса на основе настроений
Мониторинг и анализ Создание оповещений на основе настроений
Запуск стратегии тепловой карты настроений
Обнаружение пробоев через настроения
Проверка сигналов индикаторов

Примечание

Поскольку данные о настроениях доступны только в реальном времени, их нельзя использовать для бэктестинга или оптимизации, так как нет исторических или сохраненных данных.

Торговля на основе настроений

Торговля с учетом настроений

Вы можете запрограммировать сиБота на подтверждение направления тренда перед входом в сделки или торговать только в том случае, если настроения соответствуют направлению. Например, сиБот выполняет покупку, если не менее 70% настроений бычьи, и продажу, если 70% медвежьи.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBar()
{
    if (Symbol.Sentiment.BuyPercentage > 70)
    {
        ExecuteMarketOrder(TradeType.Buy, "EURUSD", 10000);
    }
    else if (Symbol.Sentiment.SellPercentage > 70)
    {
        ExecuteMarketOrder(TradeType.Sell, "EURUSD", 10000);
    }
}

Торговля против экстремальных настроений

Рассмотрим сиБота, который входит в сделки против сильного консенсуса настроений. Подход разворота в алгоритме предполагает, что толпа часто ошибается на экстремумах, или полагает, что когда очень высокая доля трейдеров находится на одной стороне, рынок может быть готов развернуться. Например, если более 80% трейдеров покупают, сиБот выполняет продажу, ожидая разворота. Та же логика применяется, когда большинство продает.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnBar()
{
    if (Symbol.Sentiment.BuyPercentage > 80)
    {
        // Everyone is buying. Consider selling
        ExecuteMarketOrder(TradeType.Sell, "EURUSD", 10000);
    }
    else if (Symbol.Sentiment.SellPercentage > 80)
    {
        // Everyone is selling. Consider buying
        ExecuteMarketOrder(TradeType.Buy, "EURUSD", 10000);
    }
}

Комбинируйте настроения с свечами

Вы можете настроить сиБота так, чтобы он действовал только тогда, когда и рыночные настроения, и направление свечи совпадают. Если он получает восходящую свечу, а настроения превышают 60% восходящих, сиБот покупает. Если свеча нисходящая и настроения совпадают, сиБот продает. Этот подход помогает отфильтровать слабые сигналы и избежать ложных входов.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
protected override void OnBar()
{
    bool bullishCandle = Bars.LastBar.Close > Bars.LastBar.Open;
    if (bullishCandle && Symbol.Sentiment.BuyPercentage > 60)
    {
        ExecuteMarketOrder(TradeType.Buy, "EURUSD", 10000);
    }

    bool bearishCandle = Bars.LastBar.Close < Bars.LastBar.Open;
    if (bearishCandle && Symbol.Sentiment.SellPercentage > 60)
    {
        ExecuteMarketOrder(TradeType.Sell, "EURUSD", 10000);
    }
}

Выход при расхождении настроений

сиБот может помочь вам выйти из сделок, когда настроения больше не поддерживают вашу позицию. Например, если вы держите покупку, а настроения меняются на более 60% нисходящих, сиБот закрывает ее. Он делает то же самое для сделок на продажу, когда настроения становятся восходящими.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnBar()
{
    foreach (var position in Positions)
    {
        if (position.TradeType == TradeType.Buy && Symbol.Sentiment.SellPercentage > 60)
            ClosePosition(position);
        if (position.TradeType == TradeType.Sell && Symbol.Sentiment.BuyPercentage > 60)
            ClosePosition(position);
    }
}

Адаптивная настройка риска

Отфильтруйте шумные сделки

Вы можете разработать сиБота, который избегает торговли, когда нет четкого смещения настроений. Например, если настроения почти разделены поровну и разница составляет менее 10%, сиБот пропускает сделку. Эта настройка отфильтровывает шум и защищает вас от нерешительных рынков.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
protected override void OnBar()
{
    var diff = Math.Abs(Symbol.Sentiment.BuyPercentage - Symbol.Sentiment.SellPercentage);

    if (diff < 10)
    {
        // Sentiment is too neutral. Avoid trading
        return;
    }

    // Continue strategy logic here
}

Масштабируйте сделки в зависимости от настроений

Вы можете настроить сиБота так, чтобы он корректировал размер позиции в зависимости от того, насколько сильно настроения склоняются в одном направлении. Например, если восходящие настроения значительно превышают нисходящие, сиБот увеличивает объем сделки. Если настроения близки к нейтральным, сиБот торгует меньшими объемами.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
protected override void OnBar()
{
    double sentimentStrength = Math.Abs(Symbol.Sentiment.BuyPercentage - Symbol.Sentiment.SellPercentage);
    long volume = (long)(10000 * (sentimentStrength / 100.0)); // Adjust volume dynamically

    if (Symbol.Sentiment.BuyPercentage > Symbol.Sentiment.SellPercentage)
    {
        ExecuteMarketOrder(TradeType.Buy, "EURUSD", 10000);
    }
    else
    {
        ExecuteMarketOrder(TradeType.Sell, "EURUSD", 10000);
    }
}

Регулируйте стратегию в зависимости от рыночной активности

Вашу стратегию можно настроить так, чтобы она приостанавливала торговлю, когда настроения показывают признаки переполненного рынка. Например, если более 90% трейдеров либо покупают, либо продают, сиБот прекращает торговлю, чтобы избежать входа в позицию как раз тогда, когда рынок, вероятно, развернется.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
protected override void OnBar()
{
    if (Symbol.Sentiment.BuyPercentage > 90 || Symbol.Sentiment.SellPercentage > 90)
    {
        Print("Extreme sentiment detected. Halting trading temporarily.");
        return;
    }

    // Continue normal trading logic
}

Установите стоп-лосс в соответствии с настроениями

Вы можете настроить сиБота так, чтобы он измерял силу настроений и реагировал соответствующим размером стоп-лосса. Например, когда восходящие настроения превышают 80%, сиБот использует более узкий стоп в 20 пипов. Если настроения менее уверенные, сиБот устанавливает более широкий стоп в 50 пипов, чтобы дать больше пространства для маневра.

1
2
3
4
5
6
7
8
protected override void OnBar()
{
    double stopLossPips = Symbol.Sentiment.BuyPercentage > 80 ? 20 : 50;
    if (Symbol.Sentiment.BuyPercentage > Symbol.Sentiment.SellPercentage)
    {
        ExecuteMarketOrder(TradeType.Buy, "EURUSD", 10000, "buy", stopLossPips, null);
    }
}

Мониторинг и анализ

Создайте оповещения на основе настроений

Рассмотрите сиБота, который отслеживает настроения в режиме реального времени и оповещает вас при достижении экстремальных уровней. Например, если настроения на покупку превышают 90%, сиБот регистрирует или выводит восходящее оповещение. Если настроения на продажу пересекают тот же порог, он уведомляет вас об экстремальных нисходящих настроениях.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// This method handles the SymbolSentiment_Updated event
// It is triggered whenever the symbol sentiment data is updated
private void SymbolSentiment_Updated(SymbolSentimentUpdatedEventArgs obj)
{
    if (obj.Sentiment.BuyPercentage > 90)
        Print("Extreme bullish sentiment detected!");

    if (obj.Sentiment.SellPercentage > 90)
        Print("Extreme bearish sentiment detected!");
}

Запустите стратегию тепловой карты настроений

Рассмотрите сиБота, который выполняет сканирование настроений по нескольким активам и определяет лучшие торговые возможности. Например, сиБот проходит по всем доступным инструментам и выводит процентные соотношения покупок и продаж, и затем вы можете сосредоточиться на тех, у которых наиболее экстремальные восходящие или нисходящие настроения.

1
2
3
4
5
6
7
8
protected override void OnStart()
{
    var symbols = Symbols.GetSymbols();
    foreach (var sym in symbols)
    {
        Print($"{sym.Name} - Buy %: {sym.Sentiment.BuyPercentage}, Sell %: {sym.Sentiment.SellPercentage}");
    }
}

Обнаруживайте пробои через настроения

сиБот может быть запрограммирован на обнаружение быстрых изменений в настроениях как потенциального признака пробоя или повышенной волатильности рынка. Например, если настроения на покупку резко возрастают или падают более чем на 15%, сиБот регистрирует всплеск как раннее указание на волатильное движение.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// Field to store the previous buy percentage value
private double previousBuy;

protected override void OnStart()
{
    previousBuy = Symbol.Sentiment.BuyPercentage;

    // Subscribe to the sentiment updated event
    // This will trigger the SymbolSentiment_Updated method whenever sentiment data is updated    
    Symbol.Sentiment.Updated += SymbolSentiment_Updated;
}

// obj is an instance of SymbolSentimentUpdatedEventArgs, which carries the updated sentiment data
private void SymbolSentiment_Updated(SymbolSentimentUpdatedEventArgs obj)
{
    double change = Math.Abs(obj.Sentiment.BuyPercentage - previousBuy);
    if (change > 15)
        Print("Spike in sentiment detected. Breakout or heightened volatility coming soon");

    previousBuy = obj.Sentiment.BuyPercentage;
}

Подтверждайте сигналы индикаторов

Вместо того чтобы полагаться только на индикаторы, вы можете улучшить свою стратегию, запрограммировав сиБота действовать только тогда, когда совпадают условия и индикатора, и настроений. Например, когда RSI показывает перепроданность, а настроения превышают 70% восходящих, сиБот покупает. Если RSI сигнализирует о перекупленности, а настроения превышают 70% нисходящих, сиБот продает.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
private RelativeStrengthIndex rsi;

protected override void OnStart()
{
    rsi = Indicators.RelativeStrengthIndex(Bars.ClosePrices, 14);
}

protected override void OnBar()
{
    if (rsi.Result.LastValue < 30 && Symbol.Sentiment.BuyPercentage > 70)
    {
        ExecuteMarketOrder(TradeType.Buy, "EURUSD", 10000);
    }

    if (rsi.Result.LastValue > 70 && Symbol.Sentiment.SellPercentage > 70)
    {
        ExecuteMarketOrder(TradeType.Sell, "EURUSD", 10000);
    }
}