3角对冲原理

基础货币 base, 兑换货币 quote, 中间货币 mid.

市场分为3个市场

p3: base_quote

p2: quote_mid

p1: quote_mid

代码逻辑

1, 首先获取3个市场的委托单

2, 开始计算: 情况一: 在p3市场买入 base币, 情况二: 在p3市场卖出base币

3, 上面两种情况, 考虑手续费, 和买卖价的情况下. 看付出的中间货币mid 是否比得到的中间货币 mid 少

4, 如果得到的mid比付出的多, 那么立刻下单

5, 下单逻辑没写, 不过大概率下单会成功, 如果不成功则等待, 等待时间太长可以止损, 直接卖出, 不能暂用资金, 下一轮套利开始

下面的代码, 只是寻找购买机会. 跑了几天, 发现机会渺茫. 所以放弃下订单的代码编写

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import threading import http.client
import urllib
import json
import hashlib
import hmac
import numpy as np
np.set_printoptions(suppress=True) #---------------------------------------数据库函数---------------------------------------
import pymysql
class MyDb:
'''
数据库类型
'''
def __init__(self, **kwargs):
self.conn=pymysql.connect(host="127.0.0.1",user="root",password="root",database="btc",charset="utf8",cursorclass=pymysql.cursors.DictCursor)
self.cur = self.conn.cursor() def create_args_string(self,num):
'''
创建参数占位符
'''
L = []
for n in range(num):
L.append('%s')
return ', '.join(L) def query(self,sql,args=()):
sql = sql.replace("?", "%s");
self.cur.execute(sql,args)
self.conn.commit() def select(self,sql,args=(),limit=None):
sql = sql.replace("?", "%s");
self.cur.execute(sql, args)
if limit==1:
result = self.cur.fetchone()
else:
result = self.cur.fetchall()
return result def update(self,table,data,where="1"):
fields = ', '.join(map(lambda f: '`%s`=?' % (f), data.keys()))
sql = "update `%s` set %s where %s" % (table, fields, where)
sql = sql.replace("?", "%s");
#print(sql)
self.cur.execute(sql,tuple(data.values()))
self.conn.commit() def insert(self,table, data):
args = list(data.values())
args_string = self.create_args_string(len(args))
fields = ",".join(data.keys())
sql = "insert into %s (%s) values (%s)" % (table, fields,args_string)
self.cur.execute(sql,args)
self.conn.commit() def close(self):
self.cur.close()
self.conn.close()
db = MyDb()
#---------------------------------------工具函数---------------------------------------
def getSign(params, secretKey):
bSecretKey = bytes(secretKey, encoding='utf8') sign = ''
for key in params.keys():
value = str(params[key])
sign += key + '=' + value + '&'
bSign = bytes(sign[:-1], encoding='utf8') mySign = hmac.new(bSecretKey, bSign, hashlib.sha512).hexdigest()
return mySign def httpGet(url, resource, params=''):
conn = http.client.HTTPSConnection(url, timeout=10)
conn.request("GET", resource + '/' + params)
response = conn.getresponse()
data = response.read().decode('utf-8')
return json.loads(data) def httpPost(url, resource, params, apiKey, secretKey):
headers = {
"Content-type" : "application/x-www-form-urlencoded",
"KEY":apiKey,
"SIGN":getSign(params, secretKey)
} conn = http.client.HTTPSConnection(url, timeout=10) tempParams = urllib.parse.urlencode(params) if params else ''
print(tempParams) conn.request("POST", resource, tempParams, headers)
response = conn.getresponse()
data = response.read().decode('utf-8')
params.clear()
conn.close()
return data #---------------------------------------多线程函数---------------------------------------
class MyThread(object):
'''
多线程
'''
def __init__(self, func_list=None,timeout=5):
self.threads = []
self.rs = {}
self.timeout = timeout
self.func_list = func_list
self.start() #封装的线程函数
def trace_func(self, func, name , *args, **kwargs):
ret = func(*args, **kwargs)
self.rs[name] = ret #执行多线程
def start(self):
for v in self.func_list:
if v["args"]:
lists = []
lists.append(v["func"])
lists.append(v["name"])
for arg in v["args"]:
lists.append(arg)
tuples = tuple(lists)
t = threading.Thread(target=self.trace_func, args=tuples)
else:
t = threading.Thread(target=self.trace_func, args=(v["func"],v["name"],))
self.threads.append(t)
for t in self.threads:
t.start()
for t in self.threads:
t.join()
#t.join(self.timeout) #########################################套利#####################################################
class Taoli:
def __init__(self, base='eos', quote='ht', mid='usdt'):
self.base = base
self.quote = quote
self.mid = mid
self.start()
'''
开始套利
'''
def start(self):
#获取委托单
func_list = []
func_list.append({"func":self.depth, "args":("%s_%s"%(self.base, self.mid),), "name":"p1"})
func_list.append({"func":self.depth, "args":("%s_%s"%(self.quote, self.mid),), "name":"p2"})
func_list.append({"func":self.depth, "args":("%s_%s"%(self.base, self.quote),), "name":"p3"})
mt = MyThread(func_list)
d = mt.rs
#print(d)
#计算是否满足条件套利
try:
p1s = d['p1']['asks'][-1]
p1s[0] = float(p1s[0])
p1s[1] = float(p1s[1])
p1b = d['p1']['bids'][0]
p1b[0] = float(p1b[0])
p1b[1] = float(p1b[1]) p2s = d['p2']['asks'][-1]
p2s[0] = float(p2s[0])
p2s[1] = float(p2s[1])
p2b = d['p2']['bids'][0]
p2b[0] = float(p2b[0])
p2b[1] = float(p2b[1]) p3s = d['p3']['asks'][-1]
p3s[0] = float(p3s[0])
p3s[1] = float(p3s[1])
p3b = d['p3']['bids'][0]
p3b[0] = float(p3b[0])
p3b[1] = float(p3b[1])
except:
print('线程错误,重新开始')
return False
self.buy(p1s, p1b, p2s,p2b,p3s,p3b)
self.sell(p1s, p1b, p2s,p2b,p3s,p3b) '''
买入 base货币
'''
def buy(self,p1s, p1b, p2s,p2b,p3s,p3b):
num1 = p3s[1]
num2 = p1b[1]
min1 = min(num1,num2) #最小base币 num3 = min1*p3s[0]
num4 = p2s[1]
min2 = min(num3, num4) #最小quote币 #最小base币
num = min(min1,min2/p3s[0])
num_usdt = 1/p1b[1]
num = min(num,num_usdt)
num = "%.4f"%(num)
num = float(num) #开始计算
orders = {}
#p3 市场
orders['p3'] = {
'type':'buy',
'base_num':num,
'quote_num':num*p3s[0],
'price':p3s[0]
} #p2 市场
orders['p2'] = {
'type':'buy',
'quote_num':orders['p3']['quote_num']*1000/998,
'mid_num' :orders['p3']['quote_num']*1000/998*p2s[0],
'price':p2s[0]
} #p1 市场
orders['p1'] = {
'type':'sell',
'base_num':num*998/1000,
'mid_num':num*998/1000*p1b[0],
'price':p1b[0]
} own_usdt = orders['p1']['mid_num']*0.998 - orders['p2']['mid_num']
if own_usdt>0:
with open('t.txt','a+') as f:
own_usdt = "%.7f"%own_usdt
orders['p2']['mid_num'] = "%.7f"%orders['p2']['mid_num']
f.write("%s_%s: 交易:%s USDT 盈利: %s\n" % (self.base,self.quote,orders['p2']['mid_num'], own_usdt))
print('买入base币开始下单')
print('买入base币:数量%s'%(num))
print('盈利mid币:%s'%(own_usdt)) '''
卖 base货币
'''
def sell(self,p1s, p1b, p2s,p2b,p3s,p3b):
num1 = p3b[1]
num2 = p1s[1]
min1 = min(num1,num2) #最小base币 num3 = min1*p3b[0]
num4 = p2b[1]
min2 = min(num3, num4) #最小quote币 #最小base币
num = min(min1,min2/p3b[0])
num_usdt = 1/p1s[1]
num = min(num,num_usdt)
num = "%.4f"%(num)
num = float(num) #开始计算
orders = {}
#p3 市场
orders['p3'] = {
'type':'sell',
'base_num':num,
'quote_num':num*p3b[0],
'price':p3b[0]
} #p2 市场
orders['p2'] = {
'type':'sell',
'quote_num':orders['p3']['quote_num']*998/1000,
'mid_num' :orders['p3']['quote_num']*998/1000*p2b[0],
'price':p2b[0]
} #p1 市场
orders['p1'] = {
'type':'buy',
'base_num':num*1000/998,
'mid_num':num*1000/998*p1s[0],
'price':p1s[0]
} own_usdt = orders['p2']['mid_num']*0.998 - orders['p1']['mid_num']
if own_usdt>0:
with open('t.txt','a+') as f:
own_usdt = "%.7f"%own_usdt
orders['p1']['mid_num'] = "%.7f"%orders['p1']['mid_num']
f.write("%s_%s: 交易:%s USDT 盈利: %s\n" % (self.base,self.quote,orders['p1']['mid_num'], own_usdt))
# print([p1s, p1b, p2s,p2b,p3s,p3b])
print(orders)
print('卖出base币开始下单')
print('卖出base币:数量%s'%(num))
print('盈利mid币:%s'%(own_usdt)) '''
获取现货市场深度信息
'''
def depth(self,symbol = ''):
URL = "/api2/1/orderBook"
url = "data.gateio.io"
return httpGet(url, URL, symbol)
while True:
#btc
# coins = ['bch','eth','etc','ltc','eos','xrp','omg','dash','zec','ada','steem','iota','ocn','soc','ctxc','act','btm','bts','ont','iost','ht','trx','dta','neo','qtum','smt','ela','ven','theta','snt','zil','xem','nas','ruff','hsr','let','mds','storj','elf','itc','cvc','gnt','wicc','cmt','bix']
# for v in coins:
# print("%s_%s"%(v,'btc'))
# Taoli(base=v, quote='btc', mid='usdt') #eth
coins = ['etc','qtum','btm','eos','req','snt','omg','pay','cvc','zrx','tnt','bat','pst','dpy','lrc','storj','rdn','stx','knc','link','cdt','ae','rlc','rcn','trx','kick','vet','mco','fun','data','zsc','mda','xtz','gnt','gem','rfr','dadi','abt','ost','xlm','mobi','ocn','zpt','cofi','jnt','blz','mtn','ruff','tnc','zil','tio','bto','theta','ddd','mkr','smt','mdt','mana','lun','salt','fuel','elf','drgn','gtc','qlc','dbc','bnty','lend','icx','mds','dgd','qash','powr','hsr','qsp','ink','med','bot','qbt','gnx','nas','bcdn','snet','bu','boe','medx','cs','man','rem','lym','ont','bft','iht','senc','tomo','elec','hav','swth','nkn','soul','lrn','eosdac','dock','gse','rating','hsc','gard','fti','sop','lemo','qkc','iotx','red','lba','open','mith','skm','met','tct']
for v in coins:
print("%s_%s"%(v,'eth'))
Taoli(base=v, quote='eth', mid='usdt') #qtum
coins = ['ink','med','bot','qbt','tsl']
for v in coins:
print("%s_%s"%(v,'qtum'))
Taoli(base=v, quote='qtum', mid='usdt')

