検索

Google
Web www.icefree.org

RSS of recent changes

 

グラフ描画の基礎

Tue, 10 Aug 2010 23:10:04 JST
08 Nov 2006-

グラフのグリッドが思うように描けなかったので、それを何とかできないか調べてみます。

ソースを読む

チャートを表示してる元締めはChartDrawingらしい。

オシレータの場合、
DrawIndicator
にいくっぽい。
その中で呼んでいるConvertToYで値からY座標に変換している。

ConvertToYはoscillatorの場合
OscillatorPreference::Trans.TransValue

TransはUtil.csで定義されてて
線形で補間するLinearTransと対数で補間するLogTransがある。

オシレータの場合、Linearだけで、
ChartDrawing.cs l.861 (RecalcFormat)あたりで設定してるみたい。

その手前で範囲を決定してます。
op.SetScaleValuesってあたり。
3つ引数があって、上限、中央、下限。
ScaleValues[1]の中央値は実際には使ってはいないらしい。

oscillator-group @type

ここで、oscillator-groupのtypeでグラフのグリッドが調整できることがわかりました。よく読んだらマニュアルにも書いてありました。

percent0_1

上限 1
中央 0.5
下限 0
です。表示は100, 50, 0になります。

percent1_1

上限 1
中央 0
下限 -1
です。表示は、-100, 0, -100になります。

origin0

上限 m
中央 0
下限 -m
です。

ここで、mは一番大きな値で、それを(1 or 2.5 or 5) * 10^nのうち最も近い値に丸めたもの。

default

プログラム上は、その他(最後のelse)です。

最大値と最小値を求めて、その差の半分をSelectGoodValueで丸めます。
それが、中央値に足したものが上限で、引いたものが下限になります。
中央値は、最初に求めた最大値と最小値をSelectGoodValueで丸めた値の単位の倍数になるように直したものです。

SelectGoodValue in ChartDrawing.cs

メモ。
良く忘れるんだけど、Floorは与えられた引数以下の値を返す。
Ceilは引数以上の値。

「(1 or 2.5 or 5) * 10^nのうち最も近い値に丸める」
とコメントにあります。

1: 0.68 - 1.45
2.5: 1.45 - 3.16
5: 3.16 - 6.76

上位桁によってこのように分けられます。
たとえば、1500だと、上位桁は1.45 - 3.16なので2.5が選ばれ、位取りをすると、2500になります。

defaultの場合の不具合?

どうもバグがあるっぽい

if(close() > open(), 0, -4.9)

なんかだと下が切れます。

このケースを細かく追ってみます。

差は、4.9なので、その半分の2.45を丸めます。
その結果、グリッド単位は2.5となります。

最大と最小の平均は、-2.45です。これをグリッディングします。
ここで、-2.5に合わないとまずいのですが、0になってしまいます。

中央値が四捨五入になっていないのが問題みたいです。
(コメントには四捨五入と書いてあります)

まとめ

 0〜1.0程度の%で表したいものは、percent0_1を使うと良い。

 -1〜1の%は同様に、percent1_1です。特に0が必ず真ん中になるのが便利です。
それ以外で、0中心で上下のバランスを同じにしたときは、origin0を使います。

 他はdefaultにして、あとはシステムに任せます。
別の指標を同時に出して、無理やりグリッドを作るという手もありえます。

コメント


お名前:
Counter: 2602, today: 5, yesterday: 1