跳转至

自定义交易品种

自定义交易品种 API 使您能够在 cTrader 中创建和管理自己的交易品种。 这些交易品种可以代表合成资产、外部数据集、衍生指标或完全离线的工具。 每个自定义交易品种可以使用一种或两种资产定义,并支持与时间框架、图表、指标、回测和实时更新的完全集成。

自定义交易品种的主要类型和方法包括:

  • CustomSymbols.Add(name, baseSymbol)CustomSymbols.Add(name, baseAsset, quoteAsset) 用于创建新的自定义交易品种。
  • CustomSymbol.BarsNeeded 用于按需提供交易品种的 OHLC 数据。
  • CustomSymbol.UpdateQuote(bid, ask) 用于为交易品种提供实时价格。
  • CustomBars.AppendBars()UpdateLastBar()PrependBars() 用于动态管理 K 线数据。 每个 CustomBar 存储 TimeOpenHighLowCloseVolume

此外,开发人员可以为自定义交易品种定义掉期利率、佣金、杠杆层级、情绪、期货设置,甚至市场时间或假期。 创建后,自定义交易品种可以完全交互,可以在图表中查看或在 cBot、指标和插件中以编程方式使用。

提示

使用自定义交易品种来可视化外部数据、模拟价差或相关性、在专有数据集上测试策略或将多个资产组合成合成工具。

自定义交易品种 API 对象可用于以下操作:

功能或操作 示例
模拟合成资产 构建价差交易品种(例如 UKOIL - USOIL)
创建股票或货币篮子
可视化离线数据集 加载市场的 CSV 数据
绘制历史利率或经济指数
从 API 实时绘制图表 馈送外部实时价格
流式传输计算的公允价值或风险指标
自定义数据上的策略测试 在基本面或替代数据集上进行回测
模拟传统市场环境
生成合成报价 从现有交易品种派生自定义价格
将报价注入自定义工具
交易约束建模 应用自定义交易时段、假期、期货到期、掉期结构或杠杆层级
策略指标可视化 绘制净值曲线、回撤或信号作为价格序列,用于策略内分析

基本操作

使用基础交易品种创建新的自定义交易品种

1
2
3
4
5
var baseSymbol = Symbols.GetSymbol("EURUSD");

var customSymbol = CustomSymbols.Add("MyCustomSymbol1", baseSymbol);
customSymbol.Description = "Synthetic EURUSD Tracker";
customSymbol.UpdateQuote(baseSymbol.Bid, baseSymbol.Ask);

使用资产创建自定义交易品种(无基础交易品种)

1
2
3
4
5
var baseAsset = Assets.GetAsset("XAU");
var quoteAsset = Assets.GetAsset("USD");

var customSymbol = CustomSymbols.Add("GoldIndex", baseAsset, quoteAsset);
customSymbol.UpdateQuote(1923.5, 1923.8);

定义静态工具属性

1
2
3
4
5
6
customSymbol.LotSize = 100000;
customSymbol.PipDigits = 2;
customSymbol.TickDigits = 3;
customSymbol.Commission = 3.5;
customSymbol.SwapLong = -0.2;
customSymbol.SwapShort = 0.1;

分配报价源(实时或模拟)

1
2
var tracking = Symbols.GetSymbol("GBPUSD");
tracking.Tick += e => customSymbol.UpdateQuote(e.Symbol.Bid, e.Symbol.Ask);

处理合成数据的K线请求

1
2
3
4
5
6
customSymbol.BarsNeeded = args =>
{
    var baseBars = MarketData.GetBars(args.CustomBars.TimeFrame, "EURUSD");
    var newBars = baseBars.Select(b => new CustomBar(b.OpenTime, b.Open, b.High, b.Low, b.Close, b.TickVolume));
    args.CustomBars.AppendBars(newBars);
};

在每个报价上附加实时K线

1
2
3
4
5
tracking.Tick += _ =>
{
    var last = MarketData.GetBars(TimeFrame.Minute, tracking.Name).LastBar;
    customSymbol.CustomBars.UpdateLastBar(last.Open, last.High, last.Low, last.Close, last.TickVolume);
};

添加自定义交易时段

1
2
3
4
customSymbol.MarketHours.Sessions.Add(new CustomSymbolTradingSession(
    DayOfWeek.Monday, DayOfWeek.Friday,
    new TimeSpan(8, 0, 0), new TimeSpan(16, 30, 0)
));

定义期货设置

1
2
3
4
5
customSymbol.FuturesSettings = new CustomSymbolFuturesSettings(
    DateTime.UtcNow.AddDays(20),
    DateTime.UtcNow.AddDays(30),
    0.15 // maintenance margin
);

添加动态杠杆层级

1
2
customSymbol.DynamicLeverage.Add(new CustomSymbolLeverageTier(100000, 100));
customSymbol.DynamicLeverage.Add(new CustomSymbolLeverageTier(500000, 50));

创建并添加自定义周期

1
2
3
4
5
6
7
var customTF = TimeFrameManager.Custom.Add("MyCustomH1");

customTF.BarsNeeded = args =>
{
    var hourly = MarketData.GetBars(TimeFrame.Hour, args.CustomBars.Symbol.Name);
    args.CustomBars.AppendBars(hourly.Select(b => new CustomBar(b.OpenTime, b.Open, b.High, b.Low, b.Close, b.TickVolume)));
};

从 CSV 导入数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var lines = File.ReadAllLines("data.csv");

var bars = lines.Skip(1).Select(line =>
{
    var parts = line.Split(',');
    return new CustomBar(DateTime.Parse(parts[0]), 
                         double.Parse(parts[1]), double.Parse(parts[2]), 
                         double.Parse(parts[3]), double.Parse(parts[4]), 
                         int.Parse(parts[5]));
});

customSymbol.BarsNeeded = args => args.CustomBars.AppendBars(bars);

移除自定义交易品种

1
2
var cs = CustomSymbols.Get("MyCustomSymbol1");
CustomSymbols.Remove(cs);

实际整合示例

随时间跟踪基本面数据

将宏观经济指标(如 CPI、失业率或 GDP)显示为合成 OHLC K线。 这种方法可以使用结构化经济数据进行策略叠加、背离分析和历史模式跟踪。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
var macroSymbol = CustomSymbols.Add("US_MacroIndex", Assets.GetAsset("USD"), Assets.GetAsset("USD"));
macroSymbol.BarsNeeded = args =>
{
    var csvData = LoadCustomCsv("us_macro.csv"); // contains OpenTime, Open, High, Low, Close, Volume
    args.CustomBars.AppendBars(csvData.Select(row => new CustomBar(
        DateTime.Parse(row[0]),
        double.Parse(row[1]),
        double.Parse(row[2]),
        double.Parse(row[3]),
        double.Parse(row[4]),
        int.Parse(row[5])
    )));
};

创建加权资产篮子

将多个股票合并为反映加权投资组合的自定义交易品种。 这种设置允许您跟踪表现、应用指标并对由选定组件构建的合成股票指数进行回测策略。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
var customIndex = CustomSymbols.Add("MyAssetBasket", Assets.GetAsset("USD"), Assets.GetAsset("USD"));
customIndex.BarsNeeded = args =>
{
    var eurusdBars = MarketData.GetBars(TimeFrame.Daily, "EURUSD");
    var gbpusdBars = MarketData.GetBars(TimeFrame.Daily, "GBPUSD");
    var usdjpyBars = MarketData.GetBars(TimeFrame.Daily, "USDJPY");

    var indexBars = Enumerable.Range(0, Math.Min(eurusdBars.Count, Math.Min(gbpusdBars.Count, usdjpyBars.Count)))
        .Select(i =>
        {
            var time = eurusdBars[i].OpenTime;
            var weightedClose = eurusdBars[i].Close * 0.4 + gbpusdBars[i].Close * 0.35 + usdjpyBars[i].Close * 0.25;

            return new CustomBar(time, weightedClose, weightedClose, weightedClose, weightedClose, 0);
        });

    args.CustomBars.AppendBars(indexBars);
};

跟踪商品价格差异

考虑创建一个代表黄金和白银价格差(XAUUSD - XAGUSD)的自定义交易品种。 这个自定义交易品种可能有助于价差交易策略、背离检测和贵金属的跨市场分析。

通过分析黄金和白银之间的价格变动差异,交易者可以识别相对强度、潜在套利机会或用一个头寸对冲另一个头寸。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
var spreadSymbol = CustomSymbols.Add("Gold_Silver_Spread", Assets.GetAsset("USD"), Assets.GetAsset("USD"));
spreadSymbol.BarsNeeded = args =>
{
    var gold = MarketData.GetBars(TimeFrame.Hour, "XAUUSD");
    var silver = MarketData.GetBars(TimeFrame.Hour, "XAGUSD");

    var spread = gold.Zip(silver, (g, s) => new CustomBar(
        g.OpenTime,
        g.Close - s.Close,
        g.Close - s.Close,
        g.Close - s.Close,
        g.Close - s.Close,
        g.TickVolume + s.TickVolume
    ));

    args.CustomBars.AppendBars(spread);
};

流式传输实时外汇价差交易品种

通过减去两个外汇对的价格来创建实时合成工具。
这个自定义交易品种可以直接对价差进行图表绘制和交易,支持均值回归策略、视觉跟踪和基于价差的对冲。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
private CustomSymbol _eurGbpSpread;
private Symbol _eurusd, _gbpusd;

protected override void OnStart()
{
    _eurusd = Symbols.GetSymbol("EURUSD");
    _gbpusd = Symbols.GetSymbol("GBPUSD");

    _eurGbpSpread = CustomSymbols.Add("EUR‑GBP Spread",
                                      _eurusd.QuoteAsset,  // both legs already trade in USD
                                      _eurusd.QuoteAsset);

    // propagate tick updates
    _eurusd.Tick  += OnLegTick;
    _gbpusd.Tick  += OnLegTick;
}

private void OnLegTick(SymbolTickEventArgs _)
{
    var mid = _eurusd.Bid - _gbpusd.Bid;        // naïve spread
    _eurGbpSpread.UpdateQuote(mid, mid + 0.00001); // 0.1 pip synthetic spread
}