策略复制地址:https://www.fmz.com/strategy/21023

策略原理

比特币搬砖策略是入门程序化交易的基础策略。原理简单,是新手尝试程序化的好选择,在其黄金时期,比特币搬砖也带来大量的利润。掌握此策略需要有一定的基础。
长期来看,两个交易所比特币的差价应该稳定的,如果存在足够的差价,我们便可以在价格低的交易所买入币,在价格高的交易所卖出币。这样一来两个交易所持有的币总量没变,但价值却增加了。这就是搬砖的基础原理。

策略参数:

主要设置差价和操作量,其中差价设为交互模式

 
 

策略源码:

import time
import json def cancelAll():
ret = False
for e in exchanges:
while True:
n = 0
for order in _C(e.GetOrders):
ret = True
e.CancelOrder(order.Id)
n+=1
if n == 0:
break
return ret def main():
global MinSpreadA, MinSpreadB
SetErrorFilter("canceled")
if len(exchanges) != 2:
raise Exception("只支持两个交易所对冲") LogReset()
LogProfitReset()
cancelAll() initStocks = 0.0
initBalance = 0.0
minAmount = 0.1
lastTradeTime = 0
lastTradeErrExchange = ''
accountsCache = []
hedgeNum = [0, 0]
names = []
baseCurrency = exchange.GetCurrency()
for e in exchanges:
if e.GetCurrency() != baseCurrency:
raise Exception("必须是同样的货币才可以对冲 " + baseCurrency)
names.append(e.GetName())
account = _C(e.GetAccount)
accountsCache.append(account)
initStocks += account.Stocks
initBalance += account.Balance
Log("Switch", e.GetLabel(), "To", e.IO("websocket"))
minAmount = 0.01 if baseCurrency == "BTC" else 0.1
Log("总钱:", _N(initBalance), "总币", _N(initStocks), 'Python:', __import__('sys').version)
while True:
if not accountsCache:
accountsCache = [_C(e.GetAccount) for e in exchanges]
Sleep(LoopInterval)
cmd = GetCommand()
if cmd:
Log("CMD", cmd)
arr = cmd.split(':')
if arr[0] == 'A->B':
MinSpreadA = float(arr[1])
elif arr[0] == 'B->A':
MinSpreadB = float(arr[1]) depthA = exchanges[0].GetDepth()
if not depthA:
continue
depthB = exchanges[1].GetDepth()
if not depthB:
continue
if lastTradeTime > 0 and time.time() - lastTradeTime > BalanceTime:
needUpdate = cancelAll()
if not needUpdate:
for account in accountsCache:
if account.FrozenBalance >= 0.1 or account.FrozenStocks > 0.001:
needUpdate = True
break
if needUpdate:
accountsCache = [_C(e.GetAccount) for e in exchanges]
nowStocks = 0.0
nowBalance = 0.0
for account in accountsCache:
nowStocks += account.Stocks
nowBalance += account.Balance
diff = _N(nowStocks - initStocks, 5)
isReverse = None
if abs(diff) < minAmount:
LogProfit(_N(nowBalance-initBalance, 3), "总钱:", _N(nowBalance), "总币", _N(nowStocks), "币差:", diff)
lastTradeTime = 0
elif diff > minAmount:
isReverse = depthA.Bids[0].Price < depthB.Bids[0].Price
elif -diff > minAmount:
isReverse = depthA.Asks[0].Price > depthB.Asks[0].Price
if isReverse is not None:
depths = [depthA, depthB]
opAmount = None
for pos in ([1, 0] if isReverse else [0, 1]):
if diff >= minAmount:
opAmount = min(diff, accountsCache[pos].Stocks, depths[pos].Bids[0].Amount + depths[pos].Bids[1].Amount)
diff -= opAmount
if opAmount >= minAmount:
exchanges[pos].Sell(depths[pos].Bids[1].Price, opAmount)
elif -diff >= minAmount:
opAmount = min(-diff, _N(accountsCache[pos].Balance / depths[pos].Asks[1].Price, 3), depths[pos].Asks[0].Amount + depths[pos].Asks[1].Amount)
diff += opAmount
if opAmount >= minAmount:
exchanges[pos].Buy(depths[pos].Asks[1].Price, opAmount)
if opAmount is not None:
lastTradeTime = time.time()
accountsCache = []
continue
# end of balanceAccount diffA = _N(depthA.Bids[0].Price - depthB.Asks[0].Price, 3)
diffB = _N(depthB.Bids[0].Price - depthA.Asks[0].Price, 3)
LogStatus('`' + json.dumps({'type': 'table', 'title': '运行信息', 'cols': ['名称', '钱', '冻结的钱', '币', '冻结的币', '买一', '卖一', '阀值', '差价', '次数'], 'rows': [[names[0], accountsCache[0].Balance, accountsCache[0].FrozenBalance, accountsCache[0].Stocks, accountsCache[0].FrozenStocks, depthA.Bids[0].Price, depthA.Asks[0].Price, MinSpreadA, diffA, hedgeNum[0]], [names[1], accountsCache[1].Balance, accountsCache[1].FrozenBalance, accountsCache[1].Stocks, accountsCache[1].FrozenStocks, depthB.Bids[0].Price, depthB.Asks[0].Price, MinSpreadB, diffB, hedgeNum[0]]]}) + '`')
HPos = 0
if diffA >= MinSpreadA:
orderH = depthA.Bids[0]
orderL = depthB.Asks[0]
exchangeH = exchanges[0]
exchangeL = exchanges[1]
accountH = accountsCache[0]
accountL = accountsCache[1]
elif diffB >= MinSpreadB:
HPos = 1
orderH = depthB.Bids[0]
orderL = depthA.Asks[0]
exchangeH = exchanges[1]
exchangeL = exchanges[0]
accountH = accountsCache[1]
accountL = accountsCache[0]
else:
continue opPrice = _N((orderH.Price + orderL.Price) / 2.0, 2)
opAmount = min(MaxAmount, orderH.Amount, orderL.Amount, accountH.Stocks, _N(accountL.Balance / opPrice, 3))
if opAmount >= minAmount:
tasks = [[exchangeH.Sell, "H"], [exchangeL.Buy, "L"]]
if lastTradeErrExchange == "L":
tasks.reverse()
lastTradeErrExchange = ""
for task in tasks:
if task[0](opPrice, opAmount) is None:
lastTradeErrExchange = task[1]
break
lastTradeTime = time.time()
accountsCache = []
hedgeNum[HPos] += 1

比特币搬砖对冲策略Python源码的更多相关文章

  1. Python 源码剖析(六)【内存管理机制】

    六.内存管理机制 1.内存管理架构 2.小块空间的内存池 3.循环引用的垃圾收集 4.python中的垃圾收集 1.内存管理架构 Python内存管理机制有两套实现,由编译符号PYMALLOC_DEB ...

  2. Omega System Trading and Development Club内部分享策略Easylanguage源码 (第二期)

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 我们曾经在前文(链接),为大家分享我们精心整理的私货:"System Trading and ...

  3. 读python源码--对象模型

    学python的人都知道,python中一切皆是对象,如class生成的对象是对象,class本身也是对象,int是对象,str是对象,dict是对象....所以,我很好奇,python是怎样实现这些 ...

  4. VS2013编译python源码

    系统:win10 手头有个python模块,是用C写的,想编译安装就需要让python调用C编译器.直接编译发现使用的是vc9编译,不支持C99标准(两个槽点:为啥VS2008都还不支持C99?手头这 ...

  5. 三种排序算法python源码——冒泡排序、插入排序、选择排序

    最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...

  6. 《python源码剖析》笔记一——python编译

    1.python的架构: 2.python源码的组织结构: 3.windows环境下编译python:

  7. 转换器5:参考Python源码,实现Php代码转Ast并直接运行

    前两个周末写了<手写PHP转Python编译器>的词法,语法分析部分,上个周末卡文了. 访问器部分写了两次都不满意,没办法,只好停下来,参考一下Python的实现.我实现的部分正好和Pyt ...

  8. python源码书籍

    <Python源码剖析>一书现在很难买到,目前大部分都是电子书. 为了更好地利用Python语言,无论是使用Python语言本身,还是将Python与C/C++交互使用,深刻理解Pytho ...

  9. 类似py2exe软件真的能保护python源码吗

    类似py2exe软件真的能保护python源码吗 背景 最近写了个工具用于对项目中C/C++文件的字符串常量进行自动化加密处理,用python写的,工具效果不错,所以打算在公司内部推广.为了防止代码泄 ...

随机推荐

  1. Codeforces 653D Delivery Bears【二分+网络流】

    题目链接: http://codeforces.com/problemset/problem/653/D 题意: x个熊拿着相同重量的物品,从1号结点沿着路走到N号结点,结点之间有边相连,保证可以从1 ...

  2. Linux 常用但较容易忘记的命令

    看死循环 strace -p pid 查看系统版本 cat /etc/issue 设置内核启动版本 /etc/lilo.conf , /boot/grub/grub.conf 设置启动模式  /etc ...

  3. Java中Cookie常用操作类(Spring中操作Cookie)

    说明:Cookie下用Key取值没有快速的方法,只能便利循环去取. 技巧:置0则cookie会立即删除,设置-1,负值则会在关闭浏览器后删除.切记一定要增加路径:setPath("/&quo ...

  4. 【.Net 学习系列】-- Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库

    参考资料: WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx A ...

  5. 【转】AOP

    原文:http://blog.csdn.net/zhoudaxia/article/details/38502347 .---------------------------------------- ...

  6. 分享:APK高级保护方法解析(三)

    刷朋友圈.玩游戏.看新闻,智能手机正在以我们无法想象的速度飞快发展,可是随之而来的安全问题也越来越引人关注,APP二次打包.反编译.盗版的现象屡见不鲜.因此须要对APK进行加固保护. 眼下市面上常见的 ...

  7. MySQL 高可用架构在业务层面细化分析研究

    相对于传统行业的相对服务时间9x9x6或者9x12x5,由于互联网电子商务以及互联网游戏的实时性,所以服务要求7*24小时,业务架构无论是应用还是数据库,都须要容灾互备.在mysql的体系中,最好通过 ...

  8. Android调用本地WebService

    package com.example.testinvokewebservice; import org.ksoap2.SoapEnvelope; import org.ksoap2.serializ ...

  9. Trie(前缀树)和ternary trie和binary search tree

    1 什么是trie trie是一棵多叉树,假如存放的是由26个字母(不区分大小写)构成的字符串的话,那么就是一棵26叉树. trie树是一棵前缀树,因为每个结点只保存字符串中的一个字符,整个字符串保存 ...

  10. Oracle - 创建表视图等 - DDL

    解锁scott: sqlplus / as sysdba; alter user scott account unlock; alter user scott identified by tiger; ...