Блог им. gardist

В помощь рыбакам- невод на qpile.

    • 19 сентября 2017, 19:31
    • |
    • gardist
  • Еще

Суть скрипта — отслеживать резкие изменения цены.

1. Создайте каталог c:\Qpile — в нем будем хранить старую цену.
Создайте подкаталог c:\Qpile\GO — в нем будем хранить пойманные шпильки.
При наличии шпильки(гэпа) в подкаталоге GO будет создан файл с названием этого фюьчерса, это может быть удобно для дальнейших действий, скажем, можно запускать по планировщику заданий фaйл check.bat, который будет проигрывать мелодию:

@rem check.bat
dir «c:\Qpile\GO» /a-d >nul 2>nul && (
@ECHO Поймали шпильку
%WINDIR%\Media\tada.wav
) || (
@ECHO Ничего не поймали
)

2. Посмотрите код текущих фьючерсов (в таблице фьючерсов добавьте колонку Код бумаги)
Отредактируйте коды инструментов, укажите коды актуальных фьючерсов:

sINSTRUMENT_BRENT=«BRV7» ' код инструмента BRENT
sINSTRUMENT_GOLD=«GDU7» ' код инструмента GOLD
sINSTRUMENT_EURUSD=«EDU7» ' код инструмента EUR/USD

3. Настройте при каких параметрах выводить сообщения о шпильках
'Процент изменения цены при которой выводится оповещение:
sPrc_BRENT = 0.5
sPrc_GOLD = 0.2
sPrc_EURUSD = 0.4

4. Установите задержку обновления цены.
' Задержка:
NEW_GLOBAL(«sDELAY», 5)
(если при запуске скрипта стоит период расчета 10 сек. то значение 5 будет соответствовать примерно минуте).

5. Идем в Quik->Сервисы->Qpile скрипты->Добавить->Загрузить локально.
Кликаем на скрипт->Содать таблицу->Добавить все.

Как выглядит в Квике:

 В помощь рыбакам- невод на qpile.

Кросспост rffx.ru

P.S.:
(не разобрался как подтягивать коды фьючей автоматом, если кто знает — подскажите)
Код скрипта:

PORTFOLIO_EX SPIKE CATCHER;
DESCRIPTION Ловец шпилек;
CLIENTS_LIST  ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
 
PROGRAM
	 ' =========Пользовательские настройки=============
	 sCLASSCODE="SPBFUT" ' код группы

	 sINSTRUMENT_BRENT="BRV7" ' код инструмента BRENT
	 sINSTRUMENT_GOLD="GDU7" ' код инструмента GOLD
	 sINSTRUMENT_EURUSD="EDU7" ' код инструмента EUR/USD
 
	 'Файлы для хранения предыдущей цены:
	 sFile_BRENT = "C:\Qpile\"&sINSTRUMENT_BRENT&"_BID.txt"
	 sFile_GOLD = "C:\Qpile\"&sINSTRUMENT_GOLD&"_BID.txt"
	 sFile_EURUSD = "C:\Qpile\"&sINSTRUMENT_EURUSD&"_BID.txt"

	 'Файлы для хранения оповещения о гэпе:
	 sFile_BRENT_GO = "C:\Qpile\GO\"&sINSTRUMENT_BRENT&"_GO.txt"
	 sFile_GOLD_GO = "C:\Qpile\GO\"&sINSTRUMENT_GOLD&"_GO.txt"
	 sFile_EURUSD_GO = "C:\Qpile\GO\"&sINSTRUMENT_EURUSD&"_GO.txt"

	 'Процент изменения цены при которой выаодится оповещение:
	 sPrc_BRENT = 0.5
	 sPrc_GOLD = 0.2
	 sPrc_EURUSD = 0.4
	  ' ====================Переменные==================
        
	 ' Лучшая цена спроса
	 sPriceBid_BRENT = 0 + GET_PARAM(sCLASSCODE,sINSTRUMENT_BRENT, "BID")
	 sPriceBid_GOLD = 0 + GET_PARAM(sCLASSCODE,sINSTRUMENT_GOLD, "BID")
	 sPriceBid_EURUSD = 0 + GET_PARAM(sCLASSCODE,sINSTRUMENT_EURUSD, "BID")

	 ' Лучшая цена предложения
	 sPriceOffer_BRENT = 0 + GET_PARAM(sCLASSCODE,sINSTRUMENT_BRENT, "OFFER")
	 sPriceOffer_GOLD = 0 + GET_PARAM(sCLASSCODE,sINSTRUMENT_GOLD, "OFFER")
	 sPriceOffer_EURUSD = 0 + GET_PARAM(sCLASSCODE,sINSTRUMENT_EURUSD, "OFFER")

	' Задержка:
	NEW_GLOBAL("sDELAY", 5)
	NEW_GLOBAL("sTIMER", 0)

         ' ===============СЕРВЕРНЫЕ ДАТА И ВРЕМЯ===============
         sSERVERDATE=GET_INFO_PARAM("TRADEDATE")  ' дата сервера в формате DD.MM.YYYY
         sSERVERTIME=GET_INFO_PARAM("SERVERTIME") ' время сервера в формате HH:MM:SS

	IF sTIMER < sDELAY
		sTIMER = sTIMER + 1
		RETURN
	END IF
	IF sTIMER >= sDELAY
		sOLD_PRICE_BRENT = READ_LINE(sFile_BRENT, GET_FILE_LEN(sFile_BRENT), "ERROR")
		sOLD_PRICE_PRC_BRENT=CEIL((100-((sOLD_PRICE_BRENT*100)/sPriceBid_BRENT))*100)/100
		sOLD_PRICE_PRC_ABS_BRENT=CEIL(ABS(100-((sOLD_PRICE_BRENT*100)/sPriceBid_BRENT))*100)/100

		sOLD_PRICE_GOLD = READ_LINE(sFile_GOLD, GET_FILE_LEN(sFile_GOLD), "ERROR")
		sOLD_PRICE_PRC_GOLD = CEIL((100-((sOLD_PRICE_GOLD*100)/sPriceBid_GOLD))*100)/100
		sOLD_PRICE_PRC_ABS_GOLD =CEIL(ABS(100-((sOLD_PRICE_GOLD*100)/sPriceBid_GOLD))*100)/100

		sOLD_PRICE_EURUSD = READ_LINE(sFile_EURUSD, GET_FILE_LEN(sFile_EURUSD), "ERROR")
		sOLD_PRICE_PRC_EURUSD =CEIL((100-((sOLD_PRICE_EURUSD*100)/sPriceBid_EURUSD))*100)/100
		sOLD_PRICE_PRC_ABS_EURUSD =CEIL(ABS(100-((sOLD_PRICE_EURUSD*100)/sPriceBid_EURUSD))*100)/100

         ' ===============ДАННЫЕ В ТАБЛИЦУ===============
    OUTPUT_BRENT=CREATE_MAP()
    OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"BID" , sPriceBid_BRENT)
    OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"OFFER" , sPriceOffer_BRENT)
    OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"OLD_PRICE" , sOLD_PRICE_BRENT)
    OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"PRC" , sOLD_PRICE_PRC_BRENT)
    OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"SERVERTIME" , sSERVERTIME)
    OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"SERVERDATE" , sSERVERDATE)
    OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"INSTRUMENT" , sINSTRUMENT_BRENT)

    OUTPUT_GOLD=CREATE_MAP()
    OUTPUT_GOLD=SET_VALUE(OUTPUT_GOLD,"BID" , sPriceBid_GOLD)
    OUTPUT_GOLD=SET_VALUE(OUTPUT_GOLD,"OFFER" , sPriceOffer_GOLD)
    OUTPUT_GOLD=SET_VALUE(OUTPUT_GOLD,"OLD_PRICE" , sOLD_PRICE_GOLD)
    OUTPUT_GOLD=SET_VALUE(OUTPUT_GOLD,"PRC" , sOLD_PRICE_PRC_GOLD)
    OUTPUT_GOLD=SET_VALUE(OUTPUT_GOLD,"SERVERTIME" , sSERVERTIME)
    OUTPUT_GOLD=SET_VALUE(OUTPUT_GOLD,"SERVERDATE" , sSERVERDATE)
    OUTPUT_GOLD=SET_VALUE(OUTPUT_GOLD,"INSTRUMENT" , sINSTRUMENT_GOLD)

    OUTPUT_EURUSD=CREATE_MAP()
    OUTPUT_EURUSD=SET_VALUE(OUTPUT_EURUSD,"BID" , sPriceBid_EURUSD)
    OUTPUT_EURUSD=SET_VALUE(OUTPUT_EURUSD,"OFFER" , sPriceOffer_EURUSD)
    OUTPUT_EURUSD=SET_VALUE(OUTPUT_EURUSD,"OLD_PRICE" , sOLD_PRICE_EURUSD)
    OUTPUT_EURUSD=SET_VALUE(OUTPUT_EURUSD,"PRC" , sOLD_PRICE_PRC_EURUSD)
    OUTPUT_EURUSD=SET_VALUE(OUTPUT_EURUSD,"SERVERTIME" , sSERVERTIME)
    OUTPUT_EURUSD=SET_VALUE(OUTPUT_EURUSD,"SERVERDATE" , sSERVERDATE)
    OUTPUT_EURUSD=SET_VALUE(OUTPUT_EURUSD,"INSTRUMENT" , sINSTRUMENT_EURUSD)

    DELETE_ALL_ITEMS()

    ADD_ITEM(1,OUTPUT_BRENT)
    ADD_ITEM(2,OUTPUT_GOLD)
    ADD_ITEM(3,OUTPUT_EURUSD)

		'===========================РАСКРАСКА========================================
		'BRENT
		IF sOLD_PRICE_PRC_BRENT >0 AND GET_FILE_LEN(sFile_BRENT)>0
   		  'green
    		  SET_ROW_COLOR_EX(1, "RGB(157,241,163)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		ELSE
		  'red
		   SET_ROW_COLOR_EX(1, "RGB(255,168,164)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		END IF
		IF sOLD_PRICE_PRC_BRENT == 0 AND GET_FILE_LEN(sFile_BRENT)>0
		  'transparent
    		  SET_ROW_COLOR_EX(1, "RGB(255,255,255)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		END IF

		'GOLD
		IF sOLD_PRICE_PRC_GOLD >0 AND GET_FILE_LEN(sFile_GOLD)>0
   		  'green
    		  SET_ROW_COLOR_EX(2, "RGB(157,241,163)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		ELSE
		  'red
		   SET_ROW_COLOR_EX(2, "RGB(255,168,164)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		END IF
		IF sOLD_PRICE_PRC_GOLD ==0 AND GET_FILE_LEN(sFile_GOLD)>0
		  'transparent
    		  SET_ROW_COLOR_EX(2, "RGB(255,255,255)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		END IF

		'EURUSD
		IF sOLD_PRICE_PRC_EURUSD >0 AND GET_FILE_LEN(sFile_EURUSD)>0
   		  'green
    		  SET_ROW_COLOR_EX(3, "RGB(157,241,163)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		ELSE
		  'red
		   SET_ROW_COLOR_EX(3, "RGB(255,168,164)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		END IF
		IF sOLD_PRICE_PRC_EURUSD==0 AND GET_FILE_LEN(sFile_GOLD)>0
		  'tansparent
    		  SET_ROW_COLOR_EX(3, "RGB(255,255,255)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
		END IF

		'==============================ОПОВЕЩЕНИЕ=========================================
		IF sOLD_PRICE_PRC_ABS_BRENT >= sPrc_BRENT  AND GET_FILE_LEN(sFile_BRENT)>0
			MESSAGE(sSERVERDATE&" "&sSERVERTIME&" Цена "&sINSTRUMENT_BRENT&" изменилась на:"&sOLD_PRICE_PRC_BRENT&" %",2)
			'orange
			SET_ROW_COLOR_EX(1, "RGB(255,151,33)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
			CLEAR_FILE(sFile_BRENT_GO)
			WRITE (sFile_BRENT_GO, "1")
		END IF

		IF sOLD_PRICE_PRC_ABS_GOLD >= sPrc_GOLD AND GET_FILE_LEN(sFile_GOLD)>0
			MESSAGE(sSERVERDATE&" "&sSERVERTIME&" Цена "&sINSTRUMENT_GOLD&" изменилась на:"&sOLD_PRICE_PRC_GOLD&"%",2)
			'orange
			SET_ROW_COLOR_EX(2, "RGB(255,151,33)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
			CLEAR_FILE(sFile_GOLD_GO)
			WRITE (sFile_GOLD_GO, "1")
		END IF

		IF sOLD_PRICE_PRC_ABS_EURUSD >= sPrc_EURUSD  AND GET_FILE_LEN(sFile_EURUSD)>0
			MESSAGE(sSERVERDATE&" "&sSERVERTIME&" Цена "&sINSTRUMENT_EURUSD&" изменилась на:"&sOLD_PRICE_PRC_EURUSD&"%",2)
			'orange
			SET_ROW_COLOR_EX(3, "RGB(255,151,33)", "DEFAULT_COLOR", "DEFAULT_COLOR", "DEFAULT_COLOR")
			CLEAR_FILE(sFile_EURUSD_GO)
			WRITE (sFile_EURUSD_GO, "1")
		END IF

		CLEAR_FILE(sFile_BRENT)
		CLEAR_FILE(sFile_GOLD)
		CLEAR_FILE(sFile_EURUSD)

		WRITE (sFile_BRENT, sPriceBid_BRENT)
		WRITE (sFile_GOLD, sPriceBid_GOLD)
		WRITE (sFile_EURUSD, sPriceBid_EURUSD)

	sTIMER = 0
	RETURN
	END IF

 
END_PROGRAM

PARAMETER OLD_PRICE;
PARAMETER_TITLE Старая цена;
PARAMETER_DESCRIPTION Старая цена;
PARAMETER_TYPE STRING(10);
END

PARAMETER PRC;
PARAMETER_TITLE Процент изменений;
PARAMETER_DESCRIPTION Процента изменений;
PARAMETER_TYPE STRING(10);
END
 

PARAMETER SERVERDATE;
PARAMETER_TITLE Дата;
PARAMETER_DESCRIPTION Текущая дата;
PARAMETER_TYPE STRING(10);
END
 
PARAMETER SERVERTIME;
PARAMETER_TITLE Время;
PARAMETER_DESCRIPTION Текущее время;
PARAMETER_TYPE STRING(10);
END
 
PARAMETER INSTRUMENT;
PARAMETER_TITLE Инструмент;
PARAMETER_DESCRIPTION Торгуемый инструмент;
PARAMETER_TYPE STRING(4);
END

PARAMETER BID;
PARAMETER_TITLE BID;
PARAMETER_DESCRIPTION Цена спроса;
PARAMETER_TYPE NUMERIC(10,2);
END

PARAMETER OFFER;
PARAMETER_TITLE OFFER;
PARAMETER_DESCRIPTION Цена предложения;
PARAMETER_TYPE NUMERIC(10,2);
END


 
END_PORTFOLIO_EX
 
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
  • Ключевые слова:
  • qpile
725 | ★28
5 комментариев
вот это я понимаю
avatar
А смысл ловить шпильки? все равно на хороших движениях твой терминал брокеры отключают и даже биржу))
avatar
А дельты нет для Quik?
avatar

Спасибо большое за то, что поделились своей разработкой!

avatar

Как подтягивать коды фьючей автоматом?

Я делал все просто (не знаю как вставить скрипт с сохранением отступа слева, поэтому получилось смазано, но смысл понятен):

1.Задавал инструмент (если инструментов много, то их помещают в цикл):
Seccode1 = «BR»
2.Вытягивал месяц:
dats = GET_INFO_PARAM («TRADEDATE»)
Mesyac0 = 0 + substr(dats,3,2)
3.Вытягивал последнюю цифру года:
God = 0 + substr(dats,9,1)
4.Запускал цикл, так как у некоторых инструментов экспирация 1 раз в 3 месяца:

'------------------

Mesyac = «A»   'Защита от ошибки, если месяц не подтянулся

for m from 1 to 4

if Mesyac0 = 1
Mesyac = «F»
end if

if Mesyac0 = 2
Mesyac = «G»
end if

if Mesyac0 = 3
Mesyac = «H»
end if

if Mesyac0 = 4
Mesyac = «J»
end if

if Mesyac0 = 5
Mesyac = «K»
end if

if Mesyac0 = 6
Mesyac = «M»
end if

if Mesyac0 = 7
Mesyac = «N»
end if

if Mesyac0 = 8
Mesyac = «Q»
end if

if Mesyac0 = 9
Mesyac = «U»
end if

if Mesyac0 = 10
Mesyac = «V»
end if

if Mesyac0 = 11
Mesyac = «X»
end if

if Mesyac0 = 12
Mesyac = «Z»
end if

'------------------

Seccode = Seccode1&Mesyac&God


'Получение значения количества дней до погашения из Таблицы текущих значений параметров

DAYS_TO_MAT_DATE_Seccode1 = GET_PARAM_EX (Classcode, Seccode, «DAYS_TO_MAT_DATE»)
DAYS_TO_MAT_DATE_Seccode1 = GET_VALUE(DAYS_TO_MAT_DATE_Seccode1,«PARAM_VALUE»)+0

if DAYS_TO_MAT_DATE_Seccode1<=0 and Mesyac0<12
Mesyac0 = Mesyac0+1
else
if DAYS_TO_MAT_DATE_Seccode1<=0 and Mesyac0=12 and God<9
Mesyac0 = 1
God = God +1
else
if DAYS_TO_MAT_DATE_Seccode1<=0 and Mesyac0=12 and God=9
Mesyac0 = 1
God = 0
end if
end if
end if

end for 'for m from 1 to 4

'------------------

avatar

Читайте на SMART-LAB:
Фото
ДОМ.РФ может увеличить прибыль за девять месяцев на 39%: прогноз Т-Инвестиций
30 октября $DOMRF опубликует результаты по международным стандартам финансовой отчетности (МСФО) за третий квартал 2026 года. Главный...
Фото
🏠 Встречаемся на 39 конференции Смартлаба
Уже в эту субботу, 31 октября, в Москве пройдёт главная конференция для инвесторов и трейдеров Smart-Lab Conf 2026, в которой ПАО «АПРИ» примет...
Фото
Что покупать в облигациях при ключевой ставке 14%?
Банк России 23 октября сохранил ключевую ставку на уровне 14% годовых. Денежно-кредитная политика остается жесткой, но рынок облигаций уже...
Фото
Банковский сектор сентябрь 2026 г. - рекордная прибыль, но рост все менее равномерный
Банки отчитались за сентябрь. Что интересного мы узнали?  За 12 месяцев прибыль сектора составляет уже 4,5 трлн руб. при прогнозе ЦБ 3,9–4,4...

теги блога gardist

....все тэги



UPDONW
Новый дизайн