Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар _sk_
    QLua: таблица крупных "склеенных" обезличенных сделок - 2
    Недавно ко мне обратился один из смартлабовцев с просьбой доработать скрипт из поста https://smart-lab.ru/blog/610116.php, чтобы можно было более гибко подходить к раскраске выводимой там таблицы крупных «склеенных» сделок. Я решил проделать эту работу и выложить сюда модернизированный скрипт.

    Настройки раскраски таблицы производятся в самом скрипте. Я сделал какие-то настройки для светлой темы терминала, может быть, весьма далёкие от ваших идеалов. Каждый пользователь пусть настраивает сам на свой вкус через палитру RGB (для каждого из трёх основных цветов нужно выбрать интенсивности от 0 до 255), редактируя строки в начале основного скрипта.

    Для работы скрипта нужен собственно сам скрипт и один или несколько файлов настроек для ваших наборов инструментов. Границы крупных и очень крупных сделок, проскальзывания и «многосоставности» сделок также пользователи настраивают под себя. В терминале QUIK запускается файл с настройками, а он в свою очередь запускает основной скрипт.

    Авто-репост. Читать в блоге >>>
  2. Аватар Naivny Mechtatel
    Подскажите пожалуйста, возможно ли по нескольким инструментам создать робота, который в реальном времени формирует и обновляет таблицу, где будут отражаться данные по MACD за прошлую и текущую свечи? При этом графики открывать не нужно.
  3. Аватар ✔️AlgoDevil
    Анализ сделок ЛЧИ 21 через Квик
    Анализ сделок ЛЧИ 21 через Квик



    Всем, Привет! Ищу 3 луа индикатора под квик, для последующей загрузки файла сделок лчи в формате .csv

    1.lua отображает момент открытия и закрытия сделок на графике цены.
    2.lua — рисует кривую доходности
    3.lua — график показывает проторгованное количество лот


    Кто может поделиться — буду благодарен!

    Авто-репост. Читать в блоге >>>
  4. Аватар Александр Стриженов
    Всем привет. Может есть у кого нибудь скрипт уведомления при пересечении цены MA? Или может кто подскажет(поможет) как его написать?

    Александр Клименко,

    Готовое решение www.bot4sale.ru/download-categories/2012-06-13-15-10-36/item/market-scaner.html
  5. Аватар John Smith
    В Quik 9 автоматический сбор мусора в lua не работает?
    Скрипт, нормально работающий в Quik 8.7, жрет и не освобождает память в Quik 9.2. Пришлось накостылить периодический вызов collectgarbage() в потоке обработчиков (вызов в потоке main() не помогает). Это норма в 9-м квике?

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

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

    autotrade,
  7. Аватар AlexGood
    Нужно улучшить индикатор горизонтального объема для КВИК
    Друзья и коллеги, всем привет! Удачного окончания торговой недели!😎
    Есть пользовательский индикатор гориз. объема не мной написанный (ибо в LUA не силен). Так вот, если хочешь посмотреть гориз. объем за период в который попадает клиринг, то он не работает! Кто хочет попробовать подкрутить код, чтобы клиринг не был помехой пишите в личку, скину код и обсудим конкретику по сотрудничеству! Вознаграждение по факту получения результата!

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

    Авто-репост. Читать в блоге >>>
  10. Аватар 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;
       
       
    Буду благодарен за помощь.

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





    Авто-репост. Читать в блоге >>>
  12. Аватар 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

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

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

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

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

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

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

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



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

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

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

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

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



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

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



    Авто-репост. Читать в блоге >>>
  17. Аватар 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

    Авто-репост. Читать в блоге >>>
  18. Аватар 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)
    При обратном обмене происходит все тоже самое, только имена файлов другие.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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