小白量化《穿云箭集群量化》(9)用指标公式实现miniQMT全自动交易

news2024/11/18 0:28:13

小白量化《穿云箭集群量化》(9)用指标公式实现miniQMT全自动交易
在穿云箭量化平台中,支持3中公式源码运行模式,还支持在Python策略中使用仿指标公式源码运行,编写策略。
我们先看如何使用指标公式源码。

#编程_直接使用通达信自编指标公式显示K线指标
import os,sys
sys.path.append(os.path.abspath('.'))
sys.path.append(os.path.abspath('..'))
import pandas as pd
import numpy  as np
import matplotlib.pyplot as plt
import HP_tdx as htdx#小白通达信行情库 
from HP_formula import *   #小白股票指标公式函数库
import HP_tdxgs as hgs  #小白通达信公式库

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

tdxapi=htdx.TdxInit(ip='180.153.18.171')
code='600019'
df=hgs.get_security_bars(nCategory=4,nMarket = -1,code=code)
print(df)
#df.to_csv( "股票数据源.csv" , encoding= 'gbk')
#df2=pd.read_csv("股票数据源.csv"  , encoding= 'gbk')
#KDJ指标
gs='''
N:=9;
M1:=3;
M2:=3;
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:SMA(RSV,M1,1), CIRCLEDOT,COLORFF0000,LINETHICK2;
D:SMA(K,M2,1), LINETHICK3 , COLOR00FF00 ;
J:3*K-2*D, LINETHICK2, COLOR0000FF;
'''

#MACD指标
gs2='''
SHORT:=12;
LONG:=26;
MID:=9;
DIF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
DEA:EMA(DIF,MID);
MACD2:(DIF-DEA)*2,COLORSTICK;
'''

#LHXJ 猎狐先觉
gs3='''
VAR1=(CLOSE*2+HIGH+LOW)/4;
VAR2=EMA(VAR1,13)-EMA(VAR1,34);
VAR3=EMA(VAR2,5);
ZLQP:(-2)*(VAR2-VAR3)*3.8;
ZLKP:2*(VAR2-VAR3)*3.8;
'''

#绘制图形
plt.figure(1,figsize=(10,6), dpi=100)
#绘制主图指标
ax1=plt.subplot(311)
#绘制副图指标
ax2=plt.subplot(312)
#绘制副图指标
ax3=plt.subplot(313)

tgs1=hgs.Tdxgs()
tgs1.loaddf(df)
mydf=tgs1.rungs(gs)
print('KDJ指标:\n',gs)
print('公式变量:',tgs1.bl)
print('输出变量:',tgs1.bl2)
tgs1.brawline(ax1)
print(mydf)
#mydf.to_csv( "股票数据KDJ返回结果.csv" , encoding= 'gbk')
#mydf2=pd.read_csv("股票数据KDJ返回结果.csv" , encoding= 'gbk')

#print(gs2)
tgs2=hgs.Tdxgs()
tgs2.loaddf(df)
mydf2=tgs2.rungs(gs2)
tgs2.brawline(ax2)

#print(gs2)
tgs3=hgs.Tdxgs()
tgs3.loaddf(df)
mydf3=tgs3.rungs(gs3)
tgs3.brawline(ax3)
plt.show()

在这里插入图片描述
程序运行结果,
我们可以在穿云箭量化平台上使用指标公式源码一键生成easytrader策略和miniQMT自动交易策略。
我们可以直接使用有买卖信号的专家系统公式,也可以自定义BUY和SELL信号,也支持B和S交易信号。
在这里插入图片描述
上图是通达信KD专家系统公式,我们点按钮显示图形,能够正常显示买卖信号。
我们直接点【生成miniQMT交易】按钮,生成miniQMT全自动交易策略源代码,源代码如下,用户只要修改程序路径和用户,就可以直接在穿云箭量化软件高级版面中进行实盘。
也可以将策略中的自编指标,更换为其他自编公式源码。

策略名='高级_miniQMT公式策略'
import pandas as pd
import time,os
import HP_tdx as htdx   #小白量化行情模块
import HP_global as hg   #建立高级全局数据域hg
from HP_formula import *  #小白量化公式模块
from HP_factor import *  #小白量化因子公式及Alpha公式模块
import HP_factor as hf #小白量化因子公式及Alpha公式模块
import HP_formula as gs  #小白量化公式模块
import HP_quant as hpq   #穿云箭量化模块
from HP_quant import *  #穿云箭量化模块
import HP_tdx as htdx  #通达信行情模块
import HP_tdxgs as tgs  #公式运行模块
import  random, time, logging, datetime, json, akshare
from xtquant import xtdata, xttrader, xtconstant
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
import HP_xbdata as hpx
import HP_mqmt as hqmt

trader = hqmt.Trader()

##########修改帐户信息########################
qmt_path='D:\\华宝证券QMT实盘交易端'
account_id = ""
#############################################
session_id = random.randint(20000, 60000)
qmt_dir = qmt_path + '\\userdata_mini'
account_type = "STOCK" # 账号类型,可选STOCK、CREDIT
xtdata.data_dir = qmt_path + '\\datadir'
connect_result = trader.set_trader(qmt_dir, session_id)
trader.set_account(account_id, account_type=account_type)
print("交易连接成功!") if connect_result == 0 else print("交易连接失败!")

mygs=tgs.Tdxgs()
def initialize(context):
    #context.istest=True    
    context.zh='xiaoba'      #账户
    context.zhlx='回测'   #账户类型,2个汉字
    context.firstcash=1000000.00  #初始现金
    context.cash=context.firstcash
    context.portfolio.available_cash=context.firstcash
    # 设置我们要操作的股票池
    #g.stocks=hpq.get_universe()
    #g.stocks=['000001.SZ','000776.SZ','600030.SH']
    #codes=htdx.getzxgfile('G2022X500.blk')
    codes=hpq.get_universe()
    g.cwsj={}  #财务数据    
    codes2=[]
    for m,c in codes:
        if m==0:
            cc=c+'.SZ'
        elif m==1:
            cc=c+'.SH'
        codes2.append(cc)
        cw=xtdata.get_instrument_detail(cc)
        g.cwsj[cc]=cw
        #print(m,cc,cw)
    g.stocks=codes2
        
    hpq.set_universe(g.stocks)
    hpq.log.info('----策略环境信息-----')
    print('量化模块版本: ',hpq.ver)
    print('量化模块最后修改日期: ',hpq.mdate)
    print('svrip: ',hpq.svrip)
    print('svrport: ',hpq.svrport)
    print('\n----开始运行策略-----\n')
    print('策略名:'+策略名)
    qhcsj2=time.strftime('%Y%m%d %H:%M:%S',time.localtime(time.time()))
    print('开始运行时间:'+qhcsj2)

    # 设定基准
    set_benchmark('000001.SH')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    set_times(6)  #设置多少圈读一次持仓
    hg.hqsl=0 #行情数量
    hg.seemsg=False
    asset = trader.xt_trader.query_stock_asset(trader.account)
    context.portfolio.total_value=asset.total_asset   #总资产
    context.portfolio.available_cash=asset.cash       #'可用金额'
    context.portfolio.positions_value=asset.market_value    #'股票市值'
    context.portfolio.locked_cash=asset.frozen_cash  #冻结金额
    holding=hqmt.query_holding(trader)
    g.zstime=datetime.datetime.now()
    g.codezs=[]
    g.holds=[]  #持仓证券代码
    print(asset.total_asset,asset.cash)
    for i in range(len(holding)):
        股票代码=holding[i][0]['股票代码']
        g.holds.append(股票代码)
        if 股票代码 not in context.portfolio.positions:
            context.portfolio.positions[股票代码]=hpq.Position(股票代码)
            context.portfolio.positions[股票代码].total_amount=holding[i][0]['持仓']
            context.portfolio.positions[股票代码].closeable_amount=holding[i][0]['可用持仓']
            context.portfolio.positions[股票代码].acc_avg_cost=holding[i][0]['成本']
            context.portfolio.positions[股票代码].value=holding[i][0]['持仓市值']
    context.ccs=g.holds
    hpq.context=context
    g.MAX=50
    g.hd=0.003 #滑点
    g.zsfd=-0.03  #止损幅度
    g.amount=100 #买入数量
    g.xdzj=10000.00 #买入金额,下单资金
    g.cs=0  #策略运行次数
    #中文Python学习交流群 934165481
    g.gs='''{自编指标公式,最好用专家系统公式}

N:=9;
M1:=3;
RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100;
K:=SMA(RSV,M1,1);
D:=SMA(K,M1,1);
J:=3*K-2*D;
ENTERLONG:CROSS(J,D);
EXITLONG:CROSS(D,J);

'''

# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def market_open(context):
    starttime = datetime.datetime.now()
    g.cs=g.cs+1
    #开始撤单
    if g.cs%2==1:
        wtc=hqmt.query_order(trader,'') #获取委托池
        for i in range(len(wtc)):
            wt=wtc[i]
            if wt['委托状态']=='已报' or wt['委托状态']=='部分成交':
                订单编号=wt['订单编号']
                hqmt.trade_cancel_order(trader,订单编号)


    ##获取账户资金
    asset = trader.xt_trader.query_stock_asset(trader.account)
    context.portfolio.total_value=asset.total_asset   #总资产
    context.portfolio.available_cash=asset.cash       #'可用金额'
    context.portfolio.positions_value=asset.market_value    #'股票市值'
    context.portfolio.locked_cash=asset.frozen_cash  #冻结金额
    ##获取持仓
    holding=hqmt.query_holding(trader)
    print(len(holding))
    g.holds=[]  #持仓证券代码
    for i in range(len(holding)):
        security=股票代码=holding[i][0]['股票代码']
        g.holds.append(股票代码)
        tick=hqmt.get_tick_data(股票代码)
        price=tick['lastPrice']
        if 股票代码 not in context.portfolio.positions:
            context.portfolio.positions[股票代码]=hpq.Position(股票代码)
            context.portfolio.positions[股票代码].total_amount=holding[i][0]['持仓']
            context.portfolio.positions[股票代码].closeable_amount=holding[i][0]['可用持仓']
            context.portfolio.positions[股票代码].acc_avg_cost=holding[i][0]['成本']
            context.portfolio.positions[股票代码].value=holding[i][0]['持仓市值']
            context.portfolio.positions[股票代码].price=price
            context.portfolio.positions[股票代码].issell=False
            context.portfolio.positions[股票代码].isbuy=False
        else:
            context.portfolio.positions[股票代码].total_amount=holding[i][0]['持仓']
            context.portfolio.positions[股票代码].closeable_amount=holding[i][0]['可用持仓']
            context.portfolio.positions[股票代码].acc_avg_cost=holding[i][0]['成本']
            context.portfolio.positions[股票代码].value=holding[i][0]['持仓市值']            
            context.portfolio.positions[股票代码].price=price
            context.portfolio.positions[股票代码].issell=False
            context.portfolio.positions[股票代码].isbuy=False
        amos=holding[i][0]['可用持仓']
        acc_avg_cost=context.portfolio.positions[股票代码].acc_avg_cost
        #df=hqmt.get_day_line(security)
        df=hqmt.get_day_line(security)
        price = df.close.iloc[-1]
        if security not in g.cwsj: 
            cw=xtdata.get_instrument_detail(security)
            g.cwsj[security]=cw
        
        if amos>0:
            ##响尾蛇导弹,自动止损和回撤止盈
            sell=hf.autosell(security,price=price,cost=acc_avg_cost,withdraw=0.3,stoploss=g.zsfd,minp=0.02,t=99999)
            if sell==2:  #止损
                p5=round(price*(1-g.hd),2)
                x=order_target(security,0,p=p5)
                hpq.log.info(context.current_dt+   " 止损卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,p5,amos*p5))
                print(security,p5,amos,price)
                time.sleep(0.1)
                order_id = trader.xt_trader.order_stock(trader.account,security, xtconstant.STOCK_SELL,amos, xtconstant.FIX_PRICE, p5, '策略TTMJ', '止损')  
                context.portfolio.positions[security].sellprice=p5
                context.portfolio.positions[security].issellprice=True
                context.portfolio.positions[security].total_amount=0
                context.portfolio.positions[security].closeable_amount=0
            elif sell==1: #止盈
                p5=round(price*(1-g.hd),2)
                x=order_target(security,0,p=p5)
                hpq.log.info(context.current_dt+   " 止盈卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,p5,amos*p5))
                print(security,p5,amos,price)
                time.sleep(0.1)
                order_id = trader.xt_trader.order_stock(trader.account,security, xtconstant.STOCK_SELL,amos, xtconstant.FIX_PRICE, p5, '策略TTMJ', '止盈')  
                context.portfolio.positions[security].sellprice=p5
                context.portfolio.positions[security].issellprice=True
                context.portfolio.positions[security].total_amount=0
                context.portfolio.positions[security].closeable_amount=0
                
        df=hqmt.get_day_line(security)
        if len(df)<1:
            continue
        price = df.close.iloc[-1]
        close=price
        high= df.high.iloc[-1]
        low= df.low.iloc[-1]
        #value = context.portfolio.positions[security].value
        acc_avg_cost  = context.portfolio.positions[security].acc_avg_cost #买入成本价 
        amos=context.portfolio.positions[security].closeable_amount  #可卖数量
        amos2=context.portfolio.positions[security].total_amount   #总数量
        CAPTIAL=df['capital']=g.cwsj[security]['FloatVolume']        
        mydf=gs.initmydf(df)  ##初始化mydf表
        C=CLOSE=gs.CLOSE
        L=LOW=gs.LOW
        H=HIGH=gs.HIGH
        O=OPEN=gs.OPEN
        V=VOL=mydf['volume']
        AMO=AMOUNT=mydf['amount']
        CAPTIAL=mydf['capital']=g.cwsj[security]['FloatVolume']
        HSL=V/CAPTIAL  ##换手率
        pre_close=CLOSE.iloc[-1]   #前收盘
        ZX=AMO/(V+0.00001)/100   
        BL=(C-ZX)/(ZX+0.00001)

        mydf=gs.initmydf(df)  ##初始化mydf表
        mygs.loaddf(mydf)  #加载行情数据
        mydf=mygs.execgs(g.gs)  #运行指标公式
        
        if 'ENTERLONG' in mydf.columns:
            BUY=mydf['ENTERLONG']  #买点
        elif 'BUY' in mydf.columns:
            BUY=mydf['BUY']  #买点
        elif 'B' in mydf.columns:
            BUY=mydf['B']  #买点

        if 'EXITLONG' in mydf.columns:
            SELL=mydf['EXITLONG']  #卖点
        elif 'SELL' in mydf.columns:
            SELL=mydf['SELL']  #卖点
        elif 'S' in mydf.columns:
            SELL=mydf['S']  #卖点        
  
        cash=context.portfolio.available_cash   #资金余额
        if BUY>0 and amos2==0 and context.portfolio.positions[security].isbuy==False and context.onlysell==False :   #保留资金
            price2=round(price*(1+g.hd),2)
            amount=g.xdzj/price2  
            g.amount=int(amount/100)*100
            x=order_target(security,g.amount,p=price2)
            context.portfolio.positions[security].isbuy=True

            order_id = trader.xt_trader.order_stock(trader.account,security, xtconstant.STOCK_BUY, g.amount, xtconstant.FIX_PRICE, price2, 'strategy_name', 'remark')            
            context.portfolio.positions[security].total_amount=g.amount
            if x !=None:
                hpq.log.info(context.current_dt+" 买入: %s ,数量:%d,买入价格:%.2f,成交资金:%0.2f"%(security,x.amount,price,x.amount*price))

        amos=context.portfolio.positions[security].closeable_amount  #可卖数量
        if SELL>0 and amos>0 and context.onlybuy==False:
            price2=round(price*(1-g.hd),2)
            x=order_target(security,0,p=price2)
            context.portfolio.positions[security].issell=True
            order_id = trader.xt_trader.order_stock(trader.account,security, xtconstant.STOCK_SELL, amos, xtconstant.FIX_PRICE, price2, 'strategy_name', 'remark')  
            hpq.log.info(context.current_dt+  " 卖出: %s ,数量:%d,卖出价格:%.2f,成交资金:%0.2f"%(security,amos,price2,amos*price2))
            context.portfolio.positions[security].total_amount=0

    endtime = datetime.datetime.now()
    costtime=(endtime - starttime).seconds
    t1=costtime-int(costtime/60)*60
    t2=int(costtime/60)-int(int(costtime/60)/60)*60
    t3=int(int(costtime/60)/60)
    print('花费时间:%d:%d:%d'%(t3,t2,t1))

在这里插入图片描述
上面给了出了使用指标公式实现miniQMT全自动交易,如果没有miniQMT,也可以生成easytrader自动交易策略。
后面我们将介绍更多的量化交易技术。

超越自己是我的每一步!我的进步就是你的进步!

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

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

相关文章

【2023秋招】每日一题:P1087-美团3-18真题 + 题目思路 + 所有语言带注释

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&…

【C生万物】 指针和数组笔试题汇总 (下)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《C生万物 | 先来学C》&#x1f448; 前言&#xff1a; 承接上文&#xff0c;继续进行指针和数组的练习。 目录 Part2:指针笔试题 1.做题 …

硬件系统工程师宝典(24)-----如何能够正确理解三极管?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。上篇我们说到不同材质的磁珠&#xff0c;频率阻抗特性不同&#xff0c;根据磁珠的频率阻抗特性曲线&#xff0c;磁珠在低频时电感起作用&#xff0c;…

Java开源工具库使用之压测JMeter

文章目录 前言一、概念原理1.1 Jmeter 原理1.2 性能测试术语1.3 web项目性能标准 二、常用元件2.1 线程组2.2 取样器2.3 控制器2.4 定时器2.5 前置/后置处理器2.6 配置元件2.7 监听器 三、插件3.1 第三方插件3.2 录制插件 四、JSR223 脚本及函数4.1 JSR223 脚本4.2 函数变量 五…

职场难题:克服压力、提升自我能力,勇闯职场巅峰

在当今激烈的职场竞争中&#xff0c;职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这些问题都是需要克服的问题。作为一名在职场中求生存&#xff0c;求发展的职业人士&#xff0c;我们必须学会适应这些挑战&#xff0c;掌…

Java基础面试题突击系列1

&#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我不迷路 ❤️《java面试核心知识》突击系列&#xff0c;持续更新… &#x1f490; 面试必知必会学习路线&#xff1a;Java技术栈面试系列SpringCloud项目实战学习路线 &#x1f4dd;再小的收获x365天…

面了个 Java 实习生,小伙很优秀!

大家好&#xff0c;我是鱼皮&#xff0c;前几天给自己的公司面试了一位 Java 暑期实习生&#xff0c;候选人目前是大三。 整个过程我都录屏了&#xff0c;并且在征得候选人的同意后&#xff0c;把面试过程分享出来。一方面是希望对其他在学编程找工作的小伙伴有一些启发和参考…

强化学习代码规划之深度学习预备

现在到了自动编码器和解码器&#xff0c;同样&#xff0c;先练几遍代码&#xff0c;再去理解 import torch import torch.nn as nn import torch.utils.data as Data import torchvision import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matpl…

文心一言和ChatGPT最全对比

文心一言和ChatGPT都是基于深度学习技术的自然语言处理模型&#xff0c;有各自的优势和使用场景&#xff0c;无法简单地比较 ChatGPT 和文心一言哪一个功能更强大&#xff0c;它们各自具有优势和局限性&#xff0c;需要根据具体需求进行选择&#xff0c;以下一些具体对比&#…

HttpRunner 接口自动化测试进阶

这里我们介绍一下通过调试源码的方式来做接口测试&#xff1a; 1、获取源码 github下载或pycharm的git checkout功能去获取&#xff0c;这里直接下载 通过ide打开解压后的源码包 源码包含三层目录结构&#xff1a;docs帮助文档、httprunner核心库、tests自测文件 2、源码结…

小白量化《穿云箭集群量化》(8) 实盘核聚变氢弹策略

小白量化《穿云箭集群量化》&#xff08;8&#xff09; 核聚变策略 上一篇介绍了超级订单SuperOrder功能在股票上买入策略&#xff0c;这篇介绍MetaTrader5期货外汇的双向交易策略。 交易策略比较有名的是马丁策略&#xff0c;马丁策略是单向策略。 我们设计了双向策略原子弹策…

新来的实习生太牛了,还是我们太弱了?...

前几天有个朋友向我哭诉&#xff0c;说她在公司工作&#xff08;软件测试&#xff09;了7年了&#xff0c;却被一个实习生代替了&#xff0c;该何去何从&#xff1f; 这是一个值得深思的问题&#xff0c;作为职场人员&#xff0c;我们确实该思考&#xff0c;我们的工作会被实习…

Qt布局管理器

一、布局管理器 1.1、布局管理器的作用 布局管理器是摆放控件的辅助工具&#xff0c;主要解决组件的位置和大小无法自适应父窗口变化的问题&#xff0c;主要功能如下&#xff1a; 自动调整控件的位置&#xff0c;包括控件之间的间距、对齐等当用户调整窗口大小时&#xff0c;位…

【洛谷】P1404 平均数

【洛谷】P1404 平均数 题目描述 给一个长度为 n n n 的数列&#xff0c;我们需要找出该数列的一个子串&#xff0c;使得子串平均数最大化&#xff0c;并且子串长度 ≥ m \ge m ≥m。 输入格式 第一行两个整数 n n n 和 m m m。 接下来 n n n 行&#xff0c;每行一个整数 …

激光点云3D目标检测算法之CenterPoint

激光点云3D目标检测算法之CenterPoint 本文首发于公众号【DeepDriving】&#xff0c;欢迎关注。 前言 CenterPoint是CVPR 2021的论文《Center-based 3D Object Detection and Tracking》中提出的一个激光点云3D目标检测与跟踪算法框架&#xff0c;与以往算法不同的是&#xff…

一大波特斯拉人形机器人上线,马斯克震撼官宣2款新车!

来源 | 新智源 ID | AI-era 【导读】这次特斯拉股东日&#xff0c;虽没有新车&#xff0c;但马斯克确定Cybertruck今年一定会来。 特斯拉股东日&#xff0c;依旧没有新车。 万众瞩目的马斯克登台继续画饼&#xff0c;「我不官宣新车&#xff0c;不过新车年销量会超过500万」…

【云原生】k8sPod基础概念

k8sPod基础概念 一、Pod概述1、pod概念2、Pod资源限制 二、Pod的两种使用方式三、资源共享1、创建Pod的方式2、Pod功能 四、底层容器Pause1、Pause共享资源2、Pause主要功能3、Pod与Pause结构设计用意 五、镜像的拉取策略1、Pod容器镜像拉取策略2、Pod重启策略 六、容器的分类1…

信息收集-ip地址

1、cdn网络 CDN&#xff08;Content Delivery Network&#xff09;网络是一种分布式网络架构。它通过将内容&#xff08;如网页、图片、视频等&#xff09;缓存到公共的服务器上&#xff0c;以便更快速、更可靠地交付给用户所在的位置。CDN解决了Internet中的一些固有瓶颈和性…

【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill)

0、版本说明 Ubuntu22.04对应的ROS2的版本为Humble Hawksbill&#xff08;ros-humble&#xff09; 如果不是在Ubuntu22.04中安装ROS&#xff0c;请参考下面Ubuntu和ROS的版本对应关系 1、更新apt包列表 $ sudo apt update2、设置编码 将ubuntu环境语言编码设置为en_US en_…

appium自动化测试实战详解及框架搭建

目录 一、Appium的介绍 二、Appium实战&#xff08;以真机为例&#xff09; 一、Appium的介绍 Appium是一款开源的自动化测试工具&#xff0c;其支持iOS和安卓平台上的原生的&#xff0c;基于移动浏览器的&#xff0c;混合的应用。 1、 使用appium进行自动化测试的好…