Блог им. 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
'------------------