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

Backtrader 文档学习- Sizers

Backtrader 文档学习- Sizers

1.概述

  • 智能仓位
    Strategy提供了交易方法,即:buy,sell和close。看一下buy的定义:
def buy(self, data=None,size=None, price=None, plimit=None,exectype=None, valid=None, tradeid=0, **kwargs):

注意,如果调用者未指定,则size的默认值为None。Sizers发挥重要作用的地方:

  • size=None 请求Strategy向其Sizers请求实际股份

意味着Strategies有一个Sizer:后台机制会向Strategy添加默认的Sizer,如果用户没有添加,则会添加默认的Sizer。strategy的默认Sizer是SizerFix。定义的初始化:

class SizerFix(SizerBase):params = (('stake', 1),)

默认的Sizer只是使用1单位的stake(无论是股票、合约等)买入/卖出。

2.使用Sizers

(1)From Cerebro

可以通过2种不同的方法向Cerebro添加Sizers:

  • addsizer(sizercls, *args, **kwargs)
    添加一个Sizer,该Sizer将应用于添加到cerebro的任何策略。这是默认的Sizer。例如:
cerebro = bt.Cerebro()
cerebro.addsizer(bt.sizers.SizerFix, stake=20)  # default sizer for strategies
  • addsizer_byidx(idx, sizercls, *args, **kwargs)
    Sizer仅将添加到引用idx的Strategy中
    可以从addstrategy中获取此idx。如:
cerebro = bt.Cerebro()
cerebro.addsizer(bt.sizers.SizerFix, stake=20)  # default sizer for strategiesidx = cerebro.addstrategy(MyStrategy, myparam=myvalue)
cerebro.addsizer_byidx(idx, bt.sizers.SizerFix, stake=5)cerebro.addstrategy(MyOtherStrategy)

在这个例子中:

  • 系统中添加了一个默认的Sizer,适用于所有没有指定具体Sizer的策略

  • 对于MyStrategy,在得到增加策略的idx后,可以添加一个特定的sizer(更改stake参数)
    第二个策略MyOtherStrategy被添加到系统中。没有为它指定特定的Sizer 。
    说明:

    • MyStrategy将最终使用一个内部特定的Sizer
    • MyOtherStrategy策略将使用默认Sizer

注意:
default并不意味着策略共享单个Sizer实例。每个strategy都会收到不同的default sizer实例
要共享单个实例,应该共享的sizer应该是单例类。如何定义一个超出了backtrader的范围 。

(2)From Strategy

Strategy类提供了API:setsizer和getsizer(以及sizer属性)来管理Sizer。定义:

  • def setsizer(self, sizer):需要一个已经实例化的Sizer
  • def getsizer(self):返回当前的Sizer实例
  • sizer : 是可以直接get/set的属性
    在这种情况下,Sizer可以是:
  • 作为参数传递给策略
  • 在__init__期间使用属性sizer或setsizer设置,如:
class MyStrategy(bt.Strategy):params = (('sizer', None),)def __init__(self):if self.p.sizer is not None:self.sizer = self.p.sizer

例如,允许在Cerebro调用发生时创建同级别的Sizer,并将其作为参数传递给系统中的所有策略,有效地允许共享Sizer。

3.Sizer Development

Subclass from backtrader.Sizer

This gives you access to self.strategy and self.broker although it shouldn’t be needed in most cases. Things that can be accessed with the broker

data’s position with self.strategy.getposition(data)

complete portfolio value through self.broker.getvalue()

Notice this could of course also be done with self.strategy.broker.getvalue()

Some of the other things are already below as arguments

1.从backtrader.Sizer子类中继承
可以访问self.strategy和self.broker,尽管在大多数情况下不需要。可以使用broker访问

  • 使用self.strategy.getposition(data)获取数据仓位
  • 通过self.broker.getvalue()获取完整的组合价值

注意,也可以使用self.strategy.broker.getvalue()完成

This method returns the desired size for the buy/sell operation

The returned sign is not relevant, ie: if the operation is a sell operation (isbuy will be False) the method may return 5 or -5. Only the absolute value will be used by the sell operation.

