Settings = { Name = "xZIG_ZAG_ATR", periodATR =21, ddd=3, line= { { Name = "ATRL", Color = RGB(0, 192, 0), Type = TYPET_BAR, Width = 2 }, { Name = "ATRH", Color = RGB(192, 0, 0), Type = TYPET_BAR, Width = 2 } , { Name = "BUY", Color = RGB(0, 0, 255), Type = TYPE_TRIANGLE_UP, Width = 3 } , { Name = "SELL", Color = RGB(255, 0, 0), Type = TYPE_TRIANGLE_DOWN, Width = 3 } , { Name = "ZIGZAG", Color = RGB(0, 0, 0), Type = TYPE_LINE, Width = 2 } } } --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function cached_SAR() local cache_H={} local cache_L={} local cache_SAR={} local cache_ST={} local AMA2={} local CC={} local CC_N={} local ATR={} local H_index={} local L_index={} local I_index={} return function(ind, _p4,_ddd) local index = ind local ZZZ = 0 if index == 1 then cache_H={} cache_L={} cache_SAR={} cache_ST={} AMA2={} CC={} CC_N={} ATR={} H_index={} L_index={} I_index={} ------------------ CC[index]=C(index) CC_N[index]=(C(index)+H(index)+L(index))/3 cache_H[index]=H(index) cache_L[index]=L(index) cache_SAR[index]=L(index)-2*(H(index)-L(index)) AMA2[index]=(C(index)+O(index))/2 cache_ST[index]=1 ATR[index]=math.abs(H(index)-L(index)) H_index[index]=index L_index[index]=index I_index[index]=index SetValue(index, 5, CC[index]) return nil end ------------------------------ ZZZ=math.max(math.abs(H(index)-L(index)),math.abs(H(index)-C(index-1)),math.abs(L(index)-C(index-1))) ATR[index]=(ATR[index-1]*(_p4-1)+ZZZ)/_p4 cache_SAR[index]=cache_SAR[index-1] CC[index]=C(index) AMA2[index]=(2/(_p4/2+1))*CC[index]+(1-2/(_p4/2+1))*AMA2[index-1] CC_N[index]=(C(index)-AMA2[index])/2+AMA2[index] cache_ST[index]=cache_ST[index-1] cache_H[index]=cache_H[index-1] cache_L[index]=cache_L[index-1] H_index[index]=H_index[index-1] L_index[index]=L_index[index-1] I_index[index]=I_index[index-1] --------------------------------------------------------------------------------------- if index ==2 then return nil end ---------------------------------------------------------------------- if cache_ST[index]==1 then if cache_H[index] < CC[index] then cache_H[index]=CC[index] SetValue(H_index[index], 5, nil) H_index[index]=index end SetRangeValue(5, L_index[index], index, nil) for i = L_index[index], H_index[index] do SetValue(i, 5, (i-L_index[index])/(H_index[index]-L_index[index])*(CC[H_index[index]]-CC[L_index[index]])+CC[L_index[index]]) end cache_SAR[index]=math.max((cache_H[index]-ATR[index]*_ddd),cache_SAR[index-1]) if (cache_SAR[index] > CC_N[index])and(cache_SAR[index] > C(index)) then cache_ST[index]=0 cache_L[index]=CC[index] cache_SAR[index]=cache_L[index]+ATR[index]*_ddd*1 L_index[index]=index I_index[index]=H_index[index] SetRangeValue(5, H_index[index], index, nil) for i = H_index[index], L_index[index] do SetValue(i, 5, (i-H_index[index])/(L_index[index]-H_index[index])*(CC[L_index[index]]-CC[H_index[index]])+CC[H_index[index]]) end return nil,cache_SAR[index], nil,math.max((cache_H[index]-ATR[index]*_ddd),cache_SAR[index-1]),CC[index] end if H_index[index]==index then return cache_SAR[index], nil, nil, nil,CC[index] end SetValue(H_index[index], 5,CC[H_index[index]]) return cache_SAR[index], nil, nil, nil,nil end --------------------------------------------------------------------------------------- if cache_ST[index]==0 then if cache_L[index] > CC[index] then cache_L[index]=CC[index] SetValue(L_index[index], 5, nil) L_index[index]=index SetRangeValue(5, H_index[index], index, nil) for i = H_index[index], L_index[index] do SetValue(i, 5, (i-H_index[index])/(L_index[index]-H_index[index])*(CC[L_index[index]]-CC[H_index[index]])+CC[H_index[index]]) end end cache_SAR[index]=math.min((cache_L[index]+ATR[index]*_ddd),cache_SAR[index-1]) if (cache_SAR[index] < CC_N[index])and (cache_SAR[index] < C(index)) then cache_ST[index]=1 cache_H[index]=CC[index] cache_SAR[index]=cache_H[index]-ATR[index]*_ddd*1 H_index[index]=index I_index[index]=L_index[index] SetRangeValue(5, L_index[index], index, nil) for i = L_index[index], H_index[index] do SetValue(i, 5, (i-L_index[index])/(H_index[index]-L_index[index])*(CC[H_index[index]]-CC[L_index[index]])+CC[L_index[index]]) end return cache_SAR[index], nil, math.min((cache_L[index]+ATR[index]*_ddd),cache_SAR[index-1]),nil,CC[index] end if L_index[index]==index then return nil,cache_SAR[index], nil, nil,CC[index] end SetValue(L_index[index], 5,CC[L_index[index]]) return nil,cache_SAR[index], nil, nil,nil end end end --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function Init() mySAR = cached_SAR() return 5 end function OnCalculate(index) return mySAR(index, Settings.periodATR,Settings.ddd) end