チャネルライン
ChartEquidistantChannel
直訳すると等幅チャネルですが、よくチャネルラインって呼ばれてるやつです。トレンドラインが2本ならんだものと考えていいです。
Chart.DrawEquidistantChannel(...)で描画し、返り値でこの型を取得します。
public interface ChartEquidistantChannel : ChartObject
1本が基準の線となり、もう一本がChannelHeight分離れた場所に平行に引かれます。
プロパティ
トレンドラインのプロパティにChannelHeightが加わっただけです。
(double) ChannelHeight {get; set;}
チャネルの幅を取得、設定します。なぜか+で下方向です。感覚と逆な気がします。なんで?
(Color) Color {get; set;}
チャネルラインの色を取得、設定します。
(DateTime) Time1 {get; set;}
チャネルライン基準線の開始点の横位置を取得、設定します。
(double) Y1 {get; set;}
チャネルライン基準線の開始点の縦位置を取得、設定します。
(DateTime) Time2 {get; set;}
チャネルライン基準線の終了点の横位置を取得、設定します。
(double) Y2 {get; set;}
チャネルライン基準線の終了点の縦位置を取得、設定します。
(LineStyle) LineStyle {get; set;}
チャネルのラインスタイルを取得、設定します。
(int) Thickness {get; set;}
チャネルラインの太さを取得、設定します。
(bool) ExtendToInfinity {get; set;}
チャネルラインをY2Time2方向に無限延長するかどうかを取得、設定します。
(bool) ShowAngle {get; set;}
角度を表示するかどうかを取得、設定します。
ChartObjectのプロパティ
IsAlive、IsIntaractive、Name、Commentなど
サンプルコード
// ファイル冒頭に using System.Linq が必要。
// 今あるトレンドラインに重ねてそれっぽいチャネルラインを引く
// トレンドライン一覧の最後の1本を使う。1本もなければ終了。
var trendLines = Chart.FindAllObjects<ChartTrendLine>();
if (trendLines.Count() == 0) return;
var tl = trendLines.Last();
tl.ExtendToInfinity = true;
// チャネル高さ設定
var bars = Bars.Skip(Bars.OpenTimes.GetIndexByTime(tl.Time1));
double channelHeight;
if (tl.Y1 < tl.Y2) {
channelHeight = bars.Select(b => b.High > tl.CalculateY(b.OpenTime) ? b.High - tl.CalculateY(b.OpenTime) : 0)
.OrderBy(price => price)
.Skip((int)(bars.Count() * 0.9))
.Average();
} else {
channelHeight = bars.Select(b => b.Low < tl.CalculateY(b.OpenTime) ? b.Low - tl.CalculateY(b.OpenTime) : 0)
.OrderByDescending(price => price)
.Skip((int)(bars.Count() * 0.9))
.Average();
}
// チャネルラインを引いて、マウスで操作可能にする
Chart.DrawEquidistantChannel("channel_line", tl.Time1, tl.Y1, tl.Time2, tl.Y2, -1*channelHeight, Color.Yellow).IsInteractive = true;
チャートに1本だけトレンドライン引いたうえで実行してください。
チャネル高さ設定のところは少しわかりにくいかもしれませんが、ここではなんか高さを設定してるんだな、とだけ思ってもらえればいいです。