# システムプログラムの書き方

トップ > システムプログラムの書き方

PtSimで使用できるシステムは、すべてProtra言語によって記述されたプログラムです。ここで説明する方法にしたがって独自のシステムを追加できます。

## システムプログラムの置き場所

PtSimはsystemディレクトリ以下に置かれた、拡張子.ptのファイルをシステムプログラムとして認識します。systemディレクトリ以下にプログラムを置いたら、F5キーを押すとシステムの一覧に追加されます。

## 実行の仕組み

システムプログラムは1日分について記述します。PtSimはデータの存在する全期間についてプログラムを繰り返し実行します。この繰り返される実行の間でグローバル変数は保存されます。プログラムによって指示された売買はシステムログとして記録されて、これを利用してシステムの成績計算や履歴表示ができるようになります。

1度実行したあとに再度実行すると、前回実行した最後の営業日の次の営業日から実行が再開されます。グローバル変数は前回の実行から引き継がれます。システムログを削除すると前回の最後の営業日とグローバル変数の情報も削除されます。

## 簡単なサンプル

簡単な例として1000円以下になったら1000株買って2000円以上になったら1000株売るプログラムを示します。

    if ! $hold && Close < 1000
        $hold = 1000
        Buy(Close, $hold)
    elsif $hold && Close > 2000
        Sell(Close, $hold)
        $hold = 0
    end

Buy、Sellは売買を指示するための関数です。

## 注意事項

同じ日に売買を2回以上行うと成績計算が異常になります。

## トレードの処理

成績計算における1トレードは以下のように定義されます。

1. 保有株数が0でなくなった時点をトレード開始点とする。
2. 保有株数が0に戻った時点をトレード終了点とする。

Buyは保有株数を増やし、Sellは保有株数を減らします。保有株数は負の値を取ることもできます。したがって、複数の売買からなるトレードが可能ですし、先にSellを呼んであとでBuyを呼ぶ空売りも可能です。ただし、保有株数を負から正または正から負にする売買、つまりドテンはできません。

## 組み込み関数

システムプログラムで使用できる組み込み関数は以下の通りです。

    (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"です。
    array CodeList
            CodeListは、銘柄リストに含まれる銘柄コードの配列を返します。
    string Market
            処理中の銘柄の市場コードを返します。
            "T1"が東証1部、"T2"が東証2部、"M"がマザーズ、
            "O1"が大証1部、"O2"が大証2部、"J"がJasdaqです。
            {"XXXX"}Codeの値は、銘柄XXXXの市場コードです。
    int Unit
            表示する銘柄の単元株数を返します。
            {"XXXX"}Unitの値は、銘柄XXXXの単元株数です。
            不明の場合は0となります。

    (3)売買関数
    null Buy(int price, int num)
            price円でnum株買います。
            {n}Buy(price, num)はn営業日後に買うことを示します。
            ({n}はバグにつながりやすいので注意)
            {"XXXX"}Buyは、銘柄XXXXを買うことを示します。
    null Sell(int price, int num)
            price円でnum株売ります。
            {n}Sell(price, num)はn営業日後に売ることを示します。
            ({n}はバグにつながりやすいので注意)
            {"XXXX"}Sellは、銘柄XXXXを売ることを示します。

    (4)出力関数
    null Print(string)
            指定された文字列をテキストボックスに出力します。
            文字列以外の値を指定すると文字列に変換して出力します。
    null PrintLog(string)
            銘柄と日付の後に指定された文字列をテキストボックスに出力します。
            文字列以外の値を指定すると文字列に変換して出力します。

Copyright (C) 2003 Daisuke Arai.
Copyright (C) 2007, 2010 panacoran.
This document may be used under the term of the GNU General Public License version 3 or higher.