ローソク足
S# は、次の種類のローソク足をサポートします:
- TimeFrameCandleMessage - 時間間隔、つまりタイムフレームに基づくローソク足です。一般的な間隔 (分、時間、日足) とカスタム間隔の両方を設定できます。たとえば、21 秒、4.5 分などです。
- RangeCandleMessage - 価格レンジローソク足です。許容範囲を超える価格の約定が発生すると、新しいローソク足が作成されます。許容範囲は、毎回最初の約定価格に基づいて形成されます。
- VolumeCandleMessage - 約定の合計出来高が指定された上限を超えるまでローソク足が形成されます。新しい約定が許容出来高を超える場合、その約定は新しいローソク足に含まれます。
- TickCandleMessage - VolumeCandleMessage と同じですが、制限として出来高ではなく約定数を使用します。
- PnFCandleMessage - ポイントアンドフィギュアチャートのローソク足 (X-O チャート) です。
- RenkoCandleMessage - Renko ローソク足です。
ローソク足の扱い方は、Samples/02_Candles/01_Realtime フォルダーにある例で示されています。
次の画像は、TimeFrameCandleMessage と RangeCandleMessage のチャートを示しています:


データ取得の開始
- ローソク足を取得するには、Subscription クラスを使用してサブスクリプションを作成します:
// 5 分足ローソク足へのサブスクリプションを作成
var subscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)), // タイムフレーム指定付きのデータ型
security) // 銘柄
{
// MarketData プロパティを通じて追加パラメーターを設定
MarketData =
{
// 履歴データをリクエストする期間 (直近 30 日)
From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
To = DateTime.Now
}
};
- ローソク足を受信するには、処理対象の新しい値が出現したことを通知する Connector.CandleReceived イベントをサブスクライブします:
// ローソク足受信イベントをサブスクライブ
_connector.CandleReceived += OnCandleReceived;
// ローソク足受信イベントハンドラー
private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
// ここで subscription は作成したサブスクリプションオブジェクト
// 受信したローソク足
// ローソク足が自分のサブスクリプションに属しているか確認
if (subscription == _candleSubscription)
{
// チャートにローソク足を描画
Chart.Draw(_candleElement, candle);
}
}
Tip
Chart グラフィカルコンポーネントは、ローソク足の表示に使用されます。
- 次に、Connector.Subscribe メソッドを通じてサブスクリプションを開始します:
// サブスクリプションを開始
_connector.Subscribe(subscription);
この後、Connector.CandleReceived イベントが呼び出され始めます。
- Connector.CandleReceived イベントは、新しいローソク足が出現したときだけでなく、現在のローソク足が変化したときにも呼び出されます。
"完了済み" ローソク足のみを表示する必要がある場合は、受信したローソク足の ICandleMessage.State プロパティを確認する必要があります:
private void OnCandleReceived(Subscription subscription, ICandleMessage candle)
{
// ローソク足が自分のサブスクリプションに属しているか確認
if (subscription != _candleSubscription)
return;
// ローソク足が完了しているか確認
if (candle.State == CandleStates.Finished)
{
// 描画用データを作成
var chartData = new ChartDrawData();
chartData.Group(candle.OpenTime).Add(_candleElement, candle);
// チャートにローソク足を描画
this.GuiAsync(() => Chart.Draw(chartData));
}
}
- サブスクリプションには追加パラメーターを設定できます:
- ローソク足構築モード - 既製データをリクエストするか、別のデータ型から構築するかを決定します:
// 既製データのみをリクエスト
subscription.MarketData.BuildMode = MarketDataBuildModes.Load;
// 別のデータ型からのみ構築
subscription.MarketData.BuildMode = MarketDataBuildModes.Build;
// 既製データをリクエストし、利用できない場合は構築
subscription.MarketData.BuildMode = MarketDataBuildModes.LoadAndBuild;
- ローソク足構築元 - 直接利用できない場合に、どのデータ型からローソク足を構築するかを示します:
// ティック約定からローソク足を構築
subscription.MarketData.BuildFrom = DataType.Ticks;
// 板情報からローソク足を構築
subscription.MarketData.BuildFrom = DataType.MarketDepth;
// Level1 からローソク足を構築
subscription.MarketData.BuildFrom = DataType.Level1;
- ローソク足構築用フィールド - 特定のデータ型では指定が必要です:
// Level1 の最良買気配価格からローソク足を構築
subscription.MarketData.BuildField = Level1Fields.BestBidPrice;
// Level1 の最良売気配価格からローソク足を構築
subscription.MarketData.BuildField = Level1Fields.BestAskPrice;
// 板情報内のスプレッド中央値からローソク足を構築
subscription.MarketData.BuildField = Level1Fields.SpreadMiddle;
- 出来高プロファイル - ローソク足の出来高プロファイル計算:
// 出来高プロファイル計算を有効化
subscription.MarketData.IsCalcVolumeProfile = true;
さまざまなローソク足タイプへのサブスクリプション例
標準タイムフレームのローソク足
// 5 分足ローソク足
var timeFrameSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security);
_connector.Subscribe(timeFrameSubscription);
履歴ローソク足のみを読み込む
// リアルタイムへ移行せず、履歴ローソク足のみを読み込む
var historicalSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security)
{
MarketData =
{
From = DateTime.Today.Subtract(TimeSpan.FromDays(30)),
To = DateTime.Today, // 終了日を指定
BuildMode = MarketDataBuildModes.Load // 既製データのみを読み込む
}
};
_connector.Subscribe(historicalSubscription);
ティックから非標準タイムフレームのローソク足を構築する
// ティックから構築される 21 秒タイムフレームのローソク足
var customTimeFrameSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromSeconds(21)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(customTimeFrameSubscription);
板情報データからローソク足を構築する
// 板情報内のスプレッド中央値から構築されるローソク足
var depthBasedSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(1)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.MarketDepth,
BuildField = Level1Fields.SpreadMiddle
}
};
_connector.Subscribe(depthBasedSubscription);
出来高プロファイル付きローソク足
// 出来高プロファイル計算付き 5 分足ローソク足
var volumeProfileSubscription = new Subscription(
DataType.TimeFrame(TimeSpan.FromMinutes(5)),
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.LoadAndBuild,
BuildFrom = DataType.Ticks,
IsCalcVolumeProfile = true
}
};
_connector.Subscribe(volumeProfileSubscription);
出来高ローソク足
// 出来高ローソク足 (各ローソク足に出来高 1000 コントラクトを含む)
var volumeCandleSubscription = new Subscription(
DataType.Volume(1000m), // ローソク足タイプと出来高を指定
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(volumeCandleSubscription);
ティック数ローソク足
// ティック数ローソク足 (各ローソク足に 1000 約定を含む)
var tickCandleSubscription = new Subscription(
DataType.Tick(1000), // ローソク足タイプと約定数を指定
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(tickCandleSubscription);
価格レンジローソク足
// レンジ 0.1 単位の価格レンジローソク足
var rangeCandleSubscription = new Subscription(
DataType.Range(0.1m), // ローソク足タイプと価格レンジを指定
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(rangeCandleSubscription);
Renko ローソク足
// ステップ 0.1 の Renko ローソク足
var renkoCandleSubscription = new Subscription(
DataType.Renko(0.1m), // ローソク足タイプとブロックサイズを指定
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(renkoCandleSubscription);
ポイントアンドフィギュアローソク足 (P&F)
// ポイントアンドフィギュアローソク足
var pnfCandleSubscription = new Subscription(
DataType.PnF(new PnfArg { BoxSize = 0.1m, ReversalAmount = 1 }), // P&F パラメーターを指定
security)
{
MarketData =
{
BuildMode = MarketDataBuildModes.Build,
BuildFrom = DataType.Ticks
}
};
_connector.Subscribe(pnfCandleSubscription);