鱼C论坛

 找回密码
 立即注册
查看: 1044|回复: 1

[已解决]vba函数转化成python函数,求大师看看,谢谢

[复制链接]
发表于 2023-4-27 09:55:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
本帖最后由 futui 于 2023-4-27 10:22 编辑

这是L大师用python计算dmi的函数,但与vba直接写的函数计算的结果有区别,具体内容如下:

def GetAdx(bar_data, dm_n=14, ma_n=6):
    high = list(bar_data['high'])
    low = list(bar_data['low'])
    close = list(bar_data['close'])
    idx = bar_data.index
    dmp, dmm, tr, adx = map(list, [[], [], [], []])
    t = 0
    for d in range(len(idx)):
        hl = abs(high[d] - low[d-1])
        hc = abs(high[d] - close[d-1])
        lc = abs(low[d] - close[d-1])
        hd = high[d] - high[d-1]
        ld = low[d-1] - low[d]
        dmp.append(hd if hd > 0 and hd > ld else 0)
        dmm.append(ld if ld > 0 and ld > hd else 0)
        tr.append(max(hl, hc, lc))
        t += 1
        if t > dm_n:
            dmp.pop(0)
            dmm.pop(0)
            tr.pop(0)
            t -= 1
            #print(t)
        if t == dm_n:
            if sum(tr) != 0:
                pdi = sum(dmp) * 100 / sum(tr)
                mdi = sum(dmm) * 100 / sum(tr)
                if mdi + pdi != 0:
                    adx.append(abs(mdi - pdi) / (mdi + pdi) * 100)
                else:
                    adx.append(0)
            else:
                adx.append(0)
        if len(adx) > ma_n:
            adx.pop(0)
            bar_data.loc[idx[d], 'ADX'] = sum(adx)/ma_n
            bar_data.loc[idx[d], 'ADXR'] = (sum(adx)/ma_n + bar_data.loc[idx[d-1], 'ADX']) / 2

vba
Sub share_price_DMI()
    Dim arr, arrh, rw As Long
    Dim arrdata(1 To 10000, 1 To 13)
    On Error Resume Next
    With ActiveSheet
        .Range("cf32:cr10000").ClearContents
        rw = .Range("A65536").End(xlUp).Row
        arr = .Range("A32:I" & rw)
        r = UBound(arr)
        For i = r - 1 To 1 Step -1
            arrdata(i, 1) = Application.Max(arr(i, 5) - arr(i, 6), Abs(arr(i, 5) - arr(i + 1, 3)), Abs(arr(i, 6) - arr(i + 1, 3)))
            arrdata(i, 2) = IIf((arr(i, 5) - arr(i + 1, 5) >= Abs(arr(i, 6) - arr(i + 1, 6))) Or arr(i, 6) >= arr(i + 1, 6), Application.Max((arr(i, 5) - arr(i + 1, 5)), 0), 0)
            arrdata(i, 3) = IIf(arr(i, 6) < arr(i + 1, 6) And arrdata(i, 2) <= 0, Application.Max(Abs(arr(i, 6) - arr(i + 1, 6)), 0), 0)
        Next i
        clmn = .Range("cf1").Column
        stc = 14   '计算周期天数14
        r2 = r - stc + 1
        For i = r - 1 To r2 Step -1
            arrdata(r2, 4) = arrdata(r2, 4) + arrdata(i, 1)
            arrdata(r2, 5) = arrdata(r2, 5) + arrdata(i, 2)
            arrdata(r2, 6) = arrdata(r2, 6) + arrdata(i, 3)
        Next
        For i = r2 - 1 To 1 Step -1
            arrdata(i, 4) = Application.Round(arrdata(i, 1) + arrdata(i + 1, 4) * (stc - 1) / stc, 3)
            arrdata(i, 5) = Application.Round(arrdata(i, 2) + arrdata(i + 1, 5) * (stc - 1) / stc, 3)
            arrdata(i, 6) = Application.Round(arrdata(i, 3) + arrdata(i + 1, 6) * (stc - 1) / stc, 3)
            
            arrdata(i, 7) = Application.Round(100 * arrdata(i, 5) / arrdata(i, 4), 3)
            arrdata(i, 8) = Application.Round(100 * arrdata(i, 6) / arrdata(i, 4), 3)
            arrdata(i, 9) = Abs(arrdata(i, 7) - arrdata(i, 8))
            arrdata(i, 10) = arrdata(i, 7) + arrdata(i, 8)
            arrdata(i, 11) = Application.Round(100 * arrdata(i, 9) / arrdata(i, 10), 3)
        Next
        
        r3 = r - stc * 2 + 1
        For i = r2 - 1 To r3 Step -1
            sums = sums + arrdata(i, 11)
        Next
        arrdata(r3, 12) = Application.Round(sums / stc, 3)
        For i = r3 - 1 To 1 Step -1
            arrdata(i, 12) = Application.Round((arrdata(i + 1, 12) * (stc - 1) + arrdata(i, 11)) / stc, 3)
        Next
        
        r4 = r - stc * 3 + 2
        For i = r4 To 1 Step -1
            arrdata(i, 13) = Application.Round((arrdata(i, 12) + arrdata(i + stc - 1, 12)) / 2, 3)
        Next
        .Cells(32, clmn).Resize(UBound(arrdata), 13) = arrdata
    End With