比特币 3角对冲python代码的更多相关文章

  1. 40多行python代码开发一个区块链。

    40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...

  2. 用不到 50 行的 Python 代码构建最小的区块链

    引用 译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意.本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理. 尽管一些人 ...

  3. 【路径规划】 Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame (附python代码实例)

    参考与前言 2010年,论文 Optimal Trajectory Generation for Dynamic Street Scenarios in a Frenet Frame 地址:https ...

  4. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

  5. if __name__== "__main__" 的意思(作用)python代码复用

    if __name__== "__main__" 的意思(作用)python代码复用 转自:大步's Blog  http://www.dabu.info/if-__-name__ ...

  6. Python 代码风格

    1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...

  7. 一行python代码实现树结构

    树结构是一种抽象数据类型,在计算机科学领域有着非常广泛的应用.一颗树可以简单的表示为根, 左子树, 右子树. 而左子树和右子树又可以有自己的子树.这似乎是一种比较复杂的数据结构,那么真的能像我们在标题 ...

  8. [Dynamic Language] 用Sphinx自动生成python代码注释文档

    用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...

  9. 上传自己的Python代码到PyPI

    一.需要准备的事情 1.当然是自己的Python代码包了: 2.注册PyPI的一个账号. 二.详细介绍 1.代码包的结构: application \application __init__.py m ...

随机推荐

  1. LuoguP2846[USACO08NOV]光开关Light Switching【线段树维护区间异或】By cellur925

    题目传送门 题目大意,给你一串灯,按一下开关可以将灯的状态取反(开变成关,关变成开).维护这个序列的两种操作:询问区间内有多少灯是开着的,区间按灯. 开始想的是分别维护区间内0的数量,1的数量,两个懒 ...

  2. bryce1010专题训练——划分树

    1.求区间第K大 HDU2665 Kth number /*划分树 查询区间第K大 */ #include<iostream> #include<stdio.h> #inclu ...

  3. UVA - 1658 Admiral

    3. C - Admiral 题意:给定v(3<=v<=1000)个节点,e(3<=e<=10000)条边的又向加权图,求1->v的两条不相交的路径,使得权和最小. 思路 ...

  4. vs2010 坑爹的BUG

    以前用VS2005的时候,就遇到过一些很奇怪的BUG,比如始终报错,然后把项目文件删除,重新创建一个项目文件,就好了. 今天用VS2010测试程序时,又发现一个坑爹的BUG,这绝对不是我的错! sta ...

  5. UIBarButtonItem系统默认风格形状

    typedef NS_ENUM(NSInteger, UIBarButtonSystemItem) { UIBarButtonSystemItemDone, UIBarButtonSystemItem ...

  6. 机器学习概念之特征处理(Feature processing)

    不多说,直接上干货! 肯定也有不少博友,跟我一样,刚开始接触的时候,会对这三个概念混淆. 以下是,特征处理.特征提取.特征转换和特征选择的区别! 特征处理主要包含三个方面:特征提取.特征转换和特征选择 ...

  7. Unity中所有特殊的文件夹

    1. 隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2. Standard Assets在这个文件夹中的脚本最先被编译 ...

  8. AJPFX总结方法的特点

    它可以实现独立的功能; 必须定义在类里面; 它只有被调用才会执行; 它可以被重复使用; 方法结束后方法里的对象失去引用;   如何定义一个功能,并通过方法体现出来: ① 明确该功能运算后的结果.明确返 ...

  9. 5.iOS测试总结

    1. 什么是Mock 当我们在做单元测试的过程中,为了保持测试又短又快和测试的隔离性,希望尽可能少地去实例化一些具体的组件.在现在面向对象的系统中,被测试的对象很可能会依赖于几个其他的对象,这时候我们 ...

  10. htm 中 <b>和<strong>的区别

    显示上两者没有任何区别,都是粗体<b>:为了加粗而加粗,推荐使用 css font-weight 属性来创建粗体文字.<strong>:为了强调而加粗,表示十分重要.在网页中使 ...