Алексей Никитин
Алексей Никитин личный блог
26 марта 2021, 10:43

Как отправлять сообщения из Квика в Телеграм! И писать в файлик разную дребедень!


Все очень и  очень просто!
Достаточно создать бота в телеге,  написать примитивный  луа  скрипт и запустить его.

Про ботов в телеге здесь  https://core.telegram.org/bots
в гугле  куча инфы  и примеров, как чего куда и зачем.


--
--СКРИПТ Niki для smart-lab.ru 260321  ревизия
---------------------------------------

-- Флаг для поддержания работы функции main
is_run=true

fut_limit_old =0
fut_limit_max =0
kgo_old       =0.5


function main( ... )  -- чудотворная функция внутри  которой все  работает

		   
		    --"r": режим чтения (по умолчанию);
			--"w": режим записи;
			--"a": режим добавления;
			--"r+": режим обновления, все предыдущие данные сохраняются;
			--"w+": режим обновления, все предыдущие данные стираются;
			--"a+": режим добавления и обновления, предыдущие данные сохраняются, запись разрешена только в конец файла.     b бинарные файлы
		   
		   -- Пытается открыть файл в режиме "чтения/записи"
		   f = io.open(getScriptPath().."\\Limits.txt","a");
		   -- Если файл не существует
		   if f == nil then 
			  -- Создает файл в режиме "записи"
			  f = io.open(getScriptPath().."\\Limits.txt","w"); 
			  -- Закрывает файл
			  f:close();
			  -- Открывает уже существующий файл в режиме "чтения/записи"
			  f = io.open(getScriptPath().."\\Limits.txt","a");
		   end;

    while is_run do    
        sleep(1000)   -- 1000 = 1 секунда    --волшебная пауза в  работе  скрипта
		
		if getFuturesLimit("A111", "A111111", 0, "SUR") ~= nil then     -- защита от  пустых таблиц    -- впишите ваши данные из Квика
		
			-- %c   - дата и время (по-умолчанию) (пример, 03/22/15 22:28:11) 
			-- %x   - дата (пример, 09/16/98)
			-- %X   - время (пример, 23:48:10)
			
			seconds = os.time(); -- в seconds будет значение 1427052491
			date1 = os.date("%x",seconds);  --  %c   - дата (по-умолчанию) (пример, 03/22/15 22:28:11) 
			time1 = os.date("%X",seconds);  --  %c   - время (по-умолчанию) (пример, 03/22/15 22:28:11) 
			
			
			--[[
			liquidity_coef           --NUMBER  Коэффициент ликвидности  
			cbp_prev_limit           --NUMBER  Предыдущий лимит открытых позиций на спот-рынке» 
			cbplimit                 --NUMBER  Лимит открытых позиций  
			cbplused                 --NUMBER  Текущие чистые позиции  
			cbplplanned              --NUMBER  Плановые чистые позиции  
			varmargin                --NUMBER  Вариационная маржа  
			accruedint               --NUMBER  Накопленный доход   
			cbplused_for_orders      --NUMBER  Текущие чистые позиции (под заявки)  
			cbplused_for_positions   --NUMBER  Текущие чистые позиции (под открытые позиции)  
			options_premium          --NUMBER  Премия по опционам  
			ts_comission             --NUMBER  Биржевые сборы  
			kgo                      --NUMBER  Коэффициент клиентского гарантийного обеспечения  
			currcode                 --STRING   Валюта, в которой транслируется ограничение  
			real_varmargin           --NUMBER  Реально начисленная в ходе клиринга вариационная маржа. Отображается с точностью до 2 двух знаков. При этом в поле «varmargin» транслируется вариационная маржа, рассчитанная с учетом установленных границ изменения цены  
			--]]
			
			
			fut_limit    = getFuturesLimit("A111", "A111111", 0, "SUR").cbplused_for_positions    --  NUMBER  Текущие чистые позиции (под открытые позиции)     -- впишите ваши данные из Квика
			varmargin    = getFuturesLimit("A111", "A111111", 0, "SUR").varmargin                 -- впишите ваши данные из Квика
			accruedint   = getFuturesLimit("A111", "A111111", 0, "SUR").accruedint                -- впишите ваши данные из Квика
			ts_comission = getFuturesLimit("A111", "A111111", 0, "SUR").ts_comission              -- впишите ваши данные из Квика
			kgo          = getFuturesLimit("A111", "A111111", 0, "SUR").kgo                       -- впишите ваши данные из Квика
			
			profit = varmargin + accruedint;
	 
			--if  math.abs(fut_limit-fut_limit_old) > 10000 then       -- каждые 10000 рублей изменения ГО,   слишком частый файл печати 
			if  math.abs(fut_limit-fut_limit_old) > 100000 then       -- каждые 100000 рублей изменения ГО,   настраиваем под себя.
			
				open_lim     = getFuturesLimit("A111", "A111111", 0, "SUR").cbplimit                  --NUMBER  Лимит открытых позиций
				f:write( tostring(date1).."  "..tostring(time1).."  ".."ГО: "..tostring(fut_limit).."  ".."Профит: "..tostring(profit).."  ".."Комис: "..tostring(ts_comission).."  ".. "КГО: "..tostring(kgo).."  Lim: "..tostring(open_lim)..  "\n"); -- "\n" признак конца строки
				--f:write( tostring(date1).. "  " ..tostring(time1)..  "  " .. "BID: " .. tostring(res_trans) .. "  " .. "ASK: " ..  tostring(MXU8ask_vol) .. "\n"); -- "\n" признак конца строки
				   -- Сохраняет изменения в файле на диск
				f:flush();
				
				fut_limit_old = fut_limit;
			end
			
			if fut_limit_max == 0  then   								
				fut_limit_max = fut_limit;
			end	
				
			if ( math.abs(fut_limit-fut_limit_max) > 1000000 and fut_limit>0 ) then   	  -- настраиваем под себя							
				message( tostring(fut_limit) )   ----сообщение в Квик--
				--message( tostring(time1) )
				---------------------------------------- отправляем сообщение в  Телеграмм--
				pos_free     = getFuturesLimit("A111", "A111111", 0, "SUR").cbplplanned               --NUMBER  ГО свободных денег от позы без пониженного ГО 
				open_lim     = getFuturesLimit("A111", "A111111", 0, "SUR").cbplimit                  --NUMBER  Лимит открытых позиций
				tg_message = tostring(open_lim).."   ГО:"..tostring(fut_limit).."   Поза:"..tostring(open_lim-pos_free) 
				os.execute('curl  "https://api.telegram.org/botВашиДанныеИзТелеграмм&text= + '..tg_message..' " ')    -- отправляем в телегу, через винду. Вписать ваши данные из Телеграмм
				----------------------------------------
				-- Пример строки   https://api.telegram.org/bot365877050:AAE232342348HIqifnyGSsw89U_4TK3Y/sendMessage?chat_id=202560128&text=  + Привет Квик!
				----------------------------------------
				fut_limit_max = fut_limit;
			end	
			
			if  math.abs(kgo-kgo_old) > 0 then
				---------------------------------------- отправляем сообщение в  телеграмм
				tg_message = tostring(kgo).." Внимание! Изменился коэффициент КГО" 
				os.execute('curl  "https://api.telegram.org/botВашиДанныеИзТелеграмм&text= + '..tg_message..' " ')    -- отправляем в телегу, через винду. Вписать ваши данные из Телеграмм
				----------------------------------------
				-- Пример строки   https://api.telegram.org/bot365877050:AAE232342348HIqifnyGSsw89U_4TK3Y/sendMessage?chat_id=202560128&text=  + Привет Квик!
				----------------------------------------
				kgo_old = kgo;
			end
		end
		
		
		
    end
f:close();  -- закрываем файл печати.
end		
		

-- Остановка скрипта из Квика
function OnStop(stop_flag)

    is_run=false

end



Код сохранить в обычном текстовом редакторе,  назвать его 1111.lua  помесить в папочку  Quik\Lua script
Код необходимо отредактировать,  подставить ваши данные  из Квика, и ваши данные из телеграмм бота.
Немножко поднастроить,  и можно запускать -))

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

Удачи вам, начинающие  луа писатели.



Тимофею,  файлик скрипта  прикрепить не шмогла! Нетути кнопачкав таких!





48 Комментариев
  • Igr
    26 марта 2021, 10:48
    И что именно мы увидим в телеге?
      • Petr S
        26 марта 2021, 17:02
        Алексей Никитин, ну как пример — этот код ужасен, стоило вынести  саму отсылку то (os.execute) в отдельную функцию, тогда ее легко вставлять в другие свои проекты. 

  • Stig
    26 марта 2021, 10:51
    Как отравлять сообщения

    новичком… 
  • Дмитрий Овчинников
    26 марта 2021, 11:08
    Интересен опыт практического применения.
    Используете? Зачем?
      • Дмитрий Овчинников
        26 марта 2021, 11:14
        Алексей Никитин, 
        торгует и торгует. Телеграм то причем здесь? Чего вы туда шлете? 
          • Дмитрий Овчинников
            26 марта 2021, 11:22
            Алексей Никитин, 
            вот я удивляюсь публике. Вроде простой вопрос задаешь, а получаешь какие-то странные ответы совершенно о другом. Ну да ладно, не хотите делиться опытом и не надо. 
            смотрите код там усе написано
            Когда я вижу в коде что-то типа Sleep(1000), дальше уже не смотрю :)
              • Дмитрий Овчинников
                26 марта 2021, 11:47
                Алексей Никитин, 
                то есть много сообщений отправляете? С самим телеграммом нет проблем при этом? Он, как мне кажется, тоже не очень надежный. 
                  • Дмитрий Овчинников
                    26 марта 2021, 11:58
                    Алексей Никитин, 
                    я не про тормоза, я про то, что сообщение отправили, но не доставили. Или доставили, но не всплыло уведомление и прочие баги.

                    Сам использую СМС через sms.ru, как оповещение И дублирую сообщением в почту с необходимой информацией.

                    Отправляю только ошибки, поэтому гарантированно и быстро получить информацию в приоритете.

                    Единственная проблема этой системы в том, что через sms.ru всего 5 сообщений в день на бесплатном тарифе.
                    • Petr S
                      26 марта 2021, 17:05
                      Дмитрий Овчинников, я через телегу отправляю сообщения (и фото) уже года два. оперативность намного выше чем у смс, теряется намного меньше (вообще особо и не упомню когда терялось последний раз)
            • Владимиров Владимир
              27 марта 2021, 05:18
              Дмитрий Овчинников, Можете пояснить свое высказывание "… Когда я вижу в коде что-то типа Sleep(1000), дальше уже не смотрю..."?
                 В чем вы видите неправоту или вред использования sleep?
                 Искренне интересен ответ.
  • nicknh
    26 марта 2021, 11:22

    Только напишите еще, что необходимо установить curl на рабочее место.

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

    Взаимодейтствовать с внешним миром можно и так github.com/nick-nh/qlua/tree/master/telegramQuik

      • nicknh
        26 марта 2021, 11:51
        Алексей Никитин, главное не останавливаться. Если решение работает и устраивает, значит оно правильное.
  • Владимиров Владимир
    26 марта 2021, 12:10
    Спасибо, здесь не часто делятся практическими наработками. 
    Посмотрю сам код — напишу свое мнение дополнительно.
      • Владимиров Владимир
        26 марта 2021, 14:31
        Алексей Никитин, 
        Посмотрел код, правда не запускал. Нормально все. Только для чайников может быть было бы лучше расшифровать ваши переменные «A111» и «A111111» в вызове функции getFuturesLimit?
           И один глупый вопрос )))...  вы, случайно, не связаны с ресурсом quikluacsharp.ru ?  Там есть похожий пример, но на другую тему. В вопросе нет никакого подвоха — банальное любопытство...
        Удачи
          • Владимиров Владимир
            26 марта 2021, 14:52
            Алексей Никитин, Приятно встретить честного человека. По нынешним временам — не часто удается. 
               Это абсолютно нормально. Смысл изобретать велосипед. 
            А комментарии писать в коде — это вообще правильно. Многие ленятся (в том числе — по правде — я в их числе), а потом в своих же кодах по новой разбираться приходится ))) 
            • Виталий
              26 марта 2021, 18:47
              Владимиров Владимир, 

              Комменты нужны да)
              Сам иногда смотрю на свой луа код, написанный несколько лет назад, смотрю 30 сек и потом «чёёё....?» ))))
              Приходится вспоминать)
              Еще табуляцию люблю четкую делать как на реферат)

  • Sergey Pavlov
    26 марта 2021, 12:11
    У меня с этим курлом один раз был такой баг. Чернющее окошко всплыло и почему-то зависло и не исчезало само. Обычно оно дольше секунды не висит. А тут всплыло и квик при этом завис вместе с этим окошком… Я пришел, по крестику ткнул, черное окошко исчезло и квик зафурычил, а пока я черное окошко не прибил, квик даже данные не получал и ничаво в этом квике не происходило как бы. После этого бага оставил только запись в файл у себя.
      • Sergey Pavlov
        26 марта 2021, 12:31
        Алексей Никитин, у меня было на 7 квике. Около года он мне в телегу всё это слал. Раз в 5 минут посылка. Каждый раз окошко cmd, само вылезло, само исчезло. Как автомат. Потом смотрю, в телеге уже полчаса как нет сообщений, полез на комп, а там зависший квик и поверх него черное окошко висит, я его закрыл и всё дальше зафурычило. Ладно бы только посылка зависла, но там эта гадость квика через луа подвесила. Может всё это уже неактуально для восьмой версии. 
    • Владимиров Владимир
      26 марта 2021, 17:41
      Sergey Pavlov, Можно отключить вывод исполнения командной строки на экран, задавая опцию curl_setopt
      curl_setopt — Set an option for a cURL transfer

      Description ¶

      curl_setopt ( CurlHandle $handle , int $option , mixed $value ) : bool

      Sets an option on the given cURL session handle.
      CURLOPT_NOPROGRESS :     true to disable the progress meter for cURL transfers
      Т.е. задавая curl_setopt "TRUE" мы отключаем индикатор хода выполнения для cURL передач. 

         Правда, сам не пробовал, могу ошибаться. 

    • bascomo
      26 марта 2021, 23:30
      Sergey Pavlov, поэтому и нельзя вызывать команды операционной системы из квика)
      • Дмитрий Овчинников
        27 марта 2021, 00:35
        bascomo, 
        да ну, там же есть Sleep(1000), чтобы 
        а не то вдруг ентот квик вспотеет от скриптовых запросов. 
        • bascomo
          27 марта 2021, 00:48
          Дмитрий Овчинников, а при чем тут слип? Слип — он про другое. Про гениальное архитектурное решение разработчиков квика)
  • bascomo
    26 марта 2021, 23:28
    Бомба) Теперь давай торговый скрипт))
    • Владимиров Владимир
      27 марта 2021, 12:16
      Алексей Никитин, Хотел бы обменяться мнениями.
         Вы написали, что "… квик+луа не предназначены для алготорговли...". Алготорговля бывает разной. Для высокочастотного метода — согласен, такая связка не очень подходит, хотя еще важен момент — где географически размещен ваш комп (если в стойке за стеной серверов биржи, то проблем, наверное, не будет). А у вас какие рассуждения на этот счет?
          Еще одно ваше утверждение: "… истории маркетдаты считай нет". Хотел бы прояснить, что конкретно вы имели ввиду.
         В вопросах нет никаких подвохов. Интересует ваше мнение. Кстати, по вашим комментариям вы не очень похожи на «новичка в вопросах программирования» — как вы сами про себя написали ))))
        • Владимиров Владимир
          28 марта 2021, 09:33
          Алексей Никитин, Спасибо за ответ.
             Заставили вы меня погуглить эти новомодные «data science, feature selection» and so on. )))) Вы сам, случайно, не из этой сферы?
             Интересно смотреть, как обычные этапы исследовательской работы выделяются в новые отдельные направления и сопутствующие им профессии. Ну, это так — возрастное, не обращайте внимания. ))) Я, кстати, не являюсь профессиональным программистом.
             А теперь по сути. 
             Начну с «big data». Какие огромные массивы данных имеются ввиду в нашем случае? Если мы говорим об историческом периоде (ретроперспективе) — то необходимость существенно длительного отступа назад по интервалам — весьма сомнительна. Грубо говоря, для торговли в марте 2021 года вряд ли вам действительно требуются данные за январь 1921 года. Другой вариант — желание связать динамику показателей разных активов. Но количество таких активов в разумном подходе ограничено. Более того, если есть связь динамики показателей разных активов, то ее проще учитывать явно — численно.
             Потребность в огромных массивах может возникнуть в случае использования в качестве исходных данных для нейросети банально ВСЕГО ДОСТУПНОГО НАБОРА ИНФОРМАЦИИ. Этот случай я оставлю без комментариев, хотя хочется сказать, что это тупиковый путь на нынешнем этапе.
             Насчет способов обработки данных. По моему убеждению, способ обработки (подготовки) данных выбирается исходя из метода решения задачи (т.е. расчетный численный метод). Если бы существовало точное решение задачи трейдинга, то можно было бы говорить о том, что в торговом терминале это решение надо представить набором стандартных способов решений, отличающихся методами численного решения (как индикаторы представлены, например). Но такого точного решения не существует. Обычно в алготрейдинге используют свое численно выраженное решение. При этом, используемое решение является лишь решением частного случая задачи трейдинга. Или вообще используют какую-то найденную взаимозависимость (неэффективность). А вот если метода решения задачи у исследователя вообще нет, то и возникает потребность в разных способах обработки данных — опять мы попадаем на случай использования нейросетей. Случай, когда одновременно используется несколько численных методов решений мне представляется нерациональным.
             К квику у меня тоже много вопросов. В первую очередь, мне не нравится как устроена в квик+луа работа с заявками… Такое ощущение, что его писали посменно несколько программистов, которые еще и не всегда общались между собою )))   К сожалению, мне квик сравнить не с чем — банально на других терминалах не работал.   
             Пока мне удается оставаться в рамках  «квик+луа», не используя внешние приложения. 
  • Alena Kazarinova
    15 ноября 2021, 11:21
    Алексей, добрый день! а как можно с Вами связаться?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн