BotVS数字货币现货交易类库
以下是BotVS数字货币现货交易类库模板,使用Python2语言实现
import types # 导入类型模块 import time # 导入时间模块 import platform # 版本信息 versionMainValue = None isFirstCheck = True# 判断数据类型 def typeOfstr(str):if str == "list":if versionMainValue == 2:return types.ListTypeelif versionMainValue == 3:return listelif str == "int":if versionMainValue == 2:return types.IntTypeelif versionMainValue == 3:return intelif str == "float":if versionMainValue == 2:return types.FloatTypeelif versionMainValue == 3:return floatelse:Log("error , typeOfstr used false")# 检测当前系统Python版本 def CheckVersion():global versionMainValue,isFirstCheckplatformInfo = platform.python_version()if platformInfo[0] == '2':Log("您使用的托管者 python编译环境的python版本是",platformInfo)versionMainValue = 2elif platformInfo[0] == '3':Log("您使用的托管者 python编译环境的python版本是",platformInfo)versionMainValue = 3else:Log("其它版本")isFirstCheck = False# 取消所有未完成挂单,orderType指定要买单还是卖单,或者都包括 def CancelPendingOrders(e, orderType = "") :while True:orders = e.GetOrders() #获取所有未成交的挂单LogStatus("orders:",orders,time.time()) if(type(orders) != typeOfstr("list")): #异常处理: orders 类型不为list,表示获取数据出错。 Sleep(RetryDelay)continueprocessed = 0 # 计数器,统计有多少个挂单for j in range(len(orders)): # 循环处理挂单,此处可以优化循环使用 for order in orders:if (type(orderType) == typeOfstr("int") and orders[j].Type != orderType): #不是指定的订单类型不处理continuee.CancelOrder(orders[j].Id,orders[j]) #取消指定订单processed += 1 #计数器加1if (j < (len(orders) - 1)): #每处理一次,休息一下 Sleep(RetryDelay)if(processed == 0):break# 获取账号信息 waitFrozen 是否等待冻结 def GetAccount(e, waitFrozen = False):account = nullalreadyAlert = False #用于标记是否已提醒过while True:account = _C(e.GetAccount) #调用API 获取当前账户信息if(not waitFrozen or (account.FrozenStocks < e.GetMinStock() and account.FrozenBalance < 0.01)):#不等待冻结或冻结数量小于最小交易量,直接中断循环breakif(not alreadyAlert): #否则,并在没有提醒过时,则返回冻结信息alreadyAlert = TrueLog("发现账户有冻结的钱或币",account)Sleep(RetryDelay) #[JS原注释]注意 : 如果有冻结的钱 或者 币 有可能一直卡在此处。return account# 取消 除参数指定的orderId 以外 的所有未成交的挂单。 def StripOrders(e,orderId = null):order = nullwhile True:dropped = 0 # 统计取消订单数orders = _C(e.GetOrders) # 获取所有订单for i in range(len(orders)):if(orders[i].Id == orderId): #指定订单不处理order = orders[i]else: #其他订单都处理extra = ""if(orders[i].DealAmount > 0): #已经成交量extra = "成交:" + str(orders[i].DealAmount)else:extra = "未成交"e.CancelOrder(orders[i].Id, "买单" if orders[i].Type == ORDER_TYPE_BUY else "卖单",extra)dropped += 1if(dropped == 0):breakSleep(RetryDelay)return order# 交易函数,e:交易所对象, tradeType:交易类型 , tradeAmount:交易数量, mode:模式, slidePrice:滑价, maxAmount:单次最大交易量, maxSpace: 最大挂单距离, retryDelay: 重试时间。 # mode = 0 : direct buy吃单, 1 : buy as buy1 挂单 def Trade(e, tradeType, tradeAmount, mode, slidePrice, maxAmount, maxSpace, retryDelay):initAccount = GetAccount(e,True) # 初始时 获取账户信息。nowAccount = initAccount # 用于保存当前账户信息的变量,初始化为 initAccountorderId = null # 声明一个用于保存 订单ID 的变量prePrice = 0.0 # 上一次的价格dealAmount = 0.0 # 已经处理过的(成交过的) 交易数量diffMoney = 0.0 # 账户 钱之差isFirst = True # 是否是 第一次的循环的 标记tradeFunc = e.Buy if tradeType == ORDER_TYPE_BUY else e.Sell # 根据参数 tradeType 确定 调用API Buy 还是 Sell 。让 tradeFunc 引用相应的API接口。 isBuy = (tradeType == ORDER_TYPE_BUY) # 是否是 Buy的标记, 用 tradeFunc == ORDER_TYPEBUY 表达式的布尔值 初始化。while True:ticker = _C(e.GetTicker) # 获取当前行情数据 _C 重试函数tradePrice = 0.0 # 初始交易价格 0if(isBuy): # 如果是 买入操作 # 吃单或 挂单 价,再加滑价,来成交, (ticker.Buy + slidePrice) 为买一价+滑价,可能达不到卖1价,所以算挂单,但比挂1 高出一点,可能优先成交tradePrice = _N((ticker.Sell if mode == 0 else ticker.Buy) + slidePrice,4) else:tradePrice = _N((ticker.Buy if mode == 0 else ticker.Sell) - slidePrice,4)if(not orderId):if(isFirst):isFirst = Falseelse:nowAccount = GetAccount(e,True)doAmount = 0.0;if(isBuy): # 如果是 买入操作 diffMoney = _N(initAccount.Balance - nowAccount.Balance,4) # 每次记录 ,用于最后计算 成交均价dealAmount = _N(nowAccount.Stocks - initAccount.Stocks,4) # 实际已经 处理完成的量(成交)doAmount = min(maxAmount,tradeAmount - dealAmount,_N((nowAccount.Balance - 10) / tradePrice,4)) # 根据几个待选 值取最小的。else: # 处理 卖出的操作diffMoney = _N(nowAccount.Balance - initAccount.Balance,4)dealAmount = _N(initAccount.Stocks - nowAccount.Stocks,4)doAmount = min(maxAmount,tradeAmount - dealAmount,nowAccount.Stocks)if(doAmount < e.GetMinStock()): #要处理的量 小于 平台的最小成交量 ,即为交易完成,跳出循环breakprePrice = tradePrice # 把本次循环计算出来的 交易价格 缓存到 prePrice 变量orderId = tradeFunc(tradePrice, doAmount, ticker) # 下单 ,附带输出 ticker 数据if(not orderId): # 如果 orderId 为 null ,取消所有挂单 CancelPendingOrders(e,tradeType)else: # orderId 存在了if(mode == 0 or (abs(tradePrice - prePrice) > maxSpace)): # 如果是挂单模式,超出挂单最大失效距离, 则把orderId赋值 为 null 。orderId = nullorder = StripOrders(e,orderId) # 取消 除orderId 以外的所有挂单,并返回 orderId 的 order信息if(not order):orderId = nullSleep(retryDelay)#处理量 小于等于 0 , 即 无法操作, 交易失败,返回 null if(dealAmount <= 0):Log("交易失败--TradeType:","buy" if tradeType == ORDER_TYPE_BUY else "sell"," ,diffMoney:",diffMoney," ,dealAmount",dealAmount," ,doAmount",doAmount)return null# 返回 成功的交易信息, 成交均价、 成交数量。ret = {'price': _N(diffMoney/dealAmount,4),'amount':dealAmount}return ret# 导出函数 处理买入操作 def _Buy(e = exchange,amount = 0):if isFirstCheck:CheckVersion()if (type(e) == typeOfstr("int") or type(e) == typeOfstr("float")):amount = ee = exchangereturn Trade(e,ORDER_TYPE_BUY,amount,OpMode,SlidePrice,MaxAmount,MaxSpace,RetryDelay)# 导出函数 处理卖出操作 def _Sell(e = exchange,amount = 0):if isFirstCheck:CheckVersion()if (type(e) == typeOfstr("int") or type(e) == typeOfstr("float")):amount = ee = exchangereturn Trade(e,ORDER_TYPE_SELL,amount,OpMode,SlidePrice,MaxAmount,MaxSpace,RetryDelay)# 导出函数 用于 取消所有未完成 挂单 def _CancelPendingOrders(e = exchange,orderType = ""):if isFirstCheck:CheckVersion()return CancelPendingOrders(e,orderType)# 用于 获取当前账户信息 区别于 GetAccount(e, waitFrozen) def _GetAccount(e = exchange):if isFirstCheck:CheckVersion()return _C(e.GetAccount)_MACalcMethod = [TA.EMA,TA.MA][MAType] #均线指标设置 Interval = 200 # 均线交叉 函数,用于 判断 均线交叉 返回上穿的周期数. 正数为上穿周数, 负数表示下穿的周数, 0指当前价格一样 def Cross(a,b): if isFirstCheck:CheckVersion()crossNum = 0 # 交叉周期计数arr1 = [] # 声明数组 arr1 用来 接收 指标数据 (数组结构)arr2 = [] # 判断 参数 传入的是 周期数 还是 计算好的 指标数据(数组)if type(a) == typeOfstr("list") and type(b) == typeOfstr("list"): # 如果是 数组 就把 a 参数(即指标数组)赋值给 arr1 arr1 = aarr2 = belse: # 如果传入的 a,b 不是 数组 ,是 周期数 执行一下。records = null while True:records = exchange.GetRecords() # 调用 GetRecords 获取K线数据if records and len(records) > a and len(records) > b: #判断 如果 records 获取到数据 并且 records K线数据 的 bar 个数(即 records 这个数组的长度) 大于 参数 周期数 a ,b ,代表符合计算指标的要求。(bar 个数不够 是计算不出指标数据的)breakSleep(Interval)arr1 = _MACalcMethod(records,a) # 根据界面参数 MAType 的设置 引用 指标的函数名,在这里 传入K线数据,指标参数 周期数a , 去计算 指标数据,指标数据返回给 arr1 arr2 = _MACalcMethod(records,b) # MAType 是一个索引 ,根据 你界面上的设置 设置为相应的 索引 0 ~ n 自上而下, 这个索引 又确定了 [TA.EMA, TA.MA, talib.KAMA] 这个数组种 哪个 函数引用 赋值给 _MACalcMethod ,从而确定调用哪种 指标计算函数。if len(arr1) != len(arr2): # 相同K线 计算出的 指标数据 长度 应当是一样的,不一样则异常raise Exception("array length not equal")for i in range(len(arr1) - 1,-1,-1): # 从指标数据 数组 自后向前 遍历数组# 读取到任何 指标数据不为数值类型的时候就跳出,即 指标数据 由于计算周期不同,有数据 为null 了,无法比较 ,所以 只用 arr1 arr2 都是有效值的数据。if (type(arr1[i]) != typeOfstr("int") and type(arr1[i]) != typeOfstr("float")) or (type(arr2[i]) != typeOfstr("int") and type(arr2[i]) != typeOfstr("float")):break# 此处 比较难以理解,由于crossNum 初始为0 , 不会触发一下 if 内的代码, arr1[i] 、arr2[i] 比较是 自后向前比较的, 即从离当前时间最近的 bar 的指标开始对比的, arr1[i] < arr2[i] 快线小于慢线,所以 在初始 crossNum 为0 的时候 ,快线小于慢线的 周期数 会持续记录在crossNum中, 直到 出现 arr1[i] > arr2[i] 的时候,此刻即 快线 慢线相交(这个时候break, crossNum 就是交叉后的周期数,最直观的就是 自己 模拟2组快慢线 数据数组,带入此处函数 根据逻辑 走一遍就明白了。)if arr1[i] < arr2[i] :if crossNum > 0 :breakcrossNum -= 1elif arr1[i] > arr2[i] :if crossNum < 0 :breakcrossNum += 1else:breakreturn crossNum# 导出函数 ext.Buy = _Buy ext.Sell = _Sell ext.CancelPendingOrders = _CancelPendingOrders ext.GetAccount = _GetAccount ext.Cross = Cross# 测试 def main():ret = ext.Buy(0.2)exchange.Sell(4500,1)Sleep(10 * 1000)ext.CancelPendingOrders()Log("ret:",ret)avgprice = ret['price']dealamount = ret['amount']Log("avgprice:",avgprice," dealamount:",dealamount)
模板参数
转载于:https://www.cnblogs.com/fangbei/p/botvs-digiccy-spot-classlib.html
BotVS数字货币现货交易类库相关推荐
- A股明日风口:央行工作会议要求推进法定数字货币研发
8月3日消息,行业利好密集出台,有8大板块有望成为A股明日风口. 1.央行:积极稳妥推进法定数字货币研发 8月3日,人民银行召开2020年下半年工作电视会议.会议要求,精心组织起草"十四五& ...
- 从2020全球前十的数字货币交易所甄别风险
如今,谈到FCoin,你的印象是什么?割韭菜.黑心交易所.朝令夕改.庄家操盘.跑路--这些关键词,是数位参与过FCoin交易所交易的"韭菜们"如今对这家交易所所有的回忆.只是FCo ...
- 互联网金融基础知识--数字货币
写在前面:认知创造价值 数字货币: 数字货币和股票的区别: [工作日]:股票在工作日工作时间才可交易,数字货币无任何限制 [交易时间]:股票当日买入不允许当日卖出最快第二天即T+1(如卖完跌了,今天也 ...
- 中国央行数字货币DCEP的七大猜想!
据中国媒体近日援引外媒报道,欧央行执行董事会成员克雷(Benot Curé)表示,欧央行正在研究是否要发展一种数字货币来代替现金,他并警告欧洲正在全球支付市场上落后于美国和亚洲地区. 而在近日,中国人 ...
- mysql 数字区间_币投君0904丨数字货币暴跌原因何在
昨日数字货币再次集体闪崩,btc甚至刺穿10000大关,合约帝数据显示,过去 24 小时全网爆仓超过 10 亿美元,共有 6.7 万人成为爆仓受害者.究其原因主要有两个方面:一方面是昨晚美股暴跌,三大 ...
- 2020年全球十大突破性技术公布:数字货币等在列
今天,<麻省理工科技评论>一年一度的"十大突破性技术"(TR10)榜单如期而至. 自 2001 年起,<麻省理工科技评论>每年都会评选出当年的"十 ...
- 区块链技术产生数字货币时代
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 比特币是一种革命性的数字货币,更是一种颠覆性的创新技术.比特币最大的贡献是创造了信用,解决了困扰互联网进一步发展的拜占庭 ...
- 区块链概况:从数字货币说起
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 从数字货币说起 货币是人类文明发展过程中的一大发明,最重要的职能包括价值尺度.流通手段.贮藏手段.很难想象离开了货币,现 ...
- 数字货币EOS半年时间暴跌90%多,还可追捧吗?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 对财富上的自由,很多人认为这比感情来得容易多了.但是面对这个竞争激烈的社会,是兢兢业业的工作,还是投资房地产.投资股票, ...
- 李彦宏:从没觉得百度模仿谷歌;马化腾:做ICO数字货币有很多风险
整理 | 阿司匹林 1.李彦宏:从没觉得百度模仿谷歌,中国更易接受新技术 在过去百度被称为谷歌的模仿者,而在去年年底李彦宏登上<时代周刊>封面时,获得了"中国创新者"的 ...
最新文章
- 青龙羊毛——顺丰科勒(搬运)
- 作者:姚登举(1980-),男,哈尔滨理工大学副教授。
- C语言-数据结构-可变长顺序表的删除操作
- TensorFlow 教程 --教程--2.1 综述
- 编写程序,输入一个N,返回角谷变换(达到1所需)的次数
- 阿里云服务器如何扩容云盘?
- mysql 下载教程_MySQL下载安装详情图文教程
- a标签创建超链接,利用a标签创建锚点
- 软考高级 真题 2017年上半年 信息系统项目管理师 论文
- 如何清理浏览器缓存快捷键
- 直接创建和使用struct函数
- PS--给图片加水印技巧
- 无线路由器服务器连接线,无线路由器连接有线路由器怎么设置?
- Halcon之Variation Model
- opencv中求矩阵均值和标准差函数
- [Java] Receipt 简易超市小票
- 数据智仓功能介绍(一)
- cnpm和npm使用,遇到的问题及解决方法
- 防止刷新或后退页面重复提交表单
- 【Spring MVC】mvc详解
热门文章
- 基于Pairwise排序学习的因子分解推荐算法
- springmvc框架使用拦截器实现301永久重定向,其实用过滤器应该是更好
- 主席树 || 可持久化线段树 || BZOJ 3653: 谈笑风生 || Luogu P3899 [湖南集训]谈笑风生...
- 1042 cant get hostname for your address
- 【UVA12169】不爽的裁判
- [转]VC2005中实现窗口淡入淡出
- C# 连接sql 2005
- 安装篇——nginx安装ssl模块转发https请求
- mssql 设置自增字段的起始值
- [ POI 2005 ] Bank Notes