搜索
查看: 6719|回复: 15

Fix Dollar Amout of Equity固定金额交易一手合约

[复制链接]
发表于 2011-1-21 20:20 | 显示全部楼层

Fix Dollar Amout of Equity固定金额交易一手合约

来自:MACD论坛(bbs.shudaoyoufang.com) 作者:fengyang2 浏览:6719 回复:15


Fix Dollar Amout of Equity固定金额交易一口合约
一种资金管理的模式
Fix Dollar Amount of Equity,固定金额交易一口合约。 设定我们有多少钱才能够交易一口合约。这个资金管理是很多人使用的模式。

市场 S&P
(美国股票市场)

目前 价位约 1000点,10点 为 1%

期货 minis&P

保证金 5000


一点
50


合约价值 约 50000


设 一位操作者

资金
100000


胜率笔 65%


平均赢 700 , 约1.4%


平均输 900 , 约1.8%


盈亏比 0.7778


期望值 0.65* 700 / (700+900)-0.35*900/(700+900) =0.0875
(normalize 归一化 0 到 1)


依这些条件 ,编写一程式, 追踪 400次的交易,
在不同金额操作下 ,获利多少, 回测多少。
测试结果大概如下表

50---pass






固定金额
累积金额
回测 20%以上的次数
平均 %
最大回测 %
死亡-pass

5000

1258885

67

36

76

15


10000

766311

91

36

74

5


25000

310235

57

26

47

0


30000

329519

37

26

40

0


50000

220482

10

22

34

0










1- pass 表400次的交易
50—pass
交易 50 次的 1---pass。




VB你懂 有兴趣 可看下面程式
'command1 commandbutton
'label1 label
'label2 label
'label3 label
'label4 label
'text1 textbox
'list1 listbox
'list2 listbox

程式内容
'==============================================
Dim wr, wfr, p, op, maxlost, tm, tn, tnn, wma, fma, fdollar, lostbroke
Dim wrp(801), wm(801), fm(801), n(801), twm, tfm, twn, tfn, sm(800)
Dim winprice(10000), failprice(10000), allp, sp, sv, x, w, i, v, pri, wcv, fcv
Dim pass_sm(100), pass_ret(1000)


Private Sub Command1_Click()
'test 11
testn = 51
kkk = 1
ttt = 1
fdollar = Val(Text1.Text)
223344:
If kkk = testn Then GoTo 112233
   'op = (( 0.7778 + 1 ) * 0.65 - 1 ) / 0.7778 = 0.20 = 20.0%
   '10 0000 本金
   'wma=700..1.4%..fma=900....1.8%  1point 50$美金  10point=500   mini S&P 1000点 合约价值  5万美金
   '期望值 0.0875    0.087*1000= 87
   
   tm = 100000
   wr = 0.65
   wfr = 0.7778
   op = ((wfr + 1) * wr - 1) / wfr  'kelly
   wma = 700
   fma = 900
        
   maxlost = 7000  '14%
   bn = Int(tm / fdollar)

  '求机率分布
   Call pd

  tnn = 400   '笔数
  twm = 1
  tfm = 1
  i = 1
  List1.Clear
  t_wfr = 1
  '一回测试
  'Do While Abs(t_wr - wr) > 0.005 Or Abs(t_wfr - wfr) > 0.005 Or Abs(t_wma - wma) > 5 Or Abs(t_fma - fma) > 5
  
   wrt = 0
   tfm = 0
   twm = 0
   twn = 0
   tfn = 0
   i = 1
   s = tm
   bnp = bn
   Do While i <= tnn
      q = Int(Rnd * 10000) + 1
      If q <= 10000 - 10000 * wr Then
         wrp(i) = -1
                            'm = Int(Rnd * fma * 2)
            
             x = Int(Rnd * allp)
             m = failprice(x) / fcv
            
         fm(i) = -m * bnp
         n(i) = bnp
         tfm = tfm + m * bnp
         tfn = tfn + bnp
         s = s - m * bnp
      Else
         wrp(i) = 1
                              'm = Int(Rnd * wma * 2)
             x = Int(Rnd * allp)
             m = winprice(x) / wcv
         wm(i) = m * bnp
         n(i) = bnp
         twm = twm + m * bnp
         twn = twn + bnp
         s = s + m * bnp
      End If
      '======================================================
      bnp = Int(s / fdollar)
      List1.AddItem i & "  " & s & "   " & bnp
      i = i + 1
    Loop
   
    t_wr = twn / (twn + tfn)
    If twn <> 0 Then t_wma = twm / twn
    If tfn <> 0 Then t_fma = tfm / tfn
    If t_fma <> 0 Then t_wfr = Abs(t_wma / t_fma)
   
   'Loop
  lostbroke = 0

  s = tm
            
  s_max = tm
  s_min = tm
  twm = 0
  tfm = 0
            tn = 0
  twn = 0
  tfn = 0
  For i = 1 To tnn
  
    If wrp(i) = 1 Then
       s = s + wm(i)
       twm = twm + wm(i)
       twn = twn + n(i)
       sm(i) = s
    Else
       s = s + fm(i)
       tfm = tfm + fm(i)
       tfn = tfn + n(i)
       sm(i) = s
    End If
    List1.AddItem " i= " & i & "  total money= " & Int(s) & "  number= " & n(i)
    If s < tm * 0.3 Then
       i = 800
       lostbroke = 1
    End If
  Next
  
  List1.ListIndex = List1.ListCount - 1
  
  tn = twn + tfn
  If twn <> 0 Then t1 = twm / (twn)
  If tfn <> 0 Then t2 = tfm / (tfn)
  If t2 <> 0 Then t3 = Abs(t1 / t2)
  pass_sm(kkk) = Int(s)
  kkk = kkk + 1
  If lostbroke = 1 Then
     List2.AddItem "  " & kkk - 1 & "pass   money= " & Int(s) & "   " & "lost die  "
  Else
     List2.AddItem "  " & kkk - 1 & "pass   money= " & Int(s) & "   " & "   wr=" & Int(twn / tn * 100) / 100 & "    wfr= " & Int(t3 * 100) / 100 & "    wma= " & Int(t1) & "    fma= " & Int(t2) & "   total operate number=" & tn
  End If

'====================================== find maxdrawdown
If lostbroke = 0 Then
   s_max = sm(1)
   s_min = sm(1)
   timemax = 1
   timemin = 1
   midv = 0.2 '20%
   For i = 2 To tnn
     If sm(i) > s_max Then
        s_max = sm(i)
        timemax = i
     End If
  
     If sm(i) < s_min Then
        s_min = sm(i)
        timemin = i
     End If
  
  
     If (s_max - s_min) / s_max >= midv And timemax > timemin Then 'up motion
        If timemax + 11 < i Then        '7 min 没创新高
           'List2.AddItem 1
           s_min = sm(i)
           timemin = i
        
        End If
     End If
  
     If Abs(s_max - s_min) / s_max >= midv And timemax < timemin Then 'down motion
        If timemin + 11 < i Then     '7 min 没创新高
           List2.AddItem Int(s_max) & "  " & Int(s_min) & "   " & Int(Abs(s_max - s_min) / s_max * 100) & "%   " & timemax & " " & timemin
              pass_ret(ttt) = Int(Abs(s_max - s_min) / s_max * 100)
              ttt = ttt + 1
           s_max = sm(i)
           timemax = i
        End If
     End If

   Next
End If
'==========================================================================


GoTo 223344
112233:

'================统计
s = 0
s_max = 0
s_min = 1E+30
s_maxret = 0
s_minret = 1E+21
qqq = 0
For i = 1 To testn - 1
  s = s + pass_sm(i)
  If pass_sm(i) > s_max Then s_max = pass_sm(i)
  If pass_sm(i) < s_min Then s_min = pass_sm(i)
  If pass_sm(i) <= tm * 0.3 Then qqq = qqq + 1
Next
List2.AddItem "===================================== "
List2.AddItem "total " & testn - 1 & " pass "
List2.AddItem "average total money= " & Int(s / (testn - 1))
List2.AddItem "max total money= " & Int(s_max)
List2.AddItem "min total money= " & Int(s_min)
List2.AddItem "===================================== "
List2.AddItem "die total= " & qqq & " pass "
s = 0
s_maxret = 0
s_minret = 1E+21
For i = 1 To ttt - 1
  s = s + pass_ret(i)
  If pass_ret(i) > s_maxret Then s_maxret = pass_ret(i)
Next
List2.AddItem "===================================== "
List2.AddItem "return up 20%   total " & ttt - 1 & " 次 "
If ttt <> 1 Then List2.AddItem "average return  " & Int(s / (ttt - 1)) & "% "
List2.AddItem "max return  " & Int(s_maxret) & "% "

'======================================





End Sub
Private Sub Form_Load()
Randomize
End Sub
Sub pd()
sp = 0
sv = 0
w = 1
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
sp = sp + p
v = Int(200 * x * p)
sv = sv + v
Next
  'List1.AddItem sp & "   " & "   " & sv & "   " & sv / sp
fma = 900
wma = 700
wcv = (sv / sp) / wma
fcv = (sv / sp) / fma
allp = sp  '所有的状况
sp = 0
sv = 0
w = 0
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
   If p <> 0 Then
      For k = 1 To p
       failprice(w + k) = x * 200
      Next
      w = w + p
   End If

sp = sp + p
v = Int((200 * x * p) / fcv)
sv = sv + v
Next
'List1.AddItem "fail ====>>>> " & sp & "   " & sv & "   " & Int(sv / sp)
sp = 0
sv = 0
w = 0
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
   If p <> 0 Then
      For k = 1 To p
       winprice(w + k) = x * 200
      Next
      w = w + p
   End If

sp = sp + p
v = Int((200 * x * p) / wcv)
sv = sv + v
Next
'List1.AddItem "win  ====>>>" & sp & "   " & sv & "   " & Int(sv / sp)

End Sub






[ 本帖最后由 fengyang2 于 2011-1-29 16:02 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
参与人数 1奖励 +3 时间 理由
清醒疯子 + 3 2011-1-25 07:33 谢谢风扬兄的分享:) 最近才知道资金 ...

查看全部评分

金币:
奖励:
热心:
注册时间:
2008-3-26

回复 使用道具 举报

 楼主| 发表于 2011-1-23 17:33 | 显示全部楼层
太数学的东西  没多少人喜欢 人生大盖就是如此
在我买房子的经验里

我讶异的发现
多数人不会真实的告诉你 他买多少钱
譬如 真实价格 买100W
他会加上30万 跟你说130多W吧
我不懂这心态 这样会粉爽吗 认为自己增加粉多吗了

如此乱搞数学  我超不喜欢的

这一篇 文章 好像挺冷的 让我胡乱--乱七八糟的 联想到此....
发这一篇文 我有目的 -----再乱数模似的过程--- 就表达清楚的??过程----
还是不想说 能经过 自己的认知 想通了  最后那答案 会跟随着你比较久 那才会成为你的东西~~~
金币:
奖励:
热心:
注册时间:
2008-3-26

回复 使用道具 举报

发表于 2011-1-24 08:03 | 显示全部楼层
谢谢风扬兄的分享:)
风扬兄还会编程,实在太牛了:)

很多人可能是以为要自己导入代码,就没尝试了。
而剩下的不少人可能是没有耐心细看软件就关掉了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2006-10-11

回复 使用道具 举报

 楼主| 发表于 2011-1-24 08:34 | 显示全部楼层
疯兄----
我会发这篇---最主要是因为你上一篇文---#*22*#   呵呵
您要不要整个原始程式文件阿~~~^_^

[ 本帖最后由 fengyang2 于 2011-1-24 08:35 编辑 ]
金币:
奖励:
热心:
注册时间:
2008-3-26

回复 使用道具 举报

发表于 2011-1-25 07:31 | 显示全部楼层
要啊:)我VB6都装好了:)
谢谢风扬兄啊:)
金币:
奖励:
热心:
注册时间:
2006-10-11

回复 使用道具 举报

 楼主| 发表于 2011-1-26 19:40 | 显示全部楼层
疯兄------fd_source.rar....放好了...
程式中   说明的部分  可能会变成乱码..因为简体 与繁体 冲突的关系
不影响  程式的执行..说明的部分..就看这个帖----的简体说明
程式  若部分  看不懂...没关系....提出来..我有空  会说明  ^_^
金币:
奖励:
热心:
注册时间:
2008-3-26

回复 使用道具 举报

发表于 2011-1-27 07:54 | 显示全部楼层
谢谢风扬兄分享:)
我已经下了附件:)今晚研究一下:)VB只学过一点点皮毛。不过我老婆是拿VB考过证的:)有不明白的地方再请教风扬兄#*19*# #*)*#
金币:
奖励:
热心:
注册时间:
2006-10-11

回复 使用道具 举报

发表于 2011-1-27 17:09 | 显示全部楼层
这是什么模型?一笔数据就能做回归分析?你们也太牛了,呵呵
金币:
奖励:
热心:
注册时间:
2007-7-1

回复 使用道具 举报

发表于 2011-1-28 02:14 | 显示全部楼层
改了一下描述,也不知道改对了没有:)



[ 本帖最后由 清醒疯子 于 2011-1-28 02:18 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2006-10-11

回复 使用道具 举报

 楼主| 发表于 2011-1-28 18:01 | 显示全部楼层
初始资金 10 0000
最大  10 0000
****
都对阿~~~  *d1*#   ^_^

...
..
右边的 LISTBOX
只保留   最后 一个 PASS  的明细资料
金币:
奖励:
热心:
注册时间:
2008-3-26

回复 使用道具 举报

发表于 2011-1-29 00:46 | 显示全部楼层
如果没有改错的话,就有疑问了,3万开一口,比如图中第386笔,27.5万,是不是应该开9口才对呢?而不是5手。

看了两天,还是猜不出源码的意思:)
比如SUB PD中的这段计算:

Sub pd()
sp = 0
sv = 0
w = 1
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
sp = sp + p
v = Int(200 * x * p)
sv = sv + v
Next

它究竟是用来完成什么功能的呢?:)
金币:
奖励:
热心:
注册时间:
2006-10-11

回复 使用道具 举报

 楼主| 发表于 2011-1-29 04:09 | 显示全部楼层
'  哈 犯了太有自信的错
'  疯兄 细心 与 利害哦 ^_^
'  更正如下

      If q <= 10000 - 10000 * wr Then
         wrp(i) = -1
                            'm = Int(Rnd * fma * 2)
            
             x = Int(Rnd * allp)
             m = failprice(x) / fcv
            
         fm(i) = -m * bnp
         n(i) = bnp
         tfm = tfm + m * bnp
         tfn = tfn + bnp
         s = s - m * bnp   '错在这一行 原来是 S=S-M 改成 S=S-M*BNP

      Else
         wrp(i) = 1
                              'm = Int(Rnd * wma * 2)
             x = Int(Rnd * allp)
             m = winprice(x) / wcv

         wm(i) = m * bnp
         n(i) = bnp
         twm = twm + m * bnp
         twn = twn + bnp
         s = s + m * bnp     '错在这一行 原来是 S=S+M 改成 S=S+M*BNP
      End If

'第2个错误
PD() 函属中
更正成
fma = 900
wma = 700
这2行 是垃圾码 可以删掉


'   利用乱数  模似 WMA 与  FMA

            ' 这一行的功能
                            'm = Int(Rnd * fma * 2)
            ' 等于这二行
             x = Int(Rnd * allp)
             m = failprice(x) / fcv

            'm = Int(Rnd * fma * 2)
             模似 4百个整数 数值落在 0到 2*FMA 之间 此范围的任一值 机率一样
             所以 4百个乱数的总合 / 400  此值会接近 FMA

             x = Int(Rnd * allp)
             m = failprice(x) / fcv
             这二行功能同上的一行数学式子  模似 FMA
             利用 常态分布(normal distribution),高斯分布(Gaussian distribution)
                    模似 FMA
                    我印象
             模似 4百个整数 数值落在 0到 3.2*FMA 之间, 此范围的任一值 机率符合高斯的自然分
                    布   机率都不一样

            PD()  这函数  所写的就是 利用高斯的自然分布 模似 FMA

            高斯的数学  繁体网站
                 http://tw.knowledge.yahoo.com/question/question?qid=1507010110720
           
**
注...模似的范围 跟实际 不一样的地方 在于输的金额 会更大 10倍的FMA 都有可能
      虽然 机率 粉低........在重挫就有机率发生.....

下面的资料 供你参考
去年 实战 在输的单子  平均输 约在1377元  
        (市场约8000点 1点 200 双边手续费总共 约200   单位台币)
第一列第一栏 0到 200  第2列 第2栏 200到 400
第一列 第二栏 共出现 6337手 输在 0到 200 之间
第二列 第二栏 共出现 5373手 输在 200到 400之间
其他列 依此类推....符合高斯自然分布...看起来有点像..数学的比对 我就没做了...

200        6337
400        5373
600        4280
800        2916
1000        2253
1200        1598
1400        1423
1600        975
1800        844
2000        632
2200        622
2400        486
2600        459
2800        382
3000        354
3200        281
3400        300
3600        205
3800        252
4000        188
4200        200
4400        169
4600        160
4800        126
5000        138
5200        99
5400        133
5600        79
5800        110
6000        82
6200        90
6400        70
6600        81
6800        51
7000        62
7200        41
7400        66
7600        45
7800        52
8000        44
8200        48
8400        24
8600        52
8800        26
9000        39
9200        36
9400        29
9600        21
9800        29
10000        19
10200        21
10400        13
10600        21
10800        17
11000        20
11200        13
11400        22
11600        12
11800        17
12000        13
12200        19
12400        11
12600        11
12800        10
13000        10
13200        5
13400        12
13600        6
13800        8
14000        7
14200        16
14400        4
14600        12
14800        3
15000        9
15200        6
15400        9
15600        5
15800        11
16000        2
16200        3
16400        5
16600        4
16800        7
17000        5
17200        2
17400        6
17600        2
17800        8
18000        1
18200        5
18400        1
18600        5
18800        1
19000        4
19200        0
19400        4
19600        1
19800        11
20000        0
20200        3
20400        1
20600        5
20800        0
21000        0
21200        3
21400        5
21600        2
21800        2
22000        1
22200        2
22400        0
22600        3

[ 本帖最后由 fengyang2 于 2011-1-29 15:54 编辑 ]
金币:
奖励:
热心:
注册时间:
2008-3-26

回复 使用道具 举报

发表于 2011-2-10 19:50 | 显示全部楼层
非常感谢风扬兄的耐心讲解:)
回老婆娘家的几天,继续看风扬兄这个代码。再添加了一些中文描述。本来想着回来就发的,不知道为什么回来后又忘了:)
话说,以后都不背本本回老婆娘家了,没座位,背得重死。以后会买个10吋小本本:)



下面的,是我加了中文描述的代码。嗯,一些变量名也改成汉语拼音了。同样的,不知道改错了没有:)

Dim shenlv, yinkuibi, p, zhuijiacangwei, maxlost, chushizijin, jiaoyichishu, xujiaoyibishu, meibiyinli, meibikuisun, gudincangbi, lostbroke
Dim peilv(801), biyinlijine(801), bikuisunjine(801), kaichangshoushushuzhu(801), zongyinlijine, zongkuisunjine, yinlichishu, kuisunchishu, shijijineshuzhu(800)
Dim winprice(10000), failprice(10000), allp, sp, sv, x, w, i, v, pri, wcv, fcv
Dim shilunjineshuzhu(100), pass_ret(1000)


'Fix Dollar Amount of Equity,固定金额交易一口合约。 设定我们有多少钱才能够交易一口合约。
Private Sub Command1_Click()

'test 11

chaobiaolunshu = 51
shichelunshu = 1
shiechishujiayi = 1
gudincangbi = Val(Text1.Text)

223344:
If shichelunshu = chaobiaolunshu Then GoTo 112233

   'zhuijiacangwei = (( 0.7778 + 1 ) * 0.65 - 1 ) / 0.7778 = 0.20 = 20.0%
   '10 0000 本金
   'meibiyinli=700..1.4%..meibikuisun=900....1.8%  1point 50$美金  10point=500   mini S&P 1000点 合约价值  5万美金
   '期望值 0.079    0.079*1000= 79
   
   chushizijin = 100000
   shenlv = 0.65
   yinkuibi = 0.7778
   zhuijiacangwei = ((yinkuibi + 1) * shenlv - 1) / yinkuibi  'kelly
   meibiyinli = 700
   meibikuisun = 900
        
   maxlost = 7000  '14%
   shou = Int(chushizijin / gudincangbi)


  '求机率分布
   Call jilvfenbu


  xujiaoyibishu = 400  '笔数
  zongyinlijine = 1
  zongkuisunjine = 1
  i = 1
  List1.Clear
  zongyinkuibi = 1

  '一回测试
  'Do While Abs(zongshenlv - shenlv) > 0.005 Or Abs(zongyinkuibi - yinkuibi) > 0.005 Or Abs(zongmeibiyinli - meibiyinli) > 5 Or Abs(zongmeibikuisun - meibikuisun) > 5
  
   shenlvt = 0
   zongkuisunjine = 0
   zongyinlijine = 0
   yinlichishu = 0
   kuisunchishu = 0
   i = 1
   s = chushizijin 's为实时资金总额
   shizhikaichang = shou
   
   Do While i <= xujiaoyibishu
   
   '   利用乱数  模似 WMA 与  FMA
      q = Int(Rnd * 10000) + 1
      If q <= 10000 - 10000 * shenlv Then
         peilv(i) = -1
                            'm = Int(Rnd * pinjunkuisun * 2)
            
             x = Int(Rnd * allp)
             m = failprice(x) / fcv
            
         bikuisunjine(i) = -m * shizhikaichang
         kaichangshoushushuzhu(i) = shizhikaichang
         zongkuisunjine = zongkuisunjine + m * shizhikaichang
         kuisunchishu = kuisunchishu + shizhikaichang
         s = s - m * shizhikaichang   '错在这一行 原来是 S=S-M 改成 S=S-M*shizhikaichang

      Else
         peilv(i) = 1
                              'm = Int(Rnd * yinlijinea * 2)
             x = Int(Rnd * allp)
             m = winprice(x) / wcv

         biyinlijine(i) = m * shizhikaichang
         kaichangshoushushuzhu(i) = shizhikaichang
         zongyinlijine = zongyinlijine + m * shizhikaichang
         yinlichishu = yinlichishu + shizhikaichang
         s = s + m * shizhikaichang     '错在这一行 原来是 S=S+M 改成 S=S+M*shizhikaichang
      End If
      
      '======================================================
      shizhikaichang = Int(s / gudincangbi)
         
      i = i + 1
      
    Loop
   
    zongshenlv = yinlichishu / (yinlichishu + kuisunchishu)
    If yinlichishu <> 0 Then zongmeibiyinli = zongyinlijine / yinlichishu
    If kuisunchishu <> 0 Then zongmeibikuisun = zongkuisunjine / kuisunchishu
    If zongmeibikuisun <> 0 Then zongyinkuibi = Abs(zongmeibiyinli / zongmeibikuisun)
    'Loop
      
    lostbroke = 0
    s = chushizijin
    shifenehuichefenzhi = chushizijin
    shifenehuicheguzhi = chushizijin
    zongyinlijine = 0
    zongkuisunjine = 0
    jiaoyichishu = 0
  yinlichishu = 0
  kuisunchishu = 0

  For i = 1 To xujiaoyibishu
  
    If peilv(i) = 1 Then
       s = s + biyinlijine(i)
       zongyinlijine = zongyinlijine + biyinlijine(i)
       yinlichishu = yinlichishu + kaichangshoushushuzhu(i)
       shijijineshuzhu(i) = s
    Else
       s = s + bikuisunjine(i)
       zongkuisunjine = zongkuisunjine + bikuisunjine(i)
       kuisunchishu = kuisunchishu + kaichangshoushushuzhu(i)
       shijijineshuzhu(i) = s
    End If

    List1.AddItem "第 " & i & "笔  资金= " & Int(s) & "  手= " & kaichangshoushushuzhu(i)
    If s < chushizijin * 0.3 Then
       i = 800
       lostbroke = 1
    End If

  Next
  
  List1.ListIndex = List1.ListCount - 1
  
  jiaoyichishu = yinlichishu + kuisunchishu
  If yinlichishu <> 0 Then t1 = zongyinlijine / (yinlichishu)
  If kuisunchishu <> 0 Then t2 = zongkuisunjine / (kuisunchishu)
  If t2 <> 0 Then t3 = Abs(t1 / t2)

  shilunjineshuzhu(shichelunshu) = Int(s)
  shichelunshu = shichelunshu + 1

  If lostbroke = 1 Then
     List2.AddItem "  第" & shichelunshu - 1 & "轮   资金= " & Int(s) & "   " & "破产  "
  Else
     List2.AddItem "  第" & shichelunshu - 1 & "轮   资金= " & Int(s) & "   " & "   胜率=" & Int(yinlichishu / jiaoyichishu * 100) / 100 & "    盈亏比= " & Int(t3 * 100) / 100 & "    平均盈利= " & Int(t1) & "    平均亏损= " & Int(t2) & "   交易次数=" & jiaoyichishu
  End If



