Добрый день! Написала функцию для стоп-лосса по маркету, но почему-то при выставлении заявки при срабатывании стоп-лосса статус заявки сразу же снята, а не активна, и позиция по стопу не закрывается. Пожалуйста, подскажите, где может быть ошибка:
Коллеги, привет! Написала функцию, которая проверяет количество дней до экспирации, чтобы контракт менялся сам, написала топорно в лоб: создала таблицу, где указала имена контрактов. Функция через getParamEx проверяет, сколько дней осталось до экспиры. Если дней меньше 3, то контракт сам меняется. Но сегодня утром столкнулась с тем, что предыдущий контракт по нефти (который вчера экспирировался) пропал из списка доступных в таблице "Текущие торги" и скрипт не может проверить по нему параметр остатка. Попытка проверить данный параметр на существование к нужному результату не привела. Скрипт с попыткой будет ниже. Как я вижу, нужно забрать из таблицы текущих торгов все возможные контракты по баховому активу и посмотреть их даты экспирации, но вот как забрать эти данные, я не знаю...
Код
function contract()
local futdate = {}
local timedif = {}
local idx = 0
activename = "RTS"
futnames = {"RIZ1", "RIH2", "RIM2", "RIU2", "RIZ2","RIH3", "RIM3", "RIU3", "RIZ3"}
--message("futnames[1]"..futnames[1].."futnames[2]"..futnames[2])
for i=1,12 do
if idx==1 then break end
--message("futnames"..futnames[i]..type(futnames[i]))
if futnames[i] then
futdate[i] = getParamEx(CLASSCODE, futnames[i], "DAYS_TO_MAT_DATE").param_image
--message("futdate[i]"..futdate[i])
--message(type(DATE).."date="..DATE)
--timedif[i] = futdate[i]-tonumber(DATE)
--message('timedif='..timedif[i])
if tonumber(futdate[i])>2 then
INSTRUMENT=futnames[i]
--message('actual futures is'..INSTRUMENT)
idx=1
end
end
end
end
Коллеги, привет! Скрипт работает уже давно, используется заявка тейк-профит и стоп-лимит, но в пятницу размер стопа не спас ситуацию, нефть слишком упала, и заявку протащило. Поэтому возник вопрос: как сделать заявку тейк-профит и стоп-маркет, чтобы таких ситуаций избегать? Испробована версия с выставлением нулевых параметров, но система логично такую историю отвергает, в итоге и стоп- не стоит, и позиция взята, слишком рисково.
Как получилось на реальном примере: выставлена заявка на закрытие фьюча по нефти, тейк 83, стоп 81,7, цена стопа 81,55. Что вышло на практике? нефть упала в 80 в начале торговой сессии, стоп выставил заявку на продажу по 81,55, и пришлось закрыть сделку руками. Как сделать так, чтобы при прохождении 81,7 у меня выставлялась заявка на продажу по маркету? Думала сама над двумя связанными заявками, но может, у кого есть попроще решение?
Коды все рабочие, представлены ниже. Заранее большое спасибо за ответ!
Как выглядит заявка (тут все тоже рабочее):
Код
function stop2_calc()
if (PRICEMAX-ZZ12)>500 then
stop=PRICEMAX-500
else stop = ZZ12
end
end
function BUY(FLOTS)
ORDER(FLOTS,"B",dD(PRICEMAX+0,0))
stop2_calc()
message("stop "..stop)
TAKESTOPORDER(FLOTS,"S",dD(ZZ31+0,0), dD(stop,0),dD(stop-0,15,0),100,100)
end
Коллеги, привет! У Открытия создан единый счет, пытаюсь запросить остаток средств по срочному рынку, выдает оошибку. Запрашиваю свободные средства через вот эту функцию, выдает ноль. Как узнать таги, которыми можно вывести этот самый остаток? Таблицу с группами, которую указывали на формул ранее вот здесь, не нашла. https://forum.quik.ru/forum10/topic2138/ рабочий код для рынка фортс, хочу такой же работоспособный для единого счета
Код
function Lot_calculate()
--функция для расчета лотности
moneyt = getFuturesLimit(FIRM, ACCOUNT, 0, "SUR")
--message('Cash='..moneyt.cbp_prev_limit)
gofut = getParamEx(CLASSCODE, INSTRUMENT, "SELLDEPO").param_value+0
--message("GO Br = "..gofut)
LOT1 = roundNum(0.25*moneyt.cbp_prev_limit/gofut,0)
--message("LOT="..LOT1)
end
Коллеги, добрый день! Я новичок в программировании луа, и у меня возникла проблема. Есть скрипт, который записывает в файл csv данные об отправленной транзакции в систему, далее скрипт проверяет состояние стопа и фиксирует, если стоп выполнен. И вот после этого происходят чудеса: если появляется ещё одна сделка, то скрипт её открывает, но вот в файлик уже ничего не записывается, и в итоге ломается учёт, так как скрипт не видит записи о номере стопа в файлике. Подскажите, пожалуйста, как это можно починить?
Код
-- Функция вызывается терминалом, когда с сервера приходит новая информация о транзакциях
function OnTransReply(trans_reply)
-- Если пришла информация по нашей транзакции
if trans_reply.trans_id == id_done then
-- Если данный статус уже был обработан, выходит из функции, иначе запоминает статус, чтобы не обрабатывать его повторно
if trans_reply.status == LastStatus then return else LastStatus = trans_reply.status end
-- Выводит в сообщении статусы выполнения транзакции
if trans_reply.status == 1 then -- транзакция активна
--message('OnTransReply(): По транзакции №'..trans_reply.trans_id..' УСПЕШНО ВЫСТАВЛЕНА заявка №'..trans_reply.order_num..' по цене '..trans_reply.price..' объемом '..trans_reply.quantity,3)
end
if trans_reply.status ==3 then -- транзакция выполнена, запись в журнал
--message(trans_reply.result_msg,1)
--message('OnTransReply(): По транзакции №'..trans_reply.trans_id..' УСПЕШНО ВЫПОЛНЕНА заявка №'..trans_reply.order_num..' по цене '..trans_reply.price..' объемом '..trans_reply.quantity,3)
OrderNum = trans_reply.order_num
OrderTime=trans_reply.datetime
OrderPrice=trans_reply.price
OrderQuantity=trans_reply.quantity
OrderCond=TP
OrderInstr =trans_reply.sec_code
Ordcomment=trans_reply.brokerref
local tradeline= os.date("%c", os.time(trans_reply.datetime))..";"..
OrderInstr..";"..
OrderQuantity ..";"..
OrderCond..";"..
OrderPrice..";"..
OrderNum ..";"..
"Open_order"..";"..
ACCOUNT..";"..
Ordcomment..";"..
"Created".."\n"
CSV:seek("end",0)
CSV:write(tradeline); --записали значения в файлик
CSV:flush(); --сохранили файлик
end
end
-- Если пришла информация по нашей стоп-транзакции
if trans_reply.trans_id == id_take then
-- Если данный статус уже был обработан, выходит из функции, иначе запоминает статус, чтобы не обрабатывать его повторно
if trans_reply.status == TakeStatus then return else TakeStatus = trans_reply.status end
-- Выводит в сообщении статусы выполнения транзакции
if trans_reply.status == 3 then -- транзакция активна
Stopnumb =trans_reply.order_num
SlTpOrderTime=trans_reply.datetime
SlTpOrderPrice=trans_reply.price
SlTpOrderQuantity=trans_reply.quantity
SlTpOrderCond=TP
SlTpOrderInstr=trans_reply.sec_code
SlComment=trans_reply.brokerref
--message('OnTransReply(): По транзакции №'..trans_reply.trans_id..' ВЫПОЛНЕНА заявка №'..trans_reply.order_num..' по цене '..trans_reply.price..' объемом '..trans_reply.quantity,3)
local Stopline= os.date("%c", os.time(trans_reply.datetime))..";"..
SlTpOrderInstr..";"..
SlTpOrderQuantity ..";"..
SlTpOrderCond ..";"..
SlTpOrderPrice ..";"..
Stopnumb ..";"..
"Take_Stop_order"..";"..
ACCOUNT..";"..
SlComment..";"..
"Created".."\n"
CSV:seek("end",0)
CSV:write(Stopline); --записали значения в файлик
CSV:flush(); --сохранили файлик
end
end
end