Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар Sergey Pavlov
    moex+quik+lua+candles
    Коллеги!
    Есть два варианта как получать данные в квике в рамках луа-скриптов.
    1. getCandlesByIndex
    2. CreateDataSource

    Первый вариант неудобен тем, что нужно держать открытыми графики и, если используются разные тф, то нужно держать больше открытых графиков. Всё это неудобно, когда меняются контракты и тд. Зато надёжно. Если ты графики создал, то источники создались и скрипты отработают.

    Второй вариант неудобен тем, что не всегда источники данных создаются, нужно выжидать тайм-ауты и всякое такое.

    Подскажите, какой из вариантов вы считаете наиболее правильным/оптимальным или какой используете сами?
    Если накидаете пример кода как это используете, буду премного благодарен!

    Авто-репост. Читать в блоге >>>
  2. Аватар Артур
    Пайтон и Луа
    Кто имеет опыт в программировании роботов на луа и пайтоне одновременно (речь про квик)?
    Какие плюсы/минусы можете указать при использовании того или иного языка.
    Стоит ли роботов, написанных на луа, переводить на пайтон?

    Авто-репост. Читать в блоге >>>
  3. Аватар Андрей
    Требуется помощь с плагином на Lua для QUIK (Брокер БКС)
    Всех привествую!
    Надеюсь у меня получится сделать плагин для удобства подсчета комиссии для БКС. 
    Итак, у БКС комиссия от количества контрактов за сутки на тарифе Трейдер.  
    Хочется сделать плагин, который сможет считать количество контрактов за сутки + оборот по срочке. 
    Ибо считать вручную как то не удобно..
    Или может у кого есть похожие наработки или плагин ? 
    Буду признателен за любую помощь) 

    Авто-репост. Читать в блоге >>>
  4. Аватар EASE
    Как подключиться к таблице состояние счета LUA, QUIK
    Как подключиться к  таблице состояние счета LUA, чтобы робот обращался или брал информацию из этой таблицы?

    Авто-репост. Читать в блоге >>>
  5. Аватар Сашка
    Индикатор спрос/предложение
    Подскажите, есть ли наглядные индикаторы в QIUIK для пар «общий спрос» — «общее предложение» и «кол-во лотов на покупку» — «кол-во лотов на продажу»? Возможно сторонние индикаторы на LUA для QUIK ?
    Спасибо.

    Авто-репост. Читать в блоге >>>
  6. Аватар EASE
    Дозакупка робот Lua
    Подскажите если название функции или где взять пример чтобы робот докупался, если к примеру цена идет не туда то покупает еще  .
    Заранее спасибо!

    Авто-репост. Читать в блоге >>>
  7. Аватар Vkt
    lua quik и сообщения брокера
    Скриптом на QLua есть какая-то возможность читать сообщения в Квике?
    Много нужного мимо проплывает, за всем не уследить.



    Авто-репост. Читать в блоге >>>
  8. Аватар kotopas
    Добрый день, подскажите пожалуйста с помощью какой функции можно получить цену приобретения (Балансовую цену) акции из "таблицы лимитов по бумагам". Может есть другой способ узнать стоимость?

    Авто-репост. Читать в блоге >>>
  9. Аватар Bringo
    Вопрос про QLua
    Здравствуйте. Подскажите, чтобы лучше писать на этом языке нужно ли сначала просто изучить сам язык Lua? Поделитесь советами

    Авто-репост. Читать в блоге >>>
  10. Аватар hedger
    Может кто-нибудь поделится файлами .dat котировок минуток из папки \archive для QUIK начиная с 16.09.2021 для нанесения на него метки сделок участников ЛЧИ?
    Хочу нанести с помощью скрипа smart-lab.ru/blog/754540.php на график и проанализировать сделки участников ЛЧИ 2021. Нужны полные (или почти) минутные котировки акций и фьючерсов начиная с 16.09.2021. У кого всегда отрыты минутные графики по инструменту, накопились котировки. Сам не копил. Котировки акций SBER есть.

    Примерные перечень акций(GAZP,SNGS,RUAL,TCSG,MTLR,RASP,AKRN,ROSN,ALRS,PHOR,TATN,GMKN,MTLRP,SNGSP,VTBR,LKOH,PIKK,VKCO,MAGN,NVTK,
    YNDX,SGZH,ABRD,MGNT,PLZL,OZON и другие ликвидные) и ликвидные фьючерсы.  Полезны будут хоть какие-нибудь котировки из этого списка или другие ликвидные инструменты.

    В ответ готов поделится отредактированным скрипом LUA smart-lab.ru/blog/754540.php, с помощью которого можно будет нанести метки сделок участника ЛЧИ (tatarina) на график этой акции.

    Авто-репост. Читать в блоге >>>
  11. Аватар Vkt
    Бен, это Данила. Бен, ай нид хелп! Колбеки пропали...
    У меня отдельный скрипт ведет полный реестр колбеков за день.
    OnOrder и OnTrade приходят,  OnTransReply нет.
    Раньше были. В чем может быть проблема? Первый раз такое. Может сталкивался кто?

    Авто-репост. Читать в блоге >>>
  12. Аватар die_forelle
    Market-On-Open заявка в QUIK Lua

    Привет, как в QUIK Lua сделать заявку Market-On-Open, чтобы получить покупку актива по цене открытия его основной сессии?

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



    Авто-репост. Читать в блоге >>>
  13. Аватар Rostislav Kudryashov
    Усердие всё превозмогает... Где смысл? О выявлении крупных сделок
    В источнике smart-lab.ru/blog/760357.php код QLua и картинка из Quik'а.
    Возможно, смысл в том, чтобы отловить сделки крупных игроков. Но склеивание в одну «крупную сделку» всех обезличенных сделок одного направления, пришедших в одну миллисекунду или несколько подряд, вряд ли служит цели. Это заявки разных игроков. Ведь уловка китов, прибегающих к «Айсберг-заявкам», в том и состоит, чтобы расщепить свою крупную заявку во времени.
    Так что если кто хочет схватить такого кита за руку, может попробовать выявлять последовательности тиков одного объёма и направления через равные интервалы времени.
    Но!
    1) Точно ли  все «Айсберг-заявки» формируются равными объёмами и через равные интервалы времени? Это было бы довольно глупо.
    2) Даже если такая глупость существует, к любому тику с заявкой кита может прилепиться много заявок мелкоты. Это сильно затруднит выявление регулярных «Айсберг-заявок».
    3) Самые киты входят-выходят на рынке не одной «Айсберг-заявкой» и даже не в один день! А то и ещё и через день — по обстановке. Шансов опознать именно их заявки среди прочих — ноль.
    4) В самом ли деле так важно знать сделки крупных игроков? Крупняк никогда не проигрывает?

    NB Почему эти вопросы не пришли в голову никому из заинтересованных комментаторов?
    Включая торговый терминал, не забудьте включить голову.

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

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

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

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



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

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


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

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

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

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

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

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

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

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

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

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





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

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