2.重写方法_getsizing(self, comminfo, cash, data, isbuy)

  • comminfo:包含有关数据的佣金信息的CommissionInfo实例,允许计算持仓价值、操作成本、操作的佣金
  • cash:broker中当前可用的现金
  • data:操作的目标
  • isbuy:buy操作将为True,sell操作将为False

此方法返回buy/sell操作的所需size
返回的操作信号不相关,比如:如果操作是卖出操作(isbuy将为False),则该方法可以返回5或-5。只有卖出使用绝对值。

Sizer已经传给broker并请求给定数据的佣金信息、实际的现金水平,并提供对数据的直接引用,操作的目的。
FixedSizesizer的定义:

import backtrader as btclass FixedSize(bt.Sizer):params = (('stake', 1),)def _getsizing(self, comminfo, cash, data, isbuy):return self.params.stake
  • 非常简单,因为Sizer不进行任何计算,参数就在那里
  • 但该机制应允许构建复杂的Size(又名持仓控制)系统,用于在进入/退出市场时管理仓位。
    另外一个例子:仓位反转
class FixedRerverser(bt.FixedSize):def _getsizing(self, comminfo, cash, data, isbuy):position = self.broker.getposition(data)size = self.p.stake * (1 + (position.size != 0))return size

size = self.p.stake * (1 + (position.size != 0))

  • position.size != 0 成立返回True ,1+True = 2
  • position.size != 0 不成立返回False ,1+False = 1

基于现有的FixedSize来继承params并覆盖_getsizing:

  • 通过属性broker获取数据的position
  • 使用position.size来决定是否要加倍stake
  • 返回计算出的值

将减轻策略的负担,即决定是否必须撤销或开立头寸,Sizer处于控制之中,并且可以在不影响逻辑的情况下随时更换。

4.Practical Sizer Applicability

Wihtout considering complex sizing algorithms, two different sizers can be used to turn a strategy from Long-Only to Long-Short. Simply by changing the Sizer in the cerebro execution, the strategy will change behavior. A very simple close crosses SMA algorithm:
不考虑复杂的sizer算法,两种不同的sizer可用于将策略从仅做多转变为做多-做空。只需改变cerebro执行中的Sizer,策略就会改变行为。
下面是非常简单的收盘价交叉SMA算法:

class CloseSMA(bt.Strategy):params = (('period', 15),)def __init__(self):sma = bt.indicators.SMA(self.data, period=self.p.period)self.crossover = bt.indicators.CrossOver(self.data, sma)def next(self):if self.crossover > 0:self.buy()elif self.crossover < 0:self.sell()

Notice how the strategy doesn’t consider the current position (by looking at self.position) to decide whether a buy or sell has to actually be done. Only the signal from the CrossOver is considered. The Sizers will be in charge of everything.
注意,策略不考虑当前仓位(通过self.position查看)来决定是否实际买入或卖出。只有考虑来自交叉的信号。sizer将负责一切。

如果仓位已开,此sizer将只负责在卖出时返回非零sizer .

class LongOnly(bt.Sizer):params = (('stake', 1),)def _getsizing(self, comminfo, cash, data, isbuy):if isbuy:return self.p.stake# Sell situationposition = self.broker.getposition(data)if not position.size:return 0  # do not sell if nothing is openreturn self.p.stake

将所有合并(并假设backtrader已经导入并且数据已加载到系统中):

...
cerebro.addstrategy(CloseSMA)
cerebro.addsizer(LongOnly)
...
cerebro.run()
...
python ./sizertest.py --plot --longonly

图示:

在这里插入图片描述
多空方法,只是将Sizer更改为如上所示的固定反转:

...
cerebro.addstrategy(CloseSMA)
cerebro.addsizer(FixedReverser)
...
cerebro.run()
...

执行

python ./sizertest.py --plot 

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

不同之处:

  • 交易数量已经翻倍
  • 现金数永远不会回到价值数,因为战略总是在市场中运行

无论如何两种方法都是负面的,不成功的,只是一个例子而已。

5.代码

#!/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 datetime
import randomimport backtrader as btclass CloseSMA(bt.Strategy):params = (('period', 15),)def __init__(self):sma = bt.indicators.SMA(self.data, period=self.p.period)self.crossover = bt.indicators.CrossOver(self.data, sma)def next(self):if self.crossover > 0:self.buy()elif self.crossover < 0:self.sell()class LongOnly(bt.Sizer):params = (('stake', 1),)def _getsizing(self, comminfo, cash, data, isbuy):if isbuy:return self.p.stake# Sell situationposition = self.broker.getposition(data)if not position.size:return 0  # do not sell if nothing is openreturn self.p.stakeclass FixedReverser(bt.Sizer):params = (('stake', 1),)def _getsizing(self, comminfo, cash, data, isbuy):position = self.strategy.getposition(data)size = self.p.stake * (1 + (position.size != 0))return sizedef runstrat(args=None):args = parse_args(args)cerebro = bt.Cerebro()cerebro.broker.set_cash(args.cash)dkwargs = dict()if args.fromdate:fromdate = datetime.datetime.strptime(args.fromdate, '%Y-%m-%d')dkwargs['fromdate'] = fromdateif args.todate:todate = datetime.datetime.strptime(args.todate, '%Y-%m-%d')dkwargs['todate'] = todatedata0 = bt.feeds.YahooFinanceCSVData(dataname=args.data0, **dkwargs)cerebro.adddata(data0, name='Data0')cerebro.addstrategy(CloseSMA, period=args.period)if args.longonly:cerebro.addsizer(LongOnly, stake=args.stake)else:cerebro.addsizer(bt.sizers.FixedReverser, stake=args.stake)cerebro.run()if args.plot:pkwargs = dict()if args.plot is not True:  # evals to True but is not Truepkwargs = eval('dict(' + args.plot + ')')  # args were passedcerebro.plot(**pkwargs)def parse_args(pargs=None):parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,description='Sample for sizer')parser.add_argument('--data0', required=False,default='../../datas/yhoo-1996-2015.txt',help='Data to be read in')parser.add_argument('--fromdate', required=False,default='2005-01-01',help='Starting date in YYYY-MM-DD format')parser.add_argument('--todate', required=False,default='2006-12-31',help='Ending date in YYYY-MM-DD format')parser.add_argument('--cash', required=False, action='store',type=float, default=50000,help=('Cash to start with'))parser.add_argument('--longonly', required=False, action='store_true',help=('Use the LongOnly sizer'))parser.add_argument('--stake', required=False, action='store',type=int, default=1,help=('Stake to pass to the sizers'))parser.add_argument('--period', required=False, action='store',type=int, default=15,help=('Period for the Simple Moving Average'))# Plot optionsparser.add_argument('--plot', '-p', nargs='?', required=False,metavar='kwargs', const=True,help=('Plot the read data applying any kwargs passed\n''\n''For example:\n''\n''  --plot style="candle" (to plot candles)\n'))if pargs is not None:return parser.parse_args(pargs)return parser.parse_args()if __name__ == '__main__':runstrat()

6.bt.Sizer Reference

(1)Sizer

class backtrader.Sizer()

Sizers的基类。任何sizer都应该对此子类化并覆盖_getsizing方法

成员属性:

  • 策略:将决定Sizer工作
    允许访问策略的整个api,例如在_getsizing中需要实际数据仓位时:

position = self.strategy.getposition(data)

  • broker:将由Sizer的工作策略决定

提供一些复杂Sizer可能需要的信息,如投资组合价值

(2)getsizing

_getsizing(comminfo, cash, data, isbuy)

方法必须由Sizer的子类覆盖以提供调整功能

参数:

  • comminfo: CommissionInfo 实例包含有关数据佣金的信息,并允许计算头寸价值、运营成本和运营佣金

  • cash: broker中当前可用现金

  • data: 数据源对象

  • isbuy: True 是 buy, False 是 sell

方法必须返回要执行的实际sizer(int)。如果返回0,将不执行任何操作。
将使用返回值的绝对值 。

(3)FixedSize

class backtrader.sizers.FixedSize()
sizer只是为任何操作返回一个固定的sizer。通过指定份额参数,根据系统希望用于交易的份额数量来控制size。
参数:

  • stake (default: 1)

  • tranches (default: 1)

(4)FixedReverser

class backtrader.sizers.FixedReverser()
sizer返回需要的固定sizer 来反转开仓位置,或开仓的固定大小

  • 开仓位置参数 stake
  • 反转开仓位置: 2 * stake
    参数:
  • stake (default: 1)
(5)PercentSizer

class backtrader.sizers.PercentSizer()
sizer返回可用现金的百分比
参数:

  • percents (default: 20)
(6)AllInSizer

class backtrader.sizers.AllInSizer()
sizer返回经纪人的所有可用现金
参数:

  • percents (default: 100)
(7)PercentSizerInt

class backtrader.sizers.PercentSizerInt()
This sizer return percents of available cash in form of size truncated to an int
sizer取整数的int,返回可用现金的百分比 。
参数:

  • percents (default: 20)
(8)AllInSizerInt

class backtrader.sizers.AllInSizerInt()
This sizer return all available cash of broker with the size truncated to an int
sizer返回取整数broker的所有可用现金 。
参数:

  • percents (default: 100)

相关文章:

Backtrader 文档学习- Sizers

Backtrader 文档学习- Sizers 1.概述 智能仓位 Strategy提供了交易方法&#xff0c;即&#xff1a;buy&#xff0c;sell和close。看一下buy的定义&#xff1a; def buy(self, dataNone,sizeNone, priceNone, plimitNone,exectypeNone, validNone, tradeid0, **kwargs):注意&…...

基于YOLOv8算法的照片角度分类项目实践

目录 一、任务概述二、YOLOv8算法简介2.1 算法改进2.2 算法特点2.3 网络结构2.4 性能比较 三、工程实践3.1 安装算法框架库ultralytics3.2 库存照片预处理3.2.1 提取所有图片3.2.2 去除冗余的相同照片3.2.3 去除无车辆照片3.2.4 随机提取指定数量的图片 3.3 照片朝向分类3.3.1 …...

go语言进阶篇——面向对象(一)

什么是面向对象 在我们设计代码时&#xff0c;比如写一个算法题或者写一个问题结局办法时&#xff0c;我们常常会使用面向过程的方式来书写代码&#xff0c;面向过程主要指的是以解决问题为中心&#xff0c;按照一步步具体的步骤来编写代码或者调用函数&#xff0c;他在问题规…...

C#,栅栏油漆算法(Painting Fence Algorithm)的源代码

1 刷油漆问题 给定一个有n根柱子和k种颜色的围栏&#xff0c;找出油漆围栏的方法&#xff0c;使最多两个相邻的柱子具有相同的颜色。因为答案可以是大的&#xff0c;所以返回10^97的模。 计算结果&#xff1a; 2 栅栏油漆算法的源程序 using System; namespace Legalsoft.Tr…...

java_error_in_pycharm.hprof文件是什么?能删除吗?

java_error_in_pycharm.hprof文件是什么&#xff1f;能删除吗&#xff1f; &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;hprof格式文件介绍&#x1f333;&#x1f333;java_error_in_pycharm.hprof文件什么情况下能删除&#x1f333;&…...

LeetCode 491 递增序列

给定一个整型数组, 你的任务是找到所有该数组的递增子序列&#xff0c;递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]说明: 给定数组的长度不会超过15。 数组中的整数范围是 [-…...

考研/计算机二级数据结构刷题之顺序表

目录 第一题 顺序表的初始化&#xff0c;销毁&#xff0c;头插&#xff0c;尾插&#xff0c;头删&#xff0c;尾删&#xff0c;指定位置插入&#xff0c;指定删除以及打印 第二题 移除元素 题目链接&#xff1a; OJ链接 题目详解&#xff1a;移除元素 第三题&#xff1a;删…...

Git 代码协同的使用方法 for Azure DevOps

1. 登陆Azure 步骤1.1. VS Code&#xff0c;登陆Azure Cloud的Ubuntu环境&#xff0c;如下&#xff1a; 重点: 这里的Azure Cloud的用户名是YourAzureUserName&#xff0c;口令是YourAzurePassword 步骤1.2. 登陆Azure Cloud的Ubuntu环境后&#xff0c;配置Git账户信息&…...

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前&#xff0c;先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…...

