Всем привет!
Как-то на канале я выкладывал статью и записывал видео по скрипту, который подтягивает стоп-приказ вслед за растущей ценой, отставая от текущей цены на определенный шаг. В комментариях к видео по этой теме был вопрос – можно ли скрывать стоп от маркетмейкера или, как его еще называют - кукловода? Ведь он видит все установленные стопы.
В первый момент мне показалось, что написать такой скрипт достаточно просто. Но, когда я начал писать, то вылезло много нюансов. Суть их в том, что нужно понимать, что хочет тот, кто запускает скрипт. Ведь и стопы бывают разные и есть прочие инструменты. Я реализовал скрипт (и мы его сейчас рассмотрим), который при падении цены до определенного уровня просто продает имеющиеся на балансе акции по рыночной цене. Возможно, что такой вариант не устроит того, кто управляет этими акциями. И тут возможны очень многие варианты: можно выставить все бумаги по лимитной заявке по определённой цене, возможно нужно начинать выставлять имеющиеся акции партиями с задержкой по времени. Вариантов может быть много, все они реализуемые, но в рамках одной статьи данного канала, я думаю, что это не имеет смысла. Я покажу один вариант.
Давайте вспомним блок-схему алгоритма, который подтягивает стоп-приказ. Она выглядит так:
Напомню, что эту блок-схему я отдельно разбирал в соответствующей статье и в видео-ролике.
Блок-схема алгоритма, который мы сегодня рассмотрим, выглядит так:
Суть такая, что мы не выставляет стоп-приказы. Вместо этого мы формируем переменную, в которой будет лежать цена, при опускании до которой будет выставлена рыночная заявка на продажу. Если же текущая цена по бумаге будет идти вверх, то в переменную будет записываться большее значение, которое будет ближе к текущей цене.
Давайте традиционно рассмотрим код скрипта по некоторым частям.
Вот код функции, которая инициализирует исходные данные:
function init()
CLASS_CODE = "QJSIM" -- Код класса
SEC_CODE = "SBER" -- Код бумаги
razmer_lota = give_info_razmer_lota(CLASS_CODE,SEC_CODE) -- получаем информацию о размере лота (сколько акций в одном лоте)
price_step = give_info_shag_price(CLASS_CODE,SEC_CODE) -- получаем информацию о шаге цены.
time_delay = 10000; -- стандартная задержка времени между итерациями.
stop_level = 0 -- уровень виртуального стопа (изначально равен 0).
Firm_ID="NC0011100000"; -- здесь нужно ставить свои данные
Kod_klienta="10045";-- здесь нужно ставить свои данные
Torg_schet="NL0011100043";-- здесь нужно ставить свои данные
Subscribe_Level_II_Quotes(CLASS_CODE, SEC_CODE) --делаем заказ получения данных по стакану.
sleep(500); -- подождем, на всякий случай.
difference_price_stop = 0.05; -- устанавливаем разницу между текущей ценой и устанавливаемым стопом. В процентах. К примеру, указание 0.1 - означает установление стоп-заявки на уровне ниже текущей цены на 0,1%.
trans_id = 1;
end
В этих данных есть ключевые переменные: stop_level – это переменная в которой будет лежать информация о желаемом уровне стопа, difference_price_stop – уровень в процентах на который стоп будет ниже текущей цены.
Вот текст основного блока main():
function main()
init() -- инициируем установку исходных данных.
for time_kontrol = 1, 60000 do --Цикл для постоянной работы робота
count_stock = give_balance_stock(Firm_ID, Kod_klienta, SEC_CODE, Torg_schet); -- получить информацию о количестве бумаг в портфеле. Информация в количесве акций (Не в количестве лотов!)
if (count_stock == 0) then goto enditeration; -- если бумаг нет, то завершаем итерацию. ждем.
end
current_price = give_current_price(CLASS_CODE, SEC_CODE) + 0; -- получаем текущую цену по бумаге из стакана.
message("Текущая цена = "..current_price);
message("Текущий стоп = "..stop_level);
if (stop_level < current_price * (1 - difference_price_stop/100)) then -- Если текущий стоп стоит слишком ниэко, то переустанавливаем его.
stop_level = current_price * (1 - difference_price_stop/100);
message ("Корректировка стоп-цены.");
end
if (stop_level > current_price) then --Если стоп стал выше текущей цены, то выставляем заявку на продажу.
local kolvo_lotov_for_transaction = math.ceil(count_stock / razmer_lota); -- определеяем количество лотов для выставления заявки.
local price_for_transaction = math.ceil((current_price * 0.95) / price_step) * price_step
make_transaction(CLASS_CODE, SEC_CODE, kolvo_lotov_for_transaction , price_for_transaction)
end
::enditeration::
sleep(time_delay);
end
end
Собственно, по коду можно увидеть реализацию основных блоков рассмотренной блок-схемы.
Выставление заявки реализовано в отдельной функции make_transaction.
function make_transaction(CLASS_CODE, SEC_CODE, lots, price)
message("lots = "..lots);
message("price = "..price);
podgot={
ACCOUNT=Torg_schet,
CLIENT_CODE=Kod_klienta,
TYPE="L",
TRANS_ID = tostring(trans_id),
CLASSCODE = CLASS_CODE,
SECCODE = SEC_CODE,
ACTION = "NEW_ORDER",
OPERATION = "S",
PRICE = tostring(price),
QUANTITY = tostring(lots)
}
trans_id = trans_id + 1;
rez = sendTransaction(podgot)
message (rez);
stop_level = 0 -- уровень виртуального стопа
end
Обратите внимание, что уровень виртуального стопа после выставления заявки обнуляется.
Как этот скрипт работает в КВИКЕ я, пожалуй, рассмотрю отдельно в видео-формате. Следите за новостями.
Также я напомню, то что писал про скрипт, корректирующий стоп-приказ:
- данный скрипт работает только для ситуации, когда бумага покупается. При шорте бумаги, нужно пересматривать код.
- не следует данный скрипт рассматривать как самостоятельный инструмент торговли. Это только вспомогательный скрипт. Если и запускать его отдельно, то только в ситуации, когда цена достигла желаемого уровня.
И повторюсь – реализовать скрытие стопа от маркетмейкера можно по разному, точнее можно реализовывать разные сценарии реакции при достижения цены стопа.
На сегодня у меня все.
Если есть вопросы, то пишите в комментариях. Не забывайте подписаться на канал и поставить лайк👍.
Всем пока.🖐
⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇
📃 Краткое содержание данного канала.
➖➖➖➖➖➖➖➖➖➖➖➖➖
Landingcentr.ru - разработка сайтов для малого и среднего бизнеса.
⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆⬆