当前位置: 首页 > news >正文

Backtrader 文档学习- Broker - Cheat-On-Open

Backtrader 文档学习- Broker - Cheat-On-Open

1.概述

V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说,这似乎是一个必需的功能,用bar的收盘价后进行计算,希望与开盘价相匹配。
当开盘价差距(上涨或下跌,取决于买入或卖出是否有效)以及现金不足,进行全仓操作时,这种情况下就会失败。迫使broker 退回操作。
尽管人们可以尝试用积极正向的指数方法来预测未来,需要预先加载数据,而数据并不总是可用的。

使用模式:

cerebro = bt.Cerebro(cheat_on_open=True)

  • 在系统中激活一个额外的循环,该循环调用策略中的方法next_open、nextstart_open和prenext_open。
    需要增加一组新的定价方法,明确区分常规定价方法和cheat定价方法,常规定价方法是在被检查价格不再可用且未来不可知的情况下运作的。
    这也避免了对常规next方法进行2次调用。
    当在xxx_open方法内部时,以下内容是正确的:
  • 指标尚未重新计算,并保留了在等效的xxx常规方法中上次循环中得到的值。
  • broker尚未评估新循环的挂单,可以引入新订单,如果可能将对其进行评估。
    请注意:
  • Cerebro还有一个broker_coo(默认值:True)参数,告诉cerebro如果激活了作弊模式,则在可能的情况下也应尝试在broker中激活它。
    模拟broker有一个名为:coo的参数和一个名为set_coo的方法。

2.尝试开盘作弊

(1)核心代码
    # 买入卖出点操作def operate(self, fromopen):# 如有挂起的订单,返回,无操作if self.order is not None:return# 如有仓位if self.position:# 信号点小于0 ,平仓if self.signal < 0:self.order = self.close()# 信号点大于0elif self.signal > 0:print('{} Send Buy, fromopen {}, close {}'.format(self.data.datetime.date(),fromopen, self.data.close[0]))# 买入self.order = self.buy()# 正常交易 cheat-on-open = Falsedef next(self):print('{} next, open {} close {}'.format(self.data.datetime.date(),self.data.open[0], self.data.close[0]))if self.cheating:returnself.operate(fromopen=False)# 作弊交易 cheat-on-open = Truedef next_open(self):if not self.cheating:returnself.operate(fromopen=True)
(2)cheat_on_open=False

常规执行:

python ./cheat-on-open.py --cerebro cheat_on_open=False
2005-02-14 next, open 3079.93 close 3075.76
2005-02-15 next, open 3075.2 close 3086.95
2005-02-16 next, open 3087.3 close 3068.55
2005-02-17 next, open 3068.79 close 3067.34
2005-02-18 next, open 3067.26 close 3072.04
2005-02-21 next, open 3072.31 close 3063.64
2005-02-22 next, open 3062.99 close 3045.24
2005-02-23 next, open 3042.65 close 3028.08
2005-02-24 next, open 3030.17 close 3024.8
2005-02-25 next, open 3029.07 close 3062.72
2005-02-28 next, open 3063.85 close 3058.35
2005-03-01 next, open 3056.45 close 3078.44
2005-03-02 next, open 3078.89 close 3082.71
2005-03-03 next, open 3080.71 close 3078.11
2005-03-04 next, open 3079.93 close 3106.86
2005-03-07 next, open 3106.98 close 3114.54
2005-03-08 next, open 3113.82 close 3097.34
2005-03-09 next, open 3098.91 close 3081.99
2005-03-10 next, open 3079.01 close 3053.62
2005-03-11 next, open 3058.37 close 3060.36
2005-03-14 next, open 3060.06 close 3060.72
2005-03-15 next, open 3062.77 close 3083.73
2005-03-16 next, open 3083.33 close 3032.13
2005-03-17 next, open 3032.84 close 3039.8
2005-03-18 next, open 3040.38 close 3053.54
2005-03-21 next, open 3052.39 close 3038.14
2005-03-22 next, open 3040.55 close 3050.44
2005-03-23 next, open 3040.66 close 3036.85
2005-03-24 next, open 3039.55 close 3060.67
2005-03-29 next, open 3060.02 close 3068.49
2005-03-30 next, open 3067.3 close 3056.21
2005-03-31 next, open 3059.1 close 3055.73
2005-04-01 next, open 3055.18 close 3061.11
2005-04-04 next, open 3060.0 close 3042.17
2005-04-05 next, open 3046.56 close 3064.07
2005-04-06 next, open 3066.05 close 3076.23
2005-04-07 next, open 3073.4 close 3090.72
2005-04-08 next, open 3092.07 close 3088.92
2005-04-08 Send Buy, fromopen False, close 3088.92
2005-04-11 Buy Executed at price 3088.47
2005-04-11 next, open 3088.47 close 3080.6

订单:

  • 在2005-04-08收盘后,以3088.92收盘价发布订单
  • 在2005-04-11以3088.47的开盘价执行订单
    看一下当时数据:

2005-04-07,3073.40,3092.99,3070.02,3090.72,0,0
2005-04-08,3092.07,3100.72,3083.87,3088.92,0,0
2005-04-11,3088.47,3088.47,3073.75,3080.60,0,0

图示:
在这里插入图片描述

(3)cheat_on_open=True

作弊执行:

python ./cheat-on-open.py --cerebro cheat_on_open=True
2005-02-14 next, open 3079.93 close 3075.76
2005-02-15 next, open 3075.2 close 3086.95
2005-02-16 next, open 3087.3 close 3068.55
2005-02-17 next, open 3068.79 close 3067.34
2005-02-18 next, open 3067.26 close 3072.04
2005-02-21 next, open 3072.31 close 3063.64
2005-02-22 next, open 3062.99 close 3045.24
2005-02-23 next, open 3042.65 close 3028.08
2005-02-24 next, open 3030.17 close 3024.8
2005-02-25 next, open 3029.07 close 3062.72
2005-02-28 next, open 3063.85 close 3058.35
2005-03-01 next, open 3056.45 close 3078.44
2005-03-02 next, open 3078.89 close 3082.71
2005-03-03 next, open 3080.71 close 3078.11
2005-03-04 next, open 3079.93 close 3106.86
2005-03-07 next, open 3106.98 close 3114.54
2005-03-08 next, open 3113.82 close 3097.34
2005-03-09 next, open 3098.91 close 3081.99
2005-03-10 next, open 3079.01 close 3053.62
2005-03-11 next, open 3058.37 close 3060.36
2005-03-14 next, open 3060.06 close 3060.72
2005-03-15 next, open 3062.77 close 3083.73
2005-03-16 next, open 3083.33 close 3032.13
2005-03-17 next, open 3032.84 close 3039.8
2005-03-18 next, open 3040.38 close 3053.54
2005-03-21 next, open 3052.39 close 3038.14
2005-03-22 next, open 3040.55 close 3050.44
2005-03-23 next, open 3040.66 close 3036.85
2005-03-24 next, open 3039.55 close 3060.67
2005-03-29 next, open 3060.02 close 3068.49
2005-03-30 next, open 3067.3 close 3056.21
2005-03-31 next, open 3059.1 close 3055.73
2005-04-01 next, open 3055.18 close 3061.11
2005-04-04 next, open 3060.0 close 3042.17
2005-04-05 next, open 3046.56 close 3064.07
2005-04-06 next, open 3066.05 close 3076.23
2005-04-07 next, open 3073.4 close 3090.72
2005-04-08 next, open 3092.07 close 3088.92
2005-04-11 Send Buy, fromopen True, close 3080.6
2005-04-11 Buy Executed at price 3088.47
2005-04-11 next, open 3088.47 close 3080.6

对比当时数据:

2005-04-07,3073.40,3092.99,3070.02,3090.72,0,0
2005-04-08,3092.07,3100.72,3083.87,3088.92,0,0
2005-04-11,3088.47,3088.47,3073.75,3080.60,0,0

  • 在2005-04-11开盘前发布
  • 在2005-04-11以3088.47的开盘价执行

注意区别:

  • 4月8日未触发订单
  • 4月11日触发订单,当天成交订单。
  • 对于交易结果是一样的。

图示:
在这里插入图片描述
结论:
开盘欺骗允许在开盘前发布订单,允许对全仓场景的所有投注进行精确计算。

4. 源码

#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-
###############################################################################
#
# Copyright (C) 2015-2023 Daniel Rodriguez
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from __future__ import (absolute_import, division, print_function,unicode_literals)import argparse
import datetimeimport backtrader as btclass St(bt.Strategy):params = dict(periods=[10, 30],matype=bt.ind.SMA,)def __init__(self):self.cheating = self.cerebro.p.cheat_on_openmas = [self.p.matype(period=x) for x in self.p.periods]self.signal = bt.ind.CrossOver(*mas)self.order = Nonedef notify_order(self, order):if order.status != order.Completed:returnself.order = Noneprint('{} {} Executed at price {}'.format(bt.num2date(order.executed.dt).date(),'Buy' * order.isbuy() or 'Sell', order.executed.price))def operate(self, fromopen):if self.order is not None:returnif self.position:if self.signal < 0:self.order = self.close()elif self.signal > 0:print('{} Send Buy, fromopen {}, close {}'.format(self.data.datetime.date(),fromopen, self.data.close[0]))self.order = self.buy()def next(self):print('{} next, open {} close {}'.format(self.data.datetime.date(),self.data.open[0], self.data.close[0]))if self.cheating:returnself.operate(fromopen=False)def next_open(self):if not self.cheating:returnself.operate(fromopen=True)def runstrat(args=None):args = parse_args(args)cerebro = bt.Cerebro()# Data feed kwargskwargs = dict()# Parse from/to-datedtfmt, tmfmt = '%Y-%m-%d', 'T%H:%M:%S'for a, d in ((getattr(args, x), x) for x in ['fromdate', 'todate']):if a:strpfmt = dtfmt + tmfmt * ('T' in a)kwargs[d] = datetime.datetime.strptime(a, strpfmt)# Data feeddata0 = bt.feeds.BacktraderCSVData(dataname=args.data0, **kwargs)cerebro.adddata(data0)# Brokercerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')'))# Sizercerebro.addsizer(bt.sizers.FixedSize, **eval('dict(' + args.sizer + ')'))# Strategycerebro.addstrategy(St, **eval('dict(' + args.strat + ')'))# Executecerebro.run(**eval('dict(' + args.cerebro + ')'))if args.plot:  # Plot if requested tocerebro.plot(**eval('dict(' + args.plot + ')'))def parse_args(pargs=None):parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,description=('Cheat-On-Open Sample'))parser.add_argument('--data0', default='./datas/2005-2006-day-001.txt',required=False, help='Data to read in')# Defaults for datesparser.add_argument('--fromdate', required=False, default='',help='Date[time] in YYYY-MM-DD[THH:MM:SS] format')parser.add_argument('--todate', required=False, default='',help='Date[time] in YYYY-MM-DD[THH:MM:SS] format')parser.add_argument('--cerebro', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--broker', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--sizer', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--strat', required=False, default='',metavar='kwargs', help='kwargs in key=value format')parser.add_argument('--plot', required=False, default='',nargs='?', const='{}',metavar='kwargs', help='kwargs in key=value format')return parser.parse_args(pargs)if __name__ == '__main__':runstrat()

5.Help

python ./cheat-on-open.py --help
usage: cheat-on-open.py [-h] [--data0 DATA0] [--fromdate FROMDATE][--todate TODATE] [--cerebro kwargs] [--broker kwargs][--sizer kwargs] [--strat kwargs] [--plot [kwargs]]Cheat-On-Open Sampleoptional arguments:-h, --help           show this help message and exit--data0 DATA0        Data to read in (default:./datas/2005-2006-day-001.txt)--fromdate FROMDATE  Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: )--todate TODATE      Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: )--cerebro kwargs     kwargs in key=value format (default: )--broker kwargs      kwargs in key=value format (default: )--sizer kwargs       kwargs in key=value format (default: )--strat kwargs       kwargs in key=value format (default: )--plot [kwargs]      kwargs in key=value format (default: )

相关文章:

Backtrader 文档学习- Broker - Cheat-On-Open

Backtrader 文档学习- Broker - Cheat-On-Open 1.概述 V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说&#xff0c;这似乎是一个必需的功能&#xff0c;用bar的收盘价后进行计算&#xff0c;希望与开盘价相匹配。 当开盘价差距&#xff08;上涨或下跌&#xff0c;取…...

基于微信浙江杭州某停车场车位预约小程序系统设计与实现 研究背景和意义、国内外现状

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…...

编程流程图

对于复杂流程&#xff0c;我做开发之前一般会 先画一下流程图。特别是多个部门有交叉的情况下&#xff1a; processOn&#xff1a; 这个是我之前 一直的选择&#xff0c;他可以画上面的这些&#xff0c;流程图&#xff0c;网页操作&#xff0c;但是他不是免费的&#xff0c;查过…...

2024年1月29日-2月4日(全面进行+收集虚幻商城免费资源)

从上周发现&#xff0c;一轮轮推就行&#xff0c;每轮多个时间片&#xff0c;每个时间片一门。周一到周五一轮&#xff0c;周六日多轮&#xff08;比如上下午各一轮&#xff09;。 周一&#xff1a; 7&#xff1a;09–9&#xff1a;20卫星导航定位&#xff08;p3&#xff09;&a…...

【python接口自动化】- 正则用例参数化

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…...

Java中的四种线程池详解及使用场景

前言 在Java并发编程中&#xff0c;JDK提供了一套强大的线程池工具类java.util.concurrent.ThreadPoolExecutor以及它的四个便捷工厂方法&#xff0c;这四种线程池分别对应不同的使用场景和特性。下面将详细介绍每种线程池的创建方式、工作原理以及适用场景。 1. CachedThrea…...

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新&#xff0c;因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…...

Keil软件某些汉字输出乱码,0xFD问题,51单片机

1. 问题 keil软件输入某些汉字的时候会输出乱码&#xff0c;例如&#xff1a;升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd&#xff0c;keil解析为0xc9数的GB2312编码为 0xcafd&#xff0c;keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …...

自然语言开发AI应用,利用云雀大模型打造自己的专属AI机器人

如今&#xff0c;大模型层出不穷&#xff0c;这为自然语言处理、计算机视觉、语音识别和其他领域的人工智能任务带来了重大的突破和进展。大模型通常指那些参数量庞大、层数深、拥有巨大的计算能力和数据训练集的模型。 但不能不承认的是&#xff0c;普通人使用大模型还是有一…...

Android中 Gradle与 AGP 版本对应关系表

Android Gradle Plugin Version版本Gradle Version版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2.32.14.12.3.03.33.0.04.13.1.04.43.2.0 - 3.2.14.63.3.0 - 3.3.34.10.13.4.0 - 3.4.35.1.13.5.0 - 3.5.45.4.13.…...

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识&#xff0c;同学们也可以通过公众号菜单栏查看&#xff01; 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…...

跟着pink老师前端入门教程-day13

品优购案例 一、品优购项目规划 1. 品优购项目整体介绍 项目名称&#xff1a;品优购 项目描述&#xff1a;品优购是一个电商网站&#xff0c;我们要完成 PC 端首页、列表页、注册页面的制作 2. 品优购项目学习目的 1. 电商类网站比较综合&#xff0c;里面需要大量的布…...

go语言基础之泛型

1.泛型 泛型是一种独立于所使用的特定类型的编写代码的方法。使用泛型可以编写出适用于一组类型中的任何一种的函数和类型。 1.1 为什么需要泛型 func reverse(s []int) []int {l : len(s)r : make([]int, l)for i, e : range s {r[l-i-1] e}return r }fmt.Println(reverse…...

Vue.js 中子组件向父组件传值的方法

Vue.js 是一款流行的 JavaScript 前端框架&#xff0c;它提供了一套完整的工具和 API&#xff0c;使得开发者可以更加高效地构建交互式的 Web 应用程序。其中&#xff0c;组件化是 Vue.js 的一个核心概念&#xff0c;通过组件化可以将一个复杂的应用程序拆分成多个独立的部分&a…...

数据可视化 pycharts实现地理数据可视化(全球地图)

自用版 紧急整理一点可能要用的可视化代码&#xff0c;略粗糙 以后有机会再改 requirements&#xff1a; python3.6及以上pycharts1.9 数据格式为&#xff1a; 运行结果为&#xff1a; import pandas as pd from pyecharts.charts import Map, Timeline from pyecharts im…...

Mac下查看、配置和使用环境变量

Mac下查看、配置和使用环境变量 一&#xff1a;Mac怎么查看环境变量命令 printenv一&#xff1a;这个命令会一次性列出所有环境变量的键值对&#xff0c;输出格式为&#xff1a; VAR1value1 VAR2value2 ...二&#xff1a; 也可以通过给这个命令加上环境变量名参数&#xff0…...

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆

虚拟机克隆的三种方式:全量克隆、快速全量克隆、链接克隆 快速全量克隆 特点&#xff1a;虚拟机启动快、拍平后数据独立 场景&#xff1a;快速发放独立的虚拟机&#xff0c;减少等待虚拟机部署完成时间&#xff0c;能够快速提供用户使用虚拟机。 实现方式&#xff1a;通过对…...

如何隐藏Selenium特征实现自动化网页采集

Selenium是一个流行的自动化网页测试工具&#xff0c;可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而&#xff0c;有些网站会检测浏览器是否由Selenium驱动&#xff0c;如果是&#xff0c;就会返回错误的结果或拒绝访问。为了避免这种情况&#xff0c;我们需要…...

springboot149智慧图书管理系统设计与实现

智慧图书管理系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现…...

3D词云图

工具库 tagcanvas.min.js vue3&#xff08;框架其实无所谓&#xff0c;都可以&#xff09; 实现 <script setup> import { onMounted, ref } from vue; import ./tagcanvas.min.js;const updateFlag ref(false);// 词云图初始化 const initWordCloud () > {let …...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...