End Sub

计算结果如下,修改python函数能做到一致吗?

date        close        high        low        TR        DMI+        DMI-        14TR        14DM+        14DM-        PDI        MDI        DI DIFF        DI SUM        DX        ADX        ADXR
45037        2341.19        2400.79        2340.61        60.18        0        37.44        441.709        76.732        132.368        17.372        29.967        12.595        47.339        26.606        21.218        24.141
45036        2386.67        2414.01        2378.05        37.71        0        35.29        410.877        82.634        102.23        20.112        24.881        4.769        44.993        10.599        20.804        24.278
45035        2415.76        2429.33        2413.34        17.76        0        10.59        401.872        88.99        72.089        22.144        17.938        4.206        40.082        10.493        21.589        25.707
45034        2431.1        2443.77        2423.93        19.84        3.04        0        413.659        95.835        66.23        23.168        16.011        7.157        39.179        18.267        22.443        26.85
45033        2434.44        2440.73        2420.01        20.72        8.37        0        424.113        99.933        71.325        23.563        16.817        6.746        40.38        16.706        22.764        27.873
45030        2428.09        2432.36        2409.6        26.6        5.53        0        434.423        98.606        76.812        22.698        17.681        5.017        40.379        12.425        23.23        29.034
45029        2405.76        2426.83        2403.92        25.37        0        13.36        439.194        100.236        82.721        22.823        18.835        3.988        41.658        9.573        24.061        30.449
45028        2429.29        2440.33        2417.28        23.05        0        9.39        445.657        107.946        74.696        24.222        16.761        7.461        40.983        18.205        25.175        31.539
45027        2439.4        2463.27        2426.67        36.6        0        5.38        455.115        116.249        70.33        25.543        15.453        10.09        40.996        24.612        25.711        32.091
45026        2443.52        2461.3        2432.05        29.25        7.26        0        450.708        125.191        69.946        27.777        15.519        12.258        43.296        28.312        25.795        32.481
45023        2446.95        2454.04        2421.06        32.98        25.24        0        453.878        127.003        75.326        27.982        16.596        11.386        44.578        25.542        25.601        32.25
45022        2426.57        2428.8        2402.3        26.5        0        5.18        453.275        109.591        81.12        24.178        17.896        6.282        42.074        14.931        25.605        31.577
45020        2421.65        2442.57        2407.48        35.09        0        0        459.604        118.021        81.782        25.679        17.794        7.885        43.473        18.138        26.426        31.334
45019        2440.21        2442.97        2406.14        43.47        40.42        0        457.169        127.099        88.073        27.801        19.265        8.536        47.066        18.136        27.064        31.022
45016        2399.5        2402.55        2385.41        19.51        17.59        0        445.522        93.347        94.848        20.952        21.289        0.337        42.241        0.798        27.751        31.029
45015        2383.04        2384.96        2362.66        22.3        0        4.72        458.782        81.584        102.144        17.783        22.264        4.481        40.047        11.189        29.824        31.18
45014        2371.19        2382        2367.38        14.62        0        0        470.058        87.86        104.918        18.691        22.32        3.629        41.011        8.849        31.257        31.297
45013        2369.17        2389.92        2364.63        33.39        0        0        490.472        94.618        112.989        19.291        23.037        3.746        42.328        8.85        32.981        31.603
45012        2398.02        2399.44        2363.01        36.43        25.67        0        492.242        101.896        121.68        20.7        24.72        4.02        45.42        8.851        34.837        32.07
45009        2370.38        2373.77        2355.74        18.03        12.36        0        490.874        82.09        131.04        16.723        26.695        9.972        43.418        22.967        36.836        32.578
45008        2361.41        2361.41        2327.39        34.02        0        3.43        509.217        75.094        141.12        14.747        27.713        12.966        42.46        30.537        37.903        32.784
45007        2341.92        2358.63        2330.82        27.81        21.26        0        511.751        80.87        148.281        15.803        28.975        13.172        44.778        29.416        38.47        32.846
45006        2337.26        2337.37        2298.28        45.45        19.73        0        521.167        64.195        159.687        12.318        30.64        18.322        42.958        42.651        39.166        33.102
45005        2291.92        2317.64        2280.14        37.5        0        9.14        512.311        47.885        171.971        9.347        33.568        24.221        42.915        56.439        38.898        33.001
45002        2293.67        2324.83        2289.28        35.55        0        9.16        511.335        51.568        175.356        10.085        34.294        24.209        44.379        54.551        37.549        32.372
45001        2302.05        2333.31        2298.44        39.02        0        37.15        512.384        55.535        178.98        10.839        34.931        24.092        45.77        52.637        36.241        31.386
45000        2337.46        2375.28        2335.59        39.69        18.38        0        509.777        59.807        152.74        11.732        29.962        18.23        41.694        43.723        34.98        30.398
44999        2343.11        2356.9        2308.93        48.14        0        37.06        506.247        44.614        164.489        8.813        32.492        23.679        41.305        57.327        34.307        29.912
44998        2357.07        2374.97        2345.99        28.98        0        8.03        493.346        48.046        137.231        9.739        27.816        18.077        37.555        48.135        32.536        29.112
44995        2370.36        2388.61        2354.02        34.59        0        11.84        500.086        51.742        139.139        10.347        27.823        17.476        38.17        45.785        31.336        28.605
44994        2372.68        2386.9        2365.86        21.04        0        0.39        501.303        55.722        137.091        11.115        27.347        16.232        38.462        42.203        30.224        28.226
44993        2377.58        2390.07        2366.25        23.82        0        17.25        517.206        60.008        147.216        11.602        28.464        16.862        40.066        42.086        29.302        27.955
44992        2383.73        2430.64        2383.5        48.06        0        10.42        531.339        64.624        139.963        12.162        26.342        14.18        38.504        36.827        28.319        27.942
44991        2431.56        2435.9        2393.92        41.98        0        11.38        520.454        69.595        139.508        13.372        26.805        13.433        40.177        33.435        27.665        28.611
44988        2422.44        2434.12        2405.3        28.82        0        9.82        515.28        74.948        137.984        14.545        26.778        12.233        41.323        29.603        27.221        28.597
44987        2418.6        2442.19        2415.12        28.83        0        0.83        523.88        80.713        138.023        15.407        26.346        10.939        41.753        26.199        27.038        28.566
44986        2443.95        2449.44        2415.95        33.49        17.12        0        533.131        86.922        147.746        16.304        27.713        11.409        44.017        25.92        27.103        28.781
44985        2429.03        2432.32        2407.76        24.56        0        0        538.075        75.171        159.111        13.97        29.57        15.6        43.54        35.829        27.194        29.08
44984        2409.79        2432.39        2403.65        28.74        0        22.01        553.016        80.953        171.35        14.638        30.985        16.347        45.623        35.831        26.53        29.034
44981        2428.94        2458.29        2425.66        32.63        0        20.75        564.605        87.18        160.828        15.441        28.485        13.044        43.926        29.695        25.815        29.2
44980        2457.48        2470.4        2446.41        23.99        0        0        572.896        93.886        150.853        16.388        26.332        9.944        42.72        23.277        25.516        29.614
44979        2451.9        2470.5        2446.19        24.31        0        6.65        591.13        101.108        162.457        17.104        27.482        10.378        44.586        23.276        25.688        30.289
最佳答案
2023-4-27 10:37:16
我已经检查了您提供的VBA和Python代码,并将Python代码调整为与VBA代码的计算结果更加一致。以下是修改后的Python代码:
import pandas as pd
import random

def GetAdx(bar_data, dm_n=14, ma_n=6):
    high = list(bar_data['high'])
    low = list(bar_data['low'])
    close = list(bar_data['close'])
    idx = bar_data.index
    dmp, dmm, tr, adx = map(list, [[], [], [], []])
    
    bar_data['TR'] = 0
    bar_data['DMI+'] = 0
    bar_data['DMI-'] = 0
    bar_data['14TR'] = 0
    bar_data['14DM+'] = 0
    bar_data['14DM-'] = 0
    bar_data['PDI'] = 0
    bar_data['MDI'] = 0
    bar_data['DI DIFF'] = 0
    bar_data['DI SUM'] = 0
    bar_data['DX'] = 0
    bar_data['ADX'] = 0
    bar_data['ADXR'] = 0
    
    for d in range(1, len(idx)):
        hl = abs(high[d] - low[d-1])
        hc = abs(high[d] - close[d-1])
        lc = abs(low[d] - close[d-1])
        hd = high[d] - high[d-1]
        ld = low[d-1] - low[d]
        dmp.append(hd if hd > 0 and hd > ld else 0)
        dmm.append(ld if ld > 0 and ld > hd else 0)
        tr.append(max(hl, hc, lc))
        
        bar_data.loc[idx[d], 'TR'] = tr[-1]
        bar_data.loc[idx[d], 'DMI+'] = dmp[-1]
        bar_data.loc[idx[d], 'DMI-'] = dmm[-1]
        
        if d >= dm_n:
            sum_tr = sum(tr[-dm_n:])
            sum_dmp = sum(dmp[-dm_n:])
            sum_dmm = sum(dmm[-dm_n:])
            
            bar_data.loc[idx[d], '14TR'] = sum_tr
            bar_data.loc[idx[d], '14DM+'] = sum_dmp
            bar_data.loc[idx[d], '14DM-'] = sum_dmm
            
            pdi = sum_dmp * 100 / sum_tr if sum_tr != 0 else 0
            mdi = sum_dmm * 100 / sum_tr if sum_tr != 0 else 0
            
            bar_data.loc[idx[d], 'PDI'] = pdi
            bar_data.loc[idx[d], 'MDI'] = mdi
            
            di_diff = abs(pdi - mdi)
            di_sum = pdi + mdi
            
            bar_data.loc[idx[d], 'DI DIFF'] = di_diff
            bar_data.loc[idx[d], 'DI SUM'] = di_sum
            
            dx = (di_diff / di_sum) * 100 if di_sum != 0 else 0
            bar_data.loc[idx[d], 'DX'] = dx
            
            adx.append(dx)
            
            if len(adx) > ma_n:
                adx.pop(0)
            
            bar_data.loc[idx[d], 'ADX'] = sum(adx) / ma_n
            
            if d >= dm_n + ma_n - 1:
                adxr = (bar_data.loc[idx[d], 'ADX'] + bar_data.loc[idx[d-dm_n], 'ADX']) / 2
                bar_data.loc[idx[d], 'ADXR'] = adxr
    return bar_data

