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

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

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

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

システムプログラムのファイルはsystemディレクトリ以下に置かなければならなりません。また、拡張子は.ptでなければなりません。systemディレクトリ以下にプログラムを移動してPtSimを再起動するとシステムのリストに追加されます。

#### 実行の仕組み

システムプログラムもチャートプログラムと同様に連続的に呼び出されます。この対象範囲はチャートプログラムが描画範囲のみであったのに対して、システムプログラムでは全データ範囲に対して行われます。グローバル変数が保存されることも同じです。

プログラムによって示された売買の情報はProtraのDBにシステムログとして記録され、これを利用してシステムの成績計算や履歴表示ができるようになっています。

また、1度実行したあとに再度実行すると、前回の実行終了点の次の地点から実行が開始されます。したがって、2回目以降の実行は初回の実行に比べれば高速です。前回の終了地点とグローバル変数の情報はdata/global_cacheに保存されます。

#### 簡単なサンプル

簡単な例として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はDBに売買履歴を残すための関数です。

#### 注意事項

プログラムが次のことを守らないと成績計算の動作が保障されません。

- 同じ日に売買を2回以上繰り返してはいけません。

#### トレードの単位について

成績計算における1トレードはProtraでは次のように定義しています。

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

以上です。したがって「買い増して売る」とか「ちょっとずつ売る」といったトレードも正確に解釈されることになります。また、BuyよりもSellを先に呼びだして、あとでBuyを呼ぶようにすれば「空売りして買い戻す」ことに相当します。この場合にも正確にトレードが解釈されることが分かりますね。利益についても「空売りして買い戻す」ことによる利益で計算されるので安心してください。

#### 組み込み関数のリスト

組み込み関数のリストを示します。

    (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 maxValue)
    	0以上maxValue未満の整数の乱数。

    (2)株価データ関数
    int Open()
    	始値。{-n}Open はn個前の始値。
    	存在しない場合はnullです。
    int High()
    	高値。{-n}High はn個前の高値。
    	存在しない場合はnullです。
    int Low()
    	安値。{-n}Low はn個前の安値。
    	存在しない場合はnullです。
    int Close()
    	終値。{-n}Close はn個前の終値。
    	存在しない場合はnullです。
    float Volume()
    	出来高。{-n}Volumeはn個前の出来高。
    	この値は実際の出来高を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個前の曜日。
    	存在しない場合はnullです。
    	この数は日曜の0から始まって土曜が6となります。
    int Index()
    	最も古いデータから何番目のものかを示す値。
    	{n}Index は Index + nと同じです。
    int Code()
            現在処理中の銘柄コード。
    int Unit()
            処理中の銘柄の単元株数。
    	不明の場合は0となります。

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

    (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.