自定义交易品种
自定义交易品种 API 使您能够在 cTrader 中创建和管理自己的交易品种。 这些交易品种可以代表合成资产、外部数据集、衍生指标或完全离线的工具。 每个自定义交易品种可以使用一种或两种资产定义,并支持与时间框架、图表、指标、回测和实时更新的完全集成。
自定义交易品种的主要类型和方法包括:
CustomSymbols.Add(name, baseSymbol) 或 CustomSymbols.Add(name, baseAsset, quoteAsset) 用于创建新的自定义交易品种。 CustomSymbol.BarsNeeded 用于按需提供交易品种的 OHLC 数据。 CustomSymbol.UpdateQuote(bid, ask) 用于为交易品种提供实时价格。 CustomBars.AppendBars()、UpdateLastBar() 和 PrependBars() 用于动态管理 K 线数据。 每个 CustomBar 存储 Time、Open、High、Low、Close 和 Volume。
此外,开发人员可以为自定义交易品种定义掉期利率、佣金、杠杆层级、情绪、期货设置,甚至市场时间或假期。 创建后,自定义交易品种可以完全交互,可以在图表中查看或在 cBot、指标和插件中以编程方式使用。
提示
使用自定义交易品种来可视化外部数据、模拟价差或相关性、在专有数据集上测试策略或将多个资产组合成合成工具。
自定义交易品种 API 对象可用于以下操作:
| 功能或操作 | 示例 |
| 模拟合成资产 | 构建价差交易品种(例如 UKOIL - USOIL) 创建股票或货币篮子 |
| 可视化离线数据集 | 加载市场的 CSV 数据 绘制历史利率或经济指数 |
| 从 API 实时绘制图表 | 馈送外部实时价格 流式传输计算的公允价值或风险指标 |
| 自定义数据上的策略测试 | 在基本面或替代数据集上进行回测 模拟传统市场环境 |
| 生成合成报价 | 从现有交易品种派生自定义价格 将报价注入自定义工具 |
| 交易约束建模 | 应用自定义交易时段、假期、期货到期、掉期结构或杠杆层级 |
| 策略指标可视化 | 绘制净值曲线、回撤或信号作为价格序列,用于策略内分析 |
基本操作
使用基础交易品种创建新的自定义交易品种
| var baseSymbol = Symbols.GetSymbol("EURUSD");
var customSymbol = CustomSymbols.Add("MyCustomSymbol1", baseSymbol);
customSymbol.Description = "Synthetic EURUSD Tracker";
customSymbol.UpdateQuote(baseSymbol.Bid, baseSymbol.Ask);
|
使用资产创建自定义交易品种(无基础交易品种)
| var baseAsset = Assets.GetAsset("XAU");
var quoteAsset = Assets.GetAsset("USD");
var customSymbol = CustomSymbols.Add("GoldIndex", baseAsset, quoteAsset);
customSymbol.UpdateQuote(1923.5, 1923.8);
|
定义静态工具属性
| customSymbol.LotSize = 100000;
customSymbol.PipDigits = 2;
customSymbol.TickDigits = 3;
customSymbol.Commission = 3.5;
customSymbol.SwapLong = -0.2;
customSymbol.SwapShort = 0.1;
|
分配报价源(实时或模拟)
| var tracking = Symbols.GetSymbol("GBPUSD");
tracking.Tick += e => customSymbol.UpdateQuote(e.Symbol.Bid, e.Symbol.Ask);
|
处理合成数据的K线请求
| 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线
| tracking.Tick += _ =>
{
var last = MarketData.GetBars(TimeFrame.Minute, tracking.Name).LastBar;
customSymbol.CustomBars.UpdateLastBar(last.Open, last.High, last.Low, last.Close, last.TickVolume);
};
|
添加自定义交易时段
| customSymbol.MarketHours.Sessions.Add(new CustomSymbolTradingSession(
DayOfWeek.Monday, DayOfWeek.Friday,
new TimeSpan(8, 0, 0), new TimeSpan(16, 30, 0)
));
|
定义期货设置
| customSymbol.FuturesSettings = new CustomSymbolFuturesSettings(
DateTime.UtcNow.AddDays(20),
DateTime.UtcNow.AddDays(30),
0.15 // maintenance margin
);
|
添加动态杠杆层级
| customSymbol.DynamicLeverage.Add(new CustomSymbolLeverageTier(100000, 100));
customSymbol.DynamicLeverage.Add(new CustomSymbolLeverageTier(500000, 50));
|
创建并添加自定义周期
| 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);
|
移除自定义交易品种
| 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
}
|