養分ロングbot(byともい氏)を解読してみる

自動売買

有名な仮想通貨botterであるよーぶんさんが発案したレバレッジ積み立てbotです

note ご指定のページが見つかりません

同じくbotterのともいさんが、仮想通貨取引所bybit用のコードを書いて、noteに公開されています

試しにコードをコピペして実行してみたところ、たまたま上昇トレンドだったからか、一晩で$500の資産が$600!?に増えてびっくりしました

どういう仕組みで動いているのか気になったので、解読してみました

養分ロングbotの解読

仮想通貨取引所bybit用のPythonプログラムをnoteから引用させてもらいました

note ご指定のページが見つかりません

暗号資産取引所bybitとは

ライブラリについて

import sys
import time
import ccxt
from datetime import datetime
from pprint import pprint

print(datetime.now())

必要なライブラリのインポートをしています

ccxtは、APIを一括で管理するライブラリです

仮想通貨の自動売買をする際に、よく使われます

パラメータについて

# パラメータ###########################################
GOAL = 100000                        #[USD]決済価格
LEVE = 1.5                           #維持するレバレッジ
print("deffence", 100/(LEVE+1), "%") #最高値からこれだけの調整は耐えるよという表示
LOT = 10                             #[USD]一度に注文する量
STIME = 3                            #[sec]ループ頻度。多分3以上じゃないとだめ
bybit = ccxt.bybit()
bybit.apiKey = ''
bybit.secret = ''

ゴールを100,000[USD]、レバレッジを1.5倍、ロットを10[USD]とし、3秒に1回ループするようにしています

ゴールは、ビットコイン価格が100,000[USD](日本円で大体1,000万円くらい)になると、利確するように設定されています

ロットは、1回あたりに買うビットコインの量で、10ドル分(大体1000円分)に設定してあります

ループ頻度は、3秒に1回と設定してあり、これより高頻度にするとアクセスエラーが出てしまうと思われます

初期処理について

#初期処理#########################################
#全注文キャンセル
bybit.cancelAllOrders('BTC/USD')
# 証拠金を取得
res = bybit.fetch_balance()
# ポジションを取得
pos = bybit.v2PrivateGetPositionList({'symbol': 'BTCUSD'})
balance = float(res['BTC']['free']) + float(res['BTC']['used']) + float(pos['result']['unrealised_pnl'])
print("balance+unreal:", balance, "BTC")
print("pos", pos['result']['size'], "USD")
#決済指値注文
if pos['result']['size'] > 0:
   order = bybit.v2PrivatePostOrderCreate({'side': 'Sell',
                                       'symbol': 'BTCUSD',
                                       'order_type': 'Limit',
                                       'qty': pos['result']['size'],
                                       'price': GOAL,
                                       'time_in_force': 'PostOnly',
                                       'reduce_only': True})

#寸前のポジション、減ったら決済と認識、停止
pre_pos = pos['result']['size']

balanceは、今持っているビットコイン全資産で、有効証拠金として使います

決済指値注文では、ビットコイン価格が100,000[USD]になったら利確をするように、ポジションを持っている分だけ指値を指します

繰り返し処理について

#繰り返し################################################
while True:
   try:
       # 証拠金を取得        
       res = bybit.fetch_balance()
       # ポジションを取得       
       pos = bybit.v2PrivateGetPositionList({'symbol': 'BTCUSD'})
       balance = float(res['BTC']['free']) + float(res['BTC']['used']) + float(pos['result']['unrealised_pnl'])
       # レバレッジを計算
       margin_leve = float(pos['result']['position_value']) / balance
        #ポジション量が減ってたら決済スタートもしくは異常事態として終了        
       if pos['result']['size'] < pre_pos:
           print('DECLEASE POS !!!')
           break
       #レバ低ければ買い増し
       if margin_leve < LEVE:
           print(datetime.now())
           print('LONG (leve', margin_leve, ")")
           res = bybit.create_market_buy_order('BTC/USD', LOT)

           print("pos", pos['result']['size'], "USD")
           res = bybit.v2PrivatePostOrderReplace({'order_id': order['result']['order_id'],
                                                'symbol': 'BTCUSD',
                                                'p_r_qty': pos['result']['size'] + LOT})
   except Exception as e:
       print(datetime.now())
       print(e)
   time.sleep(STIME)
   pre_pos = pos['result']['size']

この処理が、3秒に1回繰り返されます

ループの中を詳しく見てみます

証拠金について

# 証拠金を取得        
       res = bybit.fetch_balance()
       # ポジションを取得       
       pos = bybit.v2PrivateGetPositionList({'symbol': 'BTCUSD'})
       balance = float(res['BTC']['free']) + float(res['BTC']['used']) + float(pos['result']

まずはじめに、balance(有効証拠金)を計算しています

レバレッジについて

# レバレッジを計算
       margin_leve = float(pos['result']['position_value']) / balance
        #ポジション量が減ってたら決済スタートもしくは異常事態として終了  

次に、margin_leve(実効レバレッジ)を、下の式より計算しています

margin_leve(実効レバレッジ)=(取引額ポジション)÷ balance(有効証拠金)

レバレッジについて詳しく知りたい方は、この記事もご覧ください

例外処理について

#ポジション量が減ってたら決済スタートもしくは異常事態として終了        
       if pos['result']['size'] < pre_pos:
           print('DECLEASE POS !!!')
           break

例外処理です

指値が部分約定し始めると、終了するということです

また、異常事態の例として、bybitのサイトやアプリから手動で利確(決済)をすると、ロングポジションが減るので、例外処理を食らうと思います

メイン処理について

#レバ低ければ買い増し
       if margin_leve < LEVE:
           print(datetime.now())
           print('LONG (leve', margin_leve, ")")
           res = bybit.create_market_buy_order('BTC/USD', LOT)

           print("pos", pos['result']['size'], "USD")
           res = bybit.v2PrivatePostOrderReplace({'order_id': order['result']['order_id'],
                                                'symbol': 'BTCUSD',
                                                'p_r_qty': pos['result']['size'] + LOT})

もしmargin_leve(実効レバレッジ)が1.5より小さければ、1.5になるように買い増しをします

・ビットコイン価格が上がる(=儲かる)と、有効証拠金(全ビットコイン資産)が増える

・有効証拠金が増えると、実効レバレッジが減る

  実効レバレッジ=取引額(ポジション)÷ 有効証拠金

・実質レバレッジが1.5倍になるように買い増す

という仕組みになっています

1回買い増すBTCは10[USD]分で、実効レバレッジが1.5になるまで、3秒に1回、買い増しが繰り返されます

フローチャート

フローチャートでざっくり表すと、こんな感じになると思います

補足説明

私がつまずいたところを補足説明としてメモしておきます

私が勝手に解釈したものなので、間違っていたらごめんなさい

・仮想通貨取引所bybitの口座レバレッジは100倍である

・bybitは証拠金取引を行う取引所である

・保有するBTCを証拠金にして、ドル建てでBTCを購入する(ドルを借りてBTCを買う)

・購入するBTC量に応じて、実効レバレッジが変わる

  実効レバレッジ = 取引額 ÷ 有効証拠金(全ビットコイン資産)

・ビットコイン価格が上がる(=儲かる)と、有効証拠金が増える

・有効証拠金が増えると、実効レバレッジが減る

・実質レバレッジが1.5倍になるように買い増す

リンク

プログラムの引用元

note ご指定のページが見つかりません

他の自動売買プログラムについて

暗号資産取引所bybitについて

コメント

タイトルとURLをコピーしました