Board logo

標題: [發問] 迴圈問題 [打印本頁]

作者: spermbank    時間: 2012-3-21 01:58     標題: 迴圈問題

本帖最後由 spermbank 於 2012-3-21 02:01 編輯

各位大大好:
附檔為計算C區股價獲利1%的獲利股價、獲利%數、獲利金額
因為手續費與證交稅問題,導致無法滿足獲利1%

我想設計迴圈,將手續費與證交稅併入計算過之後,獲利小於或等於1%(趨近小於1%)的獲利股價、獲利金額

可是不知道怎麼設計迴圈,請大大們指教,謝謝。
作者: hugh0620    時間: 2012-3-21 14:00

回復 1# spermbank


    基本的運算總該要提供一下吧~
    哪些欄位的計算是哪些值進行運算~
    並不是所有人都懂~ 這些是怎麼運算滴唷~
作者: spermbank    時間: 2012-3-21 23:57

回復 2# hugh0620


    獲利股價 = C區股價*1%  
    Buy = C區股價*1000 + C區股價*手續費率*打折
    Sell = 獲利股價*1000 - 獲利股價*手續費率*打折-獲利股價*證交稅
    獲利%數 = (Sell - Buy)/Buy
    獲利金額 = Sell-Buy
    另外:手續費,若小於20元以20元計算。

    利用設計迴圈或是什麼方式
    可以讓獲利股價(新)扣除手續費與證交稅,能讓獲利%數趨近1%及獲利金額
    想不太出來怎麼來寫,請各位大大指教。
作者: hugh0620    時間: 2012-3-22 09:16

回復 3# spermbank


     這個不是程式運用的問題~
     這是一個運算的問題~
作者: hugh0620    時間: 2012-3-22 09:57

本帖最後由 hugh0620 於 2012-3-22 10:35 編輯

回復 3# spermbank

這是你需要去思考~ 哪一些是運算中動數(x)=>穫利1%的新股價~ 在賣出價的時候
所以~ 買價是一個既定的事實情況下~ 去推算[穫利1%的新股價]
因此第二個迴圈~ 我用的是 do  loop
先求得基本的參數值
1. 買:股價/手續費
再依買的股價依股價原則一個值一格個值去推算小於或等於1%獲利股價
2.用do loop去推算賣出的股價
  1. Sub nn()

  2. '=========================='調整C區股價規則
  3. For Each A In Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
  4. B = Application.Lookup(A, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5))
  5. A.Offset(, 2) = Application.Ceiling(A, B)
  6. Next
  7. '=========================='獲利1%股利計算,不包含手續費、證交稅
  8. Sheets("Sheet1").Select
  9. x = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算
  10. For i = 2 To x
  11.     Cells(i, "G") = Cells(i, "C") * Cells(9, "O") + Cells(i, "C")
  12. Next
  13. '=========================='調整獲利股價規則
  14. For Each A In Range("G:G").SpecialCells(xlCellTypeConstants, xlNumbers)
  15. B = Application.Lookup(A, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5))
  16. A.Offset(, 0) = Application.Ceiling(A, B)
  17. Next
  18. '=========================='計算獲利1%扣除手續費與證交稅金額
  19. Sheets("Sheet1").Select
  20. x = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算

  21. For i = 2 To x
  22.         K = Cells(i, "C")    '買進股價,是一個固定值的條件下,推算穫利接接近1%時的股價及獲利
  23.         If K * 1000 * 0.001425 * 0.28 <= 20 Then '買進手續費是一個已發生的條件,若低於20圓,則為20圓,
  24.             ABuyP = 20
  25.         Else
  26.             ABuyP = B * 1000 * 0.001425 * 0.28
  27.         End If
  28.         ABuy = K * 1000 + ABuyP
  29.         B1 = Application.Lookup(K, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5)) '股價增加比率
  30.         J = 0
  31.         Do
  32.         B2 = B1 * J
  33.         If (K + B2) * 1000 * 0.001425 * 0.28 <= 20 Then '賣出手續費若低於20圓,則為20圓
  34.             ABuyP1 = 20
  35.         Else
  36.             ABuyP1 = (K + B2) * 1000 * 0.001425 * 0.28
  37.         End If
  38.         ASell = (K + B2) * 1000 - (K + B2) * 1000 * 0.003 - ABuyP1
  39.         A = (ASell - ABuy) / ABuy
  40.         J = J + 1
  41.         Loop While A <= 0.01     '貨利在>=0.01時,停止運算
  42.         Cells(i, "K") = K + B2 - B1 '計算獲利扣除手續費與證交稅的獲利%數
  43.         Cells(i, "L") = (((K + B2 - B1) * 1000 - (K + B2 - B1) * 1000 * 0.003 - ABuyP1) - ABuy) / ABuy
  44.         Cells(i, "M") = (((K + B2 - B1) * 1000 - (K + B2 - B1) * 1000 * 0.003 - ABuyP1) - ABuy) '計算獲利扣除手續費與證交稅的獲利金額
  45. Next


  46. End Sub
複製代碼

作者: hugh0620    時間: 2012-3-22 10:28

本帖最後由 hugh0620 於 2012-3-26 09:26 編輯

回復 3# spermbank


    任何求解後~ 要再進行驗算~
    已確保我們的設計所計算出來的結果是符合我們運算的邏輯
    以下圖N~S欄是驗算的結果~
    提供N~S欄第二列的公式給你複算
    N2=IF(C2* 1000 * 0.001425 * 0.28 <= 20,20,C2* 1000 * 0.001425 * 0.28 )
    O2=C2*1000+N2
    P2=IF(K2* 1000 * 0.001425 * 0.28 <= 20,20,K2* 1000 * 0.001425 * 0.28)
   Q2=K2 * 1000 - K2* 1000 * 0.003-P2
    R2=(Q2-O2)/O2
    S2=Q2-O2
[attach]10092[/attach]
作者: spermbank    時間: 2012-3-23 23:59

本帖最後由 spermbank 於 2012-3-24 00:07 編輯

回復 6# hugh0620

    大大你好:

    我在工作表(sheet2)利用反驗證
    利用C區股價與大大利用迴圈設計出來的獲利股價(新)重新驗證獲利小於或等於1%獲利與獲利金額
    雖然迴圈可讓新的股價趨近於1%
    但是有部分獲利股價與獲利%數、獲利金額運算有誤(sheet2黃色標記處)
    我找不出運算那邊出問題
    可否請大大幫我再研究一下,謝謝。
作者: GBKEE    時間: 2012-3-24 19:14

  1. Sub Ex()
  2. Dim 手續費 As Integer, N As Integer, B As Single
  3. Sheets("Sheet1").Select
  4. Sheets("Sheet1").Names.Add "手續費率", 0.001425
  5. Sheets("Sheet1").Names.Add "打折", 0.28
  6. Sheets("Sheet1").Names.Add "證交稅率", 0.003
  7. '=========================='調整C區股價規則
  8. For Each A In Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
  9.     B = Application.Lookup(A, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5))
  10.     A(1, "C") = Round(A, 2) * 1000              '買進股金
  11.     手續費 = IIf(A(1, "C") * [手續費率] * [打折] > 20, A(1, "C") * [手續費率] * [打折], 20)
  12.     A(1, "D") = 手續費                          '手續費
  13.     A(1, "E") = A(1, "C") + 手續費
  14.     N = 1                                       '
  15.     A(1, "G") = Round(Round(A, 2) + (B * N), 2) 'C區股價
  16.     A(1, "H") = "=RC[-1]*1000"                  '賣出股金
  17.     A(1, "I") = "=Round(IF(RC[-1] *手續費率 * 打折 > 20, RC[-1] * 手續費率 * 打折, 20), 0)" '賣出手續費
  18.     A(1, "J") = "=Round(RC[-2] *證交稅率,0)"                                                '證交稅
  19.     A(1, "K") = "=RC[-3]-RC[-2]-RC[-1]"                                                     '賣出金額
  20.     A(1, "M") = "=RC[-2]-RC[-8]"                                                            '獲利金額
  21.     A(1, "N") = "=(RC[-3]-RC[-9])/RC[-9]"                                                   '獲利%數
  22.     '
  23.     A(1, "N").GoalSeek Goal:=0.01, ChangingCell:=A(1, "G") '***** 目標搜尋  獲利%數=0.01 會求得接近的[賣價]
  24.     '****  也可用迴圈求解   求解後的[賣價] 會是真實的[[ 檔價 ]]     ********
  25.     'Do Until A(1, "M") >= A(1, "E") * 0.01          '    獲利%數=0.01
  26.     'N = N + 1
  27.     'A(1, "G") = Round(A, 2) + (B * N)
  28.     'Loop
  29.     '*******************************
  30.     A(1, "G").Resize(, 8) = A(1, "G").Resize(, 8).Value     '消除公式顯示值
  31. Next
  32. End Sub
複製代碼
如圖 請修改 欄位名稱

[attach]10127[/attach]
作者: spermbank    時間: 2012-3-25 12:01

回復 8# GBKEE


    G大您好:

    我RUN過一遍
    發現A區股價、C區股價沒有調整符合下列規則:
    數字區間0-10           跳動+-0.01   
    數字區間10-50         跳動+-0.05
    數字區間50-100      跳動+-0.1
    數字區間100-500    跳動+-0.5
    數字區間500-1000  跳動+-1
    數字區間1000以上   跳動+-5
    例如:
    數字  6.7894  取 6.79  (只要數字大於6.78就進位取6.79)   
    數字  10.68    取10.7   (只要數字大於10.65就進位取10.7)
    數字  56.92    取57      (只要數字大於56.9就進位取57)
    數字  103.42 取103.5    (只要數字大於103就進位取103.5)
    ...等等
    我嘗試把A.Offset(, 0) = Application.Ceiling(A, B)塞入程式碼第9至10行中間
    可以解決買進股價符合數字規則,讓手續費、買進金額也符合
    可是我卻不知道要如何調整C區股價也符合數字規則的情況下
    求得扣除手續費、證交稅後,獲利%數小於或等於1%的獲利金額
    可請G大再幫我看看,謝謝。
作者: GBKEE    時間: 2012-3-25 16:38

本帖最後由 GBKEE 於 2012-3-25 16:40 編輯

回復 9# spermbank
   
我嘗試把A.Offset(, 0) = Application.Ceiling(A, B)塞入程式碼第9至10行中間
    可以解決買進股價符合數字規則,讓手續費、買進金額也符合
    可是我卻不知道要如何調整C區股價也符合數字規則的情況下

是要修改A區股價吧 附檔中第一個股價為   12.3333333
  1. Sub Ex()
  2. Dim 手續費 As Integer, N As Integer, B As Double
  3. Sheets("Sheet1").Select
  4. Sheets("Sheet1").Names.Add "手續費率", 0.001425
  5. Sheets("Sheet1").Names.Add "打折", 0.28
  6. Sheets("Sheet1").Names.Add "證交稅率", 0.003
  7. '=========================='調整C區股價規則
  8. For Each A In Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
  9.     B = Application.Lookup(A, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5))
  10.     A.Value = Application.Ceiling(A, B)             '在此修改 A區股價符合買賣股價規則的[[ 檔價 ]]
  11.     A(1, "C") = A * 1000                            '買進股金
  12.     手續費 = IIf(A(1, "C") * [手續費率] * [打折] > 20, A(1, "C") * [手續費率] * [打折], 20)
  13.     A(1, "D") = 手續費                              '手續費
  14.     A(1, "E") = A(1, "C") + 手續費
  15.     N = 1                                           ' 符合買賣股價數字規則 的次數
  16.     A(1, "G") = A + B * N                           'C區股價
  17.     A(1, "H") = "=RC[-1]*1000"                      '賣出股金
  18.     A(1, "I") = "=Round(IF(RC[-1] *手續費率 * 打折 > 20, RC[-1] * 手續費率 * 打折, 20), 0)" '賣出手續費
  19.     A(1, "J") = "=Round(RC[-2] *證交稅率,0)"                                                '證交稅
  20.     A(1, "K") = "=RC[-3]-RC[-2]-RC[-1]"                                                     '賣出金額
  21.     A(1, "M") = "=RC[-2]-RC[-8]"                                                            '獲利金額
  22.     A(1, "N") = "=Round(((RC[-3]-RC[-9])/RC[-9]),4)"                                        '獲利%數
  23.     '****  用迴圈求解   求解後的[賣價] 會是符合買賣股價規則的[[ 檔價 ]]
  24.     Do Until A(1, "M") >= A(1, "E") * 0.01              '獲利%數=1%
  25.         N = N + 1                                       '次數的累加
  26.         A(1, "G") = A + (B * N)                         'B -> 符合買賣股價規則的數字
  27.     Loop
  28.     A(1, "G").Resize(, 8) = A(1, "G").Resize(, 8).Value     '消除公式顯示值
  29. Next
  30. End Sub
複製代碼

作者: hugh0620    時間: 2012-3-26 09:24

本帖最後由 hugh0620 於 2012-3-26 09:25 編輯

回復 7# spermbank

很抱歉唷~ 程式碼打錯一個字  將第28列b改成K 就可以了
ABuyP = b * 1000 * 0.001425 * 0.28
ABuyP = K * 1000 * 0.001425 * 0.28
  1. Sub nn()

  2. '=========================='調整C區股價規則
  3. For Each A In Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers)
  4. B = Application.Lookup(A, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5))
  5. A.Offset(, 2) = Application.Ceiling(A, B)
  6. Next
  7. '=========================='獲利1%股利計算,不包含手續費、證交稅
  8. Sheets("Sheet1").Select
  9. x = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算
  10. For i = 2 To x
  11.     Cells(i, "G") = Cells(i, "C") * Cells(9, "O") + Cells(i, "C")
  12. Next
  13. '=========================='調整獲利股價規則
  14. For Each A In Range("G:G").SpecialCells(xlCellTypeConstants, xlNumbers)
  15. B = Application.Lookup(A, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5))
  16. A.Offset(, 0) = Application.Ceiling(A, B)
  17. Next
  18. '=========================='計算獲利1%扣除手續費與證交稅金額
  19. Sheets("Sheet1").Select
  20. x = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算

  21. For i = 2 To x
  22.         K = Cells(i, "C")    '買進股價,是一個固定值的條件下,推算穫利接接近1%時的股價及獲利
  23.         If K * 1000 * 0.001425 * 0.28 <= 20 Then '買進手續費是一個已發生的條件,若低於20圓,則為20圓,
  24.             ABuyP = 20
  25.         Else
  26.             ABuyP = K * 1000 * 0.001425 * 0.28
  27.         End If
  28.         ABuy = K * 1000 + ABuyP
  29.         B1 = Application.Lookup(K, Array(0, 11, 51, 101, 501, 1001), Array(0.01, 0.05, 0.1, 0.5, 1, 5)) '股價增加比率
  30.         J = 0
  31.         Do
  32.         B2 = B1 * J
  33.         If (K + B2) * 1000 * 0.001425 * 0.28 <= 20 Then '賣出手續費若低於20圓,則為20圓
  34.             ABuyP1 = 20
  35.         Else
  36.             ABuyP1 = (K + B2) * 1000 * 0.001425 * 0.28
  37.         End If
  38.         ASell = (K + B2) * 1000 - (K + B2) * 1000 * 0.003 - ABuyP1
  39.         A = (ASell - ABuy) / ABuy
  40.         J = J + 1
  41.         Loop While A <= 0.01     '貨利在>=0.01時,停止運算
  42.         Cells(i, "K") = K + B2 - B1 '計算獲利扣除手續費與證交稅的獲利%數
  43.         Cells(i, "L") = (((K + B2 - B1) * 1000 - (K + B2 - B1) * 1000 * 0.003 - ABuyP1) - ABuy) / ABuy
  44.         Cells(i, "M") = (((K + B2 - B1) * 1000 - (K + B2 - B1) * 1000 * 0.003 - ABuyP1) - ABuy) '計算獲利扣除手續費與證交稅的獲利金額
  45. Next


  46. End Sub
複製代碼

作者: spermbank    時間: 2012-3-26 23:29

回復 10# GBKEE


    謝謝G大
作者: spermbank    時間: 2012-3-26 23:30

回復 11# hugh0620


    謝謝H大
作者: hugh0620    時間: 2012-3-27 09:06

回復 10# GBKEE


    G大大~ 用VBA來帶出函數亦是很好的一招~
    只要將公式列出直接套用~
    再去推導出新股價的價格~
    蠻值得學習的~




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)