跳转至

cBot 的主要类型

cBot 是多功能工具,根据其代码和逻辑,可以执行各种角色和功能,从完全自动化的交易到为手动交易策略的实施提供支持。 在本文及其对应的视频中,我们将定义 cBot 的主要类型,概述它们的关键差异,并列出创建和使用各种类型 cBot 的一些最佳实践。

广义上讲,cBot 有四种主要类型。

注意

以下分类纯粹基于 cBot 的行为。 在实际的 cBot 代码中并未指定任何类别。 此外,一些开发者也可能创建自定义的 cBot 分类。

  • 自动交易策略 - 顾名思义,此类 cBot 自主执行交易策略。 例如,三只乌鸦与三白兵 cBot 在遇到三根连续的绿色蜡烛后下达新的买单,而在面对三根连续的红色蜡烛时下达新的卖单。
  • 脚本 - 属于此类型的 cBot 在启动时执行一个操作,并在执行完成后停止。 例如,脚本 cBot 可以为所有当前未平仓的头寸设置止损,无论其方向、交易量或交易品种如何。
  • 交易助手 - 旨在执行某种有助于手动或自动交易策略的辅助操作。 例如,此类 cBot 可以使用与 cTrader 内置的追踪止损功能不同的自定义规则来管理您的追踪止损。
  • 交易面板 - 此类 cBot 不会自主交易;相反,它们创建可用于各种目的的自定义控件。 例如,cBot 可以启动外汇新闻聚合器的 WebView,同时在 WebView 中集成自定义的买入和卖出按钮以及交易品种选择器,允许用户在不离开新闻网站的情况下进行交易。

在下面的小节中,我们将详细讨论上述每种类型,概述它们的优点和局限性,并提出各种使用场景。

算法交易策略

属于自动交易策略类型的 cBot 复杂但功能强大。 它们必须正确实施交易策略,包括其所有方面,如风险管理、头寸规模和技术分析。

您可以通过简单地用以下代码替换默认的新 cBot 模板,在不到两分钟内创建一个简单的自动交易策略。

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

该 cBot 在每根 K 线上开一个新头寸。 如果前一根 K 线的价格比前一根 K 线高,则开多头头寸。 相反,如果价格下跌,则开空头头寸。

回测和优化

自动交易策略通常包含许多动态部分和参数。 因此,此类 cBot 通常需要在实盘账户上启动之前进行广泛的回测和优化。 幸运的是,cTrader 提供了内置工具,可以为您处理 回测优化

cTrader 命令行工具 (CLI)

自动交易策略通常需要长时间运行,以便对各种技术分析信号做出反应。 为了在这些情况下节省 RAM 和 CPU 消耗,您可以通过 cTrader CLI 启动 cBot,而无需打开 cTrader Windows(请注意,可以通过 cTrader CLI 启动任何 cBot,而不仅仅是此类型的 cBot)。

脚本

脚本通常用于执行某种难以手动完成或耗时较长的操作。 这些操作通常在 cBot 启动时执行,以便您可以启动脚本,观察其执行结果,然后在成功后停止其实例以节省 RAM 和 CPU 消耗。

例如,脚本可以关闭所有总利润超过交易者账户存款货币 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()

启动 cBot 后,我们应该看到几个盈利头寸逐渐被关闭。

停止脚本

由于脚本只需要执行一次特定操作,您可以指示 cTrader 在执行成功后立即关闭脚本。 如上例所示,您可以通过调用 Stop() 方法来实现这一点。

交易助手

交易助手的目的是定期执行有用的操作。 虽然这使得它们与脚本相似,但脚本仅在实例启动时执行一次操作。 相比之下,交易助手旨在持续对市场条件或其他因素做出反应,并根据某些模式执行操作。

例如,考虑一个在您开仓后立即对冲头寸的 cBot。 该 cBot 的代码可能如下所示。

 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

开仓后,cBot 立即尝试在相反方向开另一个头寸;新头寸的交易量正好是原始头寸交易量的一半。

请注意,我们使用 hasHedgedPosition 字段来避免无限循环,以便 cBot 只对冲一次新头寸。

回调函数

交易助手通常使用回调函数作为各种事件的处理程序。 要了解可以为某个类处理哪些事件,请打开内置的 API 文档,搜索所需的类,并在目录中导航到 Events 部分。

交易面板

交易面板显示自定义控件,当与之交互时会触发各种操作。 它们通常为默认的 cTrader UI 提供生活质量改进。 例如,cBot 可能会显示一个 买入 按钮,点击该按钮会在 cTrader 中执行一个预定义交易量的市价单。

要创建此类 cBot,只需使用以下代码。

 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)

点击 买入 按钮后,将下达一个 10,000 单位的市价单。 按钮的便捷放置允许快速应对新的市场机会。

将交易面板与其他类型的 cBot 结合使用

交易面板提供自定义 UI 控件,让您可以执行各种操作。 您可以将其与其他类型的 cBot 一起使用。 例如,交易面板可能包括一个自定义的 对冲 按钮,点击该按钮会对冲所有当前未平仓的头寸,类似于上面的交易助手示例。

摘要

所有四种类型的 cBot 都有其有效用途,并且可以根据您的偏好进行组合。 例如,您可以同时启动一个自动交易策略和一个交易助手,以实现最佳结果。 您可以尝试各种类型的 cBot,以确保您偏好的交易方法能够完全无误地执行。

Image title