PSM-Net根据Stereo图像生成depth图像

一、新建文件夹 在KITTI数据集下新建depth_0目录 二、激活anaconda环境 conda activate pt14py37三、修改submission.py文件 3.1 KITTI数据集路径 parser.add_argument(--datapath, default/home/njust/KITTI_DataSet/00/, helpselect model)3.2 深度图像输出路径 save…...

Mocaverse NFT 概览与数据分析

作者&#xff1a;stellafootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;Mocaverse NFT Collection Dashboard Mocaverse 是 Animoca Brands 推出的专属 NFT&#xff08;非同质化代币&#xff09;系列&#xff0c;包含 8,888 个独特的 "M…...

SpringBoot之事务源码解析

首先事务是基于aop的&#xff0c;如果不了解aop的&#xff0c;建议先去看下我关于aop的文章: Spring之aop源码解析  先说结论&#xff0c;带着结论看源码。首先&#xff0c;在bean的生命周期中&#xff0c; 执行实例化前置增强&#xff0c;会加载所有切面并放入缓存&#xff0…...

FPGA高端项目:解码索尼IMX327 MIPI相机转USB3.0 UVC 输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存UVC 时序USB3.0输出架构FPGA逻辑设计工程源码架构SDK软件工程源…...

基于高通滤波器的ECG信号滤波及心率统计matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 ECG信号简介 4.2 高通滤波器原理 4.3 心率统计 5.完整工程文件 1.课题概述 通过高通滤波器对ECG信号进行滤波&#xff0c;然后再统计其心率。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a…...

springCould中的gateway-从小白开始【9】

目录 1.&#x1f35f;网关是什么 2.&#x1f37f;gateway是什么 3.&#x1f95a;gateway能什么 4.&#x1f32d;核心概念 5.&#x1f9c2;工作流程 6.&#x1f9c8;实例 7.&#x1f953;gateway网关配置的方式 8.&#x1f373;配置动态路由 9.&#x1f9c7;pred…...

邮箱营销软件推荐?企业邮箱群发会限制吗?

邮箱营销平台怎么选择&#xff1f;哪种邮箱适合做外贸邮件群发&#xff1f; 邮箱营销凭借其精准触达、低成本和高回报的特点&#xff0c;依然是许多企业不可或缺的营销手段。该如何选择一款适合自己的工具呢&#xff1f;蜂邮EDM将为您推荐几款优秀的邮箱营销软件&#xff0c;并…...

编译原理实验3——自下而上的SLR1语法分析实现(包含画DFA转换图、建表、查表)

文章目录 实验目的实现流程定义DFA状态实现代码运行结果测试1测试2测试3 总结 实验目的 实现自下而上的SLR1语法分析&#xff0c;画出DFA图 实现流程 定义DFA状态 class DFA:def __init__(self, id_, item_, next_ids_):self.id_ id_ # 编号self.item_ item_ # productio…...

基于tomcat的https(ssl)双向认证

一、背景介绍 某个供应商服务需要部署到海外&#xff0c;如果海外多个地区需要部署多个服务&#xff0c;最好能实现统一登录&#xff0c;这样可以减轻用户的使用负担&#xff08;不用记录一堆密码&#xff09;。由于安全问题&#xff08;可能会泄露用户数据&#xff09;&#x…...

【iOS ARKit】3D人体姿态估计实例

与2D人体姿态检测一样&#xff0c;在ARKit 中&#xff0c;我们不必关心底层的人体骨骼关节点检测算法&#xff0c;也不必自己去调用这些算法&#xff0c;在运行使用 ARBodyTrackingConfiguration 配置的 ARSession 之后&#xff0c;基于摄像头图像的3D人体姿态估计任务也会启动…...

ROS2 CMakeLists.txt 和 package.xml

这里记录一下ROS2中功能包package.xml和CMakeLists.txt的格式。以LIO-SAM的ROS2版本为例&#xff1a; 一&#xff1a;CMakeLists.txt cmake_minimum_required(VERSION 3.5) project(lio_sam)if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)set(CMAKE_BUILD_TYPE…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...