交易机器人-规则部分

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

在这里插入图片描述

背景

背景是基于人工去做交易本身无法做到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 TradingRulesSQLVisitor


class 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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二阶低通滤波器(二阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 差分方程形式 二阶巴特沃斯滤波器参数设计 设计采样频率100Hz&#xff0c;截止频率33Hz。 注意&#xff1a;设计参数使用在离散系统中&#xff01; 同理&#xff0c;其他不同阶数不同类型的滤波器设计&#xff0c;如二阶高通滤波器、二阶…

OFDM通信系统仿真之交织技术

文章目录 前言一、交织1、概念2、图形举例3、交织的位置 二、MATLAB仿真1、MATLAB 程序2、仿真结果 前言 之前的博客&#xff1a;OFDM深入学习及MATLAB仿真 中有对交织的概念进行讲解&#xff0c;但讲解还是比较浅显&#xff0c;且仿真实现时并没有加入交织及解交织流程&#…

系列十二、强引用、软引用、弱引用、虚引用分别是什么?

一、整体架构 二、强引用&#xff08;默认支持模式&#xff09; 2.1、概述 当内存不足时&#xff0c;JVM开始垃圾回收&#xff0c;对于强引用的对象&#xff0c;就算是出现了OOM也不会对该对象进行回收&#xff0c;死都不收。 强引用是我们最常见的普通对象引用&#xff0c;只…

特效!视频里的特效在哪制作——Adobe After Effects

今天&#xff0c;我们来谈谈一款在Adobe系列中推出的一款图形视频处理软件&#xff0c;适用于从事设计和视频特技的机构&#xff0c;包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室的属于层类型后期软件——Adobe After Effects。 Adobe After Effects&#xf…

苍穹外卖项目笔记(3)——员工管理

前言 这些功能都没有展示对应的测试结果&#xff0c;可自行通过接口文档进行测试&#xff0c;也可以进行前后端联调测试&#xff0c;附代码链接&#xff1a;take-out 1新增员工 1.1 需求分析和设计 产品原型 接口设计 【注】code&#xff1a;操作成功返回1&#xff0c;否则…

Azure Machine Learning - Azure AI 搜索中的集成数据分块和嵌入

在基于索引器的索引编制中&#xff0c;Azure AI _集成矢量化_将数据分块和文本到矢量嵌入添加到技能中&#xff0c;它还为查询添加文本到矢量的转换。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本…

我叫:选择排序【JAVA】

1.我是个啥子&#xff1f;&#xff1f; 选择式排序&#xff1a;属于内部排序法,从欲排序的数据中,按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的。 2.我的思想 基本思想:第一次从arr[0]~arr[n-1]中选取最小值&#xff0c;与arr[0]交换&#xff0c;第…

io多路复用:select、poll和epoll

1、为什么使用多路复用&#xff1a; 1.1单线程BIO监听socket 多路复用一般用于网络io当中&#xff0c;提到网络io我们肯定能想到socket。如果我们想要一个线程单纯的用向下文的方式监听很多个socket看他是否有事件发生&#xff0c;那这样是不可行。 但上一个socket1没有可读事…

哪个电脑录屏软件好用又免费?十大好用的免费录屏软件排行

屏幕录制软件是一个非常有用的辅助工具&#xff0c;可以帮助您录制屏幕上的所有内容&#xff0c;并根据需要将其转换为视频。 此外&#xff0c;免费的屏幕录像机可以为您节省大量不必要的费用。在这篇文章中&#xff0c;我将列出我在工作和学习中最有效使用的 10 个软件。 每…

OSG加载模型时显示读取进度

目录 1. 前言 2. 开发环境说明 3. 功能实现 3.1. 方法1 3.2. 方法2 3.3. 方法3 4. 附加说明 1. 前言 OSG中加载模型文件到视景器&#xff0c;一般通过osgDB::readXXXX系列开头的函数来加载模型&#xff0c;如&#xff1a;osgDB::readNodeFile、osgDB::readImageFile、os…

Pytest自动化测试框架:mark用法---测试用例分组执行

pytest中的mark&#xff1a; mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记名)&#xff0c;实现测试分组功能&#xff0c;并能和其它插件配合设置测试方法执行顺序等。 如下图&#xff0c;现在需要只执行红色部分的测试方法&#xff0c;其它方法不执行&am…

【精选】项目管理工具——Maven详解

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程&#xff0c;管理jar包&#xff0c;编译代码&#xff0c;完成测试&#xff0c;项目打包等等。 Maven工具是基于POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;实现的。在Maven的管理下…

【React】React 基础

1. 搭建环境 npx create-react-app react-basic-demo2. 基本使用 JSX 中使用 {} 识别 JavaScript 中的表达式&#xff0c;比如变量、函数调用、方法调用等。 if、switch、变量声明等属于语句&#xff0c;不是表达式。 列表渲染使用 map 。 事件绑定用&#xff1b;on 事件名称…

公寓水电管理系统

springbootmybatisthymeleaf 这次练习是尝试将layer与系统结合起来&#xff0c;将新增、修改、删除都和弹窗结合起来。 一、需求分析 二、数据库 三、模块 1、登录页面 哈哈哈&#xff0c;之前做的登录页面都好丑&#xff0c;这是目前做的最好看的一次了。 超级管理员&…

Java 教育局民办教育信息服务与监管平台

1) 项目背景 按照《中华人民共和国民办教育促进法》和《中华人民共和国政府信息公开条例》的相关规定&#xff0c;为满足学生和家长、社会各界获取权威信息的需求&#xff0c;着力解决服务老百姓最后一公里问题&#xff0c;达到宣传民办教育和引导家长择校的效果&#xff0…

Java实现图书管理系统

今天与大家分享的是一个图书管理系统&#xff0c;这里我们运用的是java基础的语法其中包括类和对象、继承、封装、多态、抽象类、接口还有数组等。 我们需要实现一个可以进行管理员操作和用户操作的图书管理系统&#xff0c;其中包括了管理员操作(查找&#xff0c;添加&#x…

SpringBoot中日志的使用log4j

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

定点整数、小数

文章目录 一、定点整数二、定点小数三、定点小数的加/减运算 一、定点整数 二、定点小数 三、定点小数的加/减运算 对两个定点小数A、B进行加法/减法时&#xff0c;需要先转换为补码 计算机硬件如何做定点小数补码的加法&#xff1a;从最低位开始&#xff0c;按位相加&#x…

栈与队列:设计循环队列

目录 题目&#x1f525;&#xff1a; 数据模型&#xff1a; 本题大意&#xff1a; 思路分析&#xff1a; 代码分析&#xff1a; 一、定义队列 二、初始化、判断队列的空和满⭐ 初始化&#xff1a; 空满的判断&#xff1a; 三、入队和出队&#x1f387; 入队&…

Vue中实现div的任意移动

前言 在系统应用中&#xff0c;像图片&#xff0c;流程预览及打印预览等情况&#xff0c;当前视窗无法全部显示要预览的全部内容&#xff0c;设置左右和上下滚动条后&#xff0c;如果用鼠标拖动滚动条&#xff0c;又不太便利&#xff0c;如何用鼠标随意的移动呢&#xff1f; …