Lewati ke isi

Simbol kustom

API simbol kustom memungkinkan Anda membuat dan mengelola simbol Anda sendiri di cTrader. Simbol-simbol ini dapat mewakili aset sintetis, dataset eksternal, metrik turunan atau instrumen offline sepenuhnya. Setiap simbol kustom dapat didefinisikan menggunakan satu atau dua aset dan mendukung integrasi penuh dengan timeframe, pembuatan grafik, indikator, backtesting, dan pembaruan real-time.

Tipe dan metode utama untuk simbol kustom meliputi:

  • CustomSymbols.Add(name, baseSymbol) atau CustomSymbols.Add(name, baseAsset, quoteAsset) untuk membuat simbol kustom baru.
  • CustomSymbol.BarsNeeded untuk menyediakan data OHLC untuk simbol sesuai permintaan.
  • CustomSymbol.UpdateQuote(bid, ask) untuk memberikan harga live ke simbol.
  • CustomBars.AppendBars(), UpdateLastBar() dan PrependBars() untuk mengelola data bar secara dinamis. Setiap CustomBar menyimpan Time, Open, High, Low, Close dan Volume.

Selain itu, pengembang dapat menentukan tingkat swap, komisi, tingkat leverage, sentimen, pengaturan futures, dan bahkan jam pasar atau hari libur untuk simbol kustom. Setelah dibuat, simbol kustom sepenuhnya interaktif dan dapat dilihat dalam grafik atau digunakan secara terprogram dalam cBot, indikator, dan plugin.

Tip

Gunakan simbol kustom untuk memvisualisasikan data eksternal, mensimulasikan spread atau korelasi, menguji strategi pada dataset proprietary atau menggabungkan beberapa aset menjadi instrumen sintetis.

Objek API simbol kustom dapat digunakan untuk melakukan hal-hal berikut:

Fitur atau operasi Contoh
Mensimulasikan aset sintetis Membangun simbol spread (mis. UKOIL - USOIL)
Membuat keranjang ekuitas atau mata uang
Memvisualisasikan dataset offline Memuat data CSV untuk pasar
Memplot suku bunga historis atau indeks ekonomi
Pembuatan grafik langsung dari API Mengumpankan harga real-time eksternal
Mengalirkan nilai wajar yang dihitung atau metrik risiko
Pengujian strategi pada data kustom Backtesting pada dataset fundamental atau alternatif
Mensimulasikan lingkungan pasar lama
Menghasilkan kuotasi sintetis Menurunkan harga kustom dari simbol yang ada
Menyuntikkan kuotasi ke dalam instrumen kustom
Pemodelan batasan trading Menerapkan sesi kustom, hari libur, kedaluwarsa futures, struktur swap atau tingkat leverage
Visualisasi metrik strategi Memplot kurva ekuitas, drawdown atau sinyal sebagai rangkaian harga untuk analisis dalam strategi

Operasi dasar

Membuat simbol kustom baru dengan simbol dasar

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

Membuat simbol kustom dengan aset (tanpa simbol dasar)

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

Menentukan properti instrumen statis

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;

Menetapkan umpan kuotasi (langsung atau simulasi)

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

Menangani permintaan bar untuk data sintetis

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);
};

Menambahkan bar real-time pada tick

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);
};

Menambahkan sesi trading kustom

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

Menentukan pengaturan futures

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

Menambahkan tingkat leverage dinamis

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

Membuat dan menambahkan periode kustom

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)));
};

Mengimpor data dari 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);

Menghapus simbol kustom

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

Contoh integrasi praktis

Melacak data fundamental dari waktu ke waktu

Menampilkan indikator makroekonomi seperti CPI, tingkat pengangguran atau PDB sebagai bar OHLC sintetis. Pendekatan ini memungkinkan overlay strategi, analisis divergensi, dan pelacakan pola historis menggunakan data ekonomi terstruktur.

 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])
    )));
};

Membuat keranjang aset berbobot

Menggabungkan beberapa ekuitas menjadi simbol kustom yang mencerminkan portofolio berbobot. Pengaturan ini memungkinkan Anda untuk melacak kinerja, menerapkan indikator dan melakukan backtesting strategi pada indeks ekuitas sintetis yang dibangun dari komponen yang dipilih.

 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);
};

Melacak perbedaan harga komoditas

Pertimbangkan untuk membuat simbol kustom yang mewakili selisih harga antara emas dan perak (XAUUSD - XAGUSD). Simbol kustom ini dapat membantu dengan strategi trading spread, deteksi divergensi dan analisis antar pasar pada logam mulia.

Dengan menganalisis perbedaan pergerakan harga antara emas dan perak, trader dapat mengidentifikasi kekuatan relatif, potensi peluang arbitrase atau melindungi nilai satu posisi terhadap yang lain.

 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);
};

Mengalirkan simbol spread FX langsung

Membuat instrumen sintetis real-time dengan mengurangkan harga dua pasangan forex.
Simbol kustom ini memungkinkan pembuatan grafik dan trading spread secara langsung, mendukung strategi mean-reversion, pelacakan visual dan lindung nilai berbasis 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
}