Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар 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;
       
       
    Буду благодарен за помощь.

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





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

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

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

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

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

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

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

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



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

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

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

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

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



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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

    Авто-репост. Читать в блоге >>>
  17. Аватар nikita
    Есть тут кто? :) как получить данные «купить» и «продать» из таблицы состояние счета по инструменту? в мануале что то таких параметров нет :(
  18. Аватар 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        

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

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

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

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

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

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

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



    Авто-репост. Читать в блоге >>>
  23. Аватар Роджер (веселый).
    Как вообще сейчас назначается номер сделки, кто нибудь знает?
    Удалось подвязать к учебному счету интерпретатор LUA 5.3, очень помог коммент
    Как вообще сейчас назначается номер сделки, кто нибудь знает?
       Так при прогонке робота обнаружил для себя необычную вещь. Номера сделок идут не по возрастанию, и номер у сделки совершенной раньше, может быть больше, чем номер у сделки совершенной позже. Кто нибудь знает, как сейчас назначаются эти номера? Как теперь отфильтровывать ордера от повторной обработки? Создавать массив и для каждого инструмента хранить теперь номер последней обработанной сделки? Раньше тупо через фильтр, проверял чтоб обрабатываемый ордер был больше по номеру обработанного. 
    Как вообще сейчас назначается номер сделки, кто нибудь знает?

    Авто-репост. Читать в блоге >>>
  24. Аватар Роджер (веселый).
    quik - lua. буду очень благодарен за помощь.
      При написании скриптов пользуюсь notepad++ и встроенным интерпретатором языка LUA в quik для отладки достаточно только одной функции message. Опробование и отладку всегда производил на учебном счете Открытия и тут они поступили как то крайне нелогично, ввели по срочному рынку 19 — значные заявки, а квик оставили седьмой версии и интерпретатор LUA 5.1 и он просто не может работать с такими числами.  Причем на реальном рынке сначала они ввели квик 8 версии с интерпретатором LUA 5.3, а потом только длинные ордера. Как можно к учебному квику 7 версии привязать интерпретатор LUA 5.3?

    Авто-репост. Читать в блоге >>>
  25. Аватар Stanislav petrov
    А можно метки на график нанести не по chart_tag, а по тикеру ?
    Ну те тикер на графике меняется, чтоб chart_tag менялся както автоматом что ли.
    Если 30 позициций отследить с метками, нужно 30 графиков открывать и на каждый график идентификатор ставить?
Чтобы купить акции, выберите надежного брокера: