Advertisement
Guest User

Untitled

a guest
May 9th, 2019
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. Settings = {
  2. Name = "*A/D (Accumulation/Distribution)",
  3. line = {{
  4. Name = "Horizontal line",
  5. Type = TYPE_LINE,
  6. Color = RGB(140, 140, 140)
  7. },
  8. {
  9. Width = 3,
  10. Name = "A/D_Up",
  11. Type = TYPE_HISTOGRAM,
  12. Color = RGB(0, 206, 0)
  13. },
  14. {
  15. Width = 3,
  16. Name = "A/D_Down",
  17. Type = TYPE_HISTOGRAM,
  18. Color = RGB(221, 44, 44)
  19. }
  20. },
  21. Round = "off",
  22. Multiply = 1,
  23. Horizontal_line="0"
  24. }
  25.  
  26. function Init()
  27. func = AD()
  28. return #Settings.line
  29. end
  30.  
  31. function OnCalculate(Index)
  32. local Out = ConvertValue(Settings, func(Index, Settings))
  33. local HL = tonumber(Settings.Horizontal_line)
  34. if Out then
  35. if Out > (HL or 0) then
  36. return HL,Out,nil
  37. else
  38. return HL,nil,Out
  39. end
  40. else
  41. return HL,nil,nil
  42. end
  43. end
  44.  
  45. function AD() --Accumulation/Distribution ("AD")
  46. local tmp = {pp=nil, p=nil}
  47. local it = {p=0, l=0}
  48. return function (I, Fsettings, ds)
  49. if I == 1 then
  50. tmp = {pp=nil, p=nil}
  51. it = {p=0, l=0}
  52. end
  53. if CandleExist(I,ds) then
  54. if I~=it.p then
  55. it={p=I, l=it.l+1}
  56. tmp.pp = tmp.p
  57. end
  58. local CLH=(2*GetValueEX(it.p,CLOSE,ds)-GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds))*GetValueEX(it.p,VOLUME,ds)
  59. local HL=GetValueEX(it.p,HIGH,ds) - GetValueEX(it.p,LOW,ds)
  60. if HL==0 then
  61. tmp.p = tmp.pp or 0
  62. else
  63. tmp.p = CLH/HL + (tmp.pp or 0)
  64. end
  65. if it.l==1 then
  66. if HL == 0 then return 0
  67. else return CLH/HL end
  68. else
  69. return tmp.p
  70. end
  71. end
  72. return nil
  73. end
  74. end
  75.  
  76.  
  77. SMA,MMA,EMA,WMA,SMMA,VMA = "SMA","MMA","EMA","WMA","SMMA","VMA"
  78. OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = "O","H","L","C","V","M","T","W","D","A"
  79.  
  80. function CandleExist(I,ds)
  81. return (type(C)=="function" and C(I)~=nil) or
  82. (type(ds)=="table" and (ds[I]~=nil or (type(ds.Size)=="function" and (I>0) and (I<=ds:Size()))))
  83. end
  84.  
  85. function Squeeze(I,P)
  86. return math.fmod(I-1,P+1)
  87. end
  88.  
  89. function ConvertValue(T,...)
  90. local function r(V, R)
  91. if R and string.upper(R)== "ON" then R=0 end
  92. if V and tonumber(R) then
  93. if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R
  94. else return math.ceil(V * 10^R - 0.5) / 10^R end
  95. else return V end
  96. end
  97. if arg.n > 0 then
  98. for i = 1, arg.n do
  99. arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off")
  100. end
  101. return unpack(arg)
  102. else return nil end
  103. end
  104.  
  105. function GetValueEX(I,VT,ds)
  106. VT=(VT and string.upper(string.sub(VT,1,1))) or ANY
  107. if VT == OPEN then --Open
  108. return (O and O(I)) or (ds and ds:O(I))
  109. elseif VT == HIGH then --High
  110. return (H and H(I)) or (ds and ds:H(I))
  111. elseif VT == LOW then --Low
  112. return (L and L(I)) or (ds and ds:L(I))
  113. elseif VT == CLOSE then --Close
  114. return (C and C(I)) or (ds and ds:C(I))
  115. elseif VT == VOLUME then --Volume
  116. return (V and V(I)) or (ds and ds:V(I))
  117. elseif VT == MEDIAN then --Median
  118. return ((GetValueEX(I,HIGH,ds) + GetValueEX(I,LOW,ds)) / 2)
  119. elseif VT == TYPICAL then --Typical
  120. return ((GetValueEX(I,MEDIAN,ds) * 2 + GetValueEX(I,CLOSE,ds))/3)
  121. elseif VT == WEIGHTED then --Weighted
  122. return ((GetValueEX(I,TYPICAL,ds) * 3 + GetValueEX(I,OPEN,ds))/4)
  123. elseif VT == DIFFERENCE then --Difference
  124. return (GetValueEX(I,HIGH,ds) - GetValueEX(I,LOW,ds))
  125. else --Any
  126. return (ds and ds[I])
  127. end
  128. return nil
  129. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement