Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар AlexGood
    Нужно улучшить индикатор горизонтального объема для КВИК
    Друзья и коллеги, всем привет! Удачного окончания торговой недели!😎
    Есть пользовательский индикатор гориз. объема не мной написанный (ибо в LUA не силен). Так вот, если хочешь посмотреть гориз. объем за период в который попадает клиринг, то он не работает! Кто хочет попробовать подкрутить код, чтобы клиринг не был помехой пишите в личку, скину код и обсудим конкретику по сотрудничеству! Вознаграждение по факту получения результата!

    Авто-репост. Читать в блоге >>>
  2. Аватар Александр Клименко
    Всем привет. Может есть у кого нибудь скрипт уведомления при пересечении цены MA? Или может кто подскажет(поможет) как его написать?
  3. Аватар Роджер (веселый).
    У Вас Quik открытия нормально работает?
    Таблицы лимитов по бумагам, деньгам и клиентский портфель показывают в моменты дикую чушь. Никогда такого не видел, делал ребалансировку портфеля из экселя выгружаю данные в XML файл, где указаны в процентном соотношении инструменты. Робот на LUA на основании таблиц по деньгам, бумагам и клиентскому портфелю делает сам ребалансировку.  Так сделка прошла, а таблицы до минуты не обновляются после исполнения заявки. Поставил меня на деньги, хотя в программе я прописывал контрольные суммы между таблицами. Жесть, давно им пользуюсь, и сегодня такой бред увидел в работе квика, раньше вроде не замечал. Дописал код и на такие случаи, но все равно работает хреново, так как все абсолютные значения он берет из квика, а там ерунду сегодня показывает.

    Авто-репост. Читать в блоге >>>
  4. Аватар Korssar64
    lua quik
    Добрый день. Вопрос для программистов на lua. Я начал разбираться с написанием робота. Сам робот на простой ma10. Вход при пробитии закрытия свечи ma(закрытием снизу вверх — лонг, сверху в них — шорт). Выход по стопам, при этом после стопа входить в противоположную сторону по открытию следующего часа. И выход по пробитию закрытия свечи и ma.
    1)Не могу понять в какую часть когда записать следующее условие: нужно что бы робот выходил при пробитии закрытия свечи ma и делал переворот.
    2)Как прописать условие переворота, по открытию следующего часа, переворота при выбивании стопа.
    3)Как прописать перенос сделок через ноч.
    Account          = ""; -- счет клиента
      ClientCode       = ""; -- код клиента
      FirmCode         = ""; -- код фирмы
      SecCode          = ""; -- код инструмента
      ClassCode        = ""; -- класс инструмента
      Tag              = SecCode .. "_PRICE"; -- индикатор графика цены
      EMA1             = SecCode .. "_EMA1"
      EMA2             = SecCode .. "_EMA2"
      Run              = true; -- отвечает за работу скрипта
      LastOpenBarIndex = 0; 
      FlagOrder        = false; -- флаг наличия активной заявки
      FlagStopOrder    = false;
      OrderNumber      = 0; -- номер заявки
      trans_id         = os.time(); -- уникальный id транзакции
      trans_number     = 0; -- номер транзакции
      trans_status     = 0; -- статус транзакции
      ClosePosition    = true;
      Count            = 0;
      Cycles           = 60;
      Rest             = 1; -- остаток в заявке 
      Start            = 65955; -- начало работы скрипта
      Stop             = 233000; -- конец работы скрипта
      StopLossl         = 350; -- размер стоп-лосса
      StopLosss         = 405; -- размер стоп-лосса
      TakeProfit		= 3.8/100
      Step             = 1; -- шаг цены
      Slip             = 0; -- проскальзывание цены
      Unit             = 10; -- количество лотов в заявке
      
       -- Главная функция скрипта --  
       function main()
           -- Основной цикл скрипта --
    	   while Run do
    	       if IsWindowClosed(t_id) then -- при закрытие окна торгового робота скрипт останавливается!!!
    		     Run = false;
    		     message("Stop trading robot!!!");
    	       end;
    		   
    		   if not_trade() then
    		   
    		       file = io.open(getScriptPath() .. "/LastOpenBarIndex.txt", "r");
    			   if file ~= nil then
    		         LastOpenBarIndex = tonumber(file:read("*n"));
    			     file:close();
    			   end;
    			 
    			   if LastOpenBarIndex == nil then LastOpenBarIndex = 0 end;
    			 
    		       if FlagOrder then
    			   
    			     done_order()
    				 
    			   elseif FlagStopOrder then
    			   
    			     stop_order()
    				 
    			   elseif LastOpenBarIndex < getNumCandles(Tag) then
    			   
    			     Predict = predict() -- получаем прогноз
    				 Position = position() -- узнаем позицию по инструменту
    	           
    			       if Predict > 0 and Position <= 0 then
    				       if Position < 0 then
    				         QtyBuy = math.abs(Position) + Unit;
    					   elseif Position == 0 then
    					    QtyBuy = Unit;
    					   end;
    				     buy(QtyBuy) -- покупаем
    				   elseif Predict < 0 and Position >= 0 then
    				       if Position > 0 then
    				         QtySell = Position + Unit;
    					   elseif Position == 0 then
    					     QtySell = Unit;
    					   end;
    				     sell(QtySell) -- продаем
    				   end;
    				   
    				 LastOpenBarIndex = getNumCandles(Tag);
    				 
    				 file = io.open(getScriptPath() .. "/LastOpenBarIndex.txt", "w");
    				   if file ~= nil then
    	                 file:write(tostring(LastOpenBarIndex));	 
                         file:close();
    				   end;
    			   
    			   end;
    			     
    			 -- вывод параметров скрипта в таблицу --  
    			 SetCell(t_id, 1, 1, tostring(getInfoParam("SERVERTIME")));
    		     SetCell(t_id, 1, 2, SecCode);
    		     SetCell(t_id, 1, 3, tostring(position()));
    		     SetCell(t_id, 1, 4, tostring(round(tonumber(predict()), 10)));
    		     SetCell(t_id, 1, 5, tostring(round(tonumber(getPortfolioInfo(FirmCode, ClientCode).total_limit_open_pos), 2)));
    		     SetCell(t_id, 1, 6, tostring(round(tonumber(getPortfolioInfo(FirmCode, ClientCode).varmargin), 2)));
    			 
    			 sleep(1000);
    			   
    		   else
    	         sleep(1000);
    		   end;
    	   end;
       end;
       
       function not_trade()
         local Error = true;
           if isConnected() == 1 then
    	     local Time = 0;
    		 
    	     SERVER_TIME = getInfoParam("SERVERTIME"); 
    		 
    		   if string.len(SERVER_TIME) == 8 then
    		     Time = tonumber(SERVER_TIME:sub (1,2) .. SERVER_TIME:sub (4,5) .. SERVER_TIME:sub (7,8));
    		   else
    		     Time = tonumber(SERVER_TIME:sub (1,1) .. SERVER_TIME:sub (3,4) .. SERVER_TIME:sub (6,7));
    		   end; 	
    		   
    		   if Time == nil then Time = 0 end;
    		   
    		   if Time < Start then
    			 Error = false;
    			 SetCell(t_id, 1, 1, "ErrorTime");
    			   for i = 2,6 do
    		         SetCell(t_id, 1, i, "0");
    		       end;
    		   elseif Time > 135900 and Time < 140600 then
    		     Error = false;
    			 SetCell(t_id, 1, 1, "Clearing");
    			   for i = 2,6 do
    		         SetCell(t_id, 1, i, "0");
    		       end;
    		   elseif Time > 184400 and Time < 190600 then
    		     Error = false;
    			 SetCell(t_id, 1, 1, "Clearing");
    			   for i = 2,6 do
    		         SetCell(t_id, 1, i, "0");
    		       end;
    		   elseif Time > Stop then
    		     Error = false;
    			 SetCell(t_id, 1, 1, "ErrorTime");
    			   for i = 2,6 do
    		         SetCell(t_id, 1, i, "0");
    		       end;
    			   
    			 -- закрытие позиции и снятие стоп-заявки в конце торговой сессии --
    			 --[[local Position = position();
    		       if Position ~= 0 then
    			       if ClosePosition then
    				       if Position > 0 then
    					     Slip = 0;
    			             sell(Position);
    			           elseif Position < 0 then
    					     Slip = 0;
    			             buy(math.abs(Position));
    				       end;
    					 FlagOrder = false;
    				     ClosePosition = false;
    				   end;
    			   elseif Position == 0 then
    			     stop_order()
    				 ClosePosition = true;
    			   end;]]
    		   end;
    	   else
    	     Error = false;
    		 SetCell(t_id, 1, 1, "ErrorConnection");
    		   for i = 2,6 do
    		     SetCell(t_id, 1, i, "0");
    		   end;
    	   end;
    	 return Error;  
       end;
       
       -- Функция покупки --
       function buy(QtyBuy)
         local PriceBuy = 0; -- цена по которой покупаем
    	
           while PriceBuy <= 0 do
    	     PriceBuy = tonumber(getParamEx(ClassCode, SecCode, "offer").param_value) - Step * Slip -- получаем лучшую цену предложения
    	   end;
    	  
    	 message("Order to buy at the price: " .. PriceBuy .. ", qty: " .. QtyBuy);
    	   
    	 trans_id = trans_id + 1;
    	 local trans_params = {
    	     ['TRANS_ID']    = tostring(trans_id),
             ['ACTION']      = "NEW_ORDER",
             ['CLASSCODE']   = ClassCode,
             ['SECCODE']     = SecCode,
             ['OPERATION']   = "B", 
             ['TYPE']        = "M", 
             ['QUANTITY']    = tostring (math.floor(QtyBuy)), 
             ['ACCOUNT']     = Account,
             ['PRICE']       = tostring(math.floor(PriceBuy)),
    		 ['CLIENT_CODE'] = ClientCode 
    	                      }
    						  
    	 trans_status = 0;
         trans_number = 0;
    	 
    	 sendTransaction(trans_params)
    	   
    	   while trans_status ~= 3 do
    		 sleep(20);
    	   end;
    	   
    	 OrderNumber = trans_number;
    	 FlagOrder = true; 
       end;
    
       -- Функция продажи --
       function sell(QtySell)
         local PriceSell = 0; -- цена по которой продаем
    	 
           while PriceSell <= 0 do
    	     PriceSell = tonumber(getParamEx(ClassCode, SecCode, "bid").param_value) - Step * Slip -- получаем лучшую цену спроса
    	   end;
    	   
    	 message("Order to sell at the price: " .. PriceSell .. ", in the quantity: " .. QtySell);
    	   
    	 trans_id = trans_id + 1;
    	 local trans_params = {
    	     ['TRANS_ID']    = tostring(trans_id),
             ['ACTION']      = "NEW_ORDER",
             ['CLASSCODE']   = ClassCode,
             ['SECCODE']     = SecCode,
             ['OPERATION']   = "S", 
             ['TYPE']        = "M", 
             ['QUANTITY']    = tostring (math.floor(QtySell)), 
             ['ACCOUNT']     = Account,
             ['PRICE']       = tostring(math.floor(PriceSell)),
    		 ['CLIENT_CODE'] = ClientCode	 
    	                      }
    						  
    	 trans_status = 0;
         trans_number = 0;
    	 
    	 sendTransaction(trans_params) 
    	 
    	   while trans_status ~= 3 do
    		 sleep(20);
    	   end;
    	   
    	 OrderNumber = trans_number;
    	 FlagOrder = true; 
       end;
    
       -- Функция контроля исполнения активной заявки --
       function done_order()
         local QtyOrder = 0;
         local PriceOrder = 0;
    			 
    	   for i = 0, getNumberOf("orders") - 1 do
    	       if getItem("orders", i).order_num == OrderNumber then
    		     Rest = getItem("orders", i).balance;
    		       while PriceOrder <= 0 do
    			     PriceOrder = getItem("orders", i).price;
    				 QtyOrder = getItem("orders", i).qty;
    				 sleep(20);
    			   end;
    		   end;
    	   end;
    	  
    	   -- если заявка полностью исполнилась --
    	   if Rest == 0 then
    	     message(getInfoParam("SERVERTIME") .. " Order №" .. OrderNumber .. " fully executed, at the price without slipping: " .. PriceOrder .. " in quantity: " .. QtyOrder, 1)
    	     FlagOrder = false;
    		 FlagStopOrder = true;
    		 Count = 0;
    		 
    	   -- если заявка не исполнилась, снимаем отстаток --	 
    	   elseif Count > Cycles then
    	     kill_order(OrderNumber);
    	     message(getInfoParam("SERVERTIME") .. " Order №" .. OrderNumber .. " canceled, rest: " .. Rest, 1)
    		 Count = 0;
    		 FlagOrder = false;
    		 
    		   if position() ~= 0 then
    			 FlagStopOrder = true;
    	       end;
    		  
    		 file = io.open(getScriptPath() .. "/LastOpenBarIndex.txt", "w");
    	     file:write("");
             file:close();
    		  
    	   -- если заявка еще не исполнилась, но время на исполнение еще осталось --
    	   elseif Rest > 0 then
    	     Count = Count + 1;
    	   end;
         sleep(1000);
       end;   
     
      -- Функция выставления stop_loss --
       function stop_order()
           
           local PriceStopOrder = 0;
    	   local Position = position();
    	   
    	   -- снимаем старую стоп-заявку --
    	   for i = 0, getNumberOf("stop_orders") - 1 do
               if bit.test(getItem("stop_orders", i).flags, 0) == true then
    			 kill_stop_order(getItem("stop_orders", i).order_num);
               end;			   
    	   end;
    	   
    	    -- определяем цену по которой заключена сделка --
    	   if Position ~= 0 then
               for i = 0, getNumberOf("trades") - 1 do
    	           if getItem("trades", i).order_num == OrderNumber then
    		           while PriceStopOrder <= 0 do
    			         PriceStopOrder = getItem("trades", i).price;
    				     sleep(20);
    			       end;
    		       end;
    	       end;
    	   end;
    	
    	   if PriceStopOrder > 0 and Position ~= 0 then
    	   
    	       if Position > 0 then
    		     StopPrice = PriceStopOrder - StopLossl;
    			 PriceX = PriceStopOrder - Step * 200;
    			 QtyStopOrder = Position;
    			 Operation = "S";
    		   elseif Position < 0 then
    		     StopPrice = PriceStopOrder + Step * StopLosss;
    			 PriceX = PriceStopOrder + Step * 200;
    			 QtyStopOrder = math.abs(Position);
    			 Operation = "B";
    		   end;
    		   
               trans_id = trans_id + 1; 
               local trans_params = {
               ['TRANS_ID']        = tostring(trans_id),
               ['ACTION']          = "NEW_STOP_ORDER",
    		   ['STOP_ORDER_KIND'] = "SIMPLE_STOP_ORDER",
    		   ['EXPIRY_DATE']     = "TODAY",
    		   ['STOPPRICE']       = tostring(math.floor(StopPrice)),
               ['CLASSCODE']       = ClassCode,
               ['SECCODE']         = SecCode,
               ['PRICE']           = tostring(math.floor(PriceX)),
               ['OPERATION']       = Operation, 
               ['TYPE']            = "L", 
               ['QUANTITY']        = tostring(math.floor(QtyStopOrder)), 
               ['ACCOUNT']         = Account,
    		   ['CLIENT_CODE']     = ClientCode
                                  }
    						
    	       trans_status = 0; -- сбрасываем прошлый статус транзакции
    	 
               sendTransaction(trans_params); -- отправляем транзакцию
    	 
    	       while trans_status ~= 3 do
    	         sleep(20);
    	       end; 
    		   if Position > 0 then
    		     StopPrice = PriceStopOrder - StopLossl;
    			 PriceX = PriceStopOrder - Step * 200;
    			 QtyStopOrder = Position;
    			 Operation = "S";
    		   elseif Position < 0 then
    		     StopPrice = PriceStopOrder + Step * StopLosss;
    			 PriceX = PriceStopOrder + Step * 200;
    			 QtyStopOrder = math.abs(Position);
    			 Operation = "B";
    		   end;
    		   
               trans_id = trans_id + 1; 
               local trans_params = {
               ['TRANS_ID']        = tostring(trans_id),
               ['ACTION']          = "NEW_STOP_ORDER",
    		   ['STOP_ORDER_KIND'] = "SIMPLE_STOP_ORDER",
    		   ['EXPIRY_DATE']     = "TODAY",
    		   ['STOPPRICE']       = tostring(math.floor(StopPrice)),
               ['CLASSCODE']       = ClassCode,
               ['SECCODE']         = SecCode,
               ['PRICE']           = tostring(math.floor(PriceX)),
               ['OPERATION']       = Operation, 
               ['TYPE']            = "L", 
               ['QUANTITY']        = tostring(math.floor(QtyStopOrder)), 
               ['ACCOUNT']         = Account,
    		   ['CLIENT_CODE']     = ClientCode
                                  }
    						
    	       trans_status = 0; -- сбрасываем прошлый статус транзакции
    	 
               sendTransaction(trans_params); -- отправляем транзакцию
    	 
    	       while trans_status ~= 3 do
    	         sleep(20);
    	       end; 
    		   --[[]]
    		   if Position > 0 then
    		     StopPrice = PriceStopOrder *(TakeProfit+1) ;
    			 PriceX = PriceStopOrder - Step * 200;
    			 QtyStopOrder = Position;
    			 Operation = "S";
    		   elseif Position < 0 then
    		     StopPrice = PriceStopOrder *(1-TakeProfit);
    			 PriceX = PriceStopOrder + Step * 200;
    			 QtyStopOrder = math.abs(Position);
    			 Operation = "B";
    		   end;
    		   
               trans_id = trans_id + 1; 
               local trans_params = {
               ['TRANS_ID']        = tostring(trans_id),
               ['ACTION']          = "NEW_STOP_ORDER",
    		   ['STOP_ORDER_KIND'] = "SIMPLE_STOP_ORDER",
    		   ['EXPIRY_DATE']     = "TODAY",
    		   ['STOPPRICE']       = tostring(math.floor(StopPrice)),
               ['CLASSCODE']       = ClassCode,
               ['SECCODE']         = SecCode,
               ['PRICE']           = tostring(math.floor(PriceX)),
               ['OPERATION']       = Operation, 
               ['TYPE']            = "L", 
               ['QUANTITY']        = tostring(math.floor(QtyStopOrder)), 
               ['ACCOUNT']         = Account,
    		   ['CLIENT_CODE']     = ClientCode
                                  }
    						
    	       trans_status = 0; -- сбрасываем прошлый статус транзакции
    	 
               sendTransaction(trans_params); -- отправляем транзакцию
    	 
    	       while trans_status ~= 3 do
    	         sleep(20);
    	       end; 
    		   
    		   FlagStopOrder = false;
     	   end;
       end;
       
       -- Функция снятия заявки --
       function kill_order(Number)
         trans_id = trans_id + 1;
         local trans_params = {
             ['TRANS_ID']   = tostring(trans_id),
             ['ACTION']     = "KILL_ORDER",
             ['CLASSCODE']  = ClassCode,
             ['SECCODE']    = SecCode,
             ['ACCOUNT']    = Account,
    	     ['ORDER_KEY']  = tostring(Number)
                              }
         sendTransaction(trans_params);
       end;
       
       -- Функция снятия стоп-заявки --
       function kill_stop_order(Number)
         trans_id = trans_id + 1;
         local trans_params = {
             ['TRANS_ID']   = tostring(trans_id),
             ['ACTION']     = "KILL_STOP_ORDER",
             ['CLASSCODE']  = ClassCode,
             ['SECCODE']    = SecCode,
             ['ACCOUNT']    = Account,
    	     ['STOP_ORDER_KEY']  = tostring(Number)
                              }
         sendTransaction(trans_params);
       end;
       
       -- Функция прогнозирования движения цены инструмента --
       function predict()
         local t, n, l = nil,nil,nil
    	   while t == nil do
    		 x1 = getNumCandles('Tag')
    		 t, n, l = getCandlesByIndex('Tag', 0, 0, x1)
    		 ma_1 = t[0].close
    		 for i=1, x1-1 do
    		 local C = t[i].close
    		 local C1 = t[i-1].close
    		 local C2 = t[i-2].close
    		 local C3 = t[i-3].close
    		 local C4 = t[i-4].close
    		 local C5 = t[i-5].close
    		 local C6 = t[i-6].close
    		 local C7 = t[i-7].close
     		 local C8 = t[i-8].close
     		 local C9 = t[i-9].close
     		 ma_2 = (C1+C2+C3+C4+C5+C6+C7+C8+C9+C)/10 
    
    		 ma_1 = ma_2
    		 end
    	     --
    		 sleep(10)
           end;
    	   local ema2 = ma_1;
    	   
    	   local ema1 = t[x1].close
    	  
    	 local result
    	   if ema1 > ema2 then
    	      result = 1;
    	   elseif ema1 < ema2 then
    	      result = -1
    	   end;
    	 return result;
       end;
       
       -- Функция определния позиции по инструменту --   
       function position()
         local res = 0;
    	   for i = 0, getNumberOf("futures_client_holding") - 1 do
    		   if getItem("futures_client_holding", i).sec_code == SecCode then
    	         res = tonumber(getItem("futures_client_holding", i).totalnet);
    	       end;
    	   end;
    	 return res;
       end;
     
       -- Функция обратного вызова запускается первой и создает таблицу торгового робота --
       function OnInit()
         message("Start trading robot!");
         t_id = AllocTable(); -- создаем таблицу
    	 AddColumn (t_id,1,"Time", true, QTABLE_TIME_TYPE, 15);
    	 AddColumn (t_id,2,"Sec_Code", true, QTABLE_STRING_TYPE, 10);
    	 AddColumn (t_id,3,"Position", true, QTABLE_STRING_TYPE, 10);
    	 AddColumn (t_id,4,"Predict", true, QTABLE_STRING_TYPE, 15);
    	 AddColumn (t_id,5,"Balance", true, QTABLE_STRING_TYPE, 10);
    	 AddColumn (t_id,6,"Margin", true, QTABLE_STRING_TYPE, 10);
    	 CreateWindow(t_id); -- создаем окно таблицы
    	 SetWindowCaption(t_id, "Trading robot");
    	 InsertRow(t_id, 1);
       end;
       
       -- Функция обратного вызова для получения результата отправки транзакции --   
       function OnTransReply(trans_reply)
           if trans_reply.trans_id == trans_id then
             trans_status = trans_reply.status;
    		 trans_number = trans_reply.order_num;
    	   end;
       end;
       
       -- Функция обратного вызова остановки скрипта --   
       function OnStop()
         Run = false;
    	 DestroyTable(t_id);
       end;
       
       -- Функция округления чисел --   
       function round(x, n)
         n = math.pow(10, n or 0)
         x = x * n
         if x >= 0 then x = math.floor(x + 0.5) else x = math.ceil(x - 0.5) end;
         return x / n
       end;
       
       
    Буду благодарен за помощь.

    Авто-репост. Читать в блоге >>>
  5. Аватар Vkt
    Не знаю, почему автор молчит
    Есть реально полезная штука — фреймворк для торговых роботов
    Оказывается существует новая версия:  github.com/ffeast/hacktrade
    А я все на старой сидел, про которую узнал тут:   smart-lab.ru/blog/195508.php
    Как можно использовать -  smart-lab.ru/blog/246568.php





    Авто-репост. Читать в блоге >>>
  6. Аватар vfreeman
    lua + winodws 10
    Коллеги, подскажите как завести скрипты lua на windows 10.

    Погуглил — заменил C:\Program Files (x86)\Lua\5.1\clibs\socket\core.dll на 64-разрядную версию. Теперь вот такая ошибка:

    error loading module 'socket.core' from file 'C:\Program Files (x86)\Lua\5.1\clibs\socket\core.dll':
        Не найден указанный модуль.

    Версия Quik — 8.13.1.16

    Авто-репост. Читать в блоге >>>
  7. Аватар Mmm
    Кто-то делает роботов для quik?
    Всем привет. Посоветуйте разработчиков, которые умеют делать приводы для квика
    на заказ. Ну там dll, C/C++ и всё такое.
    kbrobots сказали, что сдулись

    Авто-репост. Читать в блоге >>>
  8. Аватар Алексей карандашов
    Алготрейдинг в торговле
    Господа кто проконсультирует по переводу файлов lua в luac, чтоб так же работали в квике?

    Авто-репост. Читать в блоге >>>
  9. Аватар StockGamblers
    SmartMap для QUIK - ДЕМО-ВЕРСИЯ для всех!

    Ура, наконец демо-версия готова!

    Для тех, кто пропустил:
    https://smart-lab.ru/blog/697641.php  немного картинок
    https://smart-lab.ru/blog/700079.php  видео работы скрипта

    Итак, еще раз, что такое SmartMap? Это срез стакана, который остается на графике в виде меток, что позволяет нам видеть когда и где были крупные скопления, как они отрабатывались ценой, и где они есть сейчас. Дополнительно отображается общая ситуация по стакану в виде совокупного количества бидов и асков.

    Достаточно популярная вещь у иностранцев, присутствует в большинстве импортных терминалов под названиями BookMap/HeatMap. Однако везде имеется мощный недостаток — при изменении ТФ или любого параметра, сформированный на графике рисунок «следов» исчезает. Почему? Потому что история стакана не сохраняется. Наша разработка лишена этого минуса. Меняете ли вы тайм-фрейм, какую-то настройку отображения скрипта — неважно, метки на графике остаются. Скрипт собирает историю с момента включения Квика. Все что от вас требуется — открытый стакан по инструменту.



    Авто-репост. Читать в блоге >>>
  10. Аватар pessimist
    Нужны советы по формализации алгоритмов
    Всем, приветы! Удачи и профита!

    На старости лет, решил упростить себе жизнь на бирже с помощью скриптов на QLUA под QUIK. Пока скрипты были простые — все шло хорошо.

    Однако, все течёт, все меняется и простыми скриптами зарабатывать как раньше не получается.

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

    Нужны советы по формализации алгоритмов



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

    Попробовал начертить на бумажке блок-схему работы программы, но когда вышел за пределы формата А1 — понял, что этот путь мне не годится. Понимаю, что я морально устарел и, возможно существуют другие подходы к алгоритмизации решения задачек.



    Авто-репост. Читать в блоге >>>
  11. Аватар GOLD
    Косяк в LUA
    Цикл:

    for i = 0.1, 0.3, 0.1 do
        message(tostring(i))
    end
    Результат:

    0.1
    0.2


    Цикл:

    for i = 0.1, 0.5, 0.1 do
        message(tostring(i))
    end
    Результат:

    0.1
    0.2
    0.3
    0.4
    0.5

    Забавно да?

    А я этому LUA доверяю свои деньги! Кто знает, где у него еще косяки зарыты...

    ----------------------------------------
    QUIK 8.13.1.16 / LUA 5.3.5 и 5.4.1

    Авто-репост. Читать в блоге >>>
  12. Аватар 3Qu
    Связь Lua -> ваша прграмма. RAM Disk.
    Я, вроде, уже писал подобный пост. Давно. Но, новое — хорошо забытое старое.
    Очень многие неплохо владеют основами программирования, но написать DLL, связь через TCP или что-то другое для экспорта-импорта в Lua — это достаточно сложная процедура, и требует дополнительных знаний и много времени. Однако, если такую связь как-то по простому реализовать, то решились бы многие проблемы обмена данными с C#, Python и другими средами, и не надо вникать во всяческие C-API и прочие премудрости.
    Однако, есть достаточно простой и доступный способ — обмен данными через файлы. Например, так:
    1. программа Lua пишет строку (строки) данных в формате CSV в файл data.csv,
    2. программа Lua создает пустой файл flag.ddd,
    3. ваша программа проверяет наличие файла flag.ddd, что означает, что данные готовы к чтению,
    4. при наличии файла flag.ddd программа читает данные файла data.csv и удаляет файл flag.ddd,
    5. программа Lua проверяет наличие файла flag.ddd, и если этот файл отсутствует пишет строку (строки) данных в файл data.csv (см. п.1)
    При обратном обмене происходит все тоже самое, только имена файлов другие.

    Авто-репост. Читать в блоге >>>
  13. Аватар 3Qu
    Календарный спред Si прямо сейчас. (дополнение к bohemian rhapsody)
    Что нужно для игры на календарном спреде.
    1. Вот такие данные:
    Календарный спред Si прямо сейчас. (дополнение к bohemian rhapsody)
    2. Вот такой автомат. Реализован на Lua и С++ DLL
    Календарный спред Si прямо сейчас. (дополнение к bohemian rhapsody)

    Авто-репост. Читать в блоге >>>
  14. Аватар Александр Бессонов
    Какие брокеры поддерживают рыночные заявки ? Price(0) отправленные через транзакцию через QLUA ?
    Какие брокеры поддерживают рыночные заявки? Price(0) отправленные через транзакцию через QLUA?

    Авто-репост. Читать в блоге >>>
  15. Аватар Александр Бессонов
    Подскажите пожалуйста пример кода на QLUA что бы отправить заявку на планку
    Подскажите пожалуйста пример кода на QLUA что бы отправить заявку на планку 

    Авто-репост. Читать в блоге >>>
  16. Аватар Vit25
    ЛУА — программирование
    Добрый день, уважаемые коллеги!

    Не знаю снесут ли данный топик или же пройдет по правилам.

    Суть такая, что я полтора года программирую разных роботов в ЛУА, а еще имею косяк в недокапитализации счета и посему, учитывая, что живу исключительно с рынка уже почти два года, приходится встать на путь недалекий от околорынка :) Каюсь, но недостаток средств на счету, а точнее даже то, что расходы перекрывают доходы от торговли, все это стало причиной поиска сотрудничества и предложения создать робота под квик на заказ. Когда начинал торговать, то вход на всю котлету и пересиживание убытков по началу как-то вывозило. Но когда дошел до системного трейдинга с соблюдением рисков и ММ доходность упала, правда и нервы стали целее.

    Вдруг кому интересно что-то заполучить в виде скрипта луа, или индикатора какого. Сразу оговорюсь, до сего момента на заказ ничего не писал, расценок не знаю, но, полагаю, с заинтересованным человеком договоримся.

    Буду рад обратной связи и всякого рода помидорного закидывания :)

    С уважением, Виталий.

    Авто-репост. Читать в блоге >>>

    Vitaliy, Предложение еще актуально? Помощь в программировании для QUIK нужна.
  17. Аватар Анохин Алексей
    Требуется программист на Lua и TSLab
    Требуется программист на Lua и TSLab. Программист нужен НЕ под определенный проект с уже готовым ТЗ, а на постоянной основе для разработки и написания торговых систем, индикаторов и пр. Оплата помесячно.

    Работа будет выглядеть ПРИМЕРНО таким образом:
    — Брифинг по скайп с обсуждением задач
    — Написание обсуждаемого скрипта в TSLab и его тестирование
    — После утверждения: написание скрипта в Lua под QUIK

    Какой тип задач нужно будет решать:
    — Написание и тестирование модулей скрипта в TSLab с последующей переноской на lua
    — Объединение модулей в единый алгоритм
    — Написание индикаторов в QUIK
    — Работа с уже имеющимися скриптами (доработка, исправление ошибок и пр.)
    — Написание околотрейдингового вспомогательного софта для личных нужд.
    — Работа в Excel (обработка статистических данных).

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

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

    Авто-репост. Читать в блоге >>>
  18. Аватар Glago
    Обновление квик позволяет выбрать версию луа
    В обновлении Quik 8.11.0.66 при запуске скрипта луа на кнопочке появилось выпадающее меню, позволяющее выбрать версию луа, на которой будет запускаться скрипт. Выглядит это так:

    Обновление квик позволяет выбрать версию луа




    Авто-репост. Читать в блоге >>>
  19. Аватар AlexGood
    Индикатору гориз. объема для КВИК мешает клиринг
    Друзья и коллеги, всем привет!
    Когда в индикаторе выставляешь период больше времени прошедшего с последнего клиринга, то индикатор .lua не отображает гориз. объем, можно код подправить чтобы индикатор не замечал клиринги?

    Авто-репост. Читать в блоге >>>
  20. Аватар nikita
    Есть тут кто? :) как получить данные «купить» и «продать» из таблицы состояние счета по инструменту? в мануале что то таких параметров нет :(
  21. Аватар Perl
    квик сменил кодировку роботов на луа языке
    MARKET               = «SPBFUT»
    TICKER               = «SiH7»
    ACCOUNT              = "----"
    CLIENT_CODE          = "----"

    TRANS_ID             = 0
    STOP_FACTOR          = 30
    SPREAD_FACTOR        = 30
    LAST_ORDER           = 0
    TRANS_REPLY          = nil
    BALANCE = 0

    BEZUBYTOK=STOP_FACTOR*5--0.0014--малый шаг

    TP=STOP_FACTOR*30--STOP_FACTOR*1--0.015--в % внутри дня (тейк-профит).большой шаг

    SREDNSHAG=STOP_FACTOR*10---0.007--средн.шаг(0.08* STOP_FACTOR /1000)

    n=3-- кол-во кругов малого BEZUBYTOK>STOP_FACTOR*(n+1)--минимально

    k=4--кол-во кругов  безубытка --SREDNSHAG>STOP_FACTOR*(k+1)--минимально

    run = true
    function main()
       while run do
          if LAST_ORDER == 0 then     
          
             BALANCE = GetTotalnet()
             if BALANCE ~= 0 then
                LAST_ORDER = NewStopOrder(BALANCE)
             end        

    Авто-репост. Читать в блоге >>>
  22. Аватар Врач-бондиатОр
    Lua для Квик - отправка сообщений по емейлу
    Хочу создать скрипт, который бы высылал на емейл нужную мне информацию.
    По тем материалам, которые у меня есть, для этого нужно писать костыль на бесике.
    Может быть сейчас появились более современные варианты?
    Quik версия 7.ххх

    Авто-репост. Читать в блоге >>>
  23. Аватар Вадим
    Нужна помощь в lua
    Кто переделает скрипт на луа для 8 квика от 7. Чтобы работало. Оплата — раскажу или сами догадаетесь для чего он. Не для дальнейшего распостранения и не для продажи с Вашей стороны. Надеюсь на Вашу порядочность. В се сообщения в личку.

    Авто-репост. Читать в блоге >>>
  24. Аватар autotrade
    есть программный код для выставления заявок под квик на lua по сигналу пересечения индикаторов?

    Авто-репост. Читать в блоге >>>
  25. Аватар Денис Базарнов
    Карта рынка - мой первый прототип надстройки над Quik(Квик)

    Начну с того, что недавно я чуть не совершил серьезную ошибку. Мне как и многим, надоел «пресный» внешний вид Quik-а, и других торговых терминалов и захотелось «что-то свое», визуально красивое, интуитивно понятное, ну вообщем Вы поняли, я захотел «изобрести свой велосипед». Мне повезло, хватило буквально пары недель, для понимания масштаба задачи.

    Вспомнил случай из жизни: примерно два года назад у меня «не случился» заказчик на разработку программного обеспечения. Заказчик сетовал на то, что кому бы он не обращался, все отказываются. И он открывает картинку стандартного графика цены и объема в Квике и со словами «вообщем мне надо также, только вот здесь и здесь надо добавить парочку штрихов» начинает на ней рисовать. Я ему начинаю объяснять, что стандартными средствами квика эту задачу не реализовать, а он в ответ «Вот мне именно так все и говорят! А я Вам показываю, что в квике все уже сделано, осталось чуть-чуть доделать вот здесь и здесь...»

    На самом деле в этой идее больше вопросов, чем ответов, точнее чем больше ты вникаешь в задачу, тем больше вопросов возникает. Обычный пользователь как должное воспринимает что квик загружается очень быстро (например в сравнении с «Альфа Директ»), хранит и отражает данные за требуемый период, имеет относительно гибкий внутренний скриптовый язык ну и т.п.



    Авто-репост. Читать в блоге >>>
Чтобы купить акции, выберите надежного брокера: