コンテンツにスキップ

カスタムシンボル

カスタムシンボルAPIを使用すると、cTraderで独自のシンボルを作成および管理できます。 これらのシンボルは、合成資産、外部データセット、派生指標、または完全にオフラインの商品を表すことができます。 各カスタムシンボルは、1つまたは2つの資産を使用して定義でき、タイムフレーム、チャート、インジケーター、バックテスト、リアルタイム更新との完全な統合をサポートします。

カスタムシンボルの主要なタイプとメソッドは次のとおりです:

  • CustomSymbols.Add(name, baseSymbol)またはCustomSymbols.Add(name, baseAsset, quoteAsset)を使用して新しいカスタムシンボルを作成します。
  • CustomSymbol.BarsNeededを使用して、シンボルのOHLCデータをオンデマンドで提供します。
  • CustomSymbol.UpdateQuote(bid, ask)を使用して、シンボルにライブ価格を供給します。
  • CustomBars.AppendBars()UpdateLastBar()PrependBars()を使用して、バーデータを動的に管理します。 各CustomBarTimeOpenHighLowCloseVolumeを保存します。

さらに、開発者はカスタムシンボルのスワップレート、手数料、レバレッジティア、センチメント、先物設定、さらにはマーケット時間や休日を定義できます。 作成されたカスタムシンボルは完全にインタラクティブであり、チャートで表示したり、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);

合成データのバーリクエストを処理

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

ティックでリアルタイムバーを追加

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バーとして表示。 このアプローチにより、構造化された経済データを使用して、戦略オーバーレイ、ダイバージェンス分析、および過去のパターントラッキングが可能になります。

 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スプレッドシンボルのストリーム

2つの為替ペアの価格を差し引いてリアルタイムの合成インストゥルメントを作成。
このカスタムシンボルにより、スプレッドを直接チャート化および取引することが可能になり、平均回帰戦略、視覚的追跡、およびスプレッドベースのヘッジをサポートします。

 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
}