追記)本記事中のUtility.ptは更新されています。こちらの記事もあわせてご覧ください。
Protraストラテジに含まれる共通コードを外部に出して、コードの可読性を上げてみます。
【免責事項】
・本ブログの内容において、正当性を保証するものではありません。
・本ブログを利用して損失を被った場合でも一切の責任を負いません。
・最終的な決定は、ご自身の判断(自己責任)でお願い致します。
・本ブログの内容において、正当性を保証するものではありません。
・本ブログを利用して損失を被った場合でも一切の責任を負いません。
・最終的な決定は、ご自身の判断(自己責任)でお願い致します。
ファイルの格納場所
コード内の頭に記載している↓。Tilibはマニュアルにある通り、テクニカル指標を計算するオブジェクト指向風ライブラリです。
require "TIlib"
これにならって、共通化できるコードをライブラリ化します。
ファイルの格納場所:Protra\lib に Utility.ptを作成します。(名前は適当です)
コードの選択
今回は 前記事で取り上げた順張りコードを例に作成してみます。
「株数」,「売買」,「株価データの有無の確認」部分は共通化できそうです。
これらは外部に出し、Protra\systemに保管されるストラテジには、売買ルールのみを記載します。
実装
はじめにストラテジ。前記事で示したコードからの変更部は以下の通りです。
- 24行目 :Utility をインポート
- 64行目など:株価データ有無確認 PricedataExistCheck(確認したい株価データ)
- 90行目 :株数 Num(1回の購入資金, 株価データ)
- 92行目 :翌日始値買い BuyingNextDay(i)
- 127行目 :翌日始値売り SellingNextDay(i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
#loop-type: date-only #================================================== # followTest2.pt #-------------------------------------------------- # このシステムのルール # # <買い条件> # 終値が過去80日間で最大の終値を更新 # を満たしたとき、翌日の始値で買う # # <売り条件> #・終値が過去40日間で最小の終値を更新 #・購入から10日経過で売る # を満たしたとき、翌日の始値で売る #-------------------------------------------------- # written by グコウ, 2018/8/14 #================================================== #================================================== # 準備 #================================================== require "TIlib" require "Utility" codes = CodeList if $code_num && $code_num != Length(codes) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) if ! $__INIT__ $budget = 10000000 # 投資総額 (1000万円) $buyUnit = 1000000 # 1回の購入資金(100万円) $MaxHoldDay = 10 #最大保有日数 #---------------------------------------- $set = [$code_num] $buy = [$code_num] $hold = [$code_num] $__INIT__ = 1 end def Main(i) #================================================== # 条件(買条件, 売条件共通部分) #================================================== #まだ上場していない銘柄は株価データがないためnullが返る if Index == null return end #銘柄ごとのグローバル変数を初期化する。 if ! $__FLAG__ $hold[i]=0 $__FLAG__ = 1 return end #================================================== # 条件1 #================================================== if ! $hold[i] if 1==PricedataExistCheck(Close) return end # 初期化 cb = 0 high = 0 # 上場80日までは何もしない if Index < 80 return end # 過去80日で終値がもっとも高値をつけた日が当日か while cb < 80 if {-cb}Close > high high = {-cb}Close end cb = cb+1 end if Close == high #================================================== # 売買(買い) #================================================== $long = 0 $long = Num($buyUnit,Close) if 0==PricedataExistCheck({1}Open) BuyingNextDay(i) end end #================================================== # 条件2 #================================================== elsif $hold[i] if 1==PricedataExistCheck(Close) return end sell = 0 cs = 0 low =100000 if $set[i] < 1 $set[i] = $set[i] + 1 return end $set[i] = $set[i] + 1 # 過去40日で終値がもっとも安値を付けた日が当日か while cs < 40 if {-cs}Close < low low = {-cs}Close end cs = cs+1 end if (Close == low || $set[i] > $MaxHoldDay) #================================================== # 売買(売り) #================================================== if 0==PricedataExistCheck({1}Open) SellingNextDay(i) end end end end //==================== // 銘柄コードを変えながらMain関数を実行 //==================== i = -1 while i + 1 < $code_num i = i + 1 {codes[i]}Main(i) // 文字列型at作用素を与えて実行する。 end |
つづいて、Protra\lib に作成した Utility.ptです。
今回は使用していませんが、当日終値買い,当日終値売りも準備してあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
#================================================== # 株数 #================================================== def Num(buyUnit,price) unit = Unit2(price) return (buyUnit / (unit * price)) * unit end #================================================== # データの有無を確認 #================================================== def PricedataExistCheck(data) return !data end #================================================== # 当日 終値買い #================================================== def BuyingToday(i) #資金が不足している場合は何もしない if $long == 0 return end #予算を超えない場合だけ買う if $long * Close <= $budget //PrintLog(Year + " " + Month +" " + Day + " i = " + i ) $budget = $budget - $long * Close $hold[i] = $long $buy[i] = Close Buy(Close, $hold[i]) //Print("B 予算残り =" + $budget) $set[i] = 0 else PrintLog("予算を超過しています") end end #================================================== # 翌日 始値買い #================================================== def BuyingNextDay(i) #資金が不足している場合は何もしない if $long == 0 return end #予算を超えない場合だけ買う if $long * {1}Open <= $budget //PrintLog(Year + " " + Month +" " + Day + " i = " + i ) $budget = $budget - $long * {1}Open $hold[i] = $long $buy[i] = {1}Open {1}Buy(Open, $hold[i]) //Print("B 予算残り =" + $budget) $set[i] = 0 else PrintLog("予算を超過しています") end end #================================================== # 当日 終値売り #================================================== def SellingToday(i) Sell(Close, $hold[i]) $budget = $budget + Close * $hold[i] $hold[i] = 0 //Print("S 予算残り = " + $budget) end #================================================== # 翌日 始値売り #================================================== def SellingNextDay(i) {1}Sell(Open, $hold[i]) $budget = $budget + {1}Open * $hold[i] $hold[i] = 0 //Print("S 予算残り = " + $budget) end |
銘柄を横断したストラテジ用(1行目に#loop-type: date-only)に作成しましたが、通常のストラテジでもオーバーロードさせれば、同じUtilityファイルで売買を記述できそうです。
その2に続く