GD::Graph::mixedとGD::Graph::candle
GD::Graph::candleを使って、ローソク足を書くことはできるようになった。1個分のデータが4本値なので、これをどうやって渡すのかを理解するまでに時間がかかったけど、配列の入れ子でOK。並び順は始値、高値、安値、終値の順。
で、グラフを出したい理由は、独自に算出している各種指標と株価の関係、エントリーした時とエグジットした時の指標と株価の推移を、パっと一発で見て分かりたい為。で、価格にに対応した値が出てくるやつはローソク足のグラフと合成したいので、GD::Graph::mixedを使ってうまいことやりたいんだけど、2つのグラフのY軸のスケールを合わせることができない。スケールをあわせるのにこんなコードにしている。
$oGraph = GD::Graph::mixed->new(800, 400); $oGraph->set_title_font(TtfFontFile, 12); $oGraph->set( bgclr => 'white', transparent => 0, two_axes => 1, types => [ 'candle', 'linespoints' ], dclrs => [ 'cyan', 'black' ], title => $myCode, y1_min_value => $myLowestPrice, y1_max_value => $myHighestPrice, y2_min_value => $myLowestPrice, y2_max_value => $myHighestPrice, y_long_ticks => 1, bar_spacing => 10, boxclr => 'lgray', ); open(PNG, ">CANDLE-LINEPOINTS-MIX.png"); binmode(PNG); eval { print PNG $oGraph->plot([\@aLbl, \@aDt4, \@aMA])->png; }; print STDERR "$@\n" , $oGraph->error, "\n" if($@); close PNG;
@aLblにX軸ラベル(具体的には日付)、@aDt4に4本値、@aMAに移動平均がはいっているとする。これを動かすと「print PNG $oGraph->plot([\@aLbl, \@aDt4, \@aMA])->png;」の所でエラー。
Maximum for y1 too small
これねー、不可解なことにbarsとlinesとかなら動くんだ。GD::Graph::candleが、CPANとかから落としたわけじゃなくて、何かの雑誌の付録がWeb上にアーカイブされて置いてあったのを落としてきたりしたものだったりして、最近のmixedの仕様と合ってない所があるのかもしれない。これはGD::Graph::candleとbarsを比較したりして、何がマズイのか調べないといけないかも。
試しに$myHighestPriceを通るまで大きくしていったら100万倍にしたら通るようになりました。いみねーよw
うーん、合成ダルイから別のグラフにしてとりあえず逃げとくかな。X軸は問題ないんだし。