'====================================== find maxdrawdown发现最大回撤
If lostbroke = 0 Then
   shifenehuichefenzhi = shijijineshuzhu(1)
   shifenehuicheguzhi = shijijineshuzhu(1)
   fenzhibi = 1
   guzhibi = 1
   midv = 0.2 '20%

   For i = 2 To xujiaoyibishu

     If shijijineshuzhu(i) > shifenehuichefenzhi Then
        shifenehuichefenzhi = shijijineshuzhu(i)
        fenzhibi = i
     End If
  
     If shijijineshuzhu(i) < shifenehuicheguzhi Then
        shifenehuicheguzhi = shijijineshuzhu(i)
        guzhibi = i
     End If
  
  
     If (shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi >= midv And fenzhibi > guzhibi Then 'up motion
        If fenzhibi + 11 < i Then        '7 min 没创新高
           'List2.AddItem 1
           shifenehuicheguzhi = shijijineshuzhu(i)
           guzhibi = i
        
        End If
     End If
  
     If Abs(shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi >= midv And fenzhibi < guzhibi Then 'down motion
        If guzhibi + 11 < i Then     '7 min 没创新高
           List2.AddItem "资金峰值" & "  " & "资金谷值" & "   " & "回撤" & "%   " & "峰值笔" & " " & "谷值笔"
           List2.AddItem Int(shifenehuichefenzhi) & "  " & Int(shifenehuicheguzhi) & "   " & Int(Abs(shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi * 100) & "%   " & fenzhibi & " " & guzhibi
           pass_ret(shiechishujiayi) = Int(Abs(shifenehuichefenzhi - shifenehuicheguzhi) / shifenehuichefenzhi * 100)
           shiechishujiayi = shiechishujiayi + 1
           shifenehuichefenzhi = shijijineshuzhu(i)
           fenzhibi = i
        End If
     End If

   Next
End If
'==========================================================================




GoTo 223344

112233:



'================统计

s = 0
shifenehuichefenzhi = 0
shifenehuicheguzhi = 1E+30
shifenehuichefenzhiret = 0
shifenehuicheguzhiret = 1E+21
pochan = 0
For i = 1 To chaobiaolunshu - 1
  s = s + shilunjineshuzhu(i)
  If shilunjineshuzhu(i) > shifenehuichefenzhi Then shifenehuichefenzhi = shilunjineshuzhu(i)
  If shilunjineshuzhu(i) < shifenehuicheguzhi Then shifenehuicheguzhi = shilunjineshuzhu(i)
  If shilunjineshuzhu(i) <= chushizijin * 0.3 Then pochan = pochan + 1
Next

List2.AddItem "===================================== "
List2.AddItem "总共 " & chaobiaolunshu - 1 & " 轮 "
List2.AddItem "平均资金: " & Int(s / (chaobiaolunshu - 1))
List2.AddItem "资金峰值: " & Int(shifenehuichefenzhi)
List2.AddItem "资金谷值: " & Int(shifenehuicheguzhi)
List2.AddItem "===================================== "
List2.AddItem "破产次数= " & pochan & " 轮 "

s = 0
shifenehuichefenzhiret = 0
shifenehuicheguzhiret = 1E+21
For i = 1 To shiechishujiayi - 1
  s = s + pass_ret(i)
  If pass_ret(i) > shifenehuichefenzhiret Then shifenehuichefenzhiret = pass_ret(i)
Next

List2.AddItem "===================================== "
List2.AddItem "回撤20%以上: " & shiechishujiayi - 1 & " 次"
If shiechishujiayi <> 1 Then List2.AddItem "平均回撤:" & Int(s / (shiechishujiayi - 1)) & "% "
List2.AddItem "最大回撤:" & Int(shifenehuichefenzhiret) & "% "



'======================================

End Sub

Private Sub Form_Load()
Randomize
Command1.Caption = "点击运行"
Text2.Text = "初始资金:100000美元 胜率:65%  盈亏比:0.7778 平均盈利:700 平均亏损:900"
Text3.Text = "(最小5000,最大100000)固定仓比:"
End Sub

Sub jilvfenbu() '利用高斯的自然分布 模似 FMA
'模似 4百个整数 数值落在 0到 2*FMA 之间 此范围的任一值 机率一样
'所以 4百个乱数的总合 / 400  此值会接近 FMA
'x = Int(Rnd * allp)
'm = failprice(x) / fcv
'这二行功能同上的一行数学式子  模似 FMA
'利用 常态分布(normal distribution),高斯分布(Gaussian distribution)模似 FMA
'模似 4百个整数 数值落在 0到 3.2*FMA 之间, 此范围的任一值 机率符合高斯的自然分布 机率都不一样

sp = 0
sv = 0
w = 1
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
sp = sp + p
v = Int(200 * x * p)
sv = sv + v
Next

  'List1.AddItem sp & "   " & "   " & sv & "   " & sv / sp

meibikuisun = 900
meibiyinli = 700

wcv = (sv / sp) / meibiyinli
fcv = (sv / sp) / meibikuisun

allp = sp  '所有的状况

sp = 0
sv = 0
w = 0
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
   If p <> 0 Then
      For k = 1 To p
       failprice(w + k) = x * 200
      Next
      w = w + p
   End If

sp = sp + p
v = Int((200 * x * p) / fcv)
sv = sv + v
Next
'List1.AddItem "fail ====>>>> " & sp & "   " & sv & "   " & Int(sv / sp)

sp = 0
sv = 0
w = 0
For x = 0 To 10.4 Step 0.1
p = (1 / (Sqr(2 * 3.1416) * 3)) * Exp(-((x - 1) ^ 2 / (2 * 3 * 3)))
p = Int(p * 1000)
   If p <> 0 Then
      For k = 1 To p
       winprice(w + k) = x * 200
      Next
      w = w + p
   End If

sp = sp + p
v = Int((200 * x * p) / wcv)
sv = sv + v
Next
'List1.AddItem "win  ====>>>" & sp & "   " & sv & "   " & Int(sv / sp)

End Sub

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
金币:
奖励:
热心:
注册时间:
2006-10-11

回复 使用道具 举报

发表于 2011-2-11 10:04 | 显示全部楼层
都是牛人#*d1*# ,我竟然看不懂#*27*#
金币:
奖励:
热心:
注册时间:
2005-6-9

回复 使用道具 举报

 楼主| 发表于 2011-2-12 09:47 | 显示全部楼层
疯兄~~~哇 还背老婆回家 恩爱哦 羡慕哦
~~我回想我背过吗? 20多年前刚认识时,粉激情时 可能背过吧 那为了好玩 哈!哈。

操作结果同就好 ..汉语拼音我不会..所以..看也看不懂..偷懒不看了..#*29*#

[ 本帖最后由 fengyang2 于 2011-2-12 10:31 编辑 ]
金币:
奖励:
热心:
注册时间:
2008-3-26

回复 使用道具 举报

发表于 2011-2-12 21:28 | 显示全部楼层
哈哈哈哈哈,我是背本本啦:)

再次感谢风扬兄的分享:)
金币:
奖励:
热心:
注册时间:
2006-10-11

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:MACD仅提供交流平台,请交流人员遵守法律法规。
值班电话:18209240771   微信:35550268

举报|意见反馈|手机版|MACD俱乐部

GMT+8, 2025-4-22 19:14 , Processed in 0.040766 second(s), 13 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表