Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар Turbo Pascal
    Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.

    Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.
    читать дальше на смартлабе
  2. Аватар autotrade
    Доработал zigzag5

    работа индикатора заключается в том, чтоб показать ближашие горизонтальные уровни (один снизу, другой сверху) и один наклонный

    Доработал zigzag5
    код индикатора:
    Settings=              
            {                          
                Name = "Zigzag5",   -- название индикатора
                delta=2,                  -- параметр индикатора                          
                deltaY=1,                  -- параметр индикатора   			
                linedeltaY=0.75,                  -- параметр индикатора   				
                line=                                     
                    {                               
                        {  
                            Name = "zigzagline3",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(0,255, 0)
                        },
                        {  
                            Name = "upline",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(255,0, 0)
                        },
                        {  
                            Name = "lowline",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(0,0, 255)
                        },
                        {  
                            Name = "declineline",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(255,0, 0)
                        },
                        {  
                            Name = "upline2",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(255,0, 0)
                        },
                        {  
                            Name = "lowline2",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(0,0, 255)
                        },
                        {  
                            Name = "declineline2",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(255,0, 0)
                        }				
                    }
           }
    	
    	
    function getradius(x, y)
      return math.sqrt(Settings.deltaY*y*y+x*x)
    end
    
    function koef(val)
      return 1 - 1/(1-1/val)
    end
    
    
    function Init()
    
      vMin = 0
      vMax = 0
      vMinindex = 0
      vMaxindex = 0
      voldMinindex = 0
      voldMaxindex = 0
      upval = 0
      lowval = 0
      upindex = 1
      lowindex = 1  
      veu = nil
      vel = nil
      curfrom = 1
      curto = 1
    
      return 7
    end
    
    
    function OnCalculate(index)
      local printz = 0
      vsize = Size()	  
    
      ve = nil
      veu = nil
      vel = nil 
      curv = nil 
      veu2 = nil
      vel2 = nil 
      curv2 = nil  
      
      if index == 1 then
        vMin = C(index)
        vMax = C(index)
        vMinindex = index
        vMaxindex = index
        voldMinindex = index
        voldMaxindex = index
        ve = C(index)  
    	  
      else
             
        if voldMaxindex >= voldMinindex then
            
           
    	  if C(index) > (1 + Settings.delta/100)*vMin then
             
            vMin = C(index)  
            vMax = C(index) 
            vMaxindex = index
            voldMinindex = vMinindex 
            vFrom = voldMaxindex  
            vTo = vMinindex
            printz = 1		
    		
            if (C(vMinindex) > C(vsize)) and (upval > koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))) then
    		  upval = koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))
    		  upindex = vMinindex
    		end
            if (C(vMinindex) < C(vsize)) and (lowval > koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))) then
    		  lowval = koef(getradius(vsize - vMinindex, C(vMinindex) - C(vsize)))
    		  lowindex = vMinindex
    	   end	
    	   
    	    curfrom = voldMaxindex
    	    curto = voldMinindex	  	   
    	      	    
          else      
    	  
            if vMin > C(index) then
              vMin = C(index)
              vMinindex = index
              vFrom = voldMaxindex      
              vTo = index
              printz = 0
    		  curto = index		
            else
              vFrom = vMinindex 
              vTo = index
              printz = 0
            end 		
    	  
    	    curfrom = voldMaxindex	
    		
          end
    	 
     	 
        else
         
        if voldMaxindex <= voldMinindex then
    	  
          if C(index) < (1 - Settings.delta/100)*vMax then
    	     	  
            vMax = C(index) 
            vMin = C(index)  
            vMinindex = index
            voldMaxindex = vMaxindex
            vFrom = voldMinindex
            vTo = vMaxindex
            printz = 1
    	
            if (C(vMaxindex) > C(vsize)) and (upval > koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))) then
    		  upval = koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))
    		  upindex = vMaxindex
    		end                   
            if (C(vMaxindex) < C(vsize)) and (lowval > koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))) then
    		  lowval = koef(getradius(vsize - vMaxindex, C(vMaxindex) - C(vsize)))
    		  lowindex = vMaxindex
    		end		
    		
    	    curfrom = voldMinindex		
    	    curto = voldMaxindex
    		
          else 
    	    	    
            if vMax < C(index) then
              vMax = C(index)
              vMaxindex = index
              vFrom = voldMinindex    
              vTo = index
              printz = 0
    		  curto = index		
            else  
              vFrom = vMaxindex  
              vTo = index        
              printz = 0
            end
    		
    	    curfrom = voldMinindex
    		
          end  
    
    	
        end
        end
     
        if (printz == 1) or (Size() == index) then
          for i = vFrom, vTo do
            k = (C(vTo)- C(vFrom))/(vTo- vFrom)
            v = i*k + C(vTo) - vTo*k
            SetValue(i, 1, v)
            ve = v
          end   
          if (Size() == index) then
            ve = C(index)
            if voldMaxindex >= voldMinindex then
              vFrom = voldMaxindex 
              vTo = vMinindex
            end 
            if voldMaxindex <= voldMinindex then  
              vFrom = voldMinindex
              vTo = vMaxindex
            end 
            for i = vFrom, vTo do
              k = (C(vTo)- C(vFrom))/(vTo- vFrom)
              v = i*k + C(vTo) - vTo*k
              SetValue(i, 1, v)
            end  
               
            -- up level line 
            if upindex ~= nil then
    		  if C(upindex) > C(index) then		
                for i = upindex, index do
                  SetValue(i, 2, C(upindex))
                  SetValue(i, 5, C(upindex)-Settings.linedeltaY*C(vsize)/100)			  
                end  	
                veu = C(upindex)	
              end 		  
    		end
    		
    		-- low level line 
    		if lowindex ~= nil then
    		  if C(lowindex) < C(index) then
                for i = lowindex, index do
                  SetValue(i, 3, C(lowindex))
                  SetValue(i, 6, C(lowindex)+Settings.linedeltaY*C(vsize)/100)				  
                end  			
                vel = C(lowindex)
             end
           end		
            
           if voldMaxindex >= voldMinindex then     
    	    vsign = -1
    		if curfrom == voldMinindex then
    		  vsign = -1
    		end
    		if curfrom == voldMaxindex then
    		  vsign = 1
    		end		
    
            -- inclined line
    	    if curto- curfrom > 0 then
    	     maxcurv = 0
    	     k = (C(curto)- C(curfrom))/(curto- curfrom)
             for i = curfrom, curto  do        
              curv = i*k + C(curto) - curto*k	
              if vsign == -1 then  		  
     		    if L(i) < curv then
    		      if maxcurv < curv - L(i) then
    		        maxcurv = curv - L(i)
                  end
                end
    		  else
     		    if H(i) > curv then
    		      if maxcurv < H(i) - curv then
    		        maxcurv = H(i) - curv
                  end
                end		  
    		  end
             end   		
             for i = curfrom, index  do
              curv = i*k + C(curto) - curto*k + vsign*maxcurv	  
              SetValue(i, 4,curv)
    		  curv2 = curv+ vsign*Settings.linedeltaY*C(vsize)/100
    		  SetValue(i, 7,curv2)		  
             end   		
    	    end
    	    curv = nil	
    	   end 
    	  
           if voldMaxindex <= voldMinindex then
    	    vsign = -1
    		if curfrom == voldMaxindex then
    		  vsign = 1
    		end		
    		if curfrom == voldMinindex then
    		  vsign = -1
    		end			
      
            -- inclined line
            if curto- curfrom > 0 then
             maxcurv = 0
             k = (C(curto)- C(curfrom))/(curto- curfrom)
             for i = curfrom, curto  do        
              curv = i*k + C(curto) - curto*k		  
              if vsign == -1 then  		  
     		    if L(i) < curv then
    		      if maxcurv < curv - L(i) then
    		        maxcurv = curv - L(i)
                  end
                end
    		  else
     		    if H(i) > curv then
    		      if maxcurv < H(i) - curv then
    		        maxcurv = H(i) - curv
                  end
                end		  
    		  end
             end   		
             for i = curfrom, index  do
              k = (C(curto)- C(curfrom))/(curto- curfrom)
              curv = i*k + C(curto) - curto*k + vsign*maxcurv	  		
              SetValue(i, 4,curv)
    		  curv2 = curv+ vsign*Settings.linedeltaY*C(vsize)/100
    		  SetValue(i, 7,curv2)
             end   		     
            end
    	    curv = nil		
           end	  
    	          
          end
        end
    
      end  
      
      return ve, veu, vel, curv, veu2, vel2, curv2  
      
    end




    читать дальше на смартлабе
  3. Аватар autotrade
    zigzag5 переработал алгоритм горизонтальных уровней

    zigzag5 модернизировал чтоб горизонтальные уровни рисовались более интеллектуально

    zigzag5 переработал алгоритм горизонтальных уровней
    zigzag5 переработал алгоритм горизонтальных уровней
    читать дальше на смартлабе
  4. Аватар De color
    trans2quik кто подключал!? нужно сделать небольшой проект, кто сможет взяться? 3к оплата нужно подключить trans2quik к моему quik настроить, далее получить bid ask high low и тд.

    trans2quik кто подключал!?нужно сделать небольшой проект, кто сможет взяться?3к оплатанужно подключить trans2quik к моему quik настроить, далее получить bid ask high low и тд.
    читать дальше на смартлабе
  5. Аватар autotrade
    STATDIVVOL индикатор статистического отклонения с учетом объема

    индикатор статистического отклонения с учетом объема
    STATDIVVOL индикатор статистического отклонения с учетом объема

    Settings={
    Name="STATDIVVOL",
    period=10,
      line=
      {
        {
          Name="curve",
          Color=RGB(0,0,255),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name="line",
          Color=RGB(255,0,0),
          Type=TYPE_LINE,
          Width=1
        }
      } 
    }
    
    function Init()
      return 2
    end
    
    function OnCalculate(index)
      local sum1=0
      local sum2=0  
      if index < Settings.period then
        return nil, nil
      else   	
        for i=index-Settings.period+1, index do  
          if C(i) > O(i) then
            sum1 = sum1 + (C(i) - O(i))*V(i)
            sum2 = sum2 + (C(i) - O(i))*V(i)
          else
            sum2 = sum2 + (O(i) - C(i))*V(i)
          end  
        end 
        sum1 = sum1/sum2    
      end
      
      return sum1, 0.5
    
    end

    с весовыми коэффициентами
    STATDIVVOL индикатор статистического отклонения с учетом объема
    читать дальше на смартлабе
  6. Аватар autotrade
    Zigzag4 с наклонными уровнями

    доработал предыдущий зигзаг где были только горизонтальные теперь наклонные появились
    выглядит так:
    Zigzag4 с наклонными уровнями
    код индикатора:
    читать дальше на смартлабе
  7. Аватар autotrade
    zigzag с уровнями на lua под quik

    индикатор:
    https://dropmefiles.com/yZqHe
    Модифицировал zigzag в плане добавления ближайших уровней к текущей цене:
    zigzag с уровнями на lua под quik
    код индикатора:
    Settings=              
            {                          
                Name = "Zigzag3",   -- название индикатора
                delta=2,                  -- параметр индикатора                          
                line=                                     
                    {                               
                        {  
                            Name = "zigzagline3",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(120,90, 140)
                        },
                        {  
                            Name = "upline",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(255,0, 0)
                        },
                        {  
                            Name = "lowline",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(0,0, 255)
                        }					
                    }
           }
    
    
    function Init()
    
      vMin = 0
      vMax = 0
      vMinindex = 0
      vMaxindex = 0
      voldMinindex = 0
      voldMaxindex = 0
      upval = 9999999
      lowval = 9999999  
      upindex = 1
      lowindex = 1  
      veu = nil
      vel = nil
    
      return 3
    end
    
    
    function OnCalculate(index)
      local printz = 0
      vsize = Size()	  
      
      if index == 1 then
        vMin = C(index)
        vMax = C(index)
        vMinindex = index
        vMaxindex = index
        voldMinindex = index
        voldMaxindex = index
        ve = C(index)  
    	  
      else
             
        if voldMaxindex >= voldMinindex then
          if C(index) > (1 + Settings.delta/100)*vMin then
            vMin = C(index)  
            vMax = C(index) 
            vMaxindex = index
            voldMinindex = vMinindex 
            vFrom = voldMaxindex  
            vTo = vMinindex
            printz = 1		
            if (C(vMinindex) > C(vsize)) and (upval > C(vMinindex) - C(vsize)) then
    		  upval = C(vMinindex) - C(vsize)
    		  upindex = vMinindex
    		end
            if (C(vMinindex) < C(vsize)) and (lowval > C(vsize)- C(vMinindex)) then
    		  lowval = C(vsize) - C(vMinindex)
    		  lowindex = vMinindex
    		end		
    		
    		
          else     
            if vMin > C(index) then
              vMin = C(index)
              vMinindex = index
              vFrom = voldMaxindex      
              vTo = index
              printz = 0
            else
              vFrom = vMinindex 
              vTo = index
              printz = 0
            end 
          end
        else
         
        if voldMaxindex <= voldMinindex then
          if C(index) < (1 - Settings.delta/100)*vMax then
            vMax = C(index) 
            vMin = C(index)  
            vMinindex = index
            voldMaxindex = vMaxindex
            vFrom = voldMinindex
            vTo = vMaxindex
            printz = 1
            if (C(vMaxindex) > C(vsize)) and (upval > C(vMaxindex) - C(vsize)) then
    		  upval = C(vMaxindex) - C(vsize)
    		  upindex = vMaxindex
    		end
            if (C(vMaxindex) < C(vsize)) and (lowval > C(vsize)- C(vMaxindex)) then
    		  lowval = C(vsize) - C(vMaxindex)
    		  lowindex = vMaxindex
    		end			
          else 
            if vMax < C(index) then
              vMax = C(index)
              vMaxindex = index
              vFrom = voldMinindex    
              vTo = index
              printz = 0
            else  
              vFrom = vMaxindex  
              vTo = index        
              printz = 0
            end
          end  
        end
        end
     
        if (printz == 1) or (Size() == index) then
          for i = vFrom, vTo do
            k = (C(vTo)- C(vFrom))/(vTo- vFrom);
            v = i*k + C(vTo) - vTo*k
            SetValue(i, 1, v)
            ve = v
          end   
          if (Size() == index) then
            ve = C(index)
            if voldMaxindex >= voldMinindex then
              vFrom = voldMaxindex 
              vTo = vMinindex
            end 
            if voldMaxindex <= voldMinindex then  
              vFrom = voldMinindex
              vTo = vMaxindex
            end 
            for i = vFrom, vTo do
              k = (C(vTo)- C(vFrom))/(vTo- vFrom);
              v = i*k + C(vTo) - vTo*k
              SetValue(i, 1, v)
            end  
    
    		if upindex ~= nil then
    		  if C(upindex) > C(index) then		
                for i = upindex, index do
                  SetValue(i, 2, C(upindex))
                end  	
                veu = C(upindex)	
              end 		  
    		end
    		if lowindex ~= nil then
    		  if C(lowindex) < C(index) then
                for i = lowindex, index do
                  SetValue(i, 3, C(lowindex))
                end  			
    		    vel = C(lowindex)
    		  end
    		end		
    
    
    
          end
        end
    
      end   
      return ve, veu, vel
    end

    читать дальше на смартлабе
  8. Аватар Александр Бессонов
    qlua и лимитные заявки

    Вопрос к спецам !
    Всем привет,!
    пытаюсь написать робота на qlua.
    возник вопрос, можно ли как то написать на qlua что бы робот анализировал стакан и выставлял лимитную заявку?
    цена то меняется, и если выставляешь лимитную заявку и она не сработала то так и будет висеть.
    можно как то сделать что бы она снималась и выставлялась новая?
    читать дальше на смартлабе
  9. Аватар autotrade
    quik вопрос по синтаксису lua

    не могу понять почему два цикла не дает сделать:
    Settings={
    Name="XXX",
    period=25,
      line=
      {
        {
          Name="curve",
          Color=RGB(255,0,0),
          Type=TYPE_LINE,
          Width=1
        }
      } 
    }
    
    function Init()  
      return 1
    end
    
    function OnCalculate(index)
      if index < Settings.period then
        return nil
      else
    
        for i=index-Settings.period+1, index do  
        do
          j=1
        end
        for k=1, 10 do  
        do
          j=1
        end
    
    
      end 
    
      return 2
    end
    
    end
    если второй цикл убираю for k=1, 10 do do j=1 end
    то работает, с ним не работает
    читать дальше на смартлабе
  10. Аватар autotrade
    STATDIV3 доработанный индикатор для quik на языке lua

    если индикатор больше 0, то покупаем, если ниже то продаем

    скачать можно здесь:dropmefiles.com/09FCu
    как устанавливать смотрите предыдущие статьи: https://smart-lab.ru/blog/528424.php
    название STATDIV3 это доработанный STATDIV


    поведение индикатора на графике:
    STATDIV3 доработанный индикатор для quik на языке lua


    сам код индикатора:
    Settings={
    Name="STATDIV3",
    period=50,
      line=
      {
        {
          Name="curve",
          Color=RGB(0,0,255),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name="line",
          Color=RGB(255,0,0),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name="MA",
          Color=RGB(0,0,255),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name="MA2",
          Color=RGB(0,128,128),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name="line2",
          Color=RGB(0,0,255),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name="line3",
          Color=RGB(0,128,128),
          Type=TYPE_LINE,
          Width=1
        }
      } 
    }
    
    function Init()
      cache_ind={}
      cache_ind2={}
      cache_ind3={}
      return 2
    end
    
    function OnCalculate(index)
      if index < Settings.period then
        return nil
      else
        local sum1=0
        local sum2=0
        local sum0=0
        local sum02=0
        local sum03=0
        for i=index-Settings.period+1, index do  
        do
          if C(i) > O(i) then
            sum1 = sum1 + C(i) - O(i)
            sum2 = sum2 + C(i) - O(i)
          else
            sum2 = sum2 + O(i) - C(i)
          end  
        end 
        cache_ind[index] = sum1/sum2    
        if index > Settings.period+12 then 
    --[[
          sum0 = 1*cache_ind[index]+
                (1)*cache_ind[index-1]+
                (1)*cache_ind[index-2]+
                (1)*cache_ind[index-3]+
                (1)*cache_ind[index-4]+
                (1)*cache_ind[index-5]+
                (1)*cache_ind[index-6]+
                (1)*cache_ind[index-7]+
                (1)*cache_ind[index-8]+
                (1/2)*cache_ind[index-9]+
                (1/3)*cache_ind[index-10]+
                (1/4)*cache_ind[index-11]+
                (1/5)*cache_ind[index-12]
    --]]
          sum0 = 1*cache_ind[index]+
                (1/2)*cache_ind[index-1]+
                (1/3)*cache_ind[index-2]+
                (1/4)*cache_ind[index-3]+
                (1/5)*cache_ind[index-4]+
                (1/6)*cache_ind[index-5]+
                (1/7)*cache_ind[index-6]+
                (1/8)*cache_ind[index-7]+
                (1/9)*cache_ind[index-8]+
                (1/10)*cache_ind[index-9]+
                (1/11)*cache_ind[index-10]+
                (1/12)*cache_ind[index-11]+
                (1/13)*cache_ind[index-12]
    
        end
    --[[
        sum0 = sum0/(1+1+1+1+1+1+1+1+1+1/2+1/3+1/4+1/5)
    --]]
        sum0 = sum0/(1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10+1/11+1/12+1/13)
    
           
        cache_ind2[index] = sum0
        if index > Settings.period+50 then   
          sum02 = 1*cache_ind2[index]+
                (1)*cache_ind2[index-1]+
                (1)*cache_ind2[index-2]+
                (1)*cache_ind2[index-3]+
                (1)*cache_ind2[index-4]+
                (1)*cache_ind2[index-5]+
                (1)*cache_ind2[index-6]+
                (1)*cache_ind2[index-7]+
                (1/2)*cache_ind2[index-8]+
                (1/3)*cache_ind2[index-9]+
                (1/4)*cache_ind2[index-10]+
                (1/5)*cache_ind2[index-11]+
                (1/6)*cache_ind2[index-12]
    --[[
          sum02 = 1*cache_ind2[index]+
                (1/2)*cache_ind2[index-1]+
                (1/3)*cache_ind2[index-2]+
                (1/4)*cache_ind2[index-3]+
                (1/5)*cache_ind2[index-4]+
                (1/6)*cache_ind2[index-5]+
                (1/7)*cache_ind2[index-6]+
                (1/8)*cache_ind2[index-7]+
                (1/9)*cache_ind2[index-8]+
                (1/10)*cache_ind2[index-9]+
                (1/11)*cache_ind2[index-10]+
                (1/12)*cache_ind2[index-11]+
                (1/13)*cache_ind2[index-12]
    --]]
        end
        sum02 = sum02/(1+1+1+1+1+1+1+1+1/2+1/3+1/4+1/5+1/6)
    --[[
        sum02 = sum02/(1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10+1/11+1/12+1/13)
    --]]
        cache_ind3[index] = sum0 - sum02
        if index > Settings.period+50 then   
          sum03 = 1*cache_ind3[index]+
                (1/2)*cache_ind3[index-1]+
                (1/3)*cache_ind3[index-2]+
                (1/4)*cache_ind3[index-3]+
                (1/5)*cache_ind3[index-4]+
                (1/6)*cache_ind3[index-5]+
                (1/7)*cache_ind3[index-6]+
                (1/8)*cache_ind3[index-7]+
                (1/9)*cache_ind3[index-8]+
                (1/10)*cache_ind3[index-9]+
                (1/11)*cache_ind3[index-10]+
                (1/12)*cache_ind3[index-11]+
                (1/13)*cache_ind3[index-12]
        end
        sum03 = sum03/(1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10+1/11+1/12+1/13)
    
      end  
    
      if sum1/sum2 > 0.5 and sum03 > 0 then
        sum1 = sum03
      else
        if sum1/sum2 < 0.5 and sum03 < 0 then
          sum1 = sum03 
        else 
          sum1 = 0
        end
      end
    
      return sum1, 0
    end
    
    end
     всем удачи!

    читать дальше на смартлабе
  11. Аватар autotrade
    Доработал индикатор STATDIV на lua для quik

    пользоваться можно так:
    если касная кривая выше 0,5 и синяя выше зеленой то логуем
    если красная ниже 0,5 и синяя ниже зеленой то шортим
    принимаю пожелания по изменению кода индикатора
    Доработал индикатор STATDIV на lua для quik


    скачать можно здесь:
    dropmefiles.com/y4kpv

    как установить:
    в папке quik создаете папку LuaIndicators туда кидаете текстовый файл с раcширением .lua и содержанием приведенного индикатора, потом запускаете quik и добавляете как обычный индикатор к графику с именем STATDIV

    продолжение темы: smart-lab.ru/blog/528145.php

    код:

    Settings={
    Name=«STATDIV»,
    period=25,
      line=
      {
        {
          Name=«curve»,
          Color=RGB(255,0,0),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name=«line»,
          Color=RGB(255,0,0),
          Type=TYPE_LINE,
          Width=1
        },
        {
          Name=«MA»,
          Color=RGB(0,0,255),
    читать дальше на смартлабе
  12. Аватар autotrade
    для тех кто хочет много бабок зарабатывать

    публикую индикатор собственной разработки под quik, написанный на lua
    если его значение больше 0,5 то выставляете заявку на покупку с тек профитом >= стоплоссу
    гарантированно будете зарабатывать
    подключить его можно так:
    в папке quik создаете папку LuaIndicators туда кидаете текстовый файл с раcширением .lua
    и содержанием приведенного индикатора, потом запускаете quik и добавляете как обычный индикатор к графику
    название его в списке будет STATDIV (статистическое отклонение)
    на рисунке отобразил его работу с периодом 25 и 50
    его суть в том чтоб показать куда отклонено статистическое распределение вероятностей, вверх или вниз за определенный период
    проще говоря, куда вероятнее пойдет рынок вниз или вверх
    если значение индикатора выше 0,5 то разрешено лонговать, если ниже то разрешено шортить
    рекомендации по подбору периода: период для этого индикатора выбираете как период между двумя
    последними локальными вершинами
    позже могу математически привести целесообразность его использования
    читать дальше на смартлабе
  13. Аватар Тихий омут
    QUIK робот, как проверить что создаваемая заявка отвечает требованию ГО

    Пишу алгоритм и возникает ситуация, что при размещении заявки ФОРТС возникает сообщение

    Ошибка создания заявки. [GW][332] «Нехватка средств по лимитам клиента.».

    Не могу сообразить, как предварительно до отправки заявки в систему проверить, что она отвечает требования достаточности средств по лимитам. 

    Друзья, коллеги, роботорговцы, подскажите как проверить, что заявка на фортсе проходит под имеющееся свободное ГО ?


    читать дальше на смартлабе
  14. Аватар Тихий омут
    QUIK робот как проврить что создвамая заявка до отправки отвчает требванию ГО? Вознкает ситуция ошбка создния заявки. [GW][332] «Нехватка средствГО" ?

    QUIK робот как проврить что создвамая заявка до отправки отвчает требванию ГО? Вознкает ситуция ошбка создния заявки. [GW][332] «Нехватка средствГО"?
    читать дальше на смартлабе
  15. Аватар Ramil Shahattudinov
    Lua индикатор тикера ищу.

    Доброго времени всем.
    Я ищу Lua индикатор в Quik, который пишет на графике в левом верхнем углу название инструмента. Однажды наткнулся на него в интернете, счёл что бесполезная вещь и не стал его сохранять. А вот теперь понадобился и самому, но не могу вспомнить где я его видел. Может он есть у кого или кто-нить знает с какого ресурса его можно качнуть? Буду очень признателен в помощи его отыскать.
    читать дальше на смартлабе
  16. Аватар Uncle Fedor
    Изучаем QLua: Относительный ATR

    Доброго дня

    Решил попробовать написать некоторые индикаторы для Quik.
    Была прочитана книга по языку Роберту Иерузалимски «Программирование на языке Lua» и Документация по языку LUA в QUIK и примеры.
    Надо заметить, что язык мне понравился. В нем так мало и так много одновременно!

    Первый блин индикатор — что-то похожее на Волатильность Чайкина, только попроще.
    Идея: хочется изучить циклы волатильности. За основу берем ATR. Но если рассматривать большие интервалы, то цена может гулять в больших пределах, соответственно приводим ее к текущей цене.
    Сделал первый вариант, получил ошибки выполнения — надо добавить обработку ошибок.
    Следующий вариант заработал, я посмотрел — очень большой разброс, надо добавить сглаживание. 
    Добавил сглаживание, разброс стал поменьше, но все равно немного не то. Добавил отдельное сглаживание для диапазона и для цены (предполагая, что цена меняется медленнее чем периоды волатильности). Уже лучше.
    А что если брать не цену закрытия, а например среднюю? Добавил, но оказалось что влияние мизерное.
    В общем, уже можно поиграться. 
    Исходник

    Продолжаю эксперименты. 
    читать дальше на смартлабе
  17. Аватар Uncle Fedor
    Изучаем QLua: Ассиметричные фракталы

    Добрый.
    В одном из видео автор рассказывал об уровнях и использовал индикатор фрактал. Но для того чтобы потенциальные точки находились быстрее, он использовал ассиметричный показатель, например, 4 слева и 3 справа.
    Такой индикатор можно построить с помощью Lua.
    Параметры: количество свечей слева и справа
    Отображение в виде треугольников. Один треугольник было плохо видно, я добавил несколько )
    Второй раз пошло легче. Работаем дальше

    Исходник

    yadi.sk/d/gDeCrw-2FPwNVQ

     


    читать дальше на смартлабе
  18. Аватар Arti
    Как автоматизировать передачу однотипных заявок каждый день?

    Всем привет!
    Скажите, как можно автоматизировать процесс массового создания заявок на покупку бумаг на Московской Бирже каждый день?
    Специфика следующая: есть на мониторинге 10-20 корп. облигаций.
    Для каждой бумаги есть цена и кол-во, которое я хочу купить (заявка), несколько ниже текущей рыночной цены. Заявки на покупку НЕ условные.
    Цена и кол-во бумаг в моих заявках в теч. дня не меняются (для простоты).
    На следующий день цена актуализируется (может поменяться) после ручного пересмотра. Но может и не поменяться. То есть опять нужно загрузить список из этих заявок.
    Можно, конечно, каждое утро вручную заводить каждую из этих 10-20 заявок, но на это уходит минут 10 каждый день, плюс повышается вероятность ошибки/опечатки.
    Список заявок могу вести в Excel.

    Подскажите, можно ли либо сделать так, чтобы заявки на покупку на фондофом рынке МБ не отменялись после окончания сессии (либо автоматически пересоздавались), либо как-то упростить процедуру массового ввода заявок с помощью какого-нибудь механизма экспорта таблицы/списка заявок?

    P.S. Работаю в Quik/WebQuik/ЛК Открытии.
    читать дальше на смартлабе
  19. Аватар XXM
    Торговый робот на Lua для QUIK.

    4 года и 4 месяца прошло с выхода поста «Торговый робот на LUA для QUIK» (https://smart-lab.ru/blog/200767.php) про конструктор Lbot. За это время он повзрослел, лишился графического интерфейса и… превратился в младшего брата для Lbot3D. И если раньше для Lbot была пробная версия (с одним инструментом и одним лотом), то теперь, фактически, сам превратился в пробную версию для Lbot3D и, с этого дня, предоставляется в свободное пользование с полным функционалом:

    Торговый робот на Lua для QUIK.

    Скачать Lbot180.zip можно тут: drive.google.com/open?id=1DL9jGEBm2Uhk89PcQdlK-ObaOe2zihnx
    INI-файл написан для демо-QUIK на 3 инструмента — Сбербанк, Газпром и Лукойл. Стратегия на Газпроме — безиндикаторная, на Сбербанке — на скользящих средних, на Лукойле — на пересечениях MACD.

    encoding = "UTF-8"
    FREQUENCY = 1000
    account = NL0011100043, 10110
    PositionSize = 300000
    xy = 421, 0, 859, 118
    ;-------------------------------------------------------------------------------
    [GAZP]
    Security = GAZP, QJSIM, Gazp_moex
    WorkSize = 3		//  рабочий объем, в штуках;
    LossLimit = 100		// ограничение на убыток по стратегии
    OpenSlippage = 10	// допустимое проскальзывание на сделке, в количестве минимальных шагов цены;
    OpenLong =  {Close, 1} < {High, 2}	// цена 'close' предыдущей 'полной' свечи превысила 'high' предшествующего ей бара;
    OpenShort = {Close, 1} > {Low, 5-2}	// цена 'close' предыдущей 'полной' свечи принизила 'low' 5-2 баров;
    StopLoss = 2
    TakeProfit = 3, 1, 1
    EOD = 18:29:00	//закрытия позиции в указанное время.
    autoBot = Y
    [SBER]
    Security = SBER, QJSIM, Sber_moex
    WorkSize = 10
    LossLimit = 100
    OpenSlippage = 10
    OpenLong	= {Ema1} > {Ema2}
    CloseLong	= {Ema1} < {Ema2}
    OpenShort	= {Ema1} < {Ema2}
    CloseShort	= {Ema1} > {Ema2}
    autoBot = Y
    [LKOH]
    WorkSize = 2
    Security = LKOH, QJSIM, Lkoh_moex
    LossLimit = 225
    OpenSlippage = 10
    OpenLong	= cross(macd_Lkoh.0, macd_Lkoh.1)
    OpenShort	= cross(macd_Lkoh.1, macd_Lkoh.0)
    ;OpenLong =  {Close, 1} < {Low, 5-2}
    ;OpenShort = {Close, 1} > {High, 2}
    StopLoss = 30
    TakeProfit = 50, 10, 10
    autoBot = Y

    читать дальше на смартлабе
  20. Аватар XXM
    Захват откатов скольжением.

              В программе Lbot3D появилась реализация вычисления скользящего экстремума в конкретной стратегии при наличии позиции. Слово «конкретной» звучит потому, что этот самый экстремум можно использовать в других стратегиях из портфеля стратегий. Согласен, это нужно не всем. Скорее так: мало кому он нужен. Тем не менее, продолжу.

              Допустим мы придумали стратегию на некотором активе, рассчитанную на тренд:
    Покупаем на четверть портфеля. Если цена пошла против нас (пусть на 1%)- стопимся, но если в нашу сторону +1%, то в предположении, что мы тренде, выставим лимитированную заявку на покупку второй четверти на 0.5% ниже достигнутого экстремума: откат вероятен, и после того, как на откате вытряхнут часть пассажиров, (самых пугливых, самых недостойных :)), наш портфель зацепит еще несколько лотов и едем дальше, «на север». Но если первая четверть бумаг размещена в нашем портфеле на «долгосрок», то вторая четверть будет сразу же выставлена на продажу с профитом, например, в 1%.


    читать дальше на смартлабе
  21. Аватар Сергей Юхарев
  22. Аватар $upo$tat
    индикатор на LUA

    Добрый день всем!
    Народ, кто может сделать индикатор на LUA для QUIK?
    читать дальше на смартлабе
  23. Аватар Алексей Токин
    Aroon

    Всем доброго дня! Друзья, есть у кого нибудь индикатор aroon на Lua. Или может как то его можно написать, где это можно сделать?
    читать дальше на смартлабе
  24. Аватар XXM
    Fn044.lua, версия 2.1

    В своей торговле применяю комбинации рыночных и лимитированных заявок, (методику описывал ранее, "Настоящая торговая стратегия."  и "US500: Объемы больше, спреды уже!" ). Временами количество одновременно работающих стратегий зашкаливало за сотню и на некоторые из них не хватало денег под выставление заявок, они отключались, иногда ломая логику работы связанных с ней стратегий. В QUIK в таблице «Состояние счета» считается цифра — «Свободно» — свободные средства под заявки, но сходу вытащить ее из Lua у меня не получилось. И пришлось вписать расчет этой величины в робота.
    Сегодня предлагаю вашему вниманию доработанный скрипт Fn044.lua (https://yadi.sk/d/O-6JzZdXkOxyow)
    Fn044.lua, версия 2.1

    в котором реализован расчет свободных средств для заявок на ФОРТС с учетом имеющихся контрактов и заявок.
    Один в один вывести не получилось, как смог.
    As is, и все такое!


    читать дальше на смартлабе
  25. Аватар Василий
    QUIK: Бенчмарк ОФЗ к ставке ЦБ

        Может кому будет интересен скрипт на QLUA, который выступает простым бенчмарком ОФЗ с постоянным купоном к ставке ЦБ.
    Основные параметры доходность и премия к ставке ЦБ, с учетом дюрации.
    Скрипт не работает онлайн (оперативность тут не принципиальна), при запуске собирает параметры в таблицу и выводит на экран.
    В дальнейшем планируется эти данные использовать для анализа премии доходности по дюрации для муниципальных и корпоративных облигаций к ОФЗ.

    QUIK: Бенчмарк ОФЗ к ставке ЦБ


        Код скрипта на github (на github две версии одна в utf-8 для просмотра и основная версия в win1251, т.к. quik понимает только его):
    github.com/trantor77/lua_scripts/boundsOFZ.lua

        Код скрипта:
    --переменные
    keyRateCB = 7.5
    classCode = "TQOB"
    
    function CreateTable()
        t_id = AllocTable()
        AddColumn(t_id, 0, "Бумага", true, QTABLE_STRING_TYPE, 15)
        AddColumn(t_id, 1, "Цена", true, QTABLE_DOUBLE_TYPE, 15)
        AddColumn(t_id, 2, "Доходность, %", true, QTABLE_DOUBLE_TYPE, 15)
        AddColumn(t_id, 3, "Дюрация, лет", true, QTABLE_DOUBLE_TYPE, 15)
        AddColumn(t_id, 4, "Купон, %", true, QTABLE_DOUBLE_TYPE, 15)
        AddColumn(t_id, 5, "Премия к ЦБ, бп", true, QTABLE_INT_TYPE, 15)
        AddColumn(t_id, 6, "Погашение", true, QTABLE_STRING_TYPE, 15)
        t = CreateWindow(t_id)
        SetWindowCaption(t_id, "ОФЗ")
    end
    
    function string.split(str, sep)
        local fields = {}
        str:gsub(string.format("([^%s]+)", sep), function(f_c) fields[#fields + 1] = f_c end)
        return fields
    end
    
    function getParamNumber(code, param)
        return tonumber(getParamEx(classCode, code, param).param_value)
    end
    
    function formatData(prm)
        return string.format("%02d.%02d.%04d", prm%100, (prm%10000)/100, prm/10000)
    end
    
    CreateTable()
    
    arr = {}
    sec_list = getClassSecurities(classCode)
    sec_listTable = string.split(sec_list, ',')
    j = 0
    for i = 1, #sec_listTable do
        secCode = sec_listTable[i]
        securityInfo = getSecurityInfo(classCode, secCode)
        short_name = securityInfo.short_name
        if short_name:find("ОФЗ 26") ~= nil then
            j = j + 1
            r = {}
            r["short_name"] = short_name
            r["price"] = getParamNumber(securityInfo.code, "PREVPRICE")
            r["yield"] = getParamNumber(securityInfo.code, "YIELD")
            r["duration"] = getParamNumber(securityInfo.code, "DURATION")/365
            couponvalue = getParamNumber(securityInfo.code, "COUPONVALUE")
            couponperiod = getParamNumber(securityInfo.code, "COUPONPERIOD")
            r["coupon"] = ((365/couponperiod) * couponvalue)/10
            r["bonus"] = (r["yield"] - keyRateCB)*100
            r["mat_date"] = getParamNumber(securityInfo.code, "MAT_DATE")
            table.insert(arr, j, r)
        end
    end
    
    table.sort(arr, function(a,b) return a["duration"] < b["duration"] end)
    
    for j = 1, #arr do
        row = InsertRow(t_id, -1)
        SetCell(t_id, row, 0, arr[j]["short_name"])
        price = arr[j]["price"]
        SetCell(t_id, row, 1, string.format("%.2f", price), price)
        yield = arr[j]["yield"]
        SetCell(t_id, row, 2, string.format("%.2f", yield), yield)
        duration = arr[j]["duration"]
        SetCell(t_id, row, 3, string.format("%.2f", duration), duration)
        coupon = arr[j]["coupon"]
        SetCell(t_id, row, 4, string.format("%.2f", coupon), coupon)
        bonus = arr[j]["bonus"]
        SetCell(t_id, row, 5, string.format("%.0f", bonus), bonus)
        mat_date = arr[j]["mat_date"]
        SetCell(t_id, row, 6, formatData(mat_date), mat_date)
    end

    читать дальше на смартлабе
Чтобы купить акции, выберите надежного брокера: