# loop-type: date-only
//==============================
require "TIlib"
require "Utility"
require "TrendCheck"
// ======================================
// cosisin氏の安定押し目ストラテジー
// ======================================
//
//【基本設定】
// 1) 株価の低い場合はランキングしない[150]万円以下
// 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合)
// 3) 単利利用、通年
// 4) 全ての銘柄対象
// 5) 優先順位は終値と終値+ATRの乖離率(25)が小さい順(最近の値動きが小さい)
//
//【ランキング条件[安定押し目(順位)]】
// 1) [期間上昇(率)]=[当日終値(現在値)]÷[指定期間前の終値]
// 2) [安定押し目]=[期間上昇(率)(75)]が[0]より大きい
// 3) [前日比2日最大]の小さい順
//
//【買いルール】
// 1) [安定押し目(順位)]が[30]より[小さい(同じ含む)]
// 2) [翌日始値]が[終値(-5.00%)]より大きい
// IF(2) 3) [翌日指値(寄付)][終値(-1.50%)]で[買い]を仕掛ける
// IF(Not 2) 4) [翌日逆指値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける
//
//【手仕舞いルール】
// 1) [Stop高(高値)]が[1]と[同じ]
// 2) [当日指定値][高値]で手仕舞いする
// 3) [保有日数]が[1]より[大きい(同じ含む)]
// 4) [当日引け]で手仕舞いする
codes = CodeList
if ($code_num && $code_num != Length(codes))
Print("前回と異なる銘柄リストでは実行できません。")
Dummy
end
$code_num = Length(codes)
//グローバル変数を初期化
if (!$__INIT__)
$budgetIni = 10000000
$buyUnit = 1000000 // 1回の購入資金 (100万円)
$MaxHoldDay = 0 // 最大保有日数
$shortSelling = 0 // 空売り戦略 Yes(1)/No(0)
$Interest = 1 // 無制限(0) / 単利(1) / 複利(2)
$reverse = 0 // 購入順序 昇順(0) / 降順(1)
$udcount = 0 // 騰落レシオ利用数
Init()
// テクニカル指標初期化 --------------------------
$ATR25 = [$code_num]
//------------------------------------------------
InitDone() // 騰落レシオ初期化
$__INIT__ = 1
end
// 1) [期間上昇(率)]=[当日終値(現在値)]÷[指定期間前の終値]
def PeriodUpRate(i)
if ! ({-1 * i}Close)
return 0
end
return (float)Close / (float){-1 * i}Close * 100
end
def Main(i)
//==================================================
// 条件(買条件, 売条件共通部分)
//==================================================
//まだ上場していない銘柄は株価データがないためnullが返る
if (Index == null)
return
end
if ! ($order[(int)Code])
$order[(int)Code] = i
end
if ! ($ATR25[i])
$ATR25[i] = ATR_new(25)
$hold[i] = 0
return
end
//指標の計算を1日進める
ATR_next($ATR25[i])
if ! (Index > 75 && {1}Open)
return
end
//==================================================
// 保有してない→購入
//==================================================
if (! $hold[i])
//==================================================
// 売買(買い)
//==================================================
// 1) 株価の低い場合はランキングしない[150]万円以下
// 2) 売買代金の少ない場合はランキングしない(売買代金の[3]日間平均が[5]千万円以下の場合)
if ! (Close && {-1}Close && {-2}Close && Volume && {-1}Volume && {-2}Volume)
return
end
if ! (SalesValue()/3 + {-1}SalesValue()/3 + {-2}SalesValue()/3 > 50000 && Close > 150)
return
end
// 1) [期間上昇(率)]=[当日終値(現在値)]÷[指定期間前の終値]
// 2) [安定押し目]=[期間上昇(率)(75)]が[0]より大きい
// 3) [安定押し目(順位)]が[30]より[小さい(同じ含む)]
check = PeriodUpRate(75)
// 優先順位は終値と終値+ATRの乖離率(25)が小さい順
atr25 = ATR_value($ATR25[i])
flag = 100
if (atr25)
flag = ((Close + atr25) / Close - 1) * 100
end
if (check > 0)
// 4) [翌日始値]が[終値(-5.00%)]より大きい
check5 = {1}Open > Close * 0.95
if (check5)
// 5) [翌日指値(寄付)][終値(-1.50%)]で[買い]を仕掛ける
// PrintLog("購入予定1 : " + flag)
$buyflag[i][0] = 1
// 小さい順にソート
$buyflag[i][1] = flag
$buyCnt = $buyCnt + 1
else
// 6) [翌日逆指値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける
// PrintLog("購入予定2 : " + flag)
$buyflag[i][0] = 2
// 小さい順にソート
$buyflag[i][1] = flag
$buyCnt = $buyCnt + 1
end
end
//==================================================
// 保有している→売却
//==================================================
elsif ($hold[i])
if ($set[i] < 1)
$set[i] = 1
return
end
$set[i] = $set[i] + 1
//==================================================
// 売買(売り)
//==================================================
// 1) [Stop高(高値)]が[1]と[同じ]
check = High >= Close + DailyPriceLimit(Close)
if (check)
// 2) [当日指定値][高値]で手仕舞いする
PrintLog("手仕舞い1")
$sellflag[i] = 1
$set[i] = 0
// 3) [保有日数]が[1]より[大きい(同じ含む)]
elsif ($set[i] >= $MaxHoldDay)
// 4) [当日引け]で手仕舞いする
PrintLog("手仕舞い2")
$sellflag[i] = 2
$set[i] = 0
end
end
end
//==================================================
// [翌日指値(寄付)][終値(num%)]で[買い]を仕掛ける
//==================================================
def StopOrderClose2(num)
t = Close * num
if ! ({1}High > t && t > {1}Low)
return 0
end
return t
end
//==================================================
// [翌日逆指値(終日)][高値(+1Tick)]
//==================================================
def StopOrderOpenTick2()
t = {1}Open + Yobine({1}Open, 0)
if ! ({1}High > t && t > {1}Low)
return 0
end
return t
end
//==================================================
// 買い(カスタマイズ条件)
//==================================================
def Buying2(i)
if (0 == PricedataExistCheck({1}Open))
if ($buyflag[i][0] == 1)
// 5) [翌日指値(寄付)][終値(-1.50%)]で[買い]を仕掛ける
t = StopOrderClose2(0.985)
elsif ($buyflag[i][0] == 2)
// 6) [翌日逆指値(終日)][翌日始値(+1Tick)]で[買い]を仕掛ける
t = StopOrderOpenTick2()
end
if (t)
BuyingLimitedPrice(i,1,t)
end
end
end
//====================
// 買い処理
//====================
def SortBuy(i)
if (PricedataExistCheck(Close))
return
end
$long = 0
$long = Num($buyUnit, Close)
codeset = $order[(int)Code]
Buying2(codeset)
end
//==================================================
// 売り(カスタマイズ条件)
//==================================================
def Selling2(i)
if ($sellflag[i] == 1)
// 2) [当日指定値][高値]で手仕舞いする
if (0 == PricedataExistCheck(High))
Sell(High, $hold[i])
$budget = $budget + $buy[i] * $hold[i]
$hold[i] = 0
Print("S 予算残り = " + $budget)
end
elsif ($sellflag[i] == 2)
// 4) [当日引け]で手仕舞いする
Selling(i)
end
end
//====================
// 売り処理
//====================
def Sell_(i)
if ($sellflag[i])
Selling2(i)
$sellflag[i] = 0
end
// 使用した$buyflag 配列を初期化
if ($buyflag[i][0])
$buyflag[i][0] = 0
$buyflag[i][1] = 0
end
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
$max = 30
if ($max > $buyCnt)
$max = $buyCnt
end
if ($buyCnt)
// [安定押し目(順位)]が[30]より[小さい(同じ含む)]
while i + 1 < $max
i = i + 1
{$sortList2[i]}SortBuy(i)
end
end
i = -1
while i + 1 < $code_num
i = i + 1
{codes[i]}Sell_(i)
end