Protraのチャートは、すべてProtra言語によって記述されたプログラムで描画されます。ここで説明する方法にしたがって独自のチャートを追加できます。
Protraはchartディレクトリ以下に置かれた、拡張子.ptのファイルをチャートプログラムとして認識します。chartディレクトリ以下にプログラムを置くだけで、Protraのチャート選択メニューからプログラムを選択できます。
プログラムで描画する必要があるのは1日分のチャートだけです。Protraはチャートの左端から右端までの期間についてプログラムを繰り返し実行します。この繰り返される実行の間でグローバル変数は保存されます。この性質を利用することで、複数日のデータを必要とする指標の計算を行うことができます。
簡単な例として青色の出来高のバーを描画するプログラムを示します。
FillRectangle(Rgb(0, 0, 255), X-Dx/2, 0, Dx, Volume)
この例ではFillRectangle、Rgb、X、Dx、Volumeの5つの組み込み関数を使用しています。FillRectangleは矩形を塗りつぶします。Rgbは色を表す数値を、Xは描画すべきx座標を、Dxはチャートの一日分の横幅を、Volumeはその日の出来高を返します。
チャートの座標系は左下が原点でx軸が右向きでy軸が上向きです。この例では、XからDxの半分左側の一番下が左下になるように、Dxの幅でVolumeの高さの塗りつぶされた矩形を描画します。x座標は画面のピクセルに直接対応しますが、y座標と画面のピクセルの対応はProtraが適切に計算します。
チャートプログラムで使用できる組み込み関数は以下の通りです。
(0)配列関数 int Length(array) 配列長を返します。 (1)数学関数 float Exp(float) float Log(float) float Sqrt(float) float Sin(float) float Cos(float) float Tan(float) float Asin(float) float Acos(float) float Atan(float) float Pow(float, float) float Random() 0.0以上1.0未満の浮動小数点の乱数を返します。 int Random(int max) 0以上max未満の整数の乱数を返します。 (2)株価データ関数 int Open その日の始値を返します。{-n}Openはn営業日前の始値を返します。 {"XXXX"}Openは、銘柄XXXXの始値を返します。 存在しない場合はnullです。 int High その日の高値を返します。{-n}Highはn営業日前の高値を返します。 {"XXXX"}Highは、銘柄XXXXの高値を返します。 存在しない場合はnullです。 int Low その日の安値を返します。{-n}Lowはn営業日前の安値を返します。 {"XXXX"}Lowは、銘柄XXXXの安値を返します。 存在しない場合はnullです。 int Close その日の終値を返します。{-n}Closeはn営業日前の終値を返します。 {"XXXX"}Closeは、銘柄XXXXの終値を返します。 存在しない場合はnullです。 float Volume その日の出来高を返します。{-n}Volumeはn営業日前の出来高を返します。 {"XXXX"}Volumeは、銘柄XXXXの出来高を返します。 この値は実際の出来高を1000で割ったものです。 存在しない場合はnullです。 int Year その日の年を返します。{-n}Yearはn営業日前の年を返します。 存在しない場合はnullです。 int Month その日の月を返します。{-n}Monthはn営業日前の月を返します。 存在しない場合はnullです。 int Day その日の日にちを返します。{-n}Day はn営業日前の日にちを返します。 存在しない場合はnullです。 int DayOfWeek その日の曜日を返します。{-n}DayOfWeek はn営業日前の曜日を返します。 月曜から金曜を1から5で返します。存在しない場合はnullです。 int Index その日のデータが最も古いデータから何営業日目かを返します。 {"XXXX"}Indexは、銘柄XXXXのデータにおける上記値を示します。 {n}IndexはIndex + nと同じです。 int RightIndex チャートの最も右側のIndexの値を返します。 {"XXXX"}RightIndexは、銘柄XXXXのデータにおける上記値を示します。 string Code 処理中の銘柄のコードを返します。 {"XXXX"}Codeの値は、"XXXX"です。 string Market 処理中の銘柄の市場コードを返します。 "T1"が東証1部、"T2"が東証2部、"M"がマザーズ、 "O1"が大証1部、"O2"が大証2部、"J"がJasdaqです。 {"XXXX"}Codeの値は、銘柄XXXXの市場コードです。 int Unit 表示する銘柄の単元株数を返します。 {"XXXX"}Unitの値は、銘柄XXXXの単元株数です。 不明の場合は0となります。 (3)描画関数 int X その日に描画すべきx座標を返します。{-n}Xはn営業日前のXの値を返します。 これはX - n * Dxと同じです。 int Dx チャートの1日分の横幅を返します。 int Rgb(int r, int g, int b) 赤、緑、青の明度がr, g, bである色を表す整数を計算します。 r, g, bは0縲鰀255の整数でなければなりません。 null DrawLine(int rgb, float x1, float y1, float x2, float y2) 座標(x1, y1)から(x2, y2)へ直線を描画します。 null DrawRectangle(int rgb, float x, float y, float w, float h) 座標(x, y)を左下にして幅がwで高さがhの矩形を描画します。 高さが負の場合は座標(x, y)を左上にして下向きに矩形を描画します。 null DrawEllipse(int rgb, float x, float y, float w, float h) 矩形に内接する楕円を描画します。 null DrawString(int rgb, string s, float x, float y, int dh) 座標(x, y)のdhポイント上に文字列sを描画します。 最初の引数を省略すると黒で描画します。 null FillRectangle(int rgb, float x, float y, float w, float h) 矩形内部を塗りつぶします。 null FillEllipse(int rgb, float x, float y, float w, float h) 矩形に内接する楕円を塗りつぶします。 null Indicator(int i, float v) $Names[i]に対応する指標のその日の値としてvを登録します。 {-n}Indicator(i, v)はn営業日前の値を登録します。
指標の名前をチャートの左上に描画するには、グローバル変数$Namesと$Colorsを設定します。上に示したの出来高のサンプルでは以下のように記述します。これでProtraによって"出来高"と青色で左上に描画されます。$Namesおよび$Colorsは6個まで設定できます。
$Names[0] = "出来高" $Colors[0] = Rgb(0, 0, 255) FillRectangle(Rgb(0, 0, 255), X-Dx/2, 0, Dx, Volume)
マウスカーソルの位置の日付の指標の値を描画するには、描画時にIndicator関数でその日の指標の値を登録しておく必要があります。上に示した出来高のサンプルでは以下のように記述します。これで"出来高"の下にマウスカーソルの位置の日付の出来高が表示されるようになります。
$Names[0] = "出来高" $Colors[0] = Rgb(0, 0, 255) FillRectangle(Rgb(0, 0, 255), X-Dx/2, 0, Dx, Volume) Indicator(0, Volume)
Protraは時系列チャートを前提としている部分が多いため、新値足や練足などの非時系列チャートの描画は難しいです。もし非時系列チャートを描画するのなら、まず変数$IsTimeSeriesを偽にしてProtraの日付描画機能をオフにします。その上で一番最初の呼び出しの時点でチャート全体を描画するとよいでしょう。コードにすると以下のようになります。
$IsTimeSeries = 0 if ! $Drawed // 描画処理 $Drawed = 1 end