Блог им. 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 скрипты->Добавить->Загрузить локально.
Кликаем на скрипт->Содать таблицу->Добавить все.
Как выглядит в Квике:
Кросспост 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
Спасибо большое за то, что поделились своей разработкой!
Как подтягивать коды фьючей автоматом?
Я делал все просто (не знаю как вставить скрипт с сохранением отступа слева, поэтому получилось смазано, но смысл понятен):
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
'------------------