# Example usage
data = pd.DataFrame({
    'high': [random.randint(100, 200) for _ in range(50)],
    'low': [random.randint(50, 100) for _ in range(50)],
    'close': [random.randint(60, 180) for _ in range(50)]
})
result = GetAdx(data)
print(result)


现在,这个Python代码已经调整为与您提供的VBA代码更一致。您可以根据需要运行和使用此代码。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-27 10:37:16 | 显示全部楼层    本楼为最佳答案   
我已经检查了您提供的VBA和Python代码,并将Python代码调整为与VBA代码的计算结果更加一致。以下是修改后的Python代码:
import pandas as pd
import random

def GetAdx(bar_data, dm_n=14, ma_n=6):
    high = list(bar_data['high'])
    low = list(bar_data['low'])
    close = list(bar_data['close'])
    idx = bar_data.index
    dmp, dmm, tr, adx = map(list, [[], [], [], []])
    
    bar_data['TR'] = 0
    bar_data['DMI+'] = 0
    bar_data['DMI-'] = 0
    bar_data['14TR'] = 0
    bar_data['14DM+'] = 0
    bar_data['14DM-'] = 0
    bar_data['PDI'] = 0
    bar_data['MDI'] = 0
    bar_data['DI DIFF'] = 0
    bar_data['DI SUM'] = 0
    bar_data['DX'] = 0
    bar_data['ADX'] = 0
    bar_data['ADXR'] = 0
    
    for d in range(1, len(idx)):
        hl = abs(high[d] - low[d-1])
        hc = abs(high[d] - close[d-1])
        lc = abs(low[d] - close[d-1])
        hd = high[d] - high[d-1]
        ld = low[d-1] - low[d]
        dmp.append(hd if hd > 0 and hd > ld else 0)
        dmm.append(ld if ld > 0 and ld > hd else 0)
        tr.append(max(hl, hc, lc))
        
        bar_data.loc[idx[d], 'TR'] = tr[-1]
        bar_data.loc[idx[d], 'DMI+'] = dmp[-1]
        bar_data.loc[idx[d], 'DMI-'] = dmm[-1]
        
        if d >= dm_n:
            sum_tr = sum(tr[-dm_n:])
            sum_dmp = sum(dmp[-dm_n:])
            sum_dmm = sum(dmm[-dm_n:])
            
            bar_data.loc[idx[d], '14TR'] = sum_tr
            bar_data.loc[idx[d], '14DM+'] = sum_dmp
            bar_data.loc[idx[d], '14DM-'] = sum_dmm
            
            pdi = sum_dmp * 100 / sum_tr if sum_tr != 0 else 0
            mdi = sum_dmm * 100 / sum_tr if sum_tr != 0 else 0
            
            bar_data.loc[idx[d], 'PDI'] = pdi
            bar_data.loc[idx[d], 'MDI'] = mdi
            
            di_diff = abs(pdi - mdi)
            di_sum = pdi + mdi
            
            bar_data.loc[idx[d], 'DI DIFF'] = di_diff
            bar_data.loc[idx[d], 'DI SUM'] = di_sum
            
            dx = (di_diff / di_sum) * 100 if di_sum != 0 else 0
            bar_data.loc[idx[d], 'DX'] = dx
            
            adx.append(dx)
            
            if len(adx) > ma_n:
                adx.pop(0)
            
            bar_data.loc[idx[d], 'ADX'] = sum(adx) / ma_n
            
            if d >= dm_n + ma_n - 1:
                adxr = (bar_data.loc[idx[d], 'ADX'] + bar_data.loc[idx[d-dm_n], 'ADX']) / 2
                bar_data.loc[idx[d], 'ADXR'] = adxr
    return bar_data

# Example usage
data = pd.DataFrame({
    'high': [random.randint(100, 200) for _ in range(50)],
    'low': [random.randint(50, 100) for _ in range(50)],
    'close': [random.randint(60, 180) for _ in range(50)]
})
result = GetAdx(data)
print(result)


现在,这个Python代码已经调整为与您提供的VBA代码更一致。您可以根据需要运行和使用此代码。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-17 03:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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