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

Ключевые типы сиБотов

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

В общих чертах существует четыре ключевых типа сиБотов.

Примечание

Приведенные ниже категории различаются исключительно на основе поведения сиБотов. Никакие категории не указываются в самом коде сиБота. Кроме того, некоторые разработчики могут также создавать пользовательские классификации сиБотов.

  • Автоматизированные торговые стратегии — как следует из названия, сиБоты этого типа автономно выполняют торговые стратегии. Например, сиБот Three black crows & three white soldiers размещает новый ордер на покупку после обнаружения трех последовательных зеленых свечей и новый ордер на продажу при появлении трех последовательных красных свечей.
  • Скрипты — сиБоты, относящиеся к этому типу, выполняют действие при запуске и останавливаются после завершения выполнения. Например, скрипт-сиБот может установить стоп-лосс для всех текущих открытых позиций независимо от их направления, объема или инструмента.
  • Торговые помощники — предназначены для выполнения какого-либо полезного действия, которое дополняет стратегию ручной или автоматической торговли. Например, сиБот этого типа может управлять вашими скользящими стоп-лоссами, используя пользовательские правила, которые отличаются от встроенной функциональности скользящего стоп-лосса, предлагаемой cTrader.
  • Торговые панели — сиБоты этого типа не торгуют автономно; вместо этого они создают пользовательские элементы управления, которые могут использоваться для различных целей. Например, сиБот может запустить WebView агрегатора новостей Форекс, интегрируя при этом пользовательские кнопки покупки и продажи, а также селектор инструментов внутри WebView, позволяя пользователю торговать, не покидая новостной сайт.

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

Стратегии алгоритмической торговли

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using cAlgo.API;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicTrendBot : Robot
    {
        protected override void OnBar()
        {
            if (Bars.ClosePrices.Last(1) > Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000, "FollowTrend");
            }
            else if (Bars.ClosePrices.Last(1) < Bars.ClosePrices.Last(2))
            {
                ExecuteMarketOrder(TradeType.Sell, SymbolName, 1000, "FollowTrend");
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicTrendBot():
    def on_bar(self):
        if api.Bars.ClosePrices.Last(1) > api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, "FollowTrend")
        elif api.Bars.ClosePrices.Last(1) < api.Bars.ClosePrices.Last(2):
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000, "FollowTrend")

сиБот открывает новую позицию на каждом баре. Длинная позиция открывается, если цена увеличилась на предыдущем баре по сравнению с баром перед ним. И наоборот, короткая позиция открывается, если цена снизилась.

Бэктестинг и оптимизация

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

Инструмент командной строки cTrader (CLI)

Автоматизированные торговые стратегии обычно должны работать в течение длительных периодов времени, чтобы они могли реагировать на различные сигналы технического анализа. Чтобы сэкономить на потреблении оперативной памяти и процессора в этих случаях, вы можете запускать сиБотов через cTrader CLI, даже не открывая cTrader Windows (обратите внимание, что можно запустить любого сиБота через cTrader CLI, а не только сиБотов этого типа).

Скрипты

Скрипты обычно необходимы для выполнения какого-либо действия, которое было бы сложно или затратно по времени выполнить вручную. Эти действия обычно выполняются при запуске сиБота, так что вы можете запустить скрипт, наблюдать за результатами его работы, а затем остановить его экземпляр в случае успеха, чтобы сэкономить на потреблении оперативной памяти и процессора.

Например, скрипт может закрыть все позиции, валовая прибыль которых превышает 50 единиц валюты депозита счета трейдера. Фактически скрипт будет действовать как универсальный тейк-профит для всех открытых позиций, который вы можете активировать в любое время. Вот как будет выглядеть код для этого скрипта.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicScriptBot : Robot
    {

        protected override void OnStart()
        {
            foreach (var position in Positions) 
            {
                if (position.GrossProfit > 50) 
                {
                    ClosePosition(position);
                }
            }
            Stop();
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicScriptBot():
    def on_start(self):
        for position in api.Positions:
            if position.GrossProfit > 50:
                api.ClosePosition(position)
        api.Stop()

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

Остановка скриптов

Поскольку скриптам нужно выполнить определенное действие только один раз, вы можете дать указание cTrader немедленно закрыть скрипт после успешного завершения выполнения. Как показано в приведенном выше примере, вы можете сделать это, вызвав метод Stop().

Торговые помощники

Цель торговых помощников — регулярно выполнять полезные действия. Это делает их похожими на скрипты, но скрипты выполняют действие только при запуске экземпляра. В отличие от них, торговые помощники предназначены для непрерывного реагирования на рыночные условия или другие факторы и выполнения операций в ответ на определенные паттерны.

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

 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
using System;
using cAlgo.API;
using cAlgo.API.Collections;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicAssistantBot : Robot

    {
        private bool hasHedgedPosition = false;

        protected override void OnStart()
        {
            Positions.Opened += Positions_Opened;
        }

        private void Positions_Opened(PositionOpenedEventArgs args) 
        {
            if (!hasHedgedPosition) 
            {
                hasHedgedPosition = true;
                var position = args.Position;
                var oppositeTradeType = position.TradeType == TradeType.Buy ? TradeType.Sell : TradeType.Buy;
                ExecuteMarketOrder(oppositeTradeType, SymbolName, position.VolumeInUnits / 2);
            }
            else 
            {
                hasHedgedPosition = false;            
            }
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicAssistantBot():
    def on_start(self):
        self.hasHedgedPosition = False
        api.Positions.Opened += self.positions_opened

    def positions_opened(self, args):
        if not self.hasHedgedPosition:
            self.hasHedgedPosition = True
            position = args.Position
            opposite = TradeType.Sell if position.TradeType == TradeType.Buy else TradeType.Buy
            api.ExecuteMarketOrder(opposite, api.SymbolName, position.VolumeInUnits / 2)
        else:
            self.hasHedgedPosition = False

При открытии позиции сиБот немедленно пытается открыть другую в противоположном направлении; объем этой новой позиции составляет ровно половину объема исходной позиции.

Обратите внимание, что мы используем поле hasHedgedPosition, чтобы избежать бесконечного цикла, так что сиБот хеджирует новую позицию только один раз.

Функции обратного вызова

Торговые помощники часто используют функции обратного вызова, выступающие в качестве обработчиков различных событий. Чтобы узнать, какие события вы можете обрабатывать для определенного класса, откройте встроенную документацию API, найдите нужный класс и перейдите к разделу Events в оглавлении.

Торговые панели

Торговые панели отображают пользовательские элементы управления, которые запускают различные действия при взаимодействии с ними. Обычно они обеспечивают улучшения качества жизни для стандартного пользовательского интерфейса cTrader. Например, сиБот может отображать кнопку Buy, которая при нажатии выполняет рыночный ордер на заранее определенный объем в cTrader.

Чтобы создать такого сиБота, просто используйте приведенный ниже код.

 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
using System;
using cAlgo.API;

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class BasicPanelBot : Robot
    {

        Button buttonBuyOrder;

        protected override void OnStart()
        {

            buttonBuyOrder = new Button
            {
                Text = "Buy",
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
            };

            buttonBuyOrder.Click += ButtonBuyOrder_Click;

            Chart.AddControl(buttonBuyOrder);
        }

        private void ButtonBuyOrder_Click(ButtonClickEventArgs args) 
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, 10000);
        }
    }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import clr
clr.AddReference("cAlgo.API")
from cAlgo.API import *
from robot_wrapper import *

class BasicPanelBot():
    def on_start(self):
        self.buttonBuyOrder = Button()
        self.buttonBuyOrder.Text = "Buy"
        self.buttonBuyOrder.HorizontalAlignment = HorizontalAlignment.Center
        self.buttonBuyOrder.VerticalAlignment = VerticalAlignment.Center
        self.buttonBuyOrder.Click += self.button_buy_order_click
        api.Chart.AddControl(self.buttonBuyOrder)

    def button_buy_order_click(self, args):
        api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 10000)

При нажатии кнопки Buy размещается новый рыночный ордер на 10 000 единиц. Удобное расположение кнопки позволяет быстро реагировать на новые рыночные возможности.

Комбинирование торговых панелей с другими типами сиБотов

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

Обзор

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

Image title