Backtrader 文档学习-Target Orders
Backtrader 文档学习-Target Orders
第五部分 ipython 代码中,有详细解释持仓价值Value的计算,算是彩蛋。
1. 概述
sizer不能决定操作是买还是卖,意味着需要一个新的概念,通过增加小智能层可以决定买卖,即通过持仓份额可以决定买卖操作。
这就是策略中order_target_xxx方法族的作用。受zipline的方法的启发,提供了简单指定最终target的机会,target实现:
- size 特定资产组合中的股票、合同数量
- value 投资组合中资产的货币单位价值
- percent 投资组合中资产价值的百分比(来自当前投资组合)
在这种情况下,关键是指定最终target,该方法决定操作是买入还是卖出。同样的逻辑适用于3种方法。order_target_size参数设置:
-
如果目标大于头寸,则发出买入指令,差值为目标-头寸大小 :
- Pos: 0, target: 7 -> buy(size=7 - 0) -> buy(size=7)
- Pos: 3, target: 7 -> buy(size=7 - 3) -> buy(size=4)
- Pos: -3, target: 7 -> buy(size=7 - -3) -> buy(size=10)
- Pos: -3, target: -2 -> buy(size=-2 - -3) -> buy(size=1)
-
如果目标小于头寸,则根据头寸大小-目标的差额发出卖出指令:
- Pos: 0, target: -7 -> sell(size=0 - -7) -> sell(size=7)
- Pos: 3, target: -7 -> sell(size=3 - -7) -> sell(size=10)
- Pos: -3, target: -7 -> sell(size=-3 - -7) -> sell(size=4)
- Pos: 3, target: 2 -> sell(size=3 - 2) -> sell(size=1)
当使用order_target_value确定价值时,投资组合中资产的当前价值和头寸规模都将被考虑在内,以决定最终的基础操作,理由是:
-
如果头寸规模为负(空头),目标价值必须大于当前价值,这意味着卖出更多
按这个逻辑操作:- If target > value and size >=0 -> buy
- If target > value and size < 0 -> sell
- If target < value and size >= 0 -> sell
- If target < value and size < 0 -> buy
order_target_percent 的逻辑与order_target_value的逻辑相同。考虑投资组合的当前总价值来确定资产的目标价值 。
2. 示例
示例中的逻辑相当简单,只是为了测试效果,规则如下:
- 在奇数月份(1月、3月……),order_target_value =day * 1000,模拟了一个不断增加的target 。
- 在偶数月份(2月、4月……),order_target_value = 31 - day ,模拟了一个递减的target 。
(1)order_target_size
0001 - 2005-01-03 - Position Size: 00 - Value 1000000.00
0001 - 2005-01-03 - Order Target Size: 03
0002 - 2005-01-04 - Position Size: 03 - Value 999994.39
0002 - 2005-01-04 - Order Target Size: 04
0003 - 2005-01-05 - Position Size: 04 - Value 999992.48
0003 - 2005-01-05 - Order Target Size: 05
0004 - 2005-01-06 - Position Size: 05 - Value 999988.79
0004 - 2005-01-06 - Order Target Size: 06
0005 - 2005-01-07 - Position Size: 06 - Value 999991.41
0005 - 2005-01-07 - Order Target Size: 07
0006 - 2005-01-10 - Position Size: 07 - Value 999993.89
0006 - 2005-01-10 - Order Target Size: 10
0007 - 2005-01-11 - Position Size: 10 - Value 999987.32
0007 - 2005-01-11 - Order Target Size: 11
0008 - 2005-01-12 - Position Size: 11 - Value 999992.38
0008 - 2005-01-12 - Order Target Size: 12
0009 - 2005-01-13 - Position Size: 12 - Value 999982.68
... ...
0021 - 2005-02-01 - Position Size: 31 - Value 999954.68
0021 - 2005-02-01 - Order Target Size: 30
0022 - 2005-02-02 - Position Size: 30 - Value 999979.65
0022 - 2005-02-02 - Order Target Size: 29
0023 - 2005-02-03 - Position Size: 29 - Value 999966.33
0023 - 2005-02-03 - Order Target Size: 28
0024 - 2005-02-04 - Position Size: 28 - Value 999963.99
0024 - 2005-02-04 - Order Target Size: 27
0025 - 2005-02-07 - Position Size: 27 - Value 999949.19
0025 - 2005-02-07 - Order Target Size: 24
0026 - 2005-02-08 - Position Size: 24 - Value 999947.06
1月份,该target 从第一个交易日3日开始,仓位3,并不断增加。位置大小最初从0移动到3,然后以1为增量。 1月结束最后一个订单目标是31。
当进入2月1日时头寸规模,此时新的target被要求为30,并随着头寸的减少而递减1。

(2) order_target_value
0001 - 2005-01-03 - Position Size: 00 - Value 1000000.00
0001 - 2005-01-03 - Order Target Size: 03
0002 - 2005-01-04 - Position Size: 03 - Value 999994.39
0002 - 2005-01-04 - Order Target Size: 04
0003 - 2005-01-05 - Position Size: 04 - Value 999992.48
0003 - 2005-01-05 - Order Target Size: 05
0004 - 2005-01-06 - Position Size: 05 - Value 999988.79
0004 - 2005-01-06 - Order Target Size: 06
0005 - 2005-01-07 - Position Size: 06 - Value 999991.41
0005 - 2005-01-07 - Order Target Size: 07
0006 - 2005-01-10 - Position Size: 07 - Value 999993.89
0006 - 2005-01-10 - Order Target Size: 10
0007 - 2005-01-11 - Position Size: 10 - Value 999987.32
... ...
0020 - 2005-01-31 - Position Size: 28 - Value 999968.70
0020 - 2005-01-31 - Order Target Size: 31
0021 - 2005-02-01 - Position Size: 31 - Value 999954.68
0021 - 2005-02-01 - Order Target Size: 30
0022 - 2005-02-02 - Position Size: 30 - Value 999979.65
0022 - 2005-02-02 - Order Target Size: 29
0023 - 2005-02-03 - Position Size: 29 - Value 999966.33
0023 - 2005-02-03 - Order Target Size: 28
0024 - 2005-02-04 - Position Size: 28 - Value 999963.99
0024 - 2005-02-04 - Order Target Size: 27
0025 - 2005-02-07 - Position Size: 27 - Value 999949.19
0025 - 2005-02-07 - Order Target Size: 24

(3)order_target_percent
0001 - 2005-01-03 - Position Size: 00 - Value 1000000.00
0001 - 2005-01-03 - data percent 0.00
0001 - 2005-01-03 - Order Target Percent: 0.03
0002 - 2005-01-04 - Position Size: 785 - Value 998532.05
0002 - 2005-01-04 - data percent 0.03
0002 - 2005-01-04 - Order Target Percent: 0.04
0003 - 2005-01-05 - Position Size: 1091 - Value 998007.44
0003 - 2005-01-05 - data percent 0.04
0003 - 2005-01-05 - Order Target Percent: 0.05
0004 - 2005-01-06 - Position Size: 1381 - Value 996985.64
0004 - 2005-01-06 - data percent 0.05
0004 - 2005-01-06 - Order Target Percent: 0.06
0005 - 2005-01-07 - Position Size: 1688 - Value 997708.36
0005 - 2005-01-07 - data percent 0.06
0005 - 2005-01-07 - Order Target Percent: 0.07
0006 - 2005-01-10 - Position Size: 1942 - Value 998397.32
0006 - 2005-01-10 - data percent 0.07
0006 - 2005-01-10 - Order Target Percent: 0.10
... ...
0020 - 2005-01-31 - Position Size: 7985 - Value 991966.28
0020 - 2005-01-31 - data percent 0.28
0020 - 2005-01-31 - Order Target Percent: 0.31
0021 - 2005-02-01 - Position Size: 8733 - Value 988008.94
0021 - 2005-02-01 - data percent 0.31
0021 - 2005-02-01 - Order Target Percent: 0.30
0022 - 2005-02-02 - Position Size: 8530 - Value 995005.45
0022 - 2005-02-02 - data percent 0.30
0022 - 2005-02-02 - Order Target Percent: 0.29
0023 - 2005-02-03 - Position Size: 8120 - Value 991240.75
0023 - 2005-02-03 - data percent 0.29
0023 - 2005-02-03 - Order Target Percent: 0.28
0024 - 2005-02-04 - Position Size: 7910 - Value 990607.25
0024 - 2005-02-04 - data percent 0.28

