사용자 정의 심볼
사용자 정의 심볼 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을 저장합니다.
또한 개발자는 사용자 정의 심볼에 대해 스왑 요율, 수수료, 레버리지 티어, 감정, 선물 설정 및 심지어 시장 시간이나 휴일을 정의할 수 있습니다. 일단 생성되면 사용자 정의 심볼은 완전히 상호작용 가능하며 차트에서 볼 수 있거나 cBots, 지표 및 플러그인에서 프로그래밍 방식으로 사용할 수 있습니다.
팁
사용자 정의 심볼을 사용하여 외부 데이터를 시각화하거나 스프레드 또는 상관관계를 시뮬레이션하거나 독점 데이터셋에서 전략을 테스트하거나 여러 자산을 합성 도구로 결합하세요.
사용자 정의 심볼 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);
|
합성 데이터에 대한 바 요청 처리
| 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
}
|