グラフ描画の基礎
グラフのグリッドが思うように描けなかったので、それを何とかできないか調べてみます。
ソースを読む
チャートを表示してる元締めは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にして、あとはシステムに任せます。
別の指標を同時に出して、無理やりグリッドを作るという手もありえます。