|
本帖最后由 进击的投机君 于 2017-1-11 16:25 编辑
求教各路大神,小弟的作业是通过6000多个策略对不同的4个货币对进行测试,每一行是每个策略算出的详细结果。
现在的问题是,如何找出同时满足几个条件的策略,并且该策略对不止一个货币对有效
举个例子,比如同时满足:
1.E列 Net profit>3000
2.F列 # of trade>800
3.G列 %wins >50%
我找出了
同时满足2个货币对:8个同时满足EURUSD和GBPUSD,5个同时满足GBPUSD和USDJPY, 7个满足USDJPY和USDCAD。
同时满足3个货币对 : 3个同时满足EURUSD,GBPUSD和USDJPY, 1个同时满足EURUSD,GBPUSD和USDCAD,2个GBPUSD,USDJPY和USDCAD
同时满足4个货币对 : 1个
那么,请问我如何通过条件筛选,把我要找的这些组合都列举找出来呢? 比方说我要找同时满足3个货币对的策略,它就会分别列举出3个,1个和2个。筛选结果和图示见第二张附图
也是用了一个字典,代码注释一下:
- Sub test() 'by kagawa 2017/1/11
- Dim ar1, ar2, br(), cr(), dic
- Dim c1, c2, c3, i&, i2&, j&, k&, m&, s$, t&, flg As Boolean, tms#
- tms = Timer
-
- c1 = [b1]: c2 = [b2]: c3 = [b3] '读取3个筛选条件参数
-
- Set dic = CreateObject("Scripting.Dictionary")
- m = Sheet1.[a2].End(4).Row
- ReDim br(1 To m, 1 To 3) '定义存放整理结果的数组br
-
- For j = 1 To 4 '遍历4个页面
- With Sheets(j)
- s = .Name '本页货币名称
- m = .[a2].End(4).Row '数据最大行数m
- ar1 = .[a1].Resize(m) '读取第1列策略代码
- ar2 = .[e1].Resize(m, 3) '读取EFG这3列数据
- End With
- For i = 2 To m '遍历数据各行
- flg = False
- If ar2(i, 1) > c1 Then If ar2(i, 2) > c2 Then If ar2(i, 3) > c3 Then flg = True
- If flg Then '检查3项条件都符合时
- t = dic(ar1(i, 1)) '查询本行策略代码在字典中的记录序号
- If t = 0 Then k = k + 1: dic(ar1(i, 1)) = k: t = k: br(t, 3) = ar1(i, 1)
- '如字典中尚无记录,则按顺序增加1行记录 写入策略代码
- br(t, 1) = br(t, 1) + 1 '相同组合数统计+1
- br(t, 2) = br(t, 2) & "," & s '增加相同组合对应的货币名称
- End If
- Next
- Next
- ReDim cr(1 To k, 1 To 3) '定义存放输出结果的数组cr
- For i = 1 To k '遍历字典记录结果数组br
- If br(i, 1) > 1 Then '如果组合数>1则输出
- i2 = i2 + 1 '输出行序号+1
- For j = 1 To 3
- cr(i2, j) = br(i, j) '复制各行
- Next
- End If
- Next
-
- [b5].CurrentRegion.Offset(1) = "" '清空输出区域
- [b6].Resize(i2, 3) = cr '输出数组cr结果到工作表
- [b6].Resize(i2, 3).Sort [b6], 1, [c6], , 1, [d6], 1, 2 '排序
- MsgBox Format(Timer - tms, "0.000s ") & i2 '显示耗时 和 提取结果数
- End Sub
复制代码
|
|