Избранное трейдера DaHanG

по

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


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

Про ботов в телеге здесь  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


( Читать дальше )
  • обсудить на форуме:
  • QUIK

Данные из QUIK в Python. Построение Дельта графика.

Данные из QUIK в Python. Построение Дельта графика.Построение нестандартных графиков в Python при помощи библиотеки finplot.
Можно строить почти любые нестандартные графики: Range, Renco, Delta.
В качестве примера скрипт для построения Дельта графика.
График строиться с момента запуска по поступающим данным из таблицы обезличенных сделок.
Для получения данных из КВИКа используется PythonServer Евгения Шибаева (огромное спасибо автору!!!)

Тапками не кидайтесь, программировать только учусь.

# В КВИКе запускаем луа-скрипт QuikLuaPython.lua
import socket
import threading
from datetime import datetime, timezone
import pandas as pd
import finplot as fplt

fplt.display_timezone = timezone.utc


class DeltaBar():
    def __init__(self):
        self.df = pd.DataFrame(columns='date_time open high low close delta delta_time_sec'.split(' '))
        self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0]

    def parser(self, parse):
        if parse[0] == '1' and parse[1] == 'RIH1':
            if abs(self.df.iloc[len(self.df) - 1]['delta']) >= 500:
                self.df.loc[len(self.df)] = [0, 0, 0, 0, 0, 0, 0]  # Добавляем строку в DF

            self.df.iloc[len(self.df) - 1]['close'] = float(parse[4])  # Записываем последнюю цену как цену close бара

            if self.df.iloc[len(self.df) - 1]['date_time'] == 0:
                self.df.iloc[len(self.df) - 1]['date_time'] = \
                    datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f").replace(microsecond=0)

            if self.df.iloc[len(self.df) - 1]['open'] == 0:
                self.df.iloc[len(self.df) - 1]['open'] = float(parse[4])

            if float(parse[4]) > self.df.iloc[len(self.df) - 1]['high']:
                self.df.iloc[len(self.df) - 1]['high'] = float(parse[4])

            if (float(parse[4]) < self.df.iloc[len(self.df) - 1]['low']) or \
                    (self.df.iloc[len(self.df) - 1]['low'] == 0):
                self.df.iloc[len(self.df) - 1]['low'] = float(parse[4])

            if parse[5] == '1026':
                self.df.iloc[len(self.df) - 1]['delta'] += float(parse[6])

            if parse[5] == '1025':
                self.df.iloc[len(self.df) - 1]['delta'] -= float(parse[6])

            self.df.iloc[len(self.df) - 1]['delta_time_sec'] = \
                datetime.strptime(f'{parse[7]} {parse[8][0:-1]}', "%d.%m.%Y %H:%M:%S.%f") - \
                self.df.iloc[len(self.df) - 1]['date_time']
            self.df.iloc[len(self.df) - 1]['delta_time_sec'] = self.df.iloc[len(self.df) - 1]['delta_time_sec'].seconds


def service():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('127.0.0.1', 3587))  # Хост-этот компьютер, порт - 3587
    while True:
        res = sock.recv(2048).decode('utf-8')
        if res == '<qstp>\n':  # строка приходит от клиента при остановке луа-скрипта в КВИКе
            break
        else:
            delta_bar.parser(res.split(' '))  # Здесь вызываете свой парсер. Для примера функция: parser (parse)
    sock.close()


def update():

    df = delta_bar.df
    # Меняем индекс и делаем его типом datetime
    df = df.set_index(pd.to_datetime(df['date_time'], format='%Y-%m-%d %H:%M:%S'))
    # print(delta_bar.df)

    # pick columns for our three data sources: candlesticks and TD
    candlesticks = df['open close high low'.split()]
    volumes = df['open close delta_time_sec'.split()]
    if not plots:
        # first time we create the plots
        global ax
        plots.append(fplt.candlestick_ochl(candlesticks))
        plots.append(fplt.volume_ocv(volumes, ax=ax.overlay()))
    else:
        # every time after we just update the data sources on each plot
        plots[0].update_data(candlesticks)
        plots[1].update_data(volumes)


if __name__ == '__main__':
    delta_bar = DeltaBar()
    # Запускаем сервер в своем потоке
    t = threading.Thread(name='service', target=service)
    t.start()

    plots = []
    ax = fplt.create_plot('RIH1', init_zoom_periods=100, maximize=False)
    update()
    fplt.timer_callback(update, 2.0)  # update (using synchronous rest call) every N seconds

    fplt.show()
  • обсудить на форуме:
  • QUIK

....все тэги
UPDONW
Новый дизайн