# loop-type: date-only
//==============================
require "TIlib"
require "Utility"
require "TrendCheck"
//==============================
// gorotanhccat氏の逆張りデイ買いの期待値検証
//
//【仕掛け】
//
//次を満たすとき、[翌日指値(寄付)][終値(+5.00%)]で[買い]を仕掛ける
//1) [連続高値切り下がり日数]が7より[大きい(同じ含む)]
//2) [前日終値→高値(率)]が[-10]より[大きい]
//
//【手仕舞い】
//
//1) [Stop安(終値)]が[1]と[同じ]
//1.1) YES→[翌日寄付]で手仕舞いする
//2) [Stop高(高値)]が[1]と[同じ]
//2.1) YES→[当日指定値][高値(-1Tick)]で手仕舞いにする
//2.1) NO→[当日引け]で手仕舞いする
//
//==========================================
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 = 0 // 最大保有日数
$shortSelling = 0 // 空売り戦略 Yes(1)/No(0)
$Interest = 1 // 無制限(0) / 単利(1) / 複利(2)
$reverse = 1 // 購入順序 昇順(0) / 降順(1)
$udcount = 0 // 騰落レシオ利用数
Init()
//------------------------------------------------
$ATR25 = [$code_num]
//------------------------------------------------
InitDone() // 騰落レシオ初期化
$__INIT__ = 1
end
def Main(i)
//==================================================
// 条件(買条件, 売条件共通部分)
//==================================================
//まだ上場していない銘柄は株価データがないためnullが返る
if (Index == null)
return
end
if ($order[(int)Code] == -1)
$order[(int)Code] = i
end
if ! ($ATR25[i])
$ATR25[i] = ATR_new(25)
$hold[i] = 0
return
end
//指標の計算を1日進める
ATR_next($ATR25[i])
//==================================================
// 保有してない→購入
//==================================================
if (! $hold[i])
if ! (Close && {-1}Close && High)
return
end
//==================================================
// 売買(買い)
//==================================================
//2) [前日終値→高値(率)]が[-10]より[大きい]
flag2 = ((High / {-1}Close) - 1) * 100 > -10
if ! (flag2)
return
end
//1) [連続高値切り下がり日数]が7より[大きい(同じ含む)]
c = 0
flag1 = 1
while (c < 7)
if ! ({-1 * c}High && {-1 * c - 1}High && {-1 * c}High <= {-1 * c - 1}High)
flag1 = 0
break
end
c = c + 1
end
if (flag1)
// PrintLog("買い候補")
// 優先順位は終値と終値+ATRの乖離率(25)が小さい順
atr25 = ATR_value($ATR25[i])
flag = 0
if (atr25)
flag = ((Close + atr25) / Close - 1) * 100
end
// [翌日指値(寄付)][終値(+5.00%)]で[買い]を仕掛ける
$buyflag[i][0] = Close * 1.05
$buyflag[i][1] = flag // 優先順位
$buyflag[i][2] = 1
$buyCnt = $buyCnt + 1
end
//==================================================
// 保有している→売却
//==================================================
elsif ($hold[i])
if ($set[i] < 1)
$set[i] = 1
return
end
$set[i] = $set[i] + 1
//==================================================
// 売買(売り)
//==================================================
if ($set[i] >= $MaxHoldDay)
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
if ({1}Open > t)
return {1}Open
end
end
//==================================================
// 買い(指値)
//==================================================
def Buying2(i)
if (HasPricedata(Close))
t = 0
if ($buyflag[i][0])
t = CheckHighLow2($buyflag[i][0])
end
if (t)
BuyingLimitedPrice(i, 1, t)
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 (HasPricedata(Open))
if ($sellflag[i])
//1) [Stop安(終値)]が[1]と[同じ]
check1 = Close - DailyPriceLimit(Close) >= Low
//2) [Stop高(高値)]が[1]と[同じ]
check2 = High >= Close + DailyPriceLimit(Close)
if (check1)
// [翌日寄付]で手仕舞いする
PrintLog("[翌日寄付]で手仕舞い")
SellingLimitedPrice(i, 1, Open)
elsif (check2)
PrintLog("[当日指定値][高値(-1Tick)]で手仕舞い")
// [当日指定値][高値(-1Tick)]で手仕舞いにする
SellingLimitedPrice(i, 0, {-1}High - Yobine({-1}High, 0))
elsif ({-1}Close)
PrintLog("[当日引け]で手仕舞い")
// [当日引け]で手仕舞いする
SellingLimitedPrice(i, 0, {-1}Close)
else
PrintLog("売れない")
end
$sellflag[i] = 0
$buyflag[i][2] = 0
end
// 使用した$buyflag 配列を初期化
if ($buyflag[i][0])
$buyflag[i][0] = 0
$buyflag[i][1] = 0
end
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(10, 0)
cnt = $buyCnt
if ($buyCnt > 10)
cnt = 10
end
while i < cnt
{sortList[i]}SortBuy()
i = i + 1
end
end
//----------------------------------------------
i = -1
while (i + 1 < $code_num)
i = i + 1
{codes[i]}Sell_(i)
end