"""
定投实盘交易的策略代码
1. 定投思路如下
2. 每周四、周五下午的18点定投 # 10W, 3月, 3, 30000/4/2
思路和过程
1. 注册交易所, 创建api
2. 安装ccxt库,或者自己写 pip install ccxt
3. 查看交易对的信息, 下单的限制和最小价格和最小数量的限制.
4. 判断时间,然后下单.
"""
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
import ccxt
from ccxt import Exchange
import time
class BinanceBroker(object):
def __init__(self, exchange: Exchange, symbol: str, fixed_invest_money: float):
super(BinanceBroker, self).__init__()
self.exchange = exchange
self.symbol = symbol
self.fixed_invest_money = fixed_invest_money
self.order_id = None # 记录最近一次下单的订单ID.
self.bid_price = 0
self.ask_price = 0
def fixed_invest_trading(self):
now = datetime.now()
weekday = now.isoweekday()
hour = now.hour
print(f"{weekday}, {hour}")
if weekday == 4 or weekday == 5: # 没周四周五的时候定投.
if hour == 18: # 下午18点的时候定投.
if self.bid_price > 0: # 判断价格是否有效.
amount = fixed_invest_money/self.ask_price
min_amount = 0.000001
amount = amount // min_amount * min_amount # 取整数.
print(amount)
for i in range(5):
try:
order = binance_exchange.create_order(symbol, type='LIMIT', side='BUY', amount=amount, price=self.ask_price)
if order:
self.order_id = order['info']['orderId']
break
else:
continue
except Exchange as error:
print(f"下单发生错误:{error}")
time.sleep(10) # 休息10秒钟
def check_order_status(self):
"""
定时检查仓位信息等,检查当前的订单有没有成交等.
如果order 没有成交的情况下,重新撤单. 然后在下单.
:return:
"""
if self.order_id:
order = self.exchange.fetch_order_status(self.order_id, self.symbol)
def get_ask_bid_price(self):
ticker = binance_exchange.fetch_bids_asks(symbol)
# print(ticker)
if ticker:
self.bid_price = float(ticker[symbol]['info']['bidPrice'])
self.ask_price = float(ticker[symbol]['info']['askPrice'])
print(f"bid_price: {self.bid_price}, ask_price:{self.ask_price}")
def send_notify_msg(self):
"""
发送通知或者提醒功能.
:return:
"""
if __name__ == '__main__':
key = "你的币安交易所的key" # 交易所的key
secret = "你的币安交易所的secret" # 交易所的secret.
binance_exchange = ccxt.binance({"apiKey": key, "secret": secret})
symbol = "BTC/USDT" # 定投的标的.
fixed_invest_money = 500 # 500 USDT
# 获取交易对的信息. minQty = 0.000001, minNotional = 10USDT
# symbols = binance_exchange.load_markets()
# print(symbols)
# exit()
# ticker = binance_exchange.fetch_bids_asks(symbol)
# print(ticker)
# exit()
# order = binance_exchange.create_order(symbol, type='LIMIT', side='BUY', amount=0.002, price=7000)
# print(order)
# order_id = order['info']['orderId']
# print(order_id)
# exit()
# amount = fixed_invest_money / 7724.11
# print(amount)
# print(round(amount, 6))
# min_amount = 0.000001
# amount = amount // min_amount * min_amount # 取整数.
# print(amount)
# exit()
# 币安经纪人
binance_broker = BinanceBroker(binance_exchange, symbol, fixed_invest_money=fixed_invest_money)
scheduler = BlockingScheduler() # 主线程里面执行.
scheduler.add_job(binance_broker.fixed_invest_trading, trigger='cron', hour='*/1') # 每小时运行一次.
scheduler.add_job(binance_broker.check_order_status, trigger='cron', minute='*/5') # 每五分钟检查下仓位.
scheduler.add_job(binance_broker.send_notify_msg, trigger='cron', hour='*/8') # 每八个小时通知一次。
scheduler.add_job(binance_broker.get_ask_bid_price, trigger='cron', second='*/10') # 10秒钟获取一次ticker.
# 1.2
scheduler.start()