autotrade
autotrade личный блог
22 апреля 2026, 17:43

Идея построения индикатора для торговой системы. Продолжение

Предыдущее обсуждение: Идея для торговой системы
Сделал пока на одном зигзаге и двум плечам — тише едешь дальше будешь
Нижний график показывает как меняются периоды средних 
Идея построения индикатора для торговой системы. Продолжение

Реализация:
--[[
вопросы к автору: https://smart-lab.ru/profile/autotrade/
Zigzag + 2 MA
параметры: 
prc - процент зигзага 
--]]
Settings={
Name="MMZ_v2",
prc=4,
frm=200,
t=0,
    line=                                     
                {  
                    {  
                        Name = "cur1",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,0,0)
                    },
                    {  
                        Name = "cur2",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(0,0,255)
                    },
                    {  
                        Name = "cur3",
                        Type =TYPE_LINE,
                        Width = 2,
                        Color = RGB(255,0,0)
                    }
                }
}
 
function Init()
  
      
  return 3
  
end
 
function OnCalculate(index)
 
  de = Settings.prc
 
  vl = O(index)
  if index == 1 then 
    y1 = vl 
    y2 = vl
    y3 = vl
    y4 = vl    
    x1 = 1
    x2 = 1    
    x3 = 1
    x4 = 1    
    ch = {}
    ch[index] = 0
  else   
    ch[index] = ch[index-1] 
      if O(index) > y1*(1+de/100) and y1 < y2 then 
        x4 = x3
        y4 = y3          
        x3 = x2
        y3 = y2          
        x2 = x1
        y2 = y1    
        x1 = index 
        y1 = O(index)        
        ch[index] = ch[index-1] + 1
      else 
        if O(index) > y1 and y1 >= y2 
        then 
          x1 = index 
          y1 = O(index)            
		  if ch[index] % 10 == 0 then 
            ch[index] = ch[index-1] + 1
          end 		  
        end         
      end     
 
                    
      if O(index) < y1*(1-de/100) and y1 > y2 then 
        x4 = x3
        y4 = y3          
        x3 = x2
        y3 = y2          
        x2 = x1
        y2 = y1
        x1 = index 
        y1 = O(index)    
        ch[index] = ch[index-1] + 1        
      else 
        if O(index) < y1 and y1 <= y2 
        then 
          x1 = index 
          y1 = O(index)    
		  if ch[index] % 10 == 0 then 
            ch[index] = ch[index-1] + 1
          end 	
        end         
      end     
                    
    end     
  

  if x1 ~= index then 
    curfrom = x1
    curto = index
  else 
    curfrom = x2
    curto = x1
  end 
 
  if Settings.t==0 then
  if curto ~= curfrom and curfrom ~= nil and curto ~= nil then 
    if O(curto) ~= nil and O(curfrom) ~= nil then 
      k = (O(curto)- O(curfrom))/(curto- curfrom)  
      for i = curfrom, index  do
        curv = i*k + O(curto) - curto*k                    
        SetValue(i, 1, curv)
      end       
    end 
  end 
  end
 --[[--]]
 
 
  if index == 1 then 
    sma = {}
    sma[index] = O(index)
    per1 = {}
    per2 = {}
    per1[index] = 8
    per2[index] = 2
  else 
    sma[index] = sma[index-1] + O(index)
    per1[index] = per1[index-1]
    per2[index] = per2[index-1]
    
    if ch[index] ~= ch[index-1]  then          
         
     --per1_0 = Settings.frm    
    --[[     
     for i = Settings.frm, 5, -1  do
	
      j = math.ceil(i/4) 
      cros0 = 0
      for k = x2, x1 do                  
       if k-2 > Settings.frm then 
        sma1 = (sma[k] - sma[k-i])/i  
        sma2 = (sma[k] - sma[k-j])/j  
        sma1_0 = (sma[k-1] - sma[k-i-1])/i  
        sma2_0 = (sma[k-1] - sma[k-j-1])/j         
        if 
         (
           sma1 > sma2 and sma1_0 <= sma2_0 and y1 > y2 or 
           sma1 < sma2 and sma1_0 >= sma2_0 and y1 < y2
         ) --and cros0 = 0
        then
         cros0 = cros0 + 1   
         pr0 = O(k) 		 
        end      
       end 
      end  -- for k 
      if cros0 <= 1 then 
        per1_0 = i
        per2_0 = j	  
      end  	              
     end -- for i    
--]]
 
     for i = Settings.frm, 5, -1  do  
	 
      j = math.ceil(i/4) 
      cros = 0
	  updwn = 0 
      for k = x3, x1 do                  
       if k-2 > Settings.frm then         
        sma1 = (sma[k] - sma[k-i])/i  
        sma2 = (sma[k] - sma[k-j])/j  
        sma1_0 = (sma[k-1] - sma[k-i-1])/i  
        sma2_0 = (sma[k-1] - sma[k-j-1])/j         
        if 
         (
         sma1 > sma2 and sma1_0 <= sma2_0 --and y2 > y3 
		 or 
         sma1 < sma2 and sma1_0 >= sma2_0 --and y2 < y3
         ) --and cros = 0
        then
         cros = cros + 1
		 pr1 = O(k)
		 if sma1 > sma2 then 
		   updwn = 1
		 end 
		 if sma1 < sma2 then 
		   updwn = -1
		 end 		 
        end      
       end 
      end  -- for k   
	  
      if ( cros <= 2 ) and (y1 > y2 and updwn == 1 or y1 < y2 and updwn == -1 ) then 
        per1_1 = i
        per2_1 = j	  
		per1[index] = i
        per2[index] = j
      end  	 
     end -- for i         
     
    --[[ 
     for i = Settings.frm, 5, -1  do
      
	  j = math.ceil(i/4) 
      cros2 = 0
      for k = x4, x3 do                  
       if k-2 > Settings.frm then         
        sma1 = (sma[k] - sma[k-i])/i  
        sma2 = (sma[k] - sma[k-j])/j  
        sma1_0 = (sma[k-1] - sma[k-i-1])/i  
        sma2_0 = (sma[k-1] - sma[k-j-1])/j         
        if 
         (
          sma1 > sma2 and sma1_0 <= sma2_0 and y3 > y4 or 
          sma1 < sma2 and sma1_0 >= sma2_0 and y3 < y4
         ) --and cros2 = 0
        then
         cros2 = cros2 + 1
		 pr2 = O(k)
        end      
       end 
      end  -- for k 
      if cros2 <= 1 then 
        per1_1 = i
        per2_1 = j	  
      end  	 	  
 
     end -- for i              
  
      
      if cros0 == 1 and cros == 1 and 
	   ( y1 > y2 and pr0 < pr1 or y1 < y2 and pr0 > pr1 ) 
	   or
	   cros == 1 and cros2 == 1 and 
	   ( y2 > y3 and pr1 < pr2 or y2 < y3 and pr1 > pr2 ) 	   
	  then
	    per1[index] = per1_0
        per2[index] = per2_0
        if per1_0 < per1_1 then 
           per1[index] = per1_1
           per2[index] = per2_1
        else
          if per1_1 < per1_2 then 
            per1[index] = per1_2
            per2[index] = per2_2       
          end 
        end  
      end 
            

      if cros == 1   
	  then

           per1[index] = per1_1
           per2[index] = per2_1
 
      end 	--]]	  
     
    end  
    
    if index-2 > Settings.frm  then             
      sma1 = (sma[index] - sma[index-per1[index]])/per1[index]  
      sma2 = (sma[index] - sma[index-per2[index]])/per2[index]
    end    
    
  end 
 
  if Settings.t==0 then
    return nil, sma1, sma2
  else 
    return nil, per1[index], per2[index]
  end 
 
  
end
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
1 Комментарий
  • Евгений Гуревич
    22 апреля 2026, 18:10
    Хм… Навскидку — ничем не отличается от двух скользяшек, быстрой и медленной…

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн