Суть скрипта — отслеживать резкие изменения цены.
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
Спасибо большое за то, что поделились своей разработкой!