ひたすらショートを繰り返すだけのbot(bitget)

いろいろ寄り道をしてよくわからなくなってきました。
なので一度こちらに戻って最初に作りたかったbotを完了させようと取り組みました。
寄り道したおかげで少し力がついたような感じがします。

では、時間を指定して毎日ショートを繰り返すbotを作ってみます。
・取引所のbitgetを使ってます。
・24:00(JST)にポジションを解消してショートを入れる。を繰り返す。
・レバレッジは10倍の分離マージンにして10%値上がりしたら全損。

できあがったのがこちら

#[python devil_short.py]
#----------------------------------------------------------------
#---ライブラリをインポート---
import ccxt
import schedule	# 定期実行用
import time
import pandas as pd
from rich import print
import os	# ログ保存用
from datetime import datetime
from config import bitget	# 設定ファイルからbitgetの情報をインポート

#----------------------------------------------------------------
#---Bitgetのインスタンスを作成---
bitget_exchange = ccxt.bitget({
    'apiKey': bitget['apiKey'],
    'secret': bitget['secret'],
    'password': bitget['password'],  # Bitgetではパスフレーズも必要
    'enableRateLimit': True  # レート制限の有効化
})

#----------------------------------------------------------------
#---Parameter Set---
bitget_exchange.options["defaultType"] = "swap"	# 先物の時はこれが必要
symbol_nosl = "NEIROUSDT"		# シンボルの設定 (例: BTCUSDT)
levarage = 10	#レバレッジの設定
sell_order = 0	#ショートオーダーID
#---指値注文を出したいUSDTの額と価格---
usdt_amount = 10  # 10 USDT分をショートしたい
price = 0  # 指値価格用

#---ファイルが存在しない場合にファイルを作成---
if not os.path.exists("./devil_shortlog.txt"):
	with open('devil_shortlog.txt', 'a') as f:
		# 日付、シンボル、ポジション、数量、buy価、sell価、利益$、利益率
		print('Date, Symbol, Side, Amount, Buy, Sell, Profit, Margin', file=f)

#---レバレッジのセット---
if bitget_exchange.fetchLeverage(symbol_nosl)["shortLeverage"] != levarage:
	params = {'hold_side': 'short', 'marginCoin': 'USDT'}
	bitget_exchange.setLeverage(levarage, symbol_nosl, params)

#---分離モードを設定(必要あれば)---
if bitget.fetchMarginMode(symbol_nosl)["marginMode"] != 'isolated':
	bitget.setMarginMode("isolated", symbol_nosl)

#----------------------------------------------------------------
#---マクロの作成---
def take_profit(positions):	# 現在ある先物ポジションの利益確定注文
	try:
		amount = positions['contracts']
		side = "sell" if positions['side'] == 'short' else "buy"
		# Additional parameters specific to Bitget
		params = {
			'marginMode': positions['marginMode'],
			'reduceOnly': True,  # ポジションを減らす
			'tradeSide': 'close',
			'productType': 'USDT-FUTURES'
		}

		# Create the order
		order = bitget_exchange.create_order(symbol_nosl, 'market', side, amount, params)
		return order['id']

	except ccxt.BaseError as e:
		print(f"An error occurred: {e}")
		return None
#----------------------------------------------------------------
def execute_order(side):		# 先物注文を実行
	price = bitget_exchange.fetchTicker(symbol_nosl)['ask']
	try:
		amount = round(usdt_amount / price, 1)	# 数量を計算
		amount = amount * levarage				# レバレッジ修正
		hold_side = 'long' if side == 'buy' else 'short'

		parms = {
			'holdSide': hold_side,
			'marginMode': 'isolated',
			'marginCoin': 'USDT',
			'posSide': hold_side,
			'tradeSide': 'open',
			'productType': 'USDT-FUTURES'
		}

		order = bitget_exchange.create_order(symbol_nosl, 'market', side, amount, parms)
		return order['id']

	except Exception as e:
		print(f"An unexpected error occurred: {e}")
		return None

#----------------------------------------------------------------
def save_data_log(sell_order_id, buy_order_id):
	#日付、シンボル、ポジション、数量、buy価、sell価、利益$、利益率

	sell_order = bitget_exchange.fetchOrder(sell_order_id, symbol_nosl)
	timestamp = datetime.today().date()
	amount = sell_order['filled']
	s_price = sell_order['price']

	buy_order = bitget_exchange.fetchOrder(buy_order_id, symbol_nosl)
	b_price = buy_order['price']
	profit = float(buy_order['info']['totalProfits']) - buy_order['fee']['cost']
	deposit_price = (s_price * amount) / levarage
	margin = str(round(profit / deposit_price, 3)) + "%"
	profit = round(profit, 3)
	
	with open('devil_shortlog.txt', 'a') as f:		# ログ
		print(f"{timestamp}, {symbol_nosl}, short, {amount}, {b_price}, {s_price}, {profit}, {margin}", file=f)

#----------------------------------------------------------------
def job():
	positions = bitget_exchange.fetch_position(symbol_nosl)	# ポジションの確認

	if positions['contracts']:  # ポジションがある場合
		buy_order_id = take_profit(positions)	# クローズする
		if buy_order_id and sell_order_id:
			save_data_log(sell_order_id, buy_order_id)	# ログ保存
		time.sleep(1)

	# ショートポジションの指値注文を作成 (売り注文)
	sell_order_id = execute_order('sell')

#----------------------------------------------------------------
#---メインコード---
schedule.every().day.at("0:00").do(job)
#---jobの実行監視、指定時間になったらjob関数が実行される---
while True:
	schedule.run_pending()
	time.sleep(1)

ChatGPT先生からOKもらってるので問題なく動くのではないかと思います。
運用は自己責任でお願いします。

BTC上昇で動かす気なかったですが、思ったより強く上昇している感じではないですね。これから動かしてみようかと思います。1日1回動作なので自前のパソコンでいいかな。

P.S. だれか運営がたまにガッと買ってあとはひたすら下げるだけの通貨知ってたら教えてください。

では、次のbotに取り組んでいきます。👋

2024年11月10日
ソース一部変更しました。
⇒成り行き注文の場合、paramをセットするときにpriceの部分に'None'をセットしたいとエラーが起きました。
分離モードとレバレッジのセッティングも追加しておきました。

ここから先は

0字

¥ 100

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

この記事が気に入ったらチップで応援してみませんか?