3. 代码
from __future__ import (absolute_import, division, print_function,unicode_literals)import argparse
from datetime import datetimeimport backtrader as btclass TheStrategy(bt.Strategy):'''This strategy is loosely based on some of the examples from the VanK. Tharp book: *Trade Your Way To Financial Freedom*. The logic:- Enter the market if:- The MACD.macd line crosses the MACD.signal line to the upside- The Simple Moving Average has a negative direction in the last xperiods (actual value below value x periods ago)- Set a stop price x times the ATR value away from the close- If in the market:- Check if the current close has gone below the stop price. If yes,exit.- If not, update the stop price if the new stop price would be higherthan the current'''params = (('use_target_size', False),('use_target_value', False),('use_target_percent', False),)def notify_order(self, order):if order.status == order.Completed:passif not order.alive():self.order = None # indicate no order is pendingdef start(self):self.order = None # sentinel to avoid operrations on pending orderdef next(self):dt = self.data.datetime.date()portfolio_value = self.broker.get_value()print('%04d - %s - Position Size: %02d - Value %.2f' %(len(self), dt.isoformat(), self.position.size, portfolio_value))data_value = self.broker.get_value([self.data])if self.p.use_target_value:print('%04d - %s - data value %.2f' %(len(self), dt.isoformat(), data_value))elif self.p.use_target_percent:port_perc = data_value / portfolio_valueprint('%04d - %s - data percent %.2f' %(len(self), dt.isoformat(), port_perc))if self.order:return # pending order executionsize = dt.dayif (dt.month % 2) == 0:size = 31 - sizeif self.p.use_target_size:target = sizeprint('%04d - %s - Order Target Size: %02d' %(len(self), dt.isoformat(), size))self.order = self.order_target_size(target=size)elif self.p.use_target_value:value = size * 1000print('%04d - %s - Order Target Value: %.2f' %(len(self), dt.isoformat(), value))self.order = self.order_target_value(target=value)elif self.p.use_target_percent:percent = size / 100.0print('%04d - %s - Order Target Percent: %.2f' %(len(self), dt.isoformat(), percent))self.order = self.order_target_percent(target=percent)def runstrat(args=None):args = parse_args(args)cerebro = bt.Cerebro()cerebro.broker.setcash(args.cash)dkwargs = dict()if args.fromdate is not None:dkwargs['fromdate'] = datetime.strptime(args.fromdate, '%Y-%m-%d')if args.todate is not None:dkwargs['todate'] = datetime.strptime(args.todate, '%Y-%m-%d')# datadata = bt.feeds.YahooFinanceCSVData(dataname=args.data, **dkwargs)cerebro.adddata(data)# strategycerebro.addstrategy(TheStrategy,use_target_size=args.target_size,use_target_value=args.target_value,use_target_percent=args.target_percent)cerebro.run()if args.plot:pkwargs = dict(style='bar')if args.plot is not True: # evals to True but is not Truenpkwargs = eval('dict(' + args.plot + ')') # args were passedpkwargs.update(npkwargs)cerebro.plot(**pkwargs)def parse_args(pargs=None):parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,description='Sample for Order Target')parser.add_argument('--data', required=False,default='./datas/yhoo-1996-2015.txt',help='Specific 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=1000000,help='Ending date in YYYY-MM-DD format')pgroup = parser.add_mutually_exclusive_group(required=True)pgroup.add_argument('--target-size', required=False, action='store_true',help=('Use order_target_size'))pgroup.add_argument('--target-value', required=False, action='store_true',help=('Use order_target_value'))pgroup.add_argument('--target-percent', required=False,action='store_true',help=('Use order_target_percent'))# 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()
4. Help
python ./order_target.py --help
usage: order_target.py [-h] [--data DATA] [--fromdate FROMDATE][--todate TODATE] [--cash CASH](--target-size | --target-value | --target-percent)[--plot [kwargs]]Sample for Order Targetoptional arguments:-h, --help show this help message and exit--data DATA Specific data to be read in (default:./datas/yhoo-1996-2015.txt)--fromdate FROMDATE Starting date in YYYY-MM-DD format (default:2005-01-01)--todate TODATE Ending date in YYYY-MM-DD format (default: 2006-12-31)--cash CASH Ending date in YYYY-MM-DD format (default: 1000000)--target-size Use order_target_size (default: False)--target-value Use order_target_value (default: False)--target-percent Use order_target_percent (default: False)--plot [kwargs], -p [kwargs]Plot the read data applying any kwargs passed Forexample: --plot style="candle" (to plot candles)(default: None)
5.ipython代码
只加载3个月的数据,增加了说明:
from __future__ import (absolute_import, division, print_function,unicode_literals)from datetime import datetimeimport backtrader as bt%matplotlib inlineclass TheStrategy(bt.Strategy):'''This strategy is loosely based on some of the examples from the VanK. Tharp book: *Trade Your Way To Financial Freedom*. The logic:- Enter the market if:- The MACD.macd line crosses the MACD.signal line to the upside- The Simple Moving Average has a negative direction in the last xperiods (actual value below value x periods ago)- Set a stop price x times the ATR value away from the close- If in the market:- Check if the current close has gone below the stop price. If yes,exit.- If not, update the stop price if the new stop price would be higherthan the current'''params = (('use_target_size', False),('use_target_value', False),('use_target_percent', False),)def notify_order(self, order):if order.status == order.Completed:pass# 没有挂起的order ,order置空if not order.alive():self.order = None # indicate no order is pendingdef start(self):# 避免有挂起order未处理,置空 self.order = None # sentinel to avoid operrations on pending orderdef next(self):# 当前data的日期,去时分秒dt = self.data.datetime.date()# 投资组合货币价值 ,如何计算出来的??portfolio_value = self.broker.get_value()# 处理data长度 ,日期 ,仓位 ,组合价值# self.p.use_target_size 默认打印position size# 按 target_size 交易print('%04d - %s - Position Size: %02d - Value %.2f' %(len(self), dt.isoformat(), self.position.size, portfolio_value))# get_value 带参数,用当前的收盘价计算持仓价值# data_value = self.data.close[0] * self.position.sizedata_value = self.broker.get_value([self.data])print('datavalue: %.2f, open:%.2f, close:%.2f,close-open:%.2f' % (data_value,self.data.open[0],self.data.close[0],self.data.close[0]-self.data.open[0]))# 按 target_value 交易if self.p.use_target_value:print('%04d - %s - data value %.2f' %(len(self), dt.isoformat(), data_value))# 按 target_percent 交易elif self.p.use_target_percent:port_perc = data_value / portfolio_valueprint('%04d - %s - data percent %.2f' %(len(self), dt.isoformat(), port_perc))# 如果有挂起订单 ,不做后续处理,一个订单处理完,再开始下一个订单if self.order:return # pending order execution# 仓位设置为日期的天size = dt.day# 如果是偶数月if (dt.month % 2) == 0:# 仓位递减交易size = 31 - size# target_size 模式if self.p.use_target_size:target = sizeprint('%04d - %s - Order Target Size: %02d' %(len(self), dt.isoformat(), size))self.order = self.order_target_size(target=size)# target_value 模式elif self.p.use_target_value:value = size * 1000print('%04d - %s - Order Target Value: %.2f' %(len(self), dt.isoformat(), value))self.order = self.order_target_value(target=value)# target_percent 模式elif self.p.use_target_percent:percent = size / 100.0print('%04d - %s - Order Target Percent: %.2f' %(len(self), dt.isoformat(), percent))self.order = self.order_target_percent(target=percent)def runstrat(args=None):# define parameterparam_fromdate = '2005-01-01'param_todate = '2005-03-31'param_data = './datas/yhoo-1996-2015.txt'param_cash = 100000# set target parameter param_target_size = Trueparam_target_value = Falseparam_target_percent = False# set plot param_plot = Truecerebro = bt.Cerebro()cerebro.broker.setcash(param_cash)# 数据加载参数字典dkwargs = dict()if param_fromdate is not None:dkwargs['fromdate'] = datetime.strptime(param_fromdate, '%Y-%m-%d')if param_todate is not None:dkwargs['todate'] = datetime.strptime(param_todate, '%Y-%m-%d')# datadata = bt.feeds.YahooFinanceCSVData(dataname=param_data, **dkwargs)cerebro.adddata(data)# strategycerebro.addstrategy(TheStrategy,use_target_size=param_target_size,use_target_value=param_target_value,use_target_percent=param_target_percent)cerebro.run()if param_plot:# 绘图参数字典pkwargs = dict(style='bar')if param_plot is not True: # evals to True but is not Truenpkwargs = eval('dict(' + param_plot + ')') # args were passedpkwargs.update(npkwargs)cerebro.plot(iplot=False,**pkwargs)if __name__ == '__main__':runstrat()
(1)order_target_size
输出结果:
0001 - 2005-01-03 - Position Size: 00 - Value 100000.00
datavalue: 0.00, open:38.36, close:38.18,close-open:-0.18
0001 - 2005-01-03 - Order Target Size: 03
0002 - 2005-01-04 - Position Size: 03 - Value 99994.39
datavalue: 109.74, open:38.45, close:36.58,close-open:-1.87
0002 - 2005-01-04 - Order Target Size: 04
0003 - 2005-01-05 - Position Size: 04 - Value 99992.48
datavalue: 144.52, open:36.69, close:36.13,close-open:-0.56
0003 - 2005-01-05 - Order Target Size: 05
0004 - 2005-01-06 - Position Size: 05 - Value 99988.79
datavalue: 177.15, open:36.32, close:35.43,close-open:-0.89
0004 - 2005-01-06 - Order Target Size: 06
0005 - 2005-01-07 - Position Size: 06 - Value 99991.41
datavalue: 215.76, open:35.99, close:35.96,close-open:-0.03
0005 - 2005-01-07 - Order Target Size: 07
0006 - 2005-01-10 - Position Size: 07 - Value 99993.89
datavalue: 254.24, open:36.00, close:36.32,close-open:0.32
0006 - 2005-01-10 - Order Target Size: 10
0007 - 2005-01-11 - Position Size: 10 - Value 99987.32
datavalue: 356.60, open:36.31, close:35.66,close-open:-0.65
0007 - 2005-01-11 - Order Target Size: 11
0008 - 2005-01-12 - Position Size: 11 - Value 99992.38
datavalue: 397.54, open:35.88, close:36.14,close-open:0.26
0008 - 2005-01-12 - Order Target Size: 12
0009 - 2005-01-13 - Position Size: 12 - Value 99982.68
datavalue: 423.96, open:36.12, close:35.33,close-open:-0.79
0009 - 2005-01-13 - Order Target Size: 13
0010 - 2005-01-14 - Position Size: 13 - Value 99999.96
datavalue: 477.10, open:35.86, close:36.70,close-open:0.84
0010 - 2005-01-14 - Order Target Size: 14
0011 - 2005-01-18 - Position Size: 14 - Value 100006.28
datavalue: 520.52, open:37.10, close:37.18,close-open:0.08
0011 - 2005-01-18 - Order Target Size: 18
0012 - 2005-01-19 - Position Size: 18 - Value 99989.54
datavalue: 656.10, open:38.08, close:36.45,close-open:-1.63
0012 - 2005-01-19 - Order Target Size: 19
0013 - 2005-01-20 - Position Size: 19 - Value 99977.87
datavalue: 679.82, open:35.39, close:35.78,close-open:0.39
0013 - 2005-01-20 - Order Target Size: 20
0014 - 2005-01-21 - Position Size: 20 - Value 99967.98
datavalue: 706.00, open:36.07, close:35.30,close-open:-0.77
0014 - 2005-01-21 - Order Target Size: 21
0015 - 2005-01-24 - Position Size: 21 - Value 99939.03
datavalue: 712.53, open:35.48, close:33.93,close-open:-1.55
0015 - 2005-01-24 - Order Target Size: 24
0016 - 2005-01-25 - Position Size: 24 - Value 99939.81
datavalue: 816.96, open:34.55, close:34.04,close-open:-0.51
0016 - 2005-01-25 - Order Target Size: 25
0017 - 2005-01-26 - Position Size: 25 - Value 99974.89
datavalue: 886.75, open:34.71, close:35.47,close-open:0.76
0017 - 2005-01-26 - Order Target Size: 26
0018 - 2005-01-27 - Position Size: 26 - Value 99955.74
datavalue: 902.98, open:35.38, close:34.73,close-open:-0.65
0018 - 2005-01-27 - Order Target Size: 27
0019 - 2005-01-28 - Position Size: 27 - Value 99952.60
datavalue: 934.74, open:34.90, close:34.62,close-open:-0.28
0019 - 2005-01-28 - Order Target Size: 28
0020 - 2005-01-31 - Position Size: 28 - Value 99968.70
datavalue: 985.88, open:35.04, close:35.21,close-open:0.17
0020 - 2005-01-31 - Order Target Size: 31
0021 - 2005-02-01 - Position Size: 31 - Value 99954.68
datavalue: 1077.25, open:35.13, close:34.75,close-open:-0.38
0021 - 2005-02-01 - Order Target Size: 30
0022 - 2005-02-02 - Position Size: 30 - Value 99979.65
datavalue: 1066.20, open:36.02, close:35.54,close-open:-0.48
0022 - 2005-02-02 - Order Target Size: 29
0023 - 2005-02-03 - Position Size: 29 - Value 99966.33
datavalue: 1017.61, open:35.27, close:35.09,close-open:-0.18
0023 - 2005-02-03 - Order Target Size: 28
0024 - 2005-02-04 - Position Size: 28 - Value 99963.99
datavalue: 980.56, open:34.71, close:35.02,close-open:0.31
0024 - 2005-02-04 - Order Target Size: 27
分析Value:
看value,如何计算出来的 ?每个人都有疑问 ?
增加了一行过程计算数据 :
datavalue: 109.74, open:38.45, close:36.58,close-open:-1.87
经过一下午研究,在Excel中拼凑计算,终于和BT数据一致了:

Excel模拟计算下载
相关文章:
Backtrader 文档学习-Target Orders
Backtrader 文档学习-Target Orders 第五部分 ipython 代码中,有详细解释持仓价值Value的计算,算是彩蛋。 1. 概述 sizer不能决定操作是买还是卖,意味着需要一个新的概念,通过增加小智能层可以决定买卖,即通过持仓份…...
QT发生弹出警告窗口
QTC开发程序弹出警告窗口,如上图 实施代码: #include <QMessageBox> int main() {// 在发生错误的地方QMessageBox::critical(nullptr, "错误", "发生了一个错误,请检查您的操作。");}上面的文字可以更改&#x…...
vue3使用特殊字符@、~代替路径src
在vite.config.js中引入 import { resolve } from pathexport default defineConfig({resolve:{alias:{~:resolve(__dirname,src)}} })vue3使用特殊字符、~代替路径src_vue3 ~/-CSDN博客...
Java中的HTTPS通信
在Java中实现HTTPS通信,主要涉及到SSL/TLS协议的使用,用于提供数据传输的安全性。下面我们将深入探讨如何使用Java进行HTTPS通信。 一、基本概念 HTTPS,全称为Hypertext Transfer Protocol Secure,是HTTP的安全版本。它使用SSL/…...
威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件
文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣…...
Ubuntu上安装部署Qt
首先需要下载对应的虚拟机软件和ubuntu镜像,虚拟机软件使用VMware或者Virtual Box都行,我用的是前者,这里是VMware的下载链接:下载 VMware Workstation Pro | CN。Ubuntu镜像推荐去清华的网站下载:Index of /ubuntu-re…...
MySQL的`FOR UPDATE`详解
MySQL的FOR UPDATE详解 欢迎阅读本博客,今天我们将深入探讨MySQL中的FOR UPDATE语句,它用于在事务中锁定选择的数据行,确保在事务结束前其他事务无法修改这些数据。 1. FOR UPDATE基础 FOR UPDATE是用于SELECT语句的一种选项,它…...
计算机网络 第4章(网络层)
系列文章目录 计算机网络 第1章(概述) 计算机网络 第2章(物理层) 计算机网络 第3章(数据链路层) 计算机网络 第4章(网络层) 计算机网络 第5章(运输层) 计算机…...
HDD的烦恼:HAMR会让SMR黯然失色吗?
HDD相关阅读参考: HDD回暖于2024,与SSD决战于2028 HDD最后的冲刺:大容量硬盘的奋力一搏 叠瓦式磁记录技术(SMR)自20世纪90年代起开始研究,于2010年后逐渐商业化应用于高密度硬盘。该技术的核心理念在于通…...
linux安装docker(入门一)
环境:centos 7(linux) 网站 官网: https://docs.docker.com/ Docker Hub 网站: https://hub.docker.com/ 容器官方概述 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &…...
Node.js中fs模块
fs模块是Node.js中的一个核心模块,全称为File System(文件管理系统)。该模块专门用来操作系统中的文件,常用的操作方式是对文件的读取和写入。 fs模块的API大都提供三种操作方式: 同步操作文件:代码会被阻…...
google-webrtc 原理
Google WebRtc Android 使用详解(包括客户端和服务端代码) - 知乎 (zhihu.com) 【记】Android使用WebRTC未释放资源导致的内存泄露 - 掘金 (juejin.cn)...
uniapp 框架搭建及使用
uniapp官方文档 uview官网文档 前期工作: 1.下载Hbuilder X编辑器;2.熟悉uniapp的相关文档;3.查找合适的UI组件库,我使用的是uview(适配H5和小程序) 创建uniapp 新建: 新项目的话打开Hbuilder X选择项目&…...
嵌入式软件工程师面试题——2025校招社招通用(计算机网络篇)(三十二)
说明: 面试群,群号: 228447240面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但…...
《WebKit 技术内幕》学习之十一(4):多媒体
4 WebRTC 4.1 历史 相信读者都有过使用Tencent QQ或者FaceTime进行视频通话的经历,这样的应用场景相当典型和流行,但是基本上来说它们都是每个公司推出的私有产品,而且通信等协议也都是保密的,这使得一种产品的用户基本上不可能…...
k8s基础知识
理解docker [二] - namespace - 知乎 Kubernetes Controller 机制详解(一)-赵化冰的博客 | Zhaohuabing Blog K8S之自定义Controller - 知乎 Controller - K8S - 知乎 https://coolshell.cn/articles/17010.html/comment-page-2#comment-2133157 ht…...
Docker容器引擎(3)
目录 一.Docker 镜像的创建 1.基于现有镜像创建 2.基于本地模板创建 3.基于Dockerfile创建: Dockerfile 操作常用的指令: ADD 和 COPY 的区别? CMD 和 ENTRYPOINT 的区别? 容器启动命令的优先级 如…...
【Android12】Android Framework系列---Adb和PMS安装apk源码流程
Adb和PMS安装apk源码流程 adb install命令 通过adb install命令可以将apk安装到Android系统(注意:特定类型的apk,比如persist类型是无法通过adb安装的) 下述命令中adb解析install命令,并调用Android PackageManagerS…...
web漏洞总结大全(基础)
前言 本文章是和cike_y师傅一起写的,cike_y博客:https://blog.csdn.net/weixin_53912233?typeblog 也欢迎大家对本文章进行补充和指正,共同维护这个项目,本文的github项目地址: https://github.com/baimao-box/Sum…...
获取双异步返回值时,如何保证主线程不阻塞?
目录 一、前情提要二、JDK8的CompletableFuture1、ForkJoinPool2、从ForkJoinPool和ThreadPoolExecutor探索CompletableFuture和Future的区别 三、通过CompletableFuture优化 “通过Future获取异步返回值”1、通过Future获取异步返回值关键代码(1)将异步…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
