สัญลักษณ์ที่กำหนดเอง
API ของสัญลักษณ์ที่กำหนดเองช่วยให้คุณสามารถสร้างและจัดการสัญลักษณ์ของคุณเองใน cTrader สัญลักษณ์เหล่านี้สามารถแทนสินทรัพย์สังเคราะห์ ชุดข้อมูลภายนอก เมตริกที่ได้มา หรือเครื่องมือออฟไลน์ทั้งหมด สัญลักษณ์ที่กำหนดเองแต่ละตัวสามารถกำหนดได้โดยใช้สินทรัพย์หนึ่งหรือสองรายการและรองรับการรวมเข้ากับกรอบเวลา การสร้างแผนภูมิ อินดิเคเตอร์ การทดสอบย้อนหลัง และการอัปเดตแบบเรียลไทม์อย่างเต็มรูปแบบ
ประเภทและวิธีการหลักสำหรับสัญลักษณ์ที่กำหนดเองรวมถึง:
CustomSymbols.Add(name, baseSymbol) หรือ CustomSymbols.Add(name, baseAsset, quoteAsset) เพื่อสร้างสัญลักษณ์ที่กำหนดเองใหม่ CustomSymbol.BarsNeeded เพื่อจัดหาข้อมูล OHLC สำหรับสัญลักษณ์ตามความต้องการ CustomSymbol.UpdateQuote(bid, ask) เพื่อป้อนราคาสดให้กับสัญลักษณ์ CustomBars.AppendBars(), UpdateLastBar() และ PrependBars() เพื่อจัดการข้อมูลแท่งเทียนแบบไดนามิก CustomBar แต่ละอันเก็บ Time, Open, High, Low, Close และ Volume
นอกจากนี้ นักพัฒนายังสามารถกำหนดอัตราสวอป ค่าคอมมิชชัน ระดับเลเวอเรจ ความรู้สึก การตั้งค่าฟิวเจอร์ส และแม้แต่ชั่วโมงการซื้อขายหรือวันหยุดสำหรับสัญลักษณ์ที่กำหนดเองได้ เมื่อสร้างขึ้นแล้ว สัญลักษณ์ที่กำหนดเองสามารถโต้ตอบได้อย่างเต็มที่และสามารถดูได้ในแผนภูมิหรือใช้ในการเขียนโปรแกรมใน cBot อินดิเคเตอร์ และปลั๊กอิน
เคล็ดลับ
ใช้สัญลักษณ์ที่กำหนดเองเพื่อแสดงข้อมูลภายนอก จำลองสเปรดหรือความสัมพันธ์ ทดสอบกลยุทธ์บนชุดข้อมูลที่เป็นกรรมสิทธิ์ หรือรวมสินทรัพย์หลายรายการเข้าเป็นเครื่องมือสังเคราะห์
วัตถุ API ของสัญลักษณ์ที่กำหนดเองสามารถใช้เพื่อทำสิ่งต่อไปนี้:
| ฟีเจอร์หรือการดำเนินการ | ตัวอย่าง |
| จำลองสินทรัพย์สังเคราะห์ | สร้างสัญลักษณ์สเปรด (เช่น UKOIL - USOIL) สร้างตะกร้าหุ้นหรือสกุลเงิน |
| แสดงชุดข้อมูลออฟไลน์ | โหลดข้อมูล CSV สำหรับตลาด พล็อตอัตราดอกเบี้ยในอดีตหรือดัชนีทางเศรษฐกิจ |
| สร้างแผนภูมิสดจาก API | ป้อนราคาเรียลไทม์จากภายนอก สตรีมมูลค่ายุติธรรมที่คำนวณหรือเมตริกความเสี่ยง |
| ทดสอบกลยุทธ์บนข้อมูลที่กำหนดเอง | Backtest บนชุดข้อมูลพื้นฐานหรือข้อมูลทางเลือก จำลองสภาพแวดล้อมตลาดในอดีต |
| การสร้างราคาเสนอซื้อขายสังเคราะห์ | สร้างราคาที่กำหนดเองจากสัญลักษณ์ที่มีอยู่ ใส่ราคาเสนอซื้อขายลงในเครื่องมือที่กำหนดเอง |
| การจำลองข้อจำกัดในการเทรด | ใช้เซสชันที่กำหนดเอง วันหยุด การหมดอายุของฟิวเจอร์ส โครงสร้างสว็อป หรือระดับเลเวอเรจ |
| การแสดงผลเมตริกของกลยุทธ์ | พล็อตเส้นอิควิตี้ การถดถอย หรือสัญญาณเป็นชุดราคาสำหรับการวิเคราะห์ในกลยุทธ์ |
การดำเนินการพื้นฐาน
สร้างสัญลักษณ์ที่กำหนดเองใหม่ด้วยสัญลักษณ์พื้นฐาน
| 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);
|
จัดการคำขอแท่งเทียนสำหรับข้อมูลสังเคราะห์
| 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);
};
|
เพิ่มแท่งเทียนแบบเรียลไทม์ตามการเคลื่อนไหวของราคา
| 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 สังเคราะห์ วิธีนี้ช่วยให้สามารถซ้อนทับกลยุทธ์ วิเคราะห์การแยกตัว และติดตามรูปแบบในอดีตโดยใช้ข้อมูลเศรษฐกิจที่มีโครงสร้าง
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);
};
|
สตรีมสัญลักษณ์ส่วนต่าง FX แบบสด
สร้างเครื่องมือสังเคราะห์แบบเรียลไทม์โดยการลบราคาของคู่สกุลเงินสองคู่
สัญลักษณ์ที่กำหนดเองนี้ช่วยให้สามารถสร้างกราฟและเทรดส่วนต่างได้โดยตรง สนับสนุนกลยุทธ์การกลับสู่ค่าเฉลี่ย การติดตามด้วยภาพ และการป้องกันความเสี่ยงตามส่วนต่าง
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
}
|