<br/>
# 必要なライブラリをインストール
pip install ccxt pandas numpy talib TA-Lib python-dotenv schedule websockets flask
<br/>
# .envファイルにAPIキーを保存
API_KEY = "your_api_key" # 取引所から発行されたAPIキー
API_SECRET = "your_api_secret" # 取引所から発行されたAPIシークレット
import ccxt
<br/>
# Binance APIを初期化
binance = ccxt.binance({
'apiKey': API_KEY, # APIキーを設定
'secret': API_SECRET, # APIシークレットを設定
'enableRateLimit': True # APIリクエスト制限を有効化
})
<br/>
# リアルタイムOHLCVデータを受信 (Websocket)
async def fetch_btc_data():
async with websockets.connect('wss://fstream.binance.com/ws/btcusdt@kline_1m') as ws:
while True:
data = await ws.recv() # リアルタイムデータを受信
print(json.loads(data)) # データを出力
import talib
<br/>
# テクニカル指標を計算する関数
def calculate_indicators(df):
# 20日単純移動平均 (SMA) を計算
df['MA20'] = talib.SMA(df['close'], timeperiod=20)
# 14日相対力指数 (RSI) を計算
df['RSI'] = talib.RSI(df['close'], timeperiod=14)
# MACD (移動平均収束拡散) を計算
df['MACD'], _, _ = talib.MACD(df['close'])
return df
<br/>
# 売買シグナルを生成する関数
def generate_signal(df):
latest = df.iloc[-1] # 最新データを取得
# デュアルSMA戦略
if latest['MA20'] > latest['MA50'] and df['MA20'].iloc[-2] <= df['MA50'].iloc[-2]:
return 'BUY' # 買いシグナル
elif latest['MA20'] < latest['MA50'] and df['MA20'].iloc[-2] >= df['MA50'].iloc[-2]:
return 'SELL' # 売りシグナル
else:
return 'HOLD' # ホールドシグナル
<br/>
# ポジションサイズを計算する関数
def calculate_position_size(balance, risk_per_trade=0.02):
# 総資本と1トレードあたりのリスク率に基づいてポジションサイズを計算
return balance * risk_per_trade
<br/>
# ストップロスを設定する関数
def set_stop_loss(entry_price, atr, multiplier=1.5):
# ATR (アベレージ・トゥルー・レンジ) に基づいてストップロスを計算
return entry_price - (atr * multiplier)
<br/>
# 注文を実行する関数
def execute_order(side, amount, symbol='BTC/USDT'):
try:
if side == 'BUY':
# 成り行き買い注文を実行
order = binance.create_market_buy_order(symbol, amount)
elif side == 'SELL':
# 成り行き売り注文を実行
order = binance.create_market_sell_order(symbol, amount)
print(f"注文が実行されました: {order}") # 注文実行ログを出力
return order
except Exception as e:
print(f"注文に失敗しました: {e}") # 注文に失敗した場合、エラーメッセージを出力
return None
<br/>
# バックテスト関数
def backtest_strategy(df, initial_balance=10000):
balance = initial_balance # 初期資本を設定
position = 0 # ポジションを初期化
for i in range(1, len(df)):
signal = df['signal'].iloc[i] # 売買シグナルを取得
price = df['close'].iloc[i] # 終値を取得
if signal == 'BUY' and position == 0:
# 買いシグナルを受信したらポジションを設定
position = balance / price
balance = 0
elif signal == 'SELL' and position > 0:
# 売りシグナルを受信したらポジションを清算
balance = position * price
position = 0
return balance # 最終残高を返す
import logging
<br/>
# ロギング設定
logging.basicConfig(filename='trading.log', level=logging.INFO)
<br/>
# トランザクションロギング関数
def log_transaction(order):
logging.info(f"""
[トランザクション詳細]
時間: {datetime.now()}
種類: {order['side']}
量: {order['amount']}
価格: {order['price']}
ステータス: {order['status']}
""")
<br/>
# メイン実行ループ
def main():
while True:
try:
df = fetch_realtime_data() # リアルタイムデータを取得
df = calculate_indicators(df) # テクニカル指標を計算
signal = generate_signal(df) # 売買シグナルを生成
if signal != 'HOLD':
# 売買シグナルがある場合は注文を実行
amount = calculate_position_size(get_balance())
execute_order(signal, amount)
time.sleep(60) # 1分間隔で実行
except KeyboardInterrupt:
break # ユーザーによる中断でループを終了
binance = ccxt.binance({
'options': {'adjustForTimeDifference': True}, # 時間差補正
'proxies': {'https': 'http://10.10.1.10:3128'} # プロキシ設定
})
<br/>
# システムサービス登録 (Linux)
[Unit]
Description=Crypto Trading Bot
After=network.target
[Service]
ExecStart=/usr/bin/python3 /path/to/bot.py
Restart=always
[Install]
WantedBy=multi-user.target
📌 重要な注意事項
0