Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. В помощь QLUA-водам. Функция чтения CSV файла.
    В былую давность пытался решить вопрос с интерфейсом для QLUA.
    Испробовал IUP, VCL и еще какая-то библиотека была. Но ни одна библиотека стабильно не работала, через какой-то промежуток времени Квик вставал колом.


    Т.к. нам красоты не надо, а удобство хочется, то решил пусть интерфейсом будет Excel(файл.CSV).

    В помощь QLUA-водам. Функция чтения CSV файла.


    Вот вам функция для чтения CSV файлов:

    — можно задать до 20 столбиков параметров, количество строк не ограничено.
    — запятую заменяет на точку в вещественном числе
    — удаляет заголовок столбца, т.е. на выходе получаем массив начинающийся со второй строки

    -----------------------------
    function File_Read(filename)


    local col = 1
    local pat = "(.*)"
    local A={};local B={};local C={};local D={};local E={};
    local F={};local G={};local H={};local I={};local J={};
    local K={};local L={};local M={};local N={};local O={};
    local P={};local Q={};local R={};local S={};local T={};
    local file, err = io.open(filename,«r»)
    if err ~= nil then PrintDbgStr(«err read file: »..err); return; end
    str = file:read()
    for var in string.gmatch (str, ";") do col=col+1 end
    for i = 2, col do pat = pat..";(.*)" end
    for line in io.lines(filename) do
    --PrintDbgStr(line)
    local _,_,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20 = string.find(line,pat)
    --PrintDbgStr(tostring(s1))
    table.insert(A,s1);table.insert(B,s2);table.insert(C,s3);table.insert(D,s4);table.insert(E,s5);
    table.insert(F,s6);table.insert(G,s7);table.insert(H,s8);table.insert(I,s9);table.insert(J,s10);
    table.insert(K,s11);table.insert(L,s12);table.insert(M,s13);table.insert(N,s14);table.insert(O,s15);
    table.insert(P,s16);table.insert(Q,s17);table.insert(R,s18);table.insert(S,s19);table.insert(T,s20);
    end
    file:close()
    table.remove(A,1);table.remove(B,1);table.remove(C,1);table.remove(D,1);table.remove(E,1);
    table.remove(F,1);table.remove(G,1);table.remove(H,1);table.remove(I,1);table.remove(J,1);
    table.remove(K,1);table.remove(L,1);table.remove(M,1);table.remove(N,1);table.remove(O,1);
    table.remove(P,1);table.remove(Q,1);table.remove(R,1);table.remove(S,1);table.remove(T,1);
    --Print_Table® Print_Table(S) Print_Table(T)
    return A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T
    end

     



    -------------------------------


    Во время работы робота смело изменяем CSV файл и сохраняем, и новые параметры у вас в роботе.
    CSV файл можно держать открытым.





    Авто-репост. Читать в блоге >>>
  2. COM интерфейс МаtLab в LUA
    Так уж вышло, что пару дней назад я познакомился с терминалом QUICK и языком его скриптов — LUA

       Естественно, сразу возникла необходимость передать полный контроль над этим двумя сложнейшими приложениями чему-то более простому и понятному, например Матлабу, чтобы нажимая разноцветные кнопочки «Обыграть рынок» и «Что там опять у волатильности?» оставить конечному пользователю, то есть мне, только наслаждение от наблюдения за происходящим.


         Теоретически, для этого надо нанять менеджера COM из LUACOM.dll и дать ему в управление пару простых исполнителей — объектов LUA, чтобы высшее руководство МатЛаба могло эффективно распоряжаться ресурсами в иерархии 

     Руководство МатЛаб -> менеджер интерфейса  COM -> исполнитель  объект LUA 


           Но в силу каких-то неведомых причин (от сборки dll, до сборки MS Windows и даже предустановленного железа) сделать по теории управления с ходу не получилось, поэтому была использована альтернативная схема:

    Авто-репост. Читать в блоге >>>
  3. 500 рублей за устранение ошибки в LUA. помогите устранить ошибку. Только прошу отписать того кто разбирается, и поможет.

    Авто-репост. Читать в блоге >>>
  4. Ищу исполнителя! Надо написать в LUA советника: проверяет одно условие, на 4H и D, и посылает на почту или смс, если сигнал сработал. Кто сделает и в какую цену. В личку пишите.
    Ищу исполнителя! Надо написать в LUA советника: проверяет одно условие, на 4H и D, и посылает на почту или смс, если сигнал сработал. Кто сделает и в какую цену. В личку пишите.

    Авто-репост. Читать в блоге >>>
  5. Вопрос к программистам...
    При выключении скрипта lua, при его работе почти целый день, квик зависает напрочь. Что может быть такого в коде или проблема с кивком? Зависание наблюдается на крике 7 и 8 версии у двух разных брокеров.

    Авто-репост. Читать в блоге >>>
  6. Упрощенный алгоритм индикатора zigzag
    в дальнейшем в него встрою сигналы и наклонные уровни

    Упрощенный алгоритм индикатора zigzag


    Settings={
    Name="ZIGZAGPROF",
        line=                                     
                    {  
    					{  
                            Name = "cur1",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(0,0, 0)
                        }				
                    }
    }
    
    function Init()
    
      de = 1
      y1 = nil
      y2 = nil
      x1 = 1
      x2 = 1
        
      return 1
      
    end
    
    function OnCalculate(index)
    
      vl = C(index)
      if index == 1 then 
    	y1 = vl
        y2 = vl
      else   
    	  if C(index) > y1*(1+de/100) and y1 < y2 then 
    	    x2 = x1
    	    y2 = y1	
    	    x1 = index 
    	    y1 = C(index)	        
    	  end 	
    	  if C(index) > y1 and C(index) > y2 then 
    	    x1 = index 
    	    y1 = C(index)	  			  
    	  end 
    	  	  		
    	  if C(index) < y1*(1-de/100) and y1 > y2 then 
    	    x2 = x1
    	    y2 = y1
    	    x1 = index 
    	    y1 = C(index)	  		
    	  end 	
    	  if C(index) < y1 and C(index) < y2 then 
    	    x1 = index 
    	    y1 = C(index)	  			  
    	  end 	  	  		
    	end 	
      
      if x1 ~= index then 
        curfrom = x1
    	curto = index
      else 
        curfrom = x2
    	curto = x1
      end 
     
      if curto ~= curfrom then 
        k = (C(curto)- C(curfrom))/(curto- curfrom)  
        for i = curfrom, index  do
          curv = i*k + C(curto) - curto*k  		          
    	  SetValue(i, 1, curv)
        end   	
      end 
      
      return vl
     
      
    end


    Авто-репост. Читать в блоге >>>
  7. Куплю робота на LUA без блока индикаторов
    Нужен робот на LUA, без блока индикаторов, «болванка». Было бы хорошо, если бы там была реализована схема динамического переноса стоп-лоссов

    Авто-репост. Читать в блоге >>>
  8. как на lua в quik передать данные из одного индикатора в другой, getCandlesByIndex не предлагать она при смене графика не работает
    как на lua в quik передать данные из одного индикатора в другой, getCandlesByIndex не предлагать она при смене графика не работает

    Авто-репост. Читать в блоге >>>
  9. Индикатор на базе объемов и цены, показывающий точки входа и выхода
    если кривая пересекает нулевую линию, то сигнал на покупку или продажу в зависимости от направления пересечения
    Индикатор на базе объемов и цены, показывающий точки входа и выхода


    Settings={
    Name="VDIV",
    period=20,
    periodma=15,
        line=                                     
                    {                               		
                        {  
                            Name = "cur1",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(255,0,0)
                        },				
                        {  
                            Name = "cur2",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(0,0,0)
                        }
                    }
    }
    --[[
    
    -- кривая объемов
    описание свойств:
    
    period: сколько баров берутся в подсчет
    weighted: =0 - обычная, =1 - взвешанная
    proportional: =1- считается: volume*(close-open)/(hight-low), =0 - считается: volume*sign(close-open)
    
    --]]
    
    function Init()
    
      mas = {} 
      return 3
      
    end
    
    function OnCalculate(index)
      	
    
    	  sumv1 = 0
    	  sumv2 = 0
    
    
    	if index >= Settings.period then 
    	  for i=index-Settings.period+1, index do    
    	    if V(i) ~= nil and C(i) ~= nil then
    	      if C(i) > O(i) then
    		    sumv1 = sumv1+V(i)*(C(i) - O(i))
    	      else
    		    sumv2 = sumv2+V(i)*(O(i) - C(i))	
    	      end
            end 
    	  end 
    	else
    	  sumv1 = nil	
    	  sumv2 = nil
    	end	
    	
    	if sumv2 ~= 0 and sumv2 ~= nil then 
    	  vdiv = sumv1/sumv2
    	  vdiv2 = sumv2/sumv1
    	  vdiv3 = vdiv - vdiv2
    	else	
    	  vdiv = nil
    	  vdiv2 = nil
    	  vdiv3 = nil
    	end
    	
    	mas[index] = vdiv3
    	
    	ma = 0
    	if index >= Settings.periodma then 
    	  for i=index-Settings.periodma+1, index do    
    	    if mas[i] ~= nil then		  
              ma = ma + mas[i]			
    		end 
    	  end
    	end  
        ma = ma/Settings.periodma		
    	
      return ma, 0
    
    
    end


    Авто-репост. Читать в блоге >>>
  10. Другой вариант кривой объемов со средней
    пересечение двух линий является сигналом
    Другой вариант кривой объемов со средней


    Settings={
    Name="VCUR",
    period=20,
    periodma=20,
    weighted=1,
    proportional=1,
        line=                                     
                    {                               
                        {  
                            Name = "cur1",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(155,0, 0)
                        },	
                        {  
                            Name = "cur2",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(0,0,155)
                        },						
                        {  
                            Name = "cur3",
                            Type =TYPE_LINE,
                            Width = 1,
                            Color = RGB(0,0, 0)
                        }					
                    }
    }
    --[[
    
    -- кривая объемов
    описание свойств:
    
    period: сколько баров берутся в подсчет
    weighted: =0 - обычная, =1 - взвешанная
    proportional: =1- считается: volume*(close-open)/(hight-low), =0 - считается: volume*sign(close-open)
    
    --]]
    
    function Init()
        
      mas={}	
      return 3
      
    end
    
    function OnCalculate(index)
      	
    	--sumv = 0
    	if index >= Settings.period then 
    	  for i=index-Settings.period-1, index do    
            if sumv == nil then
    	      sumv = 0
            end	  
    	    if C(i-1) ~= nil then
    	      if C(i-1) > O(i-1) then
    		    if Settings.proportional == 0 then
    		      prop = 1
    			else
    			  if (H(i-1)-L(i-1)) == 0 then
    			    prop = 0
    			  else
    			    prop = (C(i-1)-O(i-1))/(H(i-1)-L(i-1))
    			  end
    			end
    		    if Settings.weighted == 0 then
                  sumv = sumv + prop*V(i-1)
    			else
    			  sumv = sumv + prop*V(i-1)*(i-(index-Settings.period))/Settings.period
    			end
    	      else
                if Settings.proportional == 0 then
    		      prop = 1
    			else
                  if (H(i-1)-L(i-1)) == 0 then
    			    prop = 0
    			  else			
    			    prop = (O(i-1)-C(i-1))/(H(i-1)-L(i-1))
    			  end
    			end	  
    		    if Settings.weighted == 0 then
                  sumv = sumv - prop*V(i-1)
    			else
    			  sumv = sumv - prop*V(i-1)*(i-(index-Settings.period))/Settings.period
    			end
    	      end
            end 
    	  end 
    	else
    	  sumv = nil
    	end
    	mas[index]=sumv
    	
    	ma = 0
    	if index >= Settings.periodma then 
    	  for i=index-Settings.periodma+1, index do    
    	    if mas[i] ~= nil then
    	      ma = ma + mas[i]
    		end 
    	  end
    	end  
    	ma = ma/Settings.periodma	
         
      return sumv, ma, 0
    
    
    end


    Авто-репост. Читать в блоге >>>
  11. Индикатор кривой объема
    Помогает отфильтровать не нужные сигналы

    Индикатор кривой объема



    Settings={
    Name="VCUR",
    period=20,
        line=                                     
                    {                               
                        {  
                            Name = "cur1",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(140,181, 242)
                        }	
                    }
    }
    --[[
    
    -- кривая объемов
    описание свойств:
    
    period- сколько баров берутся в подсчет
    
    --]]
    
    function Init()
        
      return 1
      
    end
    
    function OnCalculate(index)
      	
    	if index >= Settings.period then 
    	  for i=index-Settings.period-1, index do    
            if sumv == nil then
    	      sumv = 0
            end	  
    	    if C(i-1) ~= nil then
    	      if C(i-1) > O(i-1) then
                sumv = sumv + V(i-1)
    	      else
    	        sumv = sumv - V(i-1)
    	      end
            end           
    	  end	
    	else
    	  sumv = nil
    	end
         
      return sumv
    
    
    end





    Авто-репост. Читать в блоге >>>
  12. Горизонтальные объемы на рост (зеленый) на падение (красный)
    Горизонтальные объемы на рост (зеленый) на падение (красный)
    как работает:

    Горизонтальные объемы на рост (зеленый) на падение (красный)

    Авто-репост. Читать в блоге >>>
  13. MQL программирование (LUA) и вообще программирование (C/C++)
    Добрый день, smartlab и его посетители!
     Возможно обращаюсь с не совсем стандартной просьбой или помощью. В общем, есть  надобность в обучении программированию, а именно языка Си (Си++ в дальнейшем + MQL (LUA) для автоматизации торговли (стратегия основана строго по цене) со всеми его наворотами. Понимаю, что дело нелегкое. Курсов хороших очень мало (есть мега громкие, но комментарии не порадовали) и неудобно по времени.

     Опыт на рынке у меня порядка 5-ти лет и перепробовал за этот срок все что можно (огромных архив паттернов, индикаторы, тс, нестандартные подходы, скальпинг, лента, объемы и прочитана почти вся биржевая литература + близкое к понимаю биржи и природы поведения цены, тестировал и очень все хорошо работает, если грамотно торговать на любом таймфрейме), в итоге, использую только самое простое и рабочее, но это такая рутина и понимаю, что нужно писать робота для автоматизации ТС, как не крути, да и вообще нужно освоить программирование так как оно мне очень интересно для создание десктопных программ и тп на СИ++ не связанных с биржей. Кто научит помогу разобраться с биржей и куда получше любых обучающих ресурсов в сети и круче любого платного гуру в мире трейдинга (некоторые, слышал, готовы миллионы отдать за понимание цены). Простая человеческая просьба без лишнего пафоса и обещания золотых гор.

    Авто-репост. Читать в блоге >>>
  14. Горизонтальные объемы, последняя версия
    Горизонтальные объемы, последняя версия
    Settings={
    Name="GVOL",
    period=200,
    maxline=20,
    width=4,
    count=50,
    xshift=0,
    vlm=1,
    line={} 
    }
    --[[
    
    описание свойств:
    
    xshift - сдвиг по горизонтали
    count - количество черточек по вертикали
    period- сколько баров берутся в подсчет
    maxline - количество баров для максимальной черточки
    width - толщина черточки
    vlm - 1-c учетом оъема 0-просто распределение без объема,
    
    --]]
    
    function Init()
    
        n=Settings.count  
    	
        vol={}
        for j = 1, n do        
          vol[j]=0
          Settings.line[j] = {Color=RGB(192,192,192),Type=TYPE_LINE,Width=Settings.width}
          --for i=Size()-Settings.xshift-Settings.maxline, Size()-Settings.xshift do 	
    	  for i=1, Size() do 	
    	   SetValue(i, j, nil)
    	  end 
        end  
        
      return Settings.count  
    end
    
    function OnCalculate(index)
        
    
     
      if (index < Size()-Settings.xshift)or(index > Size()-Settings.xshift) then
        return nil
      else  	   
      
        n=Settings.count  
    	
        maxv=0
        maxc=0
        minc=9999 
             
        for i=Size()-Settings.xshift-Settings.period, Size()-Settings.xshift do  
           
          if C(i) ~= nil then         
            if maxc < C(i) then 
              maxc = C(i)      
            end        
            if minc > C(i) then 
              minc = C(i)      
            end
          end
                
        end   
         
        delta = (maxc - minc)/n
         
        for i=Size()-Settings.xshift-Settings.period, Size()-Settings.xshift do  
     
          for j = 1, n do 
           if C(i) ~= nil then      
            if (C(i) > minc + (j-1)*delta) and (C(i) <= minc + j*delta) then 
    		  if Settings.vlm == 1 then
    		    if V(i) ~= nil then
                  vol[j]=vol[j]+V(i) 
                end 			
              else 		  
    		    vol[j]=vol[j]+1
    		  end
            end  
           end    
          end
                
        end   
    
        for j = 1, n do
    	  vol[j] = math.floor(vol[j]+0.5)
          if maxv < vol[j] then 
            maxv = vol[j]
          end                
        end    
          
    
        k = 0 
        for i=Size()-Settings.xshift-Settings.maxline+1, Size()-Settings.xshift do  
          k = k + 1
          for j = 1, n do
            if vol[j] >= (Settings.maxline - k)*maxv/Settings.maxline then 
              SetValue(i, j, minc + j*delta)		  
            else  		
              SetValue(i, j, nil)
            end      
          end
        end
    	  
         
      end
    
    
    end




    Авто-репост. Читать в блоге >>>
  15. Раздаю x64 lua библиотеки для Quik8
    В рамках добра. 
    Для тех кто любит плюшки на lua.
    Пересобрал либины w32.dll и ffi.dll для Квика v8.0
    ffi проверил на прилагаемом к ней тесте — работает, w32.dll не проверял, сами скажите если что не так.

    На всякий случай напоминаю, это в рамках добра, так что требовать от меня вы ничего не можете. 
    Если надо что-то изменить — попросите, будет время и желание — сделаю.

    Исходный код w32.dll не менялся вообще, у ffi я внёс минимальные изменения в заголовочный файл чтобы всё собралось.
    Возможны некоторые косяки с изменением размера данных в w32.dll, ранее я ей никогда не пользовался. Проверяйте.
    Исходники брал с гита.
    ссылки:
    ffi - 
    www.dropbox.com/s/mqtpqyhi4b35lcq/ffi.dll?dl=1

    w32 -
    www.dropbox.com/s/1b6kb98uiad7pnc/w32.dll?dl=1
    ps: собирал на windows 10, на более ранних скорее всего не взлетит у вас.

    Авто-репост. Читать в блоге >>>
  16. Индикатор "Горизонтальные объемы"
    пока первая версия, в ближайшие дни доработаю
    Индикатор "Горизонтальные объемы"

    регулируется параметрами:
    Индикатор "Горизонтальные объемы"

    Авто-репост. Читать в блоге >>>
  17. bot.quikluacsharp.ru - позвольте представиться
    bot.quikluacsharp.ru - позвольте представиться
       Много лет мы занимаемся автоматизацией торговли наших клиентов в терминале Quik, но до сих пор не представились на просторах SmartLab. Исправляемся:)
       Приглашаем Вас, особенно тех, кто с нами еще не знаком, посетить наш основной ресурс quikluacsharp.ru  и дополнительную страницу для приема заказов bot.quikluacsharp.ru для того, чтобы мы смогли узнать друг друга лучше.
       Вы всегда можете обратиться к нам за любой помощью. Те, кто нас давно знают, подтвердят, что мы всегда отвечаем на любые вопросы, которые Вы задаете в комментариях на нашем основном сайте, помогаем Вам как самостоятельно написать своего робота, так и берем выполнение этой задачи полностью на себя, делая это на должном уровне.
    bot.quikluacsharp.ru - позвольте представиться

    Авто-репост. Читать в блоге >>>
  18. Учимся сами создавать торговые советники для Quik


    С ЧЕГО НАЧАТЬ САМОСТОЯТЕЛЬНОЕ ОБУЧЕНИЕ?


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

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

    И в третьих, начинайте изучать QLua.
    Рекомендую начать с раздела меню «QLua(Lua) основы», в частности со статей: «База скрипта в QLua (lua)» и «Функции обратного вызова, встроенные в QLua», остальные статьи данного раздела используйте как справочники при написании скрипта, в них практически к каждой функции есть пример кода с комментариями.

    Следующим шагом переходите к разделу меню «QUIK + QLua(Lua)», в нем речь идет о том, как взаимодействует скрипт с терминалом QUIK, как обменивается данными, все так же с примерами и комментариями. Особое внимание обратите на раздел «Блоки кода», в особенности на статью в нем: «Пример простого торгового движка „Simple Engine“ QLua(Lua)», разобрав код которой Вам многое станет понятнее, хоть по началу такой подход может показаться несколько сложным.


    читать дальше на смартлабе
  19. Коллеги, есть у кого-нибудь скрипт, позволяющий складывать значения нескольких индикаторов вместе?

     Необходимо сложить показания нескольких индикаторов по идентификаторам и вывести в виде графика. Может кто-то уже писал для себя? 

     Буду признателен, если поделитесь.
    читать дальше на смартлабе
  20. Кто сможет поправить робота lua?(не бесплатно) запускаю, всё ок торгует, но через какое то время, тупо перестаёт торговать.

    Кто сможет поправить робота lua?(не бесплатно)запускаю, всё ок торгует, но через какое то время, тупо перестаёт торговать.
    читать дальше на смартлабе
  21. Добрый вечер!
    Брокер Сбербанк
    Quik 7.19.3.1
    TSLab 2.0.33.0
    Возникли проблемы при настройке программы. Воспользовались инструкцией (во вложении) отсутствует папка Providers и соответственно дальнейший путь к файлу. Сталкивались ли Вы с такой проблемой?
  22. Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.

    Господа алготрейдеры, подскажите, плиз, простейший пошаговый пример, как подключиться напрямую из qlua к локально установленному MSSQL (включая какую dll куда класть и что писать). Гугл не помогает.
    читать дальше на смартлабе
  23. Доработал 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




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

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

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

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