赌博圈有一种投资策略叫马丁策略,也是我接触的第一个策略,该策略的核心思想是在每次亏损后增加投资金额,以期望在未来的胜利中弥补之前的亏损。
马丁策略的一般步骤是:
1.设定初始投资金额:首先,您需要确定初始的投资金额。这通常是您愿意承担的风险范围内的金额。
2.下注:使用初始投资金额进行下注或投资。例如,在赌博中,您可以将初始投资金额下注在一场比赛或赌局中。在交易市场中,您可以使用初始投资金额购买某种资产。
3.亏损时加注:如果您的下注或投资造成亏损,根据马丁策略,您需要在下一次下注或投资时增加投资金额。通常,加注的倍数是固定的,例如2倍或2的幂次方。
4.胜利时重置:如果您的下注或投资带来了盈利,根据马丁策略,您需要将投资金额重置为初始金额,并从头开始。
5.重复步骤2至4:根据马丁策略,您需要重复进行下注或投资、亏损时加注、胜利时重置的步骤,直到达到预设的目标或停止条件。
代码实现起来我也门清:
1.首先自定义的可调节的策略属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| """ 初始化趋势跟踪策略
参数: - capital: 初始资本 - logger: 日志记录器 """ #### 初始化策略参数
self.capital = capital """ 初始资本 """
self.total_position = 0 """ 当前仓位总数量(单位:币) """
self.total_quantity = 0 """ 当前仓位总价值(单位:U) """
self.avg_price = 0 """ 当前仓位平均价(单位:U) """
self.profit = 0 """ 累计盈亏(单位:U) """
self.trade_count = 0 """ 交易次数 """
self.last_price = None """ 最新的价格(单位:U) """
self.strategy_direction = None """ 最新的趋势方向 """
self.direction = None """ 当前仓位方向 buy or sell """
self.last_additional_entry_price = None """ 最后一次加仓价格(单位:U) """
self.frist_position_size = None """ 首次开仓的仓位大小(单位:U) """ self.logger = logger self.precision_price = 1 """ 价格精度(单位:U) """ self.precision_quantity = 6 """ 数量精度(单位:币) """ self.transaction_commission = 0.004 """ 交易手续费 """ ################### ####策略参数设置#### ################### self.max_additional_entry = 10 """ 仓位最大加仓次数 """
self.initial_position_size = 0.01 """ 首次开仓的仓位占总资金的比例 """
self.take_profit_ratio = 0.01 """ 止盈比例 """
self.stop_loss_ratio = 0.01 """ 止损价格百分比 """
self.additional_entry_multiplier = 2 """ 加仓倍数 """
self.additional_ratio = 0.001 """ 加仓移动百分比 """
self.max_lever = 10 """ 仓位最大杠杆数,影响加仓 """
|
在策略中,每个属性设置项都会极大地影响运行结果。
2.接收实时的价格和策略方向
此处的策略不是马丁,马丁本身不会生产出任何动态方向,我的计划是与目前我运行的策略方向进行结合使用,根据方向,止损位来对马丁进行调整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def update_price(self, price, direction): """ 更新价格和趋势方向 参数: - price: 最新价格 - direction: 策略的趋势方向 """ self.strategy_direction = direction #更新方向到全局 self.last_price = price #更新价格到全局 if self.total_position == 0: #判断目前仓位 self.open_position(direction,True) #开仓 else: self.check_take_profit() #止盈 self.check_additional_entry() #加仓 self.check_stop_loss() #止损
|
3.开仓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| def open_position(self,direction,needtrading): """ 开仓操作:根据趋势方向确定开仓数量和开仓平均价
参数: - direction: 趋势方向 - needtrading: 是否需要进行交易 """ self.frist_position_size = round(self.capital * self.initial_position_size , self.precision_quantity) #根据设置的首单比例和总资金计算开仓仓位 self.total_quantity = self.frist_position_size self.total_position = round(self.total_quantity / self.last_price, self.precision_quantity) #换算出数量 self.avg_price = round(self.total_quantity / self.total_position, self.precision_price) #计算出仓位的平均价 self.direction = direction self.last_additional_entry_price = self.last_price self.trade_count = 1 if needtrading: #止盈止损会有预平仓计算 self.logger.log_run('\n--------------\n开仓\n加仓数量: {}'.format(self.total_position)+'\n加仓价值: {}'.format(self.total_quantity)+' \n开仓方向: '+self.direction+' \n开仓价: {}'.format(self.last_price)) self.self_check()
|
此处我用self.logger.log_run代表下单信息
4.加仓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| def check_additional_entry(self): """ 加仓操作:根据趋势方向触发加仓 """ if self.total_position != 0 and abs(self.total_position) < (self.capital * self.max_lever) and self.trade_count < self.max_additional_entry: #加仓的硬性条件 # if (self.last_price - self.avg_price) / self.avg_price < -self.additional_ratio and self.strategy_direction == 'buy' and self.direction == 'buy':#根据浮亏加仓 if (self.last_price - self.last_additional_entry_price) / self.last_additional_entry_price < -self.additional_ratio and self.strategy_direction == 'buy' and self.direction == 'buy': #根据跌幅加仓 self.trade_count += 1 add_quantity = round(self.frist_position_size * (self.additional_entry_multiplier ** (self.trade_count - 1)), 2) #需要加仓的资金 add_position = round(add_quantity / self.last_price, self.precision_quantity) #需要加仓的数量 self.total_position += add_position self.total_quantity += add_quantity self.last_additional_entry_price = self.last_price self.avg_price = round(self.total_quantity / self.total_position, self.precision_price) self.logger.log_run('\n--------------\n加仓['+self.trade_count+']'+'\n加仓数量: {}'.format(add_position)+'\n加仓价值: {}'.format(add_quantity)+'\n加仓方向: '+self.direction+'\n加仓价: {}'.format(self.last_price)) self.self_check() # elif (self.last_price - self.avg_price) / self.avg_price > self.additional_ratio and self.strategy_direction == 'sell' and self.direction == 'sell': #根据浮亏加仓 elif (self.last_price - self.last_additional_entry_price) / self.last_additional_entry_price > self.additional_ratio and self.strategy_direction == 'sell' and self.direction == 'sell': #根据跌幅加仓 self.trade_count += 1 add_quantity = round(self.frist_position_size * (self.additional_entry_multiplier ** (self.trade_count - 1)), 2) #需要加仓的资金 add_position = round(add_quantity / self.last_price, self.precision_quantity) #需要加仓的数量 self.total_position += add_position self.total_quantity += add_quantity self.last_additional_entry_price = self.last_price self.avg_price = round(self.total_quantity / self.total_position, self.precision_price) self.logger.log_run('\n--------------\n加仓['+self.trade_count+']'+'\n加仓数量: {}'.format(add_position)+'\n加仓价值: {}'.format(add_quantity)+'\n加仓方向: '+self.direction+'\n加仓价: {}'.format(self.last_price)) self.self_check()
|
5.止盈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| def check_take_profit(self): """ 止盈操作:根据趋势方向触发止盈 """ if (self.last_price - self.avg_price) / self.avg_price > self.take_profit_ratio and self.total_position > 0 and self.direction == 'buy': #根据浮盈止盈 tp_position = self.total_position tp_quantity = self.total_quantity self.close_position() self.open_position('buy',False) tp_quantity -= self.total_quantity tp_position -= self.total_position self.logger.log_run('\n--------------\n止盈\n止盈数量: {}'.format(tp_position)+'\n止盈价值: {}'.format(tp_quantity)+"\n止盈方向: sell"+'\n止盈价: {}'.format(self.last_price)) self.self_check() elif (self.avg_price - self.last_price) / self.avg_price > self.take_profit_ratio and self.total_position > 0 and self.direction == 'sell': #根据浮盈止盈 tp_position = self.total_position tp_quantity = self.total_quantity self.close_position() self.open_position('sell',False) tp_quantity -= self.total_quantity tp_position -= self.total_position self.logger.log_run('\n--------------\n止盈\n止盈数量: {}'.format(tp_position)+'\n止盈价值: {}'.format(tp_quantity)+"\n止盈方向: buy "+'\n止盈价: {}'.format(self.last_price)) self.self_check()
|
6.止损
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| def check_stop_loss(self): """ 止损操作:根据趋势方向触发止损 """ if self.total_position != 0: # if (self.total_position > 0 and self.direction == 'buy' and self.strategy_direction == 'sell' and ((self.avg_price - self.last_price) / self.avg_price > self.stop_loss_ratio)):#根据浮亏止损 if (self.total_position > 0 and self.direction == 'buy' and self.strategy_direction == 'sell' and ((self.last_additional_entry_price - self.last_price) / self.last_additional_entry_price > self.stop_loss_ratio)):#根据跌幅止损 tl_position = self.total_position tl_quantity = self.total_quantity self.close_position() self.open_position('sell',False) tl_position += self.total_position tl_quantity += self.total_quantity self.logger.log_run('\n--------------\n止损\n止损数量: {}'.format(tl_position)+'\n止损价值: {}'.format(tl_quantity)+"\n止损方向: sell"+'\n止损价: {}'.format(self.last_price)) self.self_check() # elif (self.total_position > 0 and self.direction == 'sell' and self.strategy_direction == 'buy' and (self.last_price - self.avg_price) / self.avg_price > self.stop_loss_ratio):#根据浮亏止损 elif (self.total_position > 0 and self.direction == 'sell' and self.strategy_direction == 'buy' and (self.last_price - self.last_additional_entry_price) / self.last_additional_entry_price > self.stop_loss_ratio):#根据跌幅止损 tl_position = self.total_position tl_quantity = self.total_quantity self.close_position() self.open_position('buy',False) tl_position += self.total_position tl_quantity += self.total_quantity self.logger.log_run('\n--------------\n止损\n止损数量: {}'.format(tl_position)+'\n止损价值: {}'.format(tl_quantity)+"\n止损方向: buy "+'\n止损价: {}'.format(self.last_price)) self.self_check()
|
7.平仓
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def close_position(self): """ 平仓操作:计算盈亏并清零仓位 """ if self.direction == 'buy': self.profit += round((self.last_price - self.avg_price) * self.total_position , self.precision_price) elif self.direction == 'sell': self.profit += round((self.avg_price - self.last_price) * self.total_position , self.precision_price) self.capital += self.profit self.total_position = 0 self.avg_price = 0 self.total_quantity = 0 self.trade_count = 0 self.frist_position_size = 0
|
8.检测仓位状态
1 2 3 4 5 6 7 8 9 10 11 12
| def self_check(self): """ 自检函数:检查当前状态并打印 """ msg = '\n自检前状态:' msg += '\n仓位数量(币): {}'.format(self.total_position) msg += '\n仓位价值(U): {}'.format(self.total_quantity) msg += '\n仓位方向: '+self.direction msg += '\n此仓加仓次数: {}'.format(self.trade_count -1) msg += '\n平均价格: {}'.format(self.avg_price) msg += '\n累计盈亏: {}'.format(self.profit) self.logger.log_run(msg)
|
9.运行状态打印(一份完整的开仓到止盈的打印)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| -------------- 开仓 开仓数量: 0.016354 开仓价值: 500.0 开仓方向: sell 开仓价: 30573.77
自检前状态: 仓位数量(币): 0.016354 仓位价值(U): 500.0 仓位方向: sell 此仓加仓次数: 0 平均价格: 30573.6 累计盈亏: 0
-------------- 加仓[1] 加仓数量: 0.032665 加仓价值: 1000.0 加仓方向: sell 加仓价: 30613.77
自检前状态: 仓位数量(币): 0.049019 仓位价值(U): 1500.0 仓位方向: sell 此仓加仓次数: 1 平均价格: 30600.4 累计盈亏: 0
-------------- 加仓[2] 加仓数量: 0.065256 加仓价值: 2000.0 加仓方向: sell 加仓价: 30648.68
自检前状态: 仓位数量(币): 0.11427499999999999 仓位价值(U): 3500.0 仓位方向: sell 此仓加仓次数: 2 平均价格: 30627.9 累计盈亏: 0
-------------- 加仓[3] 加仓数量: 0.130336 加仓价值: 4000.0 加仓方向: sell 加仓价: 30690.01
自检前状态: 仓位数量(币): 0.244611 仓位价值(U): 7500.0 仓位方向: sell 此仓加仓次数: 3 平均价格: 30660.9 累计盈亏: 0
-------------- 加仓[4] 加仓数量: 0.260129 加仓价值: 8000.0 加仓方向: sell 加仓价: 30754.03
自检前状态: 仓位数量(币): 0.50474 仓位价值(U): 15500.0 仓位方向: sell 此仓加仓次数: 4 平均价格: 30708.9 累计盈亏: 0
-------------- 加仓[5] 加仓数量: 0.519655 加仓价值: 16000.0 加仓方向: sell 加仓价: 30789.68
自检前状态: 仓位数量(币): 1.024395 仓位价值(U): 31500.0 仓位方向: sell 此仓加仓次数: 5 平均价格: 30749.9 累计盈亏: 0
-------------- 止盈 止盈数量: 1.007773 止盈价值: 30991.605 止盈方向: buy 止盈价: 30585.97
自检前状态: 仓位数量(币): 0.016622 仓位价值(U): 508.395 仓位方向: sell 此仓加仓次数: 0 平均价格: 30585.7 累计盈亏: 167.9
|
这样一套组合拳下来,马丁就基本可以运行了,从打印信息可以看出,拉低平均价,小止盈,高胜率,就是马丁的灵魂.
但是拉长周期来看,有时候很多甚至能达到90%+胜率的交易账户,只需要仅仅的一次失败,就满盘皆输,所以学会风险控制,才是交易的第一要义。
代码公开,有代码基础的朋友可以直接拷贝去使用即可。