# loop-type: date-only
//==============================
require "TIlib"
require "Utility"
require "TrendCheck"
//==========================================
// コナーズRSI
//
// 1) 20日間の平均出来高が100万以上
// 2) 株価が500円以上
// 3) 直近20営業日以内に52週高値を更新した
// 4) コナーズRSIが15以下
// 5) 1,2,3,4の条件を満たした状態で前日終値から、安値が7%以上下落したら引けで買う
// 6) 引けでコナーズRSIが( 70 or 80 )以上になったら手仕舞いする
//
//==========================================
codes = CodeList
if ($code_num && $code_num != Length(codes))
Print("前回と異なる銘柄リストでは実行できません。")
Dummy
end
$code_num = Length(codes)
//グローバル変数を初期化
if (!$__INIT__)
$budgetIni = 3000000
$buyUnit = 500000 // 1回の購入資金 (50万円)
$MaxHoldDay = 1 // 最大保有日数
$shortSelling = 0 // 空売り戦略 Yes(1)/No(0)
$Interest = 1 // 無制限(0) / 単利(1) / 複利(2)
$reverse = 0 // 購入順序 昇順(0) / 降順(1)
$udcount = 0 // 騰落レシオ利用数
Init()
//------------------------------------------------
$RSI = [$code_num]
$ROC = [$code_num]
//------------------------------------------------
InitDone() // 騰落レシオ初期化
$__INIT__ = 1
end
def URSI_value(date)
// ① RS = (n日間のと騰落数の上昇幅の平均) ÷ (n日間の騰落数の下落幅の平均)
// ② RSI = 100 - (100 ÷ (RS+1) )
i = 0
upDay = 0
downDay = 0
upSteak = 0
downSteak = 0
while (i + 1 <= date)
if ! ({-1 * i - 1}Close && {-1 * i}Close)
return 1000
end
if ({-1 * i - 1}Close < {-1 * i}Close)
upDay = 1
else
upDay = 0
end
if ({-1 * i - 1}Close > {-1 * i}Close)
downDay = -1
else
downDay = 0
end
upSteak = upSteak + upDay
downSteak = downSteak + downDay
i = i + 1
end
// RS = (n日間の騰落数の上昇幅の平均) ÷ (n日間の騰落数の下落幅の平均)
if (downSteak != 0)
// Print("hoge :" + upSteak + " hage:" + downSteak + " date:" + date)
rs = ((float)upSteak / date ) / ((float)downSteak / date)
// RSI = 100 - (100 ÷ (RS + 1) )
if (rs + 1 != 0)
// Print(rs)
return 100 - 100 / (rs + 1)
else
return 0
end
else
return 1000
end
end
// date日間の平均出来高
def AveVolume(date)
i = 0
totalVol = 0
while (i + 1 <= date)
totalVol = totalVol + {-1 * i}Volume
i = i + 1
end
return totalVol / date
end
// 過去num日以内にdate日間の高値を超えた
def CheckPastHigh(date, num)
i = 1
high = {-1}High
tmpNum = date
while (i < date)
if ({-1 * i}High > high)
tmpNum = i
high = {-1 * i}High
end
i = i + 1
end
return (num >= tmpNum)
end
def Main(i)
//==================================================
// 条件(買条件, 売条件共通部分)
//==================================================
//まだ上場していない銘柄は株価データがないためnullが返る
if (Index == null)
return
end
if ($order[(int)Code] == -1)
$order[(int)Code] = i
end
if ! ($ROC[i] && $RSI[i])
//Tilibのオブジェクト生成
$RSI[i] = RSI_new(3, 0)
$ROC[i] = ROC_new(100)
//銘柄ごとのグローバル変数を初期化する
$hold[i] = 0
return
end
//指標の計算を1日進める
ROC_next($ROC[i])
RSI_next($RSI[i])
//==================================================
// 保有している(追加購入)&していない(新規購入)
//==================================================
if (! $hold[i] || $hold[i])
if ! (Close)
return
end
roc = ROC_value($ROC[i])
rsi = RSI_value($RSI[i])
ursi = URSI_value(2)
if ! (rsi && roc)
return
end
csri = ((float)ursi + rsi + roc) / 3
//==================================================
// 売買(買い)
//==================================================
// 1) 20日間の平均出来高が100万以上
flag1 = AveVolume(20) * 1000 > 1000000
// 2) 株価が500円以上
flag2 = Close >= 500
// 3) 直近20営業日以内に52週(300日)高値を更新した
flag3 = CheckPastHigh(300, 20)
// 4) コナーズRSIが15以下
flag4 = 15 >= csri
if (flag1 && flag2 && flag3 && flag4)
// 5) 1,2,3,4の条件を満たした状態で前日終値から、安値が7%以上下落したら引けで買う
PrintLog("買い候補")
$buyflag[i][0] = Close * 0.93
$buyflag[i][1] = rsi
$buyflag[i][2] = 1
$buyCnt = $buyCnt + 1
end
end
//==================================================
// 保有している&本日同一銘柄の買いシグナルが出ていない
//==================================================
if ($hold[i] && ! $buyflag[i][0])
if ($set[i] < 1)
$set[i] = 1
return
end
$set[i] = $set[i] + 1
roc = ROC_value($ROC[i])
rsi = RSI_value($RSI[i])
ursi = URSI_value(2)
if ! (rsi && roc)
return
end
csri = ((float)ursi + rsi + roc) / 3
//==================================================
// 売買(売り)
//==================================================
// 6) 引けでコナーズRSIが( 70 or 80 )以上になったら手仕舞いする
flag1 = csri >= 70
if (flag1)
PrintLog("利益確定")
$sellflag[i] = 1
$set[i] = 0
end
end
end
def CheckHighLow2(t)
t = Yobine(t, 0)
if ! ({1}High > t && t > {1}Low)
return 0
end
return 1
end
//==================================================
// 買い(前日終値から、安値が7%以上下落したら引けで買う)
//==================================================
def Buying2(i)
if (HasPricedata({1}Open))
t = 0
if ($buyflag[i][0])
t = CheckHighLow2($buyflag[i][0])
end
if (t)
BuyingLimitedPrice(i, 1, {1}Close)
end
end
end
//====================
// 買い処理
//====================
def SortBuy()
if ! (HasPricedata({1}Open))
return
end
$long = 0
$long = Num($buyUnit, Close)
codeset = $order[(int)Code]
Buying2(codeset)
end
//====================
// 売り処理
//====================
def Sell_(i)
if ($sellflag[i])
// 当日のCloseで売る
Selling(i)
$sellflag[i] = 0
$buyflag[i][2] = 0
end
// 使用した$buyflag 配列を初期化
if ($buyflag[i][0])
$buyflag[i][0] = 0
$buyflag[i][1] = 0
end
end
//====================
// 銘柄コードを変えながらMain関数,BuySell関数を実行
//====================
Print("-------------------------------------------------")
Print("日付 = "+ Year + "/" + Month + "/" + Day)
$buyCnt = 0 // 購入数初期化
i = -1
while (i + 1 < $code_num)
i = i + 1
{codes[i]}Main(i)
end
i = 0
if ($buyCnt)
sortList = SelectionSort($buyCnt, 0)
while i < $buyCnt
{sortList[i]}SortBuy()
i = i + 1
end
end
//----------------------------------------------
i = -1
while (i + 1 < $code_num)
i = i + 1
{codes[i]}Sell_(i)
end