[关闭]
@Channelchan 2018-11-28T18:04:57.000000Z 字数 13317 阅读 63359

仓位管理-fixed_loss

一、固定损失加仓法基础版

二、固定损失加仓法激进版

三、固定损失加仓法保守版


1.固定损失加仓法基础版

盈利加仓模型的一个缺点是加仓后把成本拉高,亏损几率增加。

固定损失加仓法:

(1)每次加仓都是固定仓位,为开仓的手数。

(2)第一次加仓后如果产生亏损并且总盈利变成0,则出场,停止这次交易,保证第一次加仓不会产生亏损

(3)若成功加仓,成功进行第二次加仓,使用第一次加仓与第二次加仓的总手数计算盈利率,如果等于0,则出场停止交 易,因为是固定手数,所以从第二次加仓开始,策略总能保持第一笔交易的盈利。

见 onBar ‘固定损失加仓模块’

用参数 nPos 控制加仓次数,参数 Ratio 控制加仓的进场位置,参数fixsize控制最大仓位手数

每次加仓手数为fixsize

算法如下(这里以盈利/亏损2%举例):

if 持多头仓位 and 当前加仓次数 nPos < 3:

if 加仓次数大于等于1:

    if 上一次加仓亏损1%:

        sell 全部多头头寸

if 盈利率达到2%:

    nPos = nPos+1

    加仓fixsize手

elif 持空头仓位 and 当前加仓次数 nPos < 3:

if 加仓次数大于等于1:

    if 上一次加仓亏损1%:

        cover 全部空头头寸

if 盈利率达到2%:

    nPos = nPos+1

    加仓fixsize手

当执行平仓信号,将 nPos 重置为 0

if 持有多头仓位 and 死叉:

nPos = 0

elif 持有空头仓位 and 金叉:

nPos = 0
  1. ## 大的价格除以小的价格减1
  2. lastOrder=self.transactionPrice[symbol]
  3. ## 多头亏损大于一个百分比
  4. (self.transactionPrice[symbol] - bar.close)/bar.close
  5. = lastOrder/bar.close-1
  6. ## 多头盈利大于一个百分比
  7. (bar.close-self.transactionPrice[symbol])/self.transactionPrice[symbol]
  8. = bar.close/lastOrder-1
  9. ## 空头亏损大于一个百分比
  10. (bar.close - self.transactionPrice[symbol])/self.transactionPrice[symbol]
  11. = bar.close/lastOrder-1
  12. ## 空头盈利大于一个百分比
  13. (self.transactionPrice[symbol] - bar.close)/bar.close
  14. = lastOrder/bar.close-1
  1. # 设置参数
  2. nPos = 0
  3. fixsize = 100
  4. transactionPrice = {}
  5. Ratio = 0.02
  6. # 设置变量
  7. self.transactionPrice = {s: 0 for s in self.symbolList}
  8. #在onBar中添加:
  9. lastOrder=self.transactionPrice[symbol]
  10. # 固定损失加仓模块______________________________________
  11. if (self.posDict[symbol+'_LONG']!=0 and self.nPos < 3): # 持有多头仓位并且加仓次数不超过3次
  12. if self.nPos >= 1: # 上一次的加仓之后亏损达到原来盈利比例的一半
  13. if lastOrder/bar.close-1 >= self.Ratio/2:
  14. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG']) # 全部头寸出场
  15. if bar.close/lastOrder-1>= self.Ratio: # 计算盈利比例,达到2%
  16. self.nPos += 1 # 加仓次数减少 1 次
  17. self.buy(symbol,bar.close*1.02,self.fixsize) # 加仓数量固定fixsize
  18. elif (self.posDict[symbol + "_SHORT"] != 0 and self.nPos < 3): # 持有空头仓位并且加仓次数不超过3次
  19. if self.nPos >= 1: # 上一次的加仓之后亏损达到原来盈利比例的一半
  20. if bar.close/lastOrder-1>= self.Ratio/2:
  21. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT']) # 全部头寸出场
  22. if lastOrder/bar.close-1 >= self.Ratio: # 计算盈利比例,达到2%
  23. self.nPos += 1 # 加仓次数减少 1 次
  24. self.short(symbol,bar.close*0.98,self.fixsize) # 加仓数量固定fixsize

2.固定损失加仓法激进版

盈利加仓模型的一个缺点是加仓后把成本拉高,亏损几率增加。

固定损失加仓法激进版:

(1)每次加仓都是当前仓位的手数,因此每次加仓后总仓位都变成加仓前的2倍(proportion倍)

(2)每一次加仓后如果产生亏损并且总盈利变成0,则出场,停止这次交易,保证加仓不会产生亏损,但有损失所有盈利的风险

见 onBar ‘固定损失加仓激进版模块’

用参数 nPos 控制加仓次数,参数 Ratio 控制加仓的进场位置,参数fixsize控制最大仓位手数,参数proportion控制每一次加仓的数量,即加仓后是加仓前的倍数,参数add_fixsize为每一次加仓的手数。

算法如下(这里以盈利/亏损2%举例):

if 持多头仓位 and 当前加仓次数 nPos< 3:

if 加仓次数大于等于1:

    if 所有盈利回测100%:

        sell 全部多头头寸

if 盈利率达到2%:

    nPos = nPos+1

    add_fixsize(加仓手数) = fixsize*proportion(加仓后总仓位) - self.fixsize(当前仓位)

    加仓add_fixsize手

    self.fixsize(更新当前仓位) = add_fixsize + self.fixsize

elif 持空头仓位 and 当前加仓次数 nPos< 3:

if 加仓次数大于等于1:

    if 所有盈利回测100%:

        cover 全部多头头寸

if 盈利率达到2%:

    nPos = nPos+1

    add_fixsize(加仓手数) = fixsize*proportion(加仓后总仓位) - self.fixsize(当前仓位)

    加仓add_fixsize手

    self.fixsize(更新当前仓位) = add_fixsize + self.fixsize

当执行平仓信号,将 nPos 重置为 0

if 持有多头仓位 and 死叉:

nPos = 0

elif 持有空头仓位 and 金叉:

nPos = 0
  1. # 设置参数
  2. nPos = 0
  3. fixsize = 100
  4. transactionPrice = {}
  5. Ratio = 0.02
  6. proportion = 2
  7. # 设置变量
  8. self.transactionPrice = {s: 0 for s in self.symbolList}
  9. #在onBar中添加:
  10. lastOrder=self.transactionPrice[symbol]
  11. # 固定损失加仓激进版模块______________________________________
  12. if (self.posDict[symbol+'_LONG']!=0 and self.nPos < 3): # 持有多头仓位并且加仓次数不超过3次
  13. if self.nPos >= 1: # 上一次的加仓亏损达到原来盈利比例的 1/proportion 倍
  14. if lastOrder/bar.close-1 >= self.Ratio/self.proportion:
  15. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG'])
  16. if bar.close/lastOrder-1>= self.Ratio: # 计算盈利比例,达到2%
  17. self.nPos += 1 # 加仓次数减少 1 次
  18. add_fixsize = self.fixsize*self.proportion - self.fixsize
  19. self.buy(symbol,bar.close*1.02, add_fixsize) # 加仓数量
  20. self.fixsize = add_fixsize + self.fixsize
  21. elif (self.posDict[symbol + "_SHORT"] != 0 and self.nPos < 3): # 持有空头仓位并且加仓次数不超过3次
  22. if self.nPos >= 1: # 上一次的加仓亏损达到原来盈利比例的 1/proportion 倍
  23. if bar.close/lastOrder-1>= self.Ratio/self.proportion:
  24. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT'])
  25. if lastOrder/bar.close-1 >= self.Ratio: # 计算盈利比例,达到2%
  26. self.nPos += 1 # 加仓次数减少 1 次
  27. add_fixsize = self.fixsize*self.proportion - self.fixsize
  28. self.short(symbol,bar.close*0.98,self.fixsize) # 目标仓位100手,分别加仓25手、20手、15手,10手
  29. self.fixsize = add_fixsize + self.fixsize

3.固定损失加仓法保守版

固定损失加仓法激进版在加仓的同时有损失盈利的风险。优化版本如下


固定损失加仓法保守版:

