交易机器人-规则部分

微信公众号:大数据高性能计算

在这里插入图片描述

背景

背景是基于人工去做交易本身无法做到24小时无时无刻的交易,主要是虚拟币本身它是24小时交易,人无法做到24小时盯盘,其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行量化交易的时候,就需要自己去做一些量化机器人。这是我们做这件事的出发点

设计方案

在这里插入图片描述
大概会分为如下几个重点模块设计:

(1) K线异步线程监控,主要用于拉取各项虚拟币的交易价格波动数据,主要用于计算指标给规则或者模型使用
(2) 决策中心,根据获取的指标信息去判断是跑模型还是跑规则,跑规则的话会走规则引擎
(3) 规则本身主要是基于ANTLR定义了一套简单的规则模块语法树,支持快速定义和配置,主要存储与DB如Mysql中
(4) 消息通知,对于一些直接规则可以走自动化交易。对于一些拿捏不准的,可以走消息通知,由人工在判断需要怎么进行交易。

下面主要是写一下规则部分要怎么做。

规则模块语法树

首先我们用的是ANTLR4来做基础的语法树的。最终我们希望能做到如下的效果:

SELECT 'buy' AS action, 30% AS rate WHERE symbol = 'BTCUSDT' AND change < -2;SELECT 'buy' AS action, 40% AS rate WHERE (symbol = 'BTCUSDT' AND change < -2) 
OR (symbol = 'ETHUSDT' AND change < -8);

antlr4的安装与客户端安装

Mac 安装

我的机器是Mac M1 ARM芯片:

  • 下载 wget https://www.antlr.org/download/antlr-4.7.2-complete.jar
  • 复制jar包sudo cp antlr-4.7.2-complete.jar /usr/local/lib
  • 更新~/.bash_profile
export CLASSPATH=".:/usr/local/lib/antlr-4.7.2-complete.jar:$CLASSPATH"
alias antlr4='java -jar /usr/local/lib/antlr-4.7.2-complete.jar'
alias grun='java org.antlr.v4.gui.TestRig'
  • 更新配置文件 source ~/.bash_profile source ~/.zshrc

python 客户端安装

pip antlr4-python3-runtime==4.7.2

主要一定要填写4.7.2 因为版本要和机器安装的版本保持一致

antlr4的.g4语法文件设计

我们定义了用于解析 SQL 风格规则的 ANTLR 语法,其中包括了处理 SELECT 语句、动作(ACTION)、百分比(percentage)、以及条件表达式(whereClause、expression 和 condition)的规则。

关键部分

  • Action 和 Percentage
selectItem  : action 'AS action' | percentage 'AS rate' ;
action      : ACTION ;
percentage  : NUMBER '%' ;
ACTION      : '\''('buy' | 'sell')'\'' ;

这部分定义了选择项可以是一个动作或百分比,其中动作是 ‘buy’ 或 ‘sell’。

  • 条件表达式:
whereClause : 'WHERE' expression ;
expression  : condition (logicalOp condition)* ;
condition   : '('? identifier comparison value ')'?;
identifier  : ID ;
value       : STRING | number ;
comparison  : '=' | '<>' | '<' | '>' | '<=' | '>=' ;

这部分定义了条件表达式的结构,包括标识符、比较运算符和值。

  • 词法符号:
STRING      : '\'' [a-zA-Z0-9]+ '\'' ;
NUMBER      : '-'?[0-9]+ ;
FLOAT       : '-'?[0-9]+ '.' [0-9]+ ;
ID          : [a-zA-Z_][a-zA-Z0-9_]* ;
WS          : [ \t\r\n]+ -> skip ;

这部分定义了字符串、数字、浮点数和标识符的格式。

最终我们生成了一个完整的TradingRulesSQL.g4文件

grammar TradingRulesSQL;rules       : query+ ;
query       : selectClause whereClause ';' ;
selectClause: 'SELECT' selectItem (',' selectItem)* ;
selectItem  : action 'AS action' | percentage 'AS rate' ;
whereClause : 'WHERE' expression ;
expression  : condition (logicalOp condition)* ;
condition   : '('? identifier comparison value ')'?;
logicalOp   : 'AND' | 'OR' ;
action      : ACTION ;
percentage  : NUMBER '%' ;
identifier  : ID ;
value       : STRING | number ;
comparison  : '=' | '<>' | '<' | '>' | '<=' | '>=' ;
number      : NUMBER | FLOAT ;ACTION      : '\''('buy' | 'sell')'\'' ;
STRING      : '\'' [a-zA-Z0-9]+ '\'' ;
NUMBER      : '-'?[0-9]+ ;
FLOAT       : '-'?[0-9]+ '.' [0-9]+ ;
ID          : [a-zA-Z_][a-zA-Z0-9_]* ;WS          : [ \t\r\n]+ -> skip ;

当您使用 ANTLR 工具根据您的 .g4 语法文件生成 Python 代码时,ANTLR 会自动创建几个文件,包括一个词法分析器 (Lexer),一个语法分析器 (Parser),以及一个基础的访问器 (Visitor) 类和一个监听器 (Listener) 类。这些类的名称基于您的语法文件的名称。
我们需要使用我们的antlr4根据我们的.g4文件生成固定的几个类,命令是:

antlr4 -Dlanguage=Python3 TradingRulesSQL.g4

在这里插入图片描述

这将会生成以下文件:

TradingRulesSQLLexer.py:包含由您的语法定义的词法规则的词法分析器。
TradingRulesSQLParser.py:包含由您的语法定义的语法规则的语法分析器。
TradingRulesSQLListener.py:包含一个监听器,用于遍历解析树。
TradingRulesSQLVisitor.py:包含一个访问器,用于遍历解析树并可以被重写以实现自定义行为。

TradingRulesSQLVisitor 类是一个基础访问器类,您可以通过继承并重写它的方法来实现自定义的解析行为.

这里我们通过自定义继承该类来达到我们的自定义行为。

自定义TradingRulesSQLVisitor的行为

我们自定义了CustomTradingRulesVisitor 继承TradingRulesSQLVisitor,来实现我们自己的一些逻辑

from antlr4 import *
from TradingRulesSQLLexer import TradingRulesSQLLexer
from TradingRulesSQLParser import TradingRulesSQLParser
from TradingRulesSQLVisitor import TradingRulesSQLVisitorclass CustomTradingRulesVisitor(TradingRulesSQLVisitor):def __init__(self):self.result = {"action": None, "rate": None, "conditions": []}def visitSelectItem(self, ctx):if ctx.action():self.result["action"] = ctx.action().ACTION().getText().strip("'")elif ctx.percentage():self.result["rate"] = ctx.percentage().NUMBER().getText() + '%'return self.visitChildren(ctx)  # 确保继续遍历子节点def visitCondition(self, ctx):condition = {"identifier": ctx.identifier().getText(),"comparison": ctx.comparison().getText(),"value": ctx.value().getText() if ctx.value().STRING() else ctx.value().number().getText()}self.result["conditions"].append(condition)return self.visitChildren(ctx)  # 确保继续遍历子节点# 示例规则字符串
#rule_str = "SELECT 'buy' AS action, 30% AS rate WHERE symbol = 'BTCUSDT' AND change < -2;"
rule_str = "SELECT 'buy' AS action, 30% AS rate WHERE (symbol = 'BTCUSDT' AND change < -2) OR (symbol = 'ETHUSDT' AND change < -8);"# 解析规则
input_stream = InputStream(rule_str)
lexer = TradingRulesSQLLexer(input_stream)
stream = CommonTokenStream(lexer)
parser = TradingRulesSQLParser(stream)
tree = parser.rules()visitor = CustomTradingRulesVisitor()
visitor.visit(tree)# 输出解析结果
print(visitor.result)

至此一个最基本的语法树文件就定义出来了,后面可以围绕自己的业务需求去做一些更复杂的规则实现在里面,丰富你的语法树以及业务逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

个人博客添加访问人数以及访问时间-githubpage

layout: post # 使用的布局&#xff08;不需要改&#xff09; title: 个人博客添加访问人数以及访问时间 # 标题 subtitle: 个人博客优化 #副标题 date: 2023-11-18 # 时间 author: BY ThreeStones1029 # 作者 header-img: img/about_bg.jpg #这篇文章标题背景图片 catalog: tr…

MySQL 的执行原理(四)

5.5. MySQL 的查询重写规则 对于一些执行起来十分耗费性能的语句&#xff0c;MySQL 还是依据一些规则&#xff0c;竭尽全力的把这个很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程也可以 被称作查询重写。 5.5.1. 条件化简 我们编写的查询语句的搜索条件…

【数据结构初阶】单链表SLlist

描述 不同于顺序表&#xff0c;顺序表的数据是存储在一个连续的空间里的 而链表它是链接起来的结构体地址。 所以我们不用像顺序表一样先创建一块空间出来&#xff0c;而是创建一个能存数据节点和节点与下一个节点之间的连接&#xff1b; 所以&#xff1a;“一个能存数据节点…

redis+python 建立免费http-ip代理池;验证+留接口

前言: 效果图: 对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个! 思路: 1.单页获取ipporttime (获取time主要是为了后面使用的时候,依照时效可以做文章) 2.整…

STM32串口重定向/实现不定长数据接收

STM32串口重定向/实现不定长数据接收 重定向MicroLIB 不定长数据接收 这是一期STM32内容代码分享&#xff0c;关于STM32重定向的代码和一些出现的问题吗&#xff0c;以及串口接收不定长数据思路 重定向 重定向的功能&#xff1a;能够在STM32中使用printf函数通过串口发送数据 …

Redis:Java客户端

前言 "在当今大数据和高并发的应用场景下&#xff0c;对于数据缓存和高效访问的需求日益增长。而Redis作为一款高性能的内存数据库&#xff0c;以其快速的读写能力和丰富的数据结构成为众多应用的首选。与此同时&#xff0c;Java作为广泛应用于企业级开发的编程语言&…

el-table树形数据隐藏子选择框

0 效果 1 代码 type是table数据中用来区分一级和二级的标识 // 隐藏子合同选择框 cellNone(row) {if (row.row.type 3 || row.row.type 4) {return "checkNone";} }, <style lang"scss" scoped>::v-deep {.checkNone .el-checkbox__input {displa…

INFINI Labs 产品更新 | 发布 Easysearch Java 客户端,Console 支持 SQL 查询等功能

近年来&#xff0c;日志管理平台越来越流行。使用日志管理平台可以实时地、统一地、方便地管理和查看日志&#xff0c;挖掘日志数据价值&#xff0c;驱动运维、运营&#xff0c;提升服务管理效率。 方案架构 Beats 是轻量级采集器&#xff0c;包括 Filebeat、Metricbeat 等。E…

探索计算机视觉技术的应用前景

计算机视觉技术是人工智能领域中一项至关重要的技术&#xff0c;它通过模拟人类视觉系统的工作原理&#xff0c;使计算机能够以一种类似于人类的方式理解和解释图像和视频。这项技术不仅在学术界受到了广泛关注&#xff0c;而且在商业领域也得到了广泛应用。 计算机视觉技术的应…

SpringBoot中日志的使用log4j

SpringBoot中日志的使用log4j 项目中日志系统是必不可少的&#xff0c;目前比较流行的日志框架有 log4j、logback 等&#xff0c;这两个框架的作者是同一个 人&#xff0c;Logback 旨在作为流行的 log4j 项目的后续版本&#xff0c;从而恢复 log4j 离开的位置。 另外 slf4j(…

NI Package Manager创建程序包

NI Package Manager创建程序包 要使用PackageManager创建程序包&#xff0c;即把相关的组件都放在一个目录下&#xff0c;使用命令行创建程序包。 程序包是一个压缩文件&#xff0c;包含要安装到目标位置的所有文件。Package Manager创建的程序包扩展名为.nipkg。可以使用Pack…

【碰碰球】弹珠游戏-微信小程序项目开发流程详解

还记得小时候玩过的弹珠撞击游戏不&#xff0c;这里把它的实现原理通俗易懂地讲一下&#xff0c;看看怎样实现一个碰碰球(弹珠)小游戏&#xff0c;除了个人玩法&#xff0c;也可以双人玩哦&#xff0c;与打乒乓球一样的&#xff0c;可练习临场反应。 创建项目 打开微信开发者…