赌博圈有一种投资策略叫马丁策略,也是我接触的第一个策略,该策略的核心思想是在每次亏损后增加投资金额,以期望在未来的胜利中弥补之前的亏损。

马丁策略的一般步骤是:

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%+胜率的交易账户,只需要仅仅的一次失败,就满盘皆输,所以学会风险控制,才是交易的第一要义。

代码公开,有代码基础的朋友可以直接拷贝去使用即可。