콘텐츠로 이동

사용자 정의 심볼

사용자 정의 심볼 API를 사용하면 cTrader에서 자신만의 심볼을 생성하고 관리할 수 있습니다. 이러한 심볼은 합성 자산, 외부 데이터셋, 파생 지표 또는 완전히 오프라인 도구를 나타낼 수 있습니다. 각 사용자 정의 심볼은 하나 또는 두 개의 자산을 사용하여 정의할 수 있으며, 시간 프레임, 차트, 지표, 백테스트 및 실시간 업데이트와 완전히 통합됩니다.

사용자 정의 심볼의 주요 유형 및 메서드에는 다음이 포함됩니다:

  • CustomSymbols.Add(name, baseSymbol) 또는 CustomSymbols.Add(name, baseAsset, quoteAsset)를 사용하여 새로운 사용자 정의 심볼을 생성합니다.
  • CustomSymbol.BarsNeeded를 사용하여 심볼에 대한 OHLC 데이터를 요청 시 제공합니다.
  • CustomSymbol.UpdateQuote(bid, ask)를 사용하여 심볼에 실시간 가격을 제공합니다.
  • CustomBars.AppendBars(), UpdateLastBar()PrependBars()를 사용하여 바 데이터를 동적으로 관리합니다. 각 CustomBarTime, Open, High, Low, CloseVolume을 저장합니다.

또한 개발자는 사용자 정의 심볼에 대해 스왑 요율, 수수료, 레버리지 티어, 감정, 선물 설정 및 심지어 시장 시간이나 휴일을 정의할 수 있습니다. 일단 생성되면 사용자 정의 심볼은 완전히 상호작용 가능하며 차트에서 볼 수 있거나 cBots, 지표 및 플러그인에서 프로그래밍 방식으로 사용할 수 있습니다.

사용자 정의 심볼을 사용하여 외부 데이터를 시각화하거나 스프레드 또는 상관관계를 시뮬레이션하거나 독점 데이터셋에서 전략을 테스트하거나 여러 자산을 합성 도구로 결합하세요.

사용자 정의 심볼 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 스프레드 심볼 스트리밍

두 외환 쌍의 가격을 빼서 실시간 합성 도구를 생성합니다.
이 사용자 정의 심볼은 스프레드를 직접 차트 작성하고 거래할 수 있게 하여 평균 회귀 전략, 시각적 추적 및 스프레드 기반 헤징을 지원합니다.

 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
}