(1)在激进版的基础上,每一次正方向加仓同时,往反方向加2/1仓位,若发生回撤时,则反方向的仓位能盈利,若继续往正方向,则平掉反方向的头寸

见 onBar ‘固定损失加仓保守版模块’

用参数 nPos 控制加仓次数,参数 Ratio 控制加仓的进场位置,参数fixsize控制最大仓位手数,参数proportion控制每一次加仓的数量,即加仓后是加仓前的倍数,参数add_fixsize为每一次加仓的手数。

算法如下(这里以盈利/亏损2%举例):

if 持多头仓位 and 当前加仓次数 nPos < 3:

if 加仓次数大于等于1:

    if 所有盈利回测100%:

        sell 全部多头头寸

        cover 全部空头头寸

if 盈利率达到2%:

    nPos = nPos+1

    add_fixsize(加仓手数) = fixsize*proportion(加仓后总仓位) - self.fixsize(当前仓位)

    多头加仓 add_fixsize 手

    空头开仓 add_fixsize/2 手

    self.fixsize(更新当前仓位) = add_fixsize + self.fixsize

elif 持空头仓位 and 当前加仓次数 < 3:

if 加仓次数大于等于1:

    if 所有盈利回测100%:

        cover 全部空头头寸

        sell 全部多头头寸

if 盈利率达到2%:

    nPos = nPos+1

    add_fixsize(加仓手数) = fixsize*proportion(加仓后总仓位) - self.fixsize(当前仓位)

    空头加仓 add_fixsize 手

    多头开仓 add_fixsize/2 手

    self.fixsize(更新当前仓位) = add_fixsize + self.fixsize

当执行平仓信号,将 nPos 重置为 0

if 持有多头仓位 and 死叉:

nPos = 0

elif 持有空头仓位 and 金叉:

nPos = 0
  1. # 设置参数
  2. nPos = 0
  3. fixsize = 100
  4. transactionPrice = {}
  5. Ratio = 0.02
  6. proportion = 2
  7. # 设置变量
  8. self.transactionPrice = {s: 0 for s in self.symbolList}
  9. #在onBar中添加:
  10. lastOrder=self.transactionPrice[symbol]
  11. # 固定损失加仓保守版模块______________________________________
  12. if (self.posDict[symbol+'_LONG']!=0 and self.nPos < 3): # 持有多头仓位并且加仓次数不超过3次
  13. if self.nPos >= 1: # 上一次的加仓亏损达到原来盈利比例的 1/proportion 倍
  14. if lastOrder/bar.close-1 >= self.Ratio/self.proportion:
  15. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG'])
  16. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT'])
  17. elif bar.close/firstOrder-1>= self.Ratio/self.proportion:
  18. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT'])
  19. if bar.close/lastOrder-1>= self.Ratio: # 计算盈利比例,达到2%
  20. self.nPos += 1 # 加仓次数减少 1 次
  21. add_fixsize = self.fixsize*self.proportion - self.fixsize
  22. self.buy(symbol,bar.close*1.02, add_fixsize) # 加仓数量为
  23. self.short(symbol,bar.close*0.98, add_fixsize/2)
  24. self.fixsize = add_fixsize + self.fixsize
  25. elif (self.posDict[symbol + "_SHORT"] != 0 and self.nPos < 3): # 持有空头仓位并且加仓次数不超过3次
  26. if self.nPos >= 1: # 上一次的加仓亏损达到原来盈利比例的 1/proportion 倍
  27. if bar.close/lastOrder-1>= self.Ratio/self.proportion:
  28. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT'])
  29. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG'])
  30. elif lastOrder/bar.close-1 >= self.Ratio/self.proportion:
  31. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG'])
  32. if lastOrder/bar.close-1 >= self.Ratio: # 计算盈利比例,达到2%
  33. self.nPos += 1 # 加仓次数减少 1 次
  34. add_fixsize = self.fixsize*self.proportion - self.fixsize
  35. self.short(symbol,bar.close*0.98,self.fixsize) # 目标仓位100手,分别加仓25手、20手、15手,10手
  36. self.buy(symbol,bar.close*1.02, add_fixsize)
  37. self.fixsize = add_fixsize + self.fixsize

固定损失加仓案例

  1. """
  2. 固定损失加仓,这里的Demo是一个最简单的双均线策略实现
  3. """
  4. from __future__ import division
  5. from vnpy.trader.vtConstant import *
  6. from vnpy.trader.app.ctaStrategy.ctaBarManager import CtaTemplate
  7. import numpy as np
  8. import talib as ta
  9. from datetime import timedelta
  10. ########################################################################
  11. # 策略继承CtaTemplate
  12. class DoubleMaStrategy(CtaTemplate):
  13. """双指数均线策略Demo"""
  14. className = 'DoubleMaStrategy'
  15. author = 'ChannelCMT'
  16. # 策略参数
  17. barPeriod = 200
  18. fastWindow = 60 # 快速均线参数
  19. slowWindow = 120 # 慢速均线参数
  20. # 参数列表,保存了参数的名称
  21. paramList = ['name',
  22. 'className',
  23. 'author',
  24. 'fastWindow',
  25. 'slowWindow']
  26. # 变量列表,保存了变量的名称
  27. varList = ['barPeriod']
  28. nPos = 0
  29. fixsize = 100
  30. transactionPrice = {}
  31. Ratio = 0.02
  32. # 同步列表,保存了需要保存到数据库的变量名称
  33. syncList = ['posDict', 'eveningDict']
  34. #----------------------------------------------------------------------
  35. def __init__(self, ctaEngine, setting):
  36. # 首先找到策略的父类(就是类CtaTemplate),然后把DoubleMaStrategy的对象转换为类CtaTemplate的对象
  37. super().__init__(ctaEngine, setting)
  38. #----------------------------------------------------------------------
  39. def onInit(self):
  40. """初始化策略(必须由用户继承实现)"""
  41. self.writeCtaLog(u'双EMA演示策略初始化')
  42. # 生成Bar数组
  43. self.setArrayManagerSize(self.barPeriod)
  44. self.transactionPrice = {s: 0 for s in self.symbolList}
  45. self.mail("chushihuaaaaaaaaaaaaaaaaaaaaaaaaa")
  46. self.putEvent()
  47. #----------------------------------------------------------------------
  48. def onStart(self):
  49. """启动策略(必须由用户继承实现)"""
  50. self.writeCtaLog(u'双EMA演示策略启动')
  51. self.putEvent()
  52. #----------------------------------------------------------------------
  53. def onStop(self):
  54. """停止策略(必须由用户继承实现)"""
  55. self.writeCtaLog(u'策略停止')
  56. self.putEvent()
  57. #----------------------------------------------------------------------
  58. def onTick(self, tick):
  59. """收到行情TICK推送(必须由用户继承实现)"""
  60. pass
  61. #----------------------------------------------------------------------
  62. def onBar(self, bar):
  63. """收到Bar推送(必须由用户继承实现)"""
  64. symbol = bar.vtSymbol
  65. lastOrder=self.transactionPrice[symbol]
  66. # 固定损失加仓模块______________________________________
  67. if (self.posDict[symbol+'_LONG']!=0 and self.nPos < 3): # 持有多头仓位并且加仓次数不超过3次
  68. if self.nPos >= 1: # 上一次的加仓之后亏损达到原来盈利比例的一半
  69. if lastOrder/bar.close-1 >= self.Ratio/2:
  70. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG']) # 全部头寸出场
  71. if bar.close/lastOrder-1>= self.Ratio: # 计算盈利比例,达到2%
  72. self.nPos += 1 # 加仓次数减少 1 次
  73. self.buy(symbol,bar.close*1.02,self.fixsize) # 加仓数量固定fixsize
  74. elif (self.posDict[symbol + "_SHORT"] != 0 and self.nPos < 3): # 持有空头仓位并且加仓次数不超过3次
  75. if self.nPos >= 1: # 上一次的加仓之后亏损达到原来盈利比例的一半
  76. if bar.close/lastOrder-1>= self.Ratio/2:
  77. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT']) # 全部头寸出场
  78. if lastOrder/bar.close-1 >= self.Ratio: # 计算盈利比例,达到2%
  79. self.nPos += 1 # 加仓次数减少 1 次
  80. self.short(symbol,bar.close*0.98,self.fixsize) # 加仓数量固定fixsize
  81. # 发出状态更新事件
  82. self.putEvent()
  83. def on30MinBar(self, bar):
  84. """30分钟K线推送"""
  85. symbol = bar.vtSymbol
  86. am30 = self.getArrayManager(symbol, "30m")
  87. if not am30.inited:
  88. return
  89. # 计算策略需要的信号-------------------------------------------------
  90. fastMa = ta.EMA(am30.close, self.fastWindow)
  91. slowMa = ta.EMA(am30.close, self.slowWindow)
  92. crossOver = fastMa[-1]>slowMa[-1] and fastMa[-2]<=slowMa[-2] # 金叉上穿
  93. crossBelow = fastMa[-1]<slowMa[-1] and fastMa[-2]>=slowMa[-2] # 死叉下穿
  94. if crossOver:
  95. print('crossOver:',crossOver)
  96. elif crossBelow:
  97. print('crossBelow:',crossBelow)
  98. # 构建进出场逻辑-------------------------------------------------
  99. # 金叉和死叉的条件是互斥
  100. if crossOver:
  101. # 如果金叉时手头没有持仓,则直接做多
  102. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  103. self.buy(symbol, bar.close*1.02, self.fixsize*0.3)
  104. # 如果有空头持仓,则先平空,再做多
  105. elif self.posDict[symbol+'_SHORT'] >0:
  106. self.cancelAll()
  107. self.cover(symbol,bar.close*1.02, self.posDict[symbol+'_SHORT'])
  108. self.nPos = 0
  109. self.buy(symbol,bar.close*1.02, self.fixsize*0.3)
  110. # 死叉和金叉相反
  111. elif crossBelow :
  112. if (self.posDict[symbol+'_LONG']==0) and (self.posDict[symbol+'_SHORT']==0):
  113. self.short(symbol,bar.close*0.98, self.fixsize*0.3)
  114. elif self.posDict[symbol+'_LONG'] >0:
  115. self.cancelAll()
  116. self.sell(symbol,bar.close*0.98, self.posDict[symbol+'_LONG'])
  117. self.nPos = 0
  118. self.short(symbol,bar.close*0.98, self.fixsize*0.3)
  119. # 发出状态更新事件
  120. self.putEvent()
  121. #----------------------------------------------------------------------
  122. def onOrder(self, order):
  123. """收到委托变化推送(必须由用户继承实现)"""
  124. # 对于无需做细粒度委托控制的策略,可以忽略onOrder
  125. # print(u'出现未知订单,需要策略师外部干预,ID:%s, symbol:%s,direction:%s,offset:%s'% (order.vtOrderID, order.vtSymbol, order.direction, order.offset))
  126. pass
  127. #----------------------------------------------------------------------
  128. def onTrade(self, trade):
  129. """收到成交推送(必须由用户继承实现)"""
  130. symbol = trade.vtSymbol
  131. self.transactionPrice[symbol] = trade.price
  132. pass
  133. #----------------------------------------------------------------------
  134. def onStopOrder(self, so):
  135. """停止单推送"""
  136. pass

绩效测试

  1. from vnpy.trader.app.ctaStrategy.ctaBarManager import BacktestingEngine
  2. import pandas as pd
  3. def runBacktesting(strategyClass, settingDict,
  4. startDate, endDate, size, slippage, rate):
  5. engine = BacktestingEngine()
  6. engine.setBacktestingMode(engine.BAR_MODE)
  7. engine.setDatabase('VnTrader_1Min_Db')
  8. engine.setStartDate(startDate, initHours=200)
  9. engine.setEndDate(endDate)
  10. engine.setSize(size)
  11. engine.setSlippage(slippage)
  12. engine.setRate(rate)
  13. engine.initStrategy(strategyClass, settingDict)
  14. engine.setCapital(100000)
  15. engine.setLog(True, 'E://log//')
  16. engine.runBacktesting()
  17. #显示逐日回测结果
  18. engine.showDailyResult()
  19. #显示逐笔回测结果
  20. engine.showBacktestingResult()
  21. # 计算回测结果
  22. perfromance = engine.calculateDailyResult()
  23. perfromanceDf , result = engine.calculateDailyStatistics(perfromance)
  24. tradeReport = pd.DataFrame([obj.__dict__ for obj in engine.tradeDict.values()])
  25. tradeDf = tradeReport.set_index('dt')
  26. return perfromanceDf, tradeDf
  27. if __name__ == '__main__':
  28. # 同时传入信号与执行的数据
  29. performanceReport, tradeReport = \
  30. runBacktesting(DoubleMaStrategy, {'symbolList': ['BTCUSDT:binance']},
  31. '20181001 12:00', '20181031 16:00', 100, 0, 5/10000)
  32. # tradeReport.to_excel('BBandMa5MinStrategyReport.xlsx')
2018-11-15 17:14:00.236010  计算按日统计结果
2018-11-15 17:14:00.273987  ------------------------------
2018-11-15 17:14:00.273987  首个交易日:  2018-10-01 00:00:00
2018-11-15 17:14:00.273987  最后交易日:  2018-10-31 00:00:00
2018-11-15 17:14:00.273987  总交易日:   31
2018-11-15 17:14:00.273987  盈利交易日   12
2018-11-15 17:14:00.273987  亏损交易日:  8
2018-11-15 17:14:00.273987  起始资金:   100000
2018-11-15 17:14:00.273987  结束资金:   1,455,216.18
2018-11-15 17:14:00.273987  总收益率:   1,355.22%
2018-11-15 17:14:00.273987  年化收益:   10,492.0%
2018-11-15 17:14:00.273987  总盈亏:    1,355,216.18
2018-11-15 17:14:00.274987  最大回撤:   -496,430.72
2018-11-15 17:14:00.274987  百分比最大回撤: -201.73%
2018-11-15 17:14:00.274987  总手续费:   306,913.82
2018-11-15 17:14:00.274987  总滑点:    0.0
2018-11-15 17:14:00.274987  总成交金额:  613,827,650.0
2018-11-15 17:14:00.274987  总成交笔数:  18
2018-11-15 17:14:00.274987  日均盈亏:   43,716.65
2018-11-15 17:14:00.274987  日均手续费:  9,900.45
2018-11-15 17:14:00.274987  日均滑点:   0.0
2018-11-15 17:14:00.274987  日均成交金额: 19,800,891.94
2018-11-15 17:14:00.274987  日均成交笔数: 0.58
2018-11-15 17:14:00.274987  日均收益率:  7.79%
2018-11-15 17:14:00.274987  收益标准差:  88.92%
2018-11-15 17:14:00.275986  Sharpe Ratio:   1.36

2018-11-15 17:14:01.109477  策略回测绩效图已保存

output_12_3.png-36.2kB

2018-11-15 17:14:01.883788  计算回测结果
2018-11-15 17:14:01.890782  交割单已生成
2018-11-15 17:14:01.891780  ------------------------------
2018-11-15 17:14:01.891780  第一笔交易:  2018-10-04 22:30:00
2018-11-15 17:14:01.891780  最后一笔交易: 2018-10-31 15:58:00
2018-11-15 17:14:01.891780  总交易次数:  11
2018-11-15 17:14:01.891780  总盈亏:    1,314,045.31
2018-11-15 17:14:01.891780  最大回撤:   -1,065,331.1
2018-11-15 17:14:01.891780  平均每笔盈利: 119,458.66
2018-11-15 17:14:01.891780  平均每笔滑点: 0.0
2018-11-15 17:14:01.891780  平均每笔佣金: 31,644.06
2018-11-15 17:14:01.891780  胜率      36.36%
2018-11-15 17:14:01.891780  盈利交易平均值 731,392.53
2018-11-15 17:14:01.891780  亏损交易平均值 -230,217.83
2018-11-15 17:14:01.891780  盈亏比:    3.18
2018-11-15 17:14:02.622515  策略回测统计图已保存

output_12_5.png-36.6kB

2018-11-15 17:14:03.262126  计算按日统计结果

绩效报告

  1. tradeReport
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注