相对活力指数指标(RVI)指标模拟量化交易(第二版)

经过一段时间的测试,在第一版代码的基础上做了不少修改

    第一版代码:

相对活力指数指标(RVI)指标ETH模拟量化交易https://mp.csdn.net/mp_blog/creation/editor/120299311icon-default.png?t=M85Bhttps://mp.csdn.net/mp_blog/creation/editor/120299311

与第一版代码相比,修改内容如下:

指标个数的判断;买卖方法的调用;K线数据的请求

具体修改后的代码如下:

​
from huobi.client.generic import *
from huobi.client.market import *
from huobi.constant.definition import *
from huobi.client.account import *
from huobi.client.trade import *
from huobi.client.market import *
import pandas as pd
import datetime as dt
import time
import talib as ta
import backtrader as bt
import numpy as np
import mathclass RVI(bt.Indicator):lines = ('std','pos','neg','rvi')plotlines = dict(std=dict(_plotskip=True),pos=dict(_plotskip=True),neg=dict(_plotskip=True),rvi=dict(_plotskip=False))params = (('period', 20),)def __init__(self):self.lines.std = bt.talib.STDDEV(self.datas[0].close, timeperiod=8, nbdev=2.0)def next(self):if  self.lines.std[0] > self.lines.std[-1]:self.lines.pos[0] = self.lines.std[0]else:self.lines.pos[0] = 0if self.lines.std[0] < self.lines.std[-1]:self.lines.neg[0] = self.lines.std[0]else:self.lines.neg[0] = 0pos_nan = np.nan_to_num(self.lines.pos.get(size=self.params.period))neg_nan = np.nan_to_num(self.lines.neg.get(size=self.params.period))Usum = math.fsum(pos_nan)Dsum = math.fsum(neg_nan)if (Usum + Dsum) == 0:self.lines.rvi[0] = 0returnself.lines.rvi[0] = 100 * Usum / (Usum+Dsum)class read_csv():def __init__(self):# time(时间),currency(币种),balance(余额),type(类型),symbol(交易对),amount(交易量),price(交易价格),order-id(订单ID)self.list_new = []#交易日期及时间now_time = dt.datetime.now().strftime('%F %T')self.list_new.append(now_time)def readcsv(self):self.date = pd.read_csv('交易模拟测试.csv',encoding='utf-8')try :# 取最后一行symbol数据date_old = self.date.iloc[-1,:]logger.info('取最后一行symbol数据')symbol_old = date_old['symbol']if date_old['symbol'] != 'usdt' :symbol_old = symbol_old.replace('usdt', '')amount_new = date_old['amount'] * 0.9965self.list_new.append(symbol_old)self.list_new.append(amount_new)except IndexError as err:spot = 1547906account_client = AccountClient(api_key=g_api_key, secret_key=g_secret_key)balance_list = account_client.get_balance(spot)# 账户中交易币种信息及余额c_list = ['usdt', 'eth3s', 'eth3l']c_list_1 = []for i in balance_list:currency = i.__dict__if currency['currency'] in c_list:c_list_1.append(currency)date_1 = pd.DataFrame(c_list_1)date_1['balance'] = date_1['balance'].astype('float')trade_1 = date_1.loc[(date_1['type'] == 'trade') & (date_1['balance'] > 0.01)]trade_1.reset_index(drop=True, inplace=True)self.list_new.append(trade_1['currency'][0])self.list_new.append(trade_1['balance'][0])return self.list_new, self.dateclass huobi_Strategy(bt.Strategy):def __init__(self):self.rvi = RVI()def amount_result(self,num):# 取小数点后四位self.num = numnum_x, num_y = str(self.num).split('.')self.num = float(num_x + '.' + num_y[0:4])return self.numdef market_data(self):# 取得最新价格market_client = MarketClient(api_key=g_api_key, secret_key=g_secret_key)market_trade = market_client.get_market_trade('eth3lusdt')for i in market_trade:market_trade_1 = i.__dict__# order_min = round(5.5 / market_trade_1['price'], 4)  # 最小订单数量为 5/价格self.price_1 = market_trade_1['price']return self.price_1def huobi_buy(self):if self.list_new[1] == 'usdt' :price_1 = huobi_Strategy.market_data(self)amount_1 = huobi_Strategy.amount_result(self,self.list_new[2] * price_1)self.list_new.append('buy')self.list_new.append('eth3l')self.list_new.append(amount_1)self.list_new.append(price_1)self.list_new.append('id')f = pd.DataFrame(self.list_new).Tf.columns = self.columnsdate = pd.concat([self.date,f])date.to_csv('交易模拟测试.csv',encoding='utf-8',index=False)def huobi_sell(self):if self.list_new[1] == 'eth3l' :price_1 = huobi_Strategy.market_data(self)amount_1 = huobi_Strategy.amount_result(self,self.list_new[2] / price_1)self.list_new.append('sell')self.list_new.append('usdt')self.list_new.append(amount_1)self.list_new.append(price_1)self.list_new.append('id')# csv最后增加一行f = pd.DataFrame(self.list_new).Tf.columns = self.columnsdate = pd.concat([self.date, f])date.to_csv('交易模拟测试.csv', encoding='utf-8', index=False)def next(self):up = 80down = 20self.order = 'keep'if self.rvi.rvi[-1] > up:if self.rvi.rvi[-2] < up and self.rvi.rvi[-3] < up:self.order = 'buy'elif self.rvi.rvi[-1] < down:if self.rvi.rvi[-2] > down and self.rvi.rvi[-3] > down:self.order = 'sell'returndef stop(self):if self.order == 'buy':self.list_new, self.date = read_csv().readcsv()huobi_Strategy.huobi_buy(self)elif self.order == 'sell':self.list_new, self.date = read_csv().readcsv()huobi_Strategy.huobi_sell(self)def get_data():# 取当前及30min前的烛台数据market_client = MarketClient()data_ethusdt = market_client.get_candlestick('ethusdt', CandlestickInterval.MIN5, 100)id_1 = []high_1 = []low_1 = []open_1 = []close_1 = []vol_1 = []for i in range(len(data_ethusdt) - 1, -1, -1):id_1 = data_ethusdt[i].idhigh_1.append(data_ethusdt[i].high)low_1.append(data_ethusdt[i].low)open_1.append(data_ethusdt[i].open)close_1.append(data_ethusdt[i].close)# amount = data_ethusdt[i].amount# count = data_ethusdt[i].countvol_1.append(data_ethusdt[i].vol)datas = pd.DataFrame({'datetime': id_1, 'open': open_1,'high': high_1, 'low': low_1,'close': close_1, 'volume': vol_1})datas['datetime'] = pd.to_datetime(datas['datetime'], unit='s')datas.set_index('datetime', drop=True, append=False)return datas'''
程序结束
'''
# 程序执行:
if __name__ == '__main__':while True :time_start = time.perf_counter()logger.info('-'*5 + 'start' + '-'*5)# 策略加载df = get_data()cerebro = bt.Cerebro()data = bt.feeds.PandasData(dataname=df,datetime='datetime',open='open',high='high',low='low',close='close',volume='volume',openinterest=-1)cerebro.adddata(data)cerebro.addstrategy(huobi_Strategy)result = cerebro.run()# 统计运行时间time_used = time.perf_counter() - time_starttime.sleep(300)​

有兴趣的朋友可以相互讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/255920.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMq学习笔记

RabbitMq学习笔记 1.消息队列1.1 MQ相关概念1.1.1 什么是MQ&#xff1f;1.1.2 为什么要用MQ&#xff1f;1.2.3 MQ的分类1.2.4 MQ的选择1.2.5 为什么选择RabbitMQ&#xff1f; 1.2.5 MQ对比分析图在这里插入图片描述1.2 RabbitMQ1.2.1. RabbitMQ 的概念1.2.2. 四大核心概念1.2.3…

rabbitMQ-学习笔记

RabbitMQ 一、MQ的相关概念1.1 什么是MQ1.2 为什么要用MQ1.3 MQ的分类1.3.1 ActiveMQ1.3.2 Kafka1.3.3 RocketMQ1.3.4 RabbitMQ 二、RabbitMQ2.1 RabbitMQ的概念2.2 四大核心概念2.3 RabbitMQ核心部分2.4 RabbitMQ工作原理安装java环境2.5 Hello World生产者代码消费者代码 2.6…

Rabbitmq学习笔记教程-尚硅谷

Rabbitmq学习笔记 &#xff08;尚硅谷&#xff09; 尚硅谷 rabbitmq 教程 1.MQ 的概念 1.1 什么是 MQ? 存放消息的队列&#xff0c;互联网架构中常见的一种服务与服务之间通信的方式。 1.2 为什么要用 MQ? 三大好处&#xff0c;削峰&#xff0c;解耦&#xff0c;异步。…

RabbitMQ入门指南:初学者也能读懂的教程

文章目录 1、消息队列1.1、MQ的相关概念1.1.1、什么是MQ1.1.2、为什么要使用MQ流量削峰应用解耦异步处理 1.1.3、MQ的分类ActiveMQKafKaRocketMQRabbitMQ 1.1.4、MQ的选择 1.2、RabbitMQ1.2.1、RabbitMQ 的概念1.2.2、四大核心概念1.2.3、RabbitMQ核心部分1.2.4、各个名词介绍1…

整理面试题

一、基础篇 Java 基础 1.面向对象的特征 可以说是三大特征&#xff0c;也可以说是四大特征 ①第一个是抽象&#xff1a;就是把有共同特征的一类事物&#xff0c;构造成类&#xff0c;只关注它的属性和行为&#xff0c;而不关注这些行为的细节 ②第二个是封装&#xff1a;就…

Rabbitmq笔记

rabbitmq概述 定义&#xff1a;RabbitMQ 即一个消息队列&#xff0c;主要是用来实现应用程序的异步和解耦&#xff0c;同时也能起到消息缓冲&#xff0c;消息分发的作用。 作用&#xff1a; 流量消峰应用解耦异步处理&#xff08;不同服务之间的响应时间不同&#xff0c;导致…

java mysql数据库回退_数据库事务及Java中的处理

事 务是指一组相互依赖的操作行为&#xff0c;举一个举得不能再被举的例子就是银行交易&#xff0c;当然还有其他像网上购物&#xff0c;电子货币交易等等&#xff0c;事务的成功取决于这些相互依赖的操 作行为是否都能执行成功&#xff0c;只要有一个操作行为失败&#xff0c;…

JPA 2.0 中的动态类型安全查询(如何通过 Criteria API 构建动态查询并减少运行时失败)...

简介&#xff1a; 如果编译器能够对查询执行语法正确性检查&#xff0c;那么对于 Java 对象而言该查询就是类型安全的。Java™Persistence API (JPA) 的 2.0 版本引入了 Criteria API&#xff0c;这个 API 首次将类型安全查询引入到 Java 应用程序中&#xff0c;并为在运行时动…

QB无缘无故丢失!

24号用财付通支付冲的13个QB&#xff0c;冲好后查帐户有QB&#xff08;都没出现错误&#xff09;&#xff0c;过一天查帐户QB不翼而飞&#xff0c;&#xff01;期间并没有买过什么东西&#xff0c;也不知道怎么查QB的交易详细记录&#xff0c; 感觉没有冲上&#xff0c;由于支…

详解JPA 2.0动态查询机制:Criteria API(2)

详解JPA 2.0动态查询机制:Criteria API(2) 2009-11-13 09:24 Pinaki Poddar IBMDW 字号&#xff1a; T | T JPA 2.0引入了 Criteria API&#xff0c;这个 API 首次将类型安全查询引入到 Java 应用程序中&#xff0c;并为在运行时动态地构造查询提供一种机制。本文介绍如何使用…

PA 2.0 中的动态类型安全查询

JPA 2.0 中的动态类型安全查询 如何通过 Criteria API 构建动态查询并减少运行时失败 如果编译器能够对查询执行语法正确性检查&#xff0c;那么对于 Java 对象而言该查询就是类型安全的。Java™Persistence API (JPA) 的 2.0 版本引入了 Criteria API&#xff0c;这个 API 首次…

JPA 2.0 中的动态类型安全查询

如何通过 Criteria API 构建动态查询并减少运行时失败 如果编译器能够对查询执行语法正确性检查&#xff0c;那么对于 Java 对象而言该查询就是类型安全的。Java™Persistence API (JPA) 的 2.0 版本引入了 Criteria API&#xff0c;这个 API 首次将类型安全查询引入到 Java 应…

详解JPA 2.0动态查询机制:Criteria API

转载自详解JPA 2.0动态查询机制:Criteria API-51CTO。若有侵权&#xff0c;请留言删除。 自从 JPA 于 2006 年首次被引入之后&#xff0c;它就得到了 Java 开发社区的广泛支持。该规范的下一个主要更新 —— 2.0 版本 (JSR 317) —— 将在 2009 年年底完成。JPA 2.0 引入的关键…

基于C语言的平衡二叉树操作(包含完整代码)

平衡二叉树的定义: 为避免树的高度增长过快&#xff0c;降低二叉排序树的性能&#xff0c;规定在插入和删除二叉树结点时&#xff0c;要保证任意结点的左、右子树高度差的绝对值不超过1&#xff0c;将这样的二义树称为平衡二叉树AVL (Balanced Binary Tree),简称平衡树。 平衡…

chatgpt赋能python:如何在Python中撤回输错的指令?

如何在Python中撤回输错的指令&#xff1f; 作为一名有10年Python编程经验的工程师&#xff0c;我们时常会遇到输错指令的情况。在Python中输错指令常常是不可避免的&#xff0c;特别是当你快速编写代码时。然而&#xff0c;如果你不知道如何撤回这些错误的指令&#xff0c;这…

手机备份到底备份什么

手机备份到底备份什么 文章目录 手机备份到底备份什么起因准备如何快速备份开始备份文件备份聊天记录备份图片备份软件备份 往期回顾 最后&#xff0c;点个关注不迷路 手机太卡了&#xff0c;换不起手机&#xff0c;所以就备份一下&#xff0c;刷一下 起因 手机开始卡了&#x…

华为云服务的使用方法详解--以照片备份与恢复为例

既然iPhone有iCloud&#xff0c;小米有小米云服务&#xff0c;华为当然也有自己的华为云服务。但是有些花粉可能还不知道华为云服务到底要怎么使用&#xff0c;今天小编就以照片的备份与恢复为例&#xff0c;跟大家说说华为云备份的使用方式。 一、什么是华为云备份 简单来说…

华为手机[助手]备份的db通讯录文件如何恢复到其他手机

华为手机[助手]备份的db通讯录文件如何恢复到其他手机 如果你是属于下面的情况分析需要的文件第一步最后一步结束 如果你是属于下面的情况 1.如果你使用华为手机并且用华为手机助手备份了&#xff0c;但是你想把文件恢复到其他手机上&#xff08;其他品牌的安卓手机或者苹果手…

chatgpt赋能python:Python中的按位取反

Python中的按位取反 Python中的按位取反是一种常见的操作&#xff0c;它可以让我们快速地对二进制的数字进行取反操作。在本文中&#xff0c;我们将介绍Python中的按位取反操作&#xff0c;并探讨它的用途和示例。 什么是按位取反 按位取反是一种将二进制数中的每一位进行反…

【Android取证篇】华为手机OTG备份密码重置教程

【Android取证篇】华为手机OTG备份密码重置教程 ​ 提取华为设备遇到OTG备份出来的数据信息软件无法正常解析时&#xff0c;排除数据提取不完整、软件设备等问题&#xff0c;可考虑重置华为的备份密码&#xff0c;重新备份数据再分析—【suy】 文章目录 【Android取证篇】华为…