# loop-type: date-only
//==============================
require "TIlib"
require "Utility"
require "TrendCheck"
//==============================
// 株式投資「システムトレード」の極意(保田望 著)
//==============================
//
// 下記のルールに従い、10日間平均売買代金が大きい順に仕掛ける
//
// 【資金管理条件】
// 1) 初期資金 500万円
// 2) 最大レバレッジ 1.5倍
// 3) ポジションサイズ 資金の10分の1
// 4) 突入タイミング 過去120日平均サイン点灯数の4倍以上
//
// 【買いルール】
// 1) 25日移動平均乖離率がマイナス20%以下
// 2) ストキャスティクス%K(Fast K)(9日)が30%以下
// 3) ストキャスティクス%D(Slow D)(9日)が30%以下
// 4) 当日終値が100円以上
// 5) 10日間平均売買代金が1000万円以上
//
//【手仕舞いルール】
// 1) 買い付けた日から60日が経過
// 2) 株価(終値)が買値よりも2%以上上昇
codes = CodeList
if $code_num && $code_num != Length(codes)
Print("前回と異なる銘柄リストでは実行できません。")
Dummy
end
$code_num = Length(codes)
//グローバル変数を初期化
if ! ($__INIT__)
$budgetIni = 10000000
$budget = $budgetIni // 投資総額 (1000万円)
$buyUnit = 1000000 // 1回の購入資金 (100万円)
$MaxHoldDay = 45 // 最大保有日数
$Interest = 1 // 無制限(0) / 単利(1) / 複利(2)
$reverse = 1 // 購入順序 昇順(0) / 降順(1)
$ratiodate = 0 // 騰落レシオ日数
//------------------------------------------------
$BB = [$code_num]
$ST = [$code_num]
//------------------------------------------------
$signal = [120] // 過去120日平均サイン
$sflag = 0 // 平均サインのフラグ
i = 0
while (i < 120)
$signal[i] = -1
i = i + 1
end
Init()
$__INIT__ = 1
end
def Main(i)
//==================================================
// 条件(買条件, 売条件共通部分)
//==================================================
//まだ上場していない銘柄は株価データがないためnullが返る
if (Index == null)
return
end
if ! ($order[(int)Code])
$order[(int)Code] = i
end
if ! ($BB[i] && $ST[i])
//銘柄ごとのグローバル変数を初期化する
$BB[i] = BB_new(25)
$ST[i] = Stoch_new(9, 3, 3)
$hold[i] = 0
return
end
//指標の計算を1日進める
BB_next($BB[i])
Stoch_next($ST[i])
// ここまで ========================================
if (1 == PricedataExistCheck(Close))
return
end
//==================================================
// 保有してない→購入
//==================================================
if (! $hold[i])
ma = BB_value($BB[i])
st_k = Stoch_k($ST[i])
st_d = Stoch_d($ST[i])
tv = TradingValume(10)
if ! (ma && st_k && st_d && Close)
return
end
r = 100 * (Close - ma) / ma
// 4) 当日終値が100円以上
// 5) 10日間平均売買代金が1000万円以上
if ! (Close >= 100 && tv >= 10000)
return
end
// 1) 25日移動平均乖離率がマイナス20%以下
// 2) ストキャスティクス%K(Fast K)(9日)が30%以下
// 3) ストキャスティクス%D(Slow D)(9日)が30%以下
if (r <= -20 && st_k <= 30 && st_d <= 30)
PrintLog("tv=" + tv)
$buyflag[i][0] = 1
// 10日間平均売買代金(株価 x 出来高)が大きい順に仕掛ける
$buyflag[i][1] = tv
$buyCnt = $buyCnt + 1
end
//==================================================
// 保有している→売却
//==================================================
elsif ($hold[i])
if ($set[i] < 1)
$set[i] = 1
return
end
$set[i] = $set[i] + 1
//==================================================
// 売買(売り)
//==================================================
// 2) 株価(終値)が買値よりも2%以上上昇
if (Close >= 1.02 * $buy[i])
PrintLog("利食い")
$sellflag[i] = 1
$set[i] = 0
// 1) 買い付けた日から60日が経過
elsif ($set[i] >= $MaxHoldDay)
PrintLog("損切り")
$sellflag[i] = 1
$set[i] = 0
end
end
end
//====================
// 買い処理
//====================
def SortBuy(i)
if (PricedataExistCheck(Close))
return
end
$long = 0
$long = Num($buyUnit, Close)
codeset = $order[(int)Code]
Buying(codeset)
end
//====================
// 売り処理
//====================
def Sell_(i)
if (PricedataExistCheck(Close))
return
end
if ($sellflag[i])
Selling(i)
$sellflag[i] = 0
end
end
// =========================================
// 過去の平均サイン点灯数を返す&120日の更新
// =========================================
def SignalCount()
$signal[$sflag] = $buyCnt
$sflag = ($sflag + 1) % 120
i = 0
sum = 0
while (i < 120)
if ($signal[i] == -1)
return 9999
end
sum = sum + $signal[i]
i = i + 1
end
return sum / 120
end
//====================
// 銘柄コードを変えながらMain関数,BuySell関数を実行
//====================
Print("-------------------------------------------------")
Print("日付 = "+ Year + "/" + Month + "/" + Day)
SortInit() // ソート初期化
i = -1
while (i + 1 < $code_num)
i = i + 1
{codes[i]}Main(i)
end
i = -1
while i + 1 < $code_num
i = i + 1
{codes[i]}Sort(i)
end
i = -1
// 4) 突入タイミング 過去120日平均サイン点灯数の4倍以上
sg = SignalCount()
Print("過去120日平均サイン点灯数 =" + sg + " $sflag=" + $sflag)
if ($buyCnt >= sg * 4)
while i + 1 < $buyCnt
i = i + 1
{$sortList2[i]}SortBuy(i)
end
end
i = -1
while i + 1 < $code_num
i = i + 1
{codes[i]}Sell_(i)
end