autotrade
autotrade личный блог
03 декабря 2024, 00:44

Сделал индикатор

Сделал индикатор на базе этой функции F: smart-lab.ru/blog/1089363.php
работает примерно так же как если бы выставил условие каждое по отдельности типа:
GAZP > MA(GAZP) and IMOEX2 > MAX(IMOEX2) and GAZP > MA(GAZP) and GAZP/IMOEX2 > MAX(GAZP/IMOEX2)
для лонга и наоборот для шорта.
Но функция F дает сигнал с большим шумом. Изначально была задача для выше приведенных условий придумать стоплосс.
Поэтому и пришлось придумать функцию F. Стоплосс как раз позволяет уменьшить шум сигнала. пока в нем стоплосса нет в следующей версии появится

--[[
вопросы к автору: https://t.me/autotradering
параметры: 
--]]
Settings={
Name="gazp_imoex2_2_v1",
prf=0, -- =1 - показать профит		
sign=0,	-- =1 - показать сигнал	
Len1=40, -- длина средней
Len2=30, -- длина средней
Len3=5, -- длина средней
SLP=1.0,	-- stop loss в %
line=                                     
                {  
                    {  
                        Name = "line1",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0,255)
                    },
                    {  
                        Name = "line2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0,255)
                    },					
					{  
                        Name = "TRIANGLE_DOWN",
                        Type =TYPE_TRIANGLE_DOWN,
                        Width = 5,
                        Color = RGB(255, 0, 0)
                    },
					{  
                        Name = "TRIANGLE_UP",
                        Type =TYPE_TRIANGLE_UP,
                        Width = 5,
                        Color = RGB(0, 0, 255)
                    },
					{  
                        Name = "cur5",
                        Type =TYPE_POINT,
                        Width = 5,
                        Color = RGB(255, 0, 255)
                    },
					{  
                        Name = "cur6",
                        Type =TYPE_POINT,
                        Width = 5,
                        Color = RGB(0, 0, 255)
                    }					
                }
}

function Init()
  prof = {}
  sl = {}    
  pos = {}   
  otn = {}
  return 6
  
end


function OnCalculate(index)

  Len1 = Settings.Len1  
  Len2 = Settings.Len2  
  Len3 = Settings.Len3     

if index == 1 then
  brs = Size()
	
  imoex2 = {}
  gazp = {}
  otn = {}  
end 

if index == 1 or brs ~= Size() then
  brs = Size()
  
  imoex2_id = "imoex2"
  number_of_candles_imoex2 = getNumCandles(imoex2_id)
  imoex2_from_graph, a, b = getCandlesByIndex(imoex2_id, 0, 0, number_of_candles_imoex2)  
  for i = 1, number_of_candles_imoex2 do
	imoex2[i] = imoex2_from_graph[i-1].open
	if i > 1 and imoex2[i] == 0 then 
		imoex2[i] = imoex2[i-1]
	end 
  end    
  
  gazp_id = "gazp"
  number_of_candles_gazp = getNumCandles(gazp_id)
  gazp_from_graph, a, b = getCandlesByIndex(gazp_id, 0, 0, number_of_candles_gazp)  
  for i = 1, number_of_candles_gazp do
	gazp[i] = gazp_from_graph[i-1].open
	if i > 1 and gazp[i] == 0 then 
		gazp[i] = gazp[i-1]
	end 
  end  

else

  imoex2[index] = imoex2_from_graph[index-1].open
	if index-2 >= 0 and imoex2[index] ~= nil then 
	  if imoex2[index] == 0 then 
	    if imoex2[index-1] ~= nil then 
          imoex2[index] = imoex2[index-1]
		end 
	  end 
	else  
      imoex2[index] = imoex2[index-1]	
	end 
	
  gazp[index] = gazp_from_graph[index-1].open
	if index-2 >= 0 and gazp[index] ~= nil then 
	  if gazp[index] == 0 then 
		if gazp[index-1] ~= nil then 
          gazp[index] = gazp[index-1]
		end 		
	  end 
	else  
      gazp[index] = gazp[index-1]	
	end 		

end 

  if imoex2[index]~= 0 then 
    otn[index] = gazp[index]/imoex2[index]
  else 
    otn[index] = 0
  end 

  if imoex2[index]~= nil and gazp[index]~= nil then

    
	  -- SMA1
	  if index == 1 then 
        sum1 = {}
		sma1 = {}  	
		n1 = {}				
		sum1[index] = imoex2[index]
		n1[index]=1	
	  else		
		sum1[index] = imoex2[index] + sum1[index-1]
		n1[index]= n1[index-1] + 1			
		if index > Len1 then 
		  sum1[index] = sum1[index-1] + imoex2[index]
		  sum1[index] = sum1[index] - imoex2[index-Len1]
		  n1[index] = n1[index-1]
        end    		
	  end 
	  
	  -- SMA2
	  if index == 1 then 
        sum2 = {}
		sma2 = {}  	
		n2 = {}				
		sum2[index] = gazp[index]
		n2[index]=1	
	  else		
		sum2[index] = gazp[index] + sum2[index-1]
		n2[index]= n2[index-1] + 1			
		if index > Len2 then 
		  sum2[index] = sum2[index-1] + gazp[index]
		  sum2[index] = sum2[index] - gazp[index-Len2]
		  n2[index] = n2[index-1]
        end    		
	  end 	    

	 
	  -- SMA3
	  if index == 1 then 
        sum3 = {}
		sma3 = {}  	
		n3 = {}				
		sum3[index] = otn[index]
		n3[index]=1	
	  else		
	    if sum3[index-1] == nil then 
		  sum3[index] = 0
		  n3[index] = 1
		else
		sum3[index] = otn[index] + sum3[index-1]
		n3[index]= n3[index-1] + 1			
		if index > Len3 then 
		  sum3[index] = sum3[index-1] + otn[index]
		  sum3[index] = sum3[index] - otn[index-Len3]
		  n3[index] = n3[index-1]
        end  
        end   		
	  end 	 	  
	  
	  
	  if n1[index] ~= nil then 
		if n1[index] ~= 0 then 
		  sma1[index] = sum1[index]/n1[index]
		end  
	  end 
	  
	  if n2[index] ~= nil then 
		if n2[index] ~= 0 then 
		  sma2[index] = sum2[index]/n2[index]
		end  
	  end 	

     
	  if n3[index] ~= nil then 
		if n3[index] ~= 0 then 
		  sma3[index] = sum3[index]/n3[index]
		end  
	  end 
	  

  end

	  	  
      --[[ --]]
   
 --  return otn[index], sma3[index]
 
   if index == 1 then
    prof = {}
	pos = {}
	f = {}
	prof[index] = 0  
	pos[index] = 0  
	f[index] = 0
  else 	
	prof[index] = prof[index-1] 
	pos[index] = pos[index-1]
	f[index] = f[index-1]
  end 	  
  
  if gazp[index] ~= nil and imoex2[index]  ~= nil and
     gazp[index-1]  ~= nil and imoex2[index-1]  ~= nil and
     sma1[index]  ~= nil and sma2[index]  ~= nil and
     sma1[index-1]  ~= nil and sma2[index-1]  ~= nil  
  then 
  
    kf2 = imoex2[index]/gazp[index]
	kf3 = imoex2[index]/otn[index]
  
    f[index] = (imoex2[index] - sma1[index]) +
	    kf2*(gazp[index] - sma2[index]) +
		kf3*(otn[index] - sma3[index])
  
	  if (
	    f[index] > 0 	
        ) and 
		pos[index] ~= 1
	  then -- long 
		pos[index] = 1
	  else   
		if 
	      f[index] < 0 	and 
		  pos[index] ~= -1    
		  --otn[index-1] > sma3[ind1[index-1] ] 
		then -- short
		  pos[index] = -1    
		end 
	  end   
  
  end   
 

  
  -- signals
  if index == Size() then 
   if Settings.sign == 1 then   
    for i = 2, Size() do 
	  if pos[i] ~= nil and pos[i-1] ~= nil then 
	    if pos[i-1] ~= 1 and pos[i] == 1 then
	      SetValue(i, 4, gazp[i])	
	    else	  
	     if pos[i-1] ~= -1 and pos[i] == -1 then
	       SetValue(i, 3, gazp[i])		
	     else
	       SetValue(i, 3, nil)	
	       SetValue(i, 4, nil)	
	     end 
         if pos[i] ~= pos[i-1] and pos[i] == 0 then
		   if pos[i-1] == 1 then 
	         SetValue(i, 5, gazp[i])
           else 	
             SetValue(i, 6, gazp[i])				 
           end 			 
         end  
	    end 
	  end 
    end 
   end	
  end   
  
  -- profit 
  if Settings.prf==1 then  
  
    if pos[index-1] ~= nil then 
      if pos[index-1] == 1 then 
        prof[index] = prof[index-1] +	gazp[index] - gazp[index-1]  
	  end 
      if pos[index-1] == -1 then 
        prof[index] = prof[index-1] +	gazp[index-1] - gazp[index]
	  end 	
	  if pos[index-1] == 0 then 
	    prof[index] = prof[index-1]
	  end 
    end  
    
	return prof[index]
  else   
    if Settings.sign == 1 then   
      return nil 
	else   
	  return imoex2[index]
	end 
  end    
  
  
 

  
end
11 Комментариев

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

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