BANE-IYBK Strategy

こんにちは!ぴよっちです!!

BANEさんが面白そうなロジックをtweetしてたのでstrategyにしてみました。


1.指定期間内の最高値から一定以上価格が下落したら毎足のOpenで指定サイズに達するまで買い増し

2.建値から一定以上の利益率に達した場合は毎足のOpenで指定サイズずつクローズ

するだけの複利strategyです。


早速検証結果です!


Pattern1. レバ1倍、1注文サイズ=証拠金の5%、買い増し閾値=最高値-5%、利確閾値=建値+5%

→損益率175%(BTC価格は307%)

画像8


Pattern2. レバ5倍、1注文サイズ=証拠金の5%、買い増し閾値=最高値-5%、利確閾値=建値+5%

→損益率3,060%(BTC価格は307%)

画像8


Pattern3. レバ10倍、1注文サイズ=証拠金の5%、買い増し閾値=最高値-5%、利確閾値=建値+5%
→損益率10,421%(BTC価格は307%)※9月頭の下げでロスカット!

画像8


Pattern4. レバ20倍、1注文サイズ=証拠金の5%、買い増し閾値=最高値-5%、利確閾値=建値+5%

→損益率34,333%(BTC価格は307%)※9月頭の下げでロスカット!

画像8

ごいすー!爆益です!!2020/05/01に50万円で始めたら億り人です!!!(2020/12/29追記)→やはり現実はそんなに甘くありませんでした。レバ7倍以上の複利運用ではロスカットしてしまいました!


以下、全コードです。

ドル建て取引所、スリッページ$20、手数料0.075%、1時間足を想定しています。※複利で注文サイズが大きくなる都度スリッページを大きくしたり、ロング期間中のFRは考慮していません。

// © Piyotch
//@version=4

// ピラミッディングの最大数は1000、1エントリーのスリッページは$20、手数料は0.075%とする
strategy("BANE-IYBK", overlay=true, initial_capital=10000, pyramiding=1000, slippage=20, commission_type=strategy.commission.percent, commission_value=0.075)

// 最高値を取得する足の数(1H足で24*90=1080を初期値とする)
target_period = input(title="対象期間", type=input.integer, minval=240, maxval=14400, defval=1080)

// 最大レバレッジの入力値
max_reverage = input(title="最大レバレッジ", type=input.float, minval=1, maxval=100, defval=5)

// 1回あたりの注文サイズ割合指定
order_rate = input(title="注文サイズ(資金に対する割合%)", type=input.float, minval=1, maxval=100, defval=5)

// 買い増しする閾値(最高値からの下落率%)
iybk_rate = input(title="買い増し閾値(最高値からの下落率%)", type=input.float, minval=1, maxval=99, defval=5)

// 利確する閾値(建値からの利益率%)
close_rate = input(title="利確閾値(建値からの利益率%)", type=input.float, minval=1, maxval=99, defval=5)

// テスト対象範囲のFrom
from_time = input(title="テスト開始日", type=input.time, defval=timestamp("05 01 2020 00:00"))

// 対象期間の最高値を計算して描画
highest_price = highest(high, target_period)
plot(highest_price, title="最高値", style=plot.style_line, color=color.red, linewidth=2)

// 買い増し価格を計算して描画
iybk_price = highest_price * (100 - iybk_rate) / 100
plot(iybk_price, title="買い増し値", style=plot.style_line, color=color.green, linewidth=2)

// 利確価格を計算して描画
close_price = strategy.position_avg_price * (1 + (close_rate / 100))
plot(close_price, title="利確値", style=plot.style_line, color=color.yellow, linewidth=2)



// 現在までの損益と初期資金を合算
current_capital = strategy.initial_capital + strategy.netprofit
plot(current_capital, title="capital", style=plot.style_line, color=color.gray, linewidth=2)

// 初期資金+実現損益+未実現損益を合算
total_equity = current_capital + strategy.openprofit
plot(total_equity, title="総資産", style=plot.style_line, color=color.white, linewidth=2)
bgcolor(total_equity < 0 ? color.red : color.black, 50, 0, true)

// 現在資産と注文サイズ割合から注文サイズを計算
order_size = (current_capital * (order_rate / 100)) / open
plot(order_size, title="注文サイズ")

// 現在資産×最大レバレッジで最大ポジションを計算
max_position = (current_capital * max_reverage ) / open
plot(max_position, title="最大ポジション")



// 注文処理
if(time > from_time)
   if(open < iybk_price)
       // 現在価格が買い増し価格未満で現在のポジションが最大ポジション設定値以下の場合にLongエントリー
       strategy.entry("Buy", strategy.long, order_size, when=strategy.position_size < max_position)
   else
       // 現在ポジションが0以上で現在価格が利確価格以上の場合にロング解消
       if(strategy.position_size > 0)
           strategy.order("Sell", strategy.short, order_size, when=open > close_price, comment="部分利確")

// 建値を描画
plot(strategy.position_avg_price, title="建値", style=plot.style_line, color=color.blue, linewidth=2)

// 現在ポジションを描画
plot(strategy.position_size, title="ポジションサイズ", style=plot.style_line, color=color.gray)

※trading viewのpine editerにコピペしただけでは動きません!コピペするとインデントがスペース3個になっちゃうので4個に修正してください。


以下、部分毎の説明。

// ピラミッディングの最大数は1000、1エントリーのスリッページは$20、手数料は0.075%とする
strategy("BANE-IYBK", overlay=true, initial_capital=10000, pyramiding=1000, slippage=20, commission_type=strategy.commission.percent, commission_value=0.075)

・initial_capitalは初期資金です。

・pyramiding =1000と指定しています。これは、同一方向へのエントリーの最大値で、一定価格未満の場合に買い増しを続けるために設定しています。

・slippage=20と指定している部分は、売買時の価格に加算・減算される値です。ドル建て取引所で成り行き注文した時にこれくらいはすべるよなぁ、という値を設定してください。

・commission_type=strategy.commission.percentの部分は、取引手数料の種別を%と指定しています。次のcommission_valueで手数料率を指定しています。


// 最高値を取得する足の数(1H足で24*90=2160を初期値とする)
target_period = input(title="対象期間", type=input.integer, minval=240, maxval=14400, defval=2160)

最高値を取得する足の数を指定します。1時間足で24*90日、2160本の中の最高値を取得します。


// 最大レバレッジの入力値
max_reverage = input(title="最大レバレッジ", type=input.float, minval=1, maxval=100, defval=5)

最大レバレッジを指定します。


// 1回あたりの注文サイズ割合指定
order_rate = input(title="注文サイズ(資金に対する割合%)", type=input.float, minval=1, maxval=100, defval=5)

注文時点の証拠金に対する割合で1回あたりの注文サイズの割合を指定します。


// 買い増しする閾値(最高値からの下落率%)
iybk_rate = input(title="買い増し閾値(最高値からの下落率%)", type=input.float, minval=1, maxval=99, defval=5)

買い増しする閾値を、最高値からの下落率で指定します。


// 利確する閾値(建値からの利益率%)
close_rate = input(title="利確閾値(建値からの利益率%)", type=input.float, minval=1, maxval=99, defval=5)

利確する閾値を建値からの利益率で指定します。


// テスト対象範囲のFrom
from_time = input(title="テスト開始日", type=input.time, defval=timestamp("05 01 2020 00:00"))

テストを開始する日付を指定します。取得できる全範囲とした場合、建値よりも現在価格が低い期間はずーっとガチホするだけになるので、対象期間を絞り込めるようにしています。


// 対象期間の最高値を計算して描画
highest_price = highest(high, target_period)
plot(highest_price, title="最高値", style=plot.style_line, color=color.red, linewidth=2)

// 買い増し価格を計算して描画
iybk_price = highest_price * (100 - iybk_rate) / 100
plot(iybk_price, title="買い増し値", style=plot.style_line, color=color.green, linewidth=2)

// 利確価格を計算して描画
close_price = strategy.position_avg_price * (1 + (close_rate / 100))
plot(close_price, title="利確値", style=plot.style_line, color=color.yellow, linewidth=2)

対象期間内の最高値を赤、買い増しする価格を緑、利確する価格を黄で描画します。


// 現在までの損益と初期資金を合算
current_capital = strategy.initial_capital + strategy.netprofit
plot(current_capital, title="capital", style=plot.style_line, color=color.gray, linewidth=2)

// 初期資金+実現損益+未実現損益を合算
total_equity = current_capital + strategy.openprofit
plot(total_equity, title="総資産", style=plot.style_line, color=color.white, linewidth=2)
bgcolor(total_equity < 0 ? color.red : color.black, 50, 0, true)

// 現在資産と注文サイズ割合から注文サイズを計算
order_size = (current_capital * (order_rate / 100)) / open
plot(order_size, title="注文サイズ")

// 現在資産×最大レバレッジで最大ポジションを計算
max_position = (current_capital * max_reverage ) / open
plot(max_position, title="最大ポジション")

現在までの損益と初期資金を合算したものを現在の証拠金として計算します。これに注文サイズ割合をかけたものを注文サイズとし、最大レバレッジをかけたものを最大ポジションとします。

※ドル建ての損益・初期資金から、BTC建の注文サイズ・最大サイズに変換するため、Open価格で割っています。

(2020/12/29追記)初期資金+実現損益+未実現損益を合算したものを総資産(total_equity)として白線で描画します。総資産が0以下になった場合は背景色を赤色にします。(※実際の取引所ではロスカット時の証拠金維持率は0%ではなくもうちょい上だったと思うのでそこらへんは調整してください。)


// 注文処理
if(time > from_time)
   if(open < iybk_price)
       // 現在価格が買い増し価格未満で現在のポジションが最大ポジション設定値以下の場合にLongエントリー
       strategy.entry("Buy", strategy.long, order_size, when=strategy.position_size < max_position)
   else
       // 現在ポジションが0以上で現在価格が利確価格以上の場合にロング解消
       if(strategy.position_size > 0)
           strategy.order("Sell", strategy.short, order_size, when=open > close_price, comment="部分利確")

以下の注文処理を行っています。

・開始日時以降で、

・現在価格が買い増し価格より安く、現在ポジションが最大ポジションよりも小さければBuy

・現在ポジションが0以上で、現在価格が利確価格以上ならSell


// 建値を描画
plot(strategy.position_avg_price, title="建値", style=plot.style_line, color=color.blue, linewidth=2)

// 現在ポジションを描画
plot(strategy.position_size, title="ポジションサイズ", style=plot.style_line, color=color.gray)

建値と現在ポジションサイズを描画します。



以下、設定変更方法。

このストラテジーをテストすると以下のように表示されます。

画像1

証拠金やら現ポジやらをデバッグ用に表示しているので、Y軸のスケールがへんてこりんなことになっちゃいます。


画像2

証拠金から現ポジを表示したくない場合は、BANE_IYBKのSetting→StyleからCapitalとポジションサイズの表示のチェックを外しておいてください。まぁこれはこれで証拠金の推移が見れるので面白いです。


画像3

期間、レバ、注文サイズ割合、買い増し閾値、利確閾値はBANE-IYBKのSetting→Inputsから設定してください。いいパラメータがあったらDMで教えてください。


画像4

手数料やらスリッページやらはBANE-IYBKのSetting→Propertiesから設定してください。


以上です!上げ相場が前提でこんなにうまくはいかないと思うので、ご利用は自己責任で!

この記事が気に入ったらサポートをしてみませんか?