Добрый день. Такой вопрос: Как разделить условия, вначале выполняется одно, другие игнорируются, а затем другое, а первое игнорируется. То есть первое учитывается только один раз От сделки не зависит.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
20.08.2018 08:49:49
Добрый день.
Не ясно, какую задачу вы решаете? Вариантов может быть много. Например, хотите снять активную заявку по коду клиента. Условие "если" и "и", то"
if (client_code=="1") --в кавычках код клиента and (bit.band(flags, 0x1) ~= 0) --проверяем что заявка активна then transaction = {TRANS_ID="1", ACTION="KILL_ORDER", CLASSCODE=class_code, SECCODE=sec_code, ORDER_KEY=tostring(order_num)} res = sendTransaction(transaction) --снимаем заявку
Пользователь
Сообщений: Регистрация: 25.05.2018
20.08.2018 17:11:16
Если в двух словах то пробую сделать безубыток. У меня есть образец кода с трейлинг-стопом, вот я и пробую что бы после первого стопа ставился безубыток, а далее работал трал. Сложность в том, что не понимаю как сделать чтобы после достижения безубытка выставлялся стоп по дельте (по разнице в цене между первым стопом и текущей ценой), а далее эта дельта была другой.
Пользователь
Сообщений: Регистрация: 25.05.2018
20.08.2018 17:53:18
Не так написал, выставить безубыток я смогу (по дельте 1), но для трала нужна дельта2. Как сделать что бы после выставления безубытка дельта1 игнорировалась?
QUIK clients support
Сообщений: Регистрация: 27.01.2015
21.08.2018 08:24:00
Добрый день.
Выложите свой код.
Пользователь
Сообщений: Регистрация: 25.05.2018
21.08.2018 11:49:53
Скрытый текст
--Параметры: p_classcode="SPBFUT" --Код класса p_seccode="SBRF" --Код инструмента p_account="" --Код счета p_clientcode="" --Клиенткий код p_count=2 --Размер позиции p_spread=0.7 --Проскальзывание p_sell_level_RSI=60 --уровень RSI, при котором продаем p_buy_level_RSI=40 --уровень RSI, при котором покупаем p_TRANS_ID="2" --идентифкатор транзакций робота, нужен для того, что бы робот отличал свои транзакции от транзакций других роботов и ручных транзакций p_TRANS_ID_STOP="3" --по работе со стоп ордерами p_stop_loss_level=3 --Уровень стоп лосса p_traling_stop_level=3.1 --Уровень стоп лосса, при котором мы "подтягиваем" стоп лосс p_file = io.open("D:\\userlog.txt", "w") -- тут надо указать путь к файлу лога --Служебные переменные тут мы запоминаем is_run = true count = 0 in_trade = false --признак того, что мы в позиции order_num = "" --номер заявки по открытой сделке stop_loss_num = "" --номер стоп заявик по открытой сделке direction="" --последний тип операции last_price=0 --цена последней сделки по стратегии in_set_stop_loss = false --признак, что мы в данный момнет ожидаем результата выставления стоп лосса
function main() while is_run do sleep(2000) robot() end end function to_log(a_msg) p_file:write(os.date().." "..a_msg.."\n") end function robot() local RSI=getNumCandles("RSI") local N=getNumCandles("Price") t,n,i=getCandlesByIndex("Price", 0, N-1, 1) RSI_t,RSI_n,RSI_i=getCandlesByIndex("RSI", 0, RSI-3, 2)
--сигнла обрабатываем только если мы не в позиции if not(in_trade) then --сигнал на продажу (RSI пересекает уровень продажи сверху вниз) if RSI_t[0].close>p_sell_level_RSI and RSI_t[1].close<p_sell_level_RSI then Trade("S",count+p_count,t[0].close-p_spread) end
--сигнал на покупку (RSI пересекает уровень покупки снизу вверх) if RSI_t[0].close<p_buy_level_RSI and RSI_t[1].close>p_buy_level_RSI then Trade("B",p_count-count,t[0].close+p_spread) end
else --проверить состояние стопа, не надо ли его сдвигать или изменить количество stop_loss_control() end
end --Сначала мы ищем нашу стоп заявку:для поиска используем функцию SearchItems, она у нас вызывает CALLBACK-функцию fn: function fn(par1) if stop_loss_num=="" then ----номер стоп заявик по открытой сделке return false end if tonumber(par1) - tonumber(stop_loss_num)==0 then return true else return false end end function stop_loss_control() local N=getNumCandles("Price") -- индефикатор цены на графике N if N==nil or N==0 then return end p_t,p_n,p_i=getCandlesByIndex("Price", 0, N-1, 1)
local NO=getNumberOf("stop_orders") -- Получение данных из таблицы Стоп-заявки: local is_stop_order=true if NO==nil or NO==0 then is_stop_order=false else t_so = SearchItems("stop_orders", 0, NO-1, fn, "order_num") --order_num = "" --номер заявки по открытой сделке end
--если стоп лосса нет, то возможно, его надо выставить if t_so==nil and is_stop_order then is_stop_order = false end if is_stop_order then if t_so[1]==nil then is_stop_order = false end end
if not(is_stop_order) then if in_trade and count~=0 then --in_trade признак того, что мы в позиции if count>0 then send_stop_loss("B",count,last_price)--формируем стоп-лосс и выставляем его, вызвав функцию send_stop_loss, last_price --цена последней сделки по стратегии else send_stop_loss("S",count,last_price) end end return end
--А дальше мы вычисляем разницу в ценах, проверяем условие стоп-лосса и, при необходимости перевыставляем его. До этого кода дойдет только в том случае, если у нас уже есть выставленный стоп-лосс: to_log("stop_loss_control найден стоп ордер count="..count) t_so_item=getItem("stop_orders", t_so[1]) delta_price=0;
if count>0 then to_log("count>0") delta_price=p_t[0].close-t_so_item.condition_price; --condition это состояние, p_t строка 79 l_direction="B" else to_log("count<=0") delta_price=t_so_item.condition_price-p_t[0].close l_direction="S" end to_log("delta_price="..delta_price.." t_so[0].qty="..t_so_item.qty.." p_t[0].close="..p_t[0].close)
if delta_price>=p_traling_stop_level or count~=t_so_item.qty then to_log("Послылаем новую стоп заявку price="..p_t[0].close.." количество "..count) send_stop_loss(l_direction,count,p_t[0].close) end
end function Trade(a_oper,a_count,a_price) if a_count>0 then --Количество сделки
--заявку послали и сразу же мы оказались в позиции и будем в ней до тех пор, пока не закроется сделка --или пока не будет доказано обратное (мы узнаем, что сделка не прошла) in_trade=true
direction=a_oper--последний тип операции message("Количество сделки "..tostring(a_count).." тип операции "..a_oper.." Цена "..a_price,1) end end --Обработчик события сделки. function OnTrade(trade) nord=trade["order_num"] price=trade["price"] to_log("Совершена сделка: номер заявки "..tostring(nord).."; цена "..tostring(price)..": количество "..tostring(trade["qty"])) if nord==order_num then qty=trade["qty"] if direction=="B" then count=count+qty else count=count-qty end send_stop_loss(direction,count,price) last_price=price end end --Обработчик события создания стоп заявки function OnStopOrder(stop_order)
--бит 0 (0x1) Заявка активна, иначе не активна if stop_order["order_num"]==stop_loss_num and bit.band(stop_order["flags"],0x1)==0x1 then to_log("сняли признак что мы в процессе выставления стоп оредра") in_set_stop_loss=false end
--бит 0 (0x1) Заявка активна, иначе не активна, --бит 1 (0x2) Заявка снята. Если не установлен и значение бита 0 равно 0, то заявка исполнена --в этом случае мы считаем, что позция закрыта по стоп лоссу if stop_order["order_num"]==stop_loss_num and bit.band(stop_order["flags"],0x1)==0x0 and bit.band(stop_order["flags"],0x2)==0x0 then --stop_loss_num = "" --номер стоп заявик по открытой сделке in_set_stop_loss=false count=0 end end --Удалить стоп лосс function delete_stop_loss(a_num) t = { ["CLASSCODE"]=p_classcode, ["SECCODE"]=p_seccode, ["ACTION"]="KILL_STOP_ORDER", ["ACCOUNT"]=p_account, ["CLIENT_CODE"]=p_clientcode, ["TYPE"]="L", ["OPERATION"]=l_oper, ["STOP_ORDER_KIND"]="SIMPLE_STOP_ORDER", ["TRANS_ID"]=p_TRANS_ID_STOP, ["STOP_ORDER_KEY"]=tostring(a_num) } res=sendTransaction(t) message("Удаляем стоп лосс: сообщение "..res.."; номер "..a_num,1) end --Послать стоп заявку function send_stop_loss(a_direction,a_count,a_price) to_log("send_stop_loss in_set_stop_loss="..tostring(in_set_stop_loss)) if not(in_set_stop_loss) then
if stop_loss_num~="" then delete_stop_loss(stop_loss_num) end
if a_direction=="B" then l_oper="S" l_count=a_count dir=-1 else l_oper="B" l_count=-a_count dir=1 end
l_price=a_price+p_stop_loss_level*dir if l_count>0 then
--Пошлем стоп заявку t = { ["CLASSCODE"]=p_classcode, ["SECCODE"]=p_seccode, ["ACTION"]="NEW_STOP_ORDER", ["ACCOUNT"]=p_account, ["CLIENT_CODE"]=p_clientcode, ["TYPE"]="L", ["OPERATION"]=l_oper, ["QUANTITY"]=tostring(l_count), ["PRICE"]=tostring(l_price+p_spread*dir), ["EXPIRY_DATE"]="GTC", ["STOPPRICE"]=tostring(l_price), ["STOP_ORDER_KIND"]="SIMPLE_STOP_ORDER", ["TRANS_ID"]=p_TRANS_ID_STOP } res=sendTransaction(t) message(res,1) to_log("Выставли стоп заявку "..l_oper) end end end --обработка события транзакции function OnTransReply(trans_reply) id=tostring(trans_reply["trans_id"])
to_log("Обработка транзакции "..id)
--если это наша транзакция, обработаем ее if id==p_TRANS_ID then nord=trans_reply["order_num"]
to_log("Обработка транзакции номер заявки "..nord)
--если заявка выставилась - запоминаем ее номер, иначе считаем, что мы не в сделке if nord==nil or nord==0 or nord=="0" then message("Заявка не выставилась ",1) in_trade=false else order_num=nord end end
if id==p_TRANS_ID_STOP then message("Сообщение транзакции стоп ордера "..trans_reply["result_msg"],1) nord=trans_reply["order_num"] --Номер заявки
--если заявка выставилась - запоминаем ее номер, иначе считаем, что мы закончили выставлять стоп заявку if nord==nil then message("Стоп заявка не выставилась ",1) in_set_stop_loss=false stop_loss_num="" else stop_loss_num=nord end end end function OnStop(stop_flag) is_run=false stop_flag=1 p_file:close(); end
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
22.08.2018 06:42:29
Добрый день. Обработал Ваш код, иначе читать такой объем в таком виде невозможно. Укажите, пожалуйста, в каком именно месте/функции Вам нужно разделить условия, описанные выше
Скрытый текст
Код
p_classcode="SPBFUT" --Код класса
p_seccode="SBRF" --Код инструмента
p_account="" --Код счета
p_clientcode="" --Клиенткий код
p_count=2 --Размер позиции
p_spread=0.7 --Проскальзывание
p_sell_level_RSI=60 --уровень RSI, при котором продаем
p_buy_level_RSI=40 --уровень RSI, при котором покупаем
p_TRANS_ID="2" --идентифкатор транзакций робота, нужен для того, что бы робот отличал свои транзакции от транзакций других роботов и ручных транзакций
p_TRANS_ID_STOP="3" --по работе со стоп ордерами
p_stop_loss_level=3 --Уровень стоп лосса
p_traling_stop_level=3.1 --Уровень стоп лосса, при котором мы "подтягиваем" стоп лосс
p_file = io.open("D:\\userlog.txt", "w") -- тут надо указать путь к файлу лога
--Служебные переменные тут мы запоминаем
is_run = true
count = 0
in_trade = false --признак того, что мы в позиции
order_num = "" --номер заявки по открытой сделке
stop_loss_num = "" --номер стоп заявик по открытой сделке
direction="" --последний тип операции
last_price=0 --цена последней сделки по стратегии
in_set_stop_loss = false --признак, что мы в данный момнет ожидаем результата выставления стоп лосса
function main()
while is_run do
sleep(2000)
robot()
end
end
function to_log(a_msg)
p_file:write(os.date().." "..a_msg.."\n")
end
function robot()
local RSI=getNumCandles("RSI")
local N=getNumCandles("Price")
t,n,i=getCandlesByIndex("Price", 0, N-1, 1)
RSI_t,RSI_n,RSI_i=getCandlesByIndex("RSI", 0, RSI-3, 2)
--сигнла обрабатываем только если мы не в позиции
if not(in_trade) then
--сигнал на продажу (RSI пересекает уровень продажи сверху вниз)
if RSI_t[0].close>p_sell_level_RSI and RSI_t[1].close<p_sell_level_RSI then
Trade("S",count+p_count,t[0].close-p_spread)
end
--сигнал на покупку (RSI пересекает уровень покупки снизу вверх)
if RSI_t[0].close<p_buy_level_RSI and RSI_t[1].close>p_buy_level_RSI then
Trade("B",p_count-count,t[0].close+p_spread)
end
else
--проверить состояние стопа, не надо ли его сдвигать или изменить количество
stop_loss_control()
end
end
--Сначала мы ищем нашу стоп заявку:для поиска используем функцию SearchItems, она у нас вызывает CALLBACK-функцию fn:
function fn(par1)
if stop_loss_num=="" then ----номер стоп заявик по открытой сделке
return false
end
if tonumber(par1) - tonumber(stop_loss_num)==0 then
return true
else
return false
end
end
function stop_loss_control()
local N=getNumCandles("Price") -- индефикатор цены на графике N
if N==nil or N==0 then return end
p_t,p_n,p_i=getCandlesByIndex("Price", 0, N-1, 1)
local NO=getNumberOf("stop_orders") -- Получение данных из таблицы Стоп-заявки:
local is_stop_order=true
if NO==nil or NO==0 then
is_stop_order=false
else
t_so = SearchItems("stop_orders", 0, NO-1, fn, "order_num") --order_num = "" --номер заявки по открытой сделке
end
--если стоп лосса нет, то возможно, его надо выставить
if t_so==nil and is_stop_order then
is_stop_order = false
end
if is_stop_order then
if t_so[1]==nil then
is_stop_order = false
end
end
if not(is_stop_order) then
if in_trade and count~=0 then --in_trade признак того, что мы в позиции
if count>0 then
send_stop_loss("B",count,last_price)--формируем стоп-лосс и выставляем его, вызвав функцию send_stop_loss, last_price --цена последней сделки по стратегии
else
send_stop_loss("S",count,last_price)
end
end
return
end
--А дальше мы вычисляем разницу в ценах, проверяем условие стоп-лосса и, при необходимости перевыставляем его. До этого кода дойдет только в том случае, если у нас уже есть выставленный стоп-лосс:
to_log("stop_loss_control найден стоп ордер count="..count)
t_so_item=getItem("stop_orders", t_so[1])
delta_price=0;
if count>0 then
to_log("count>0")
delta_price=p_t[0].close-t_so_item.condition_price; --condition это состояние, p_t строка 79
l_direction="B"
else
to_log("count<=0")
delta_price=t_so_item.condition_price-p_t[0].close
l_direction="S"
end
to_log("delta_price="..delta_price.." t_so[0].qty="..t_so_item.qty.." p_t[0].close="..p_t[0].close)
if delta_price>=p_traling_stop_level or count~=t_so_item.qty then
to_log("Послылаем новую стоп заявку price="..p_t[0].close.." количество "..count)
send_stop_loss(l_direction,count,p_t[0].close)
end
end
function Trade(a_oper,a_count,a_price)
if a_count>0 then --Количество сделки
--Сначала пошлем обычную заявку
t = {
["CLASSCODE"]=p_classcode,
["SECCODE"]=p_seccode,
["ACTION"]="NEW_ORDER",
["ACCOUNT"]=p_account,
["CLIENT_CODE"]=p_clientcode,
["TYPE"]="L",
["OPERATION"]=a_oper,
["QUANTITY"]=tostring(a_count),
["PRICE"]=tostring(a_price),
["EXPIRY_DATE"]="GTC",
["TRANS_ID"]=p_TRANS_ID
}
res=sendTransaction(t)
--заявку послали и сразу же мы оказались в позиции и будем в ней до тех пор, пока не закроется сделка
--или пока не будет доказано обратное (мы узнаем, что сделка не прошла)
in_trade=true
direction=a_oper--последний тип операции
message("Количество сделки "..tostring(a_count).." тип операции "..a_oper.." Цена "..a_price,1)
end
end
--Обработчик события сделки.
function OnTrade(trade)
nord=trade["order_num"]
price=trade["price"]
to_log("Совершена сделка: номер заявки "..tostring(nord).."; цена "..tostring(price)..": количество "..tostring(trade["qty"]))
if nord==order_num then
qty=trade["qty"]
if direction=="B" then
count=count+qty
else
count=count-qty
end
send_stop_loss(direction,count,price)
last_price=price
end
end
--Обработчик события создания стоп заявки
function OnStopOrder(stop_order)
--бит 0 (0x1) Заявка активна, иначе не активна
if stop_order["order_num"]==stop_loss_num and bit.band(stop_order["flags"],0x1)==0x1 then
to_log("сняли признак что мы в процессе выставления стоп оредра")
in_set_stop_loss=false
end
--бит 0 (0x1) Заявка активна, иначе не активна,
--бит 1 (0x2) Заявка снята. Если не установлен и значение бита 0 равно 0, то заявка исполнена
--в этом случае мы считаем, что позция закрыта по стоп лоссу
if stop_order["order_num"]==stop_loss_num and bit.band(stop_order["flags"],0x1)==0x0 and bit.band(stop_order["flags"],0x2)==0x0 then --stop_loss_num = "" --номер стоп заявик по открытой сделке
in_set_stop_loss=false
count=0
end
end
--Удалить стоп лосс
function delete_stop_loss(a_num)
t = {
["CLASSCODE"]=p_classcode,
["SECCODE"]=p_seccode,
["ACTION"]="KILL_STOP_ORDER",
["ACCOUNT"]=p_account,
["CLIENT_CODE"]=p_clientcode,
["TYPE"]="L",
["OPERATION"]=l_oper,
["STOP_ORDER_KIND"]="SIMPLE_STOP_ORDER",
["TRANS_ID"]=p_TRANS_ID_STOP,
["STOP_ORDER_KEY"]=tostring(a_num)
}
res=sendTransaction(t)
message("Удаляем стоп лосс: сообщение "..res.."; номер "..a_num,1)
end
--Послать стоп заявку
function send_stop_loss(a_direction,a_count,a_price)
to_log("send_stop_loss in_set_stop_loss="..tostring(in_set_stop_loss))
if not(in_set_stop_loss) then
if stop_loss_num~="" then
delete_stop_loss(stop_loss_num)
end
if a_direction=="B" then
l_oper="S"
l_count=a_count
dir=-1
else
l_oper="B"
l_count=-a_count
dir=1
end
l_price=a_price+p_stop_loss_level*dir
if l_count>0 then
to_log("send_stop_loss Зашли сюда",1)
in_set_stop_loss=true
--Пошлем стоп заявку
t = {
["CLASSCODE"]=p_classcode,
["SECCODE"]=p_seccode,
["ACTION"]="NEW_STOP_ORDER",
["ACCOUNT"]=p_account,
["CLIENT_CODE"]=p_clientcode,
["TYPE"]="L",
["OPERATION"]=l_oper,
["QUANTITY"]=tostring(l_count),
["PRICE"]=tostring(l_price+p_spread*dir),
["EXPIRY_DATE"]="GTC",
["STOPPRICE"]=tostring(l_price),
["STOP_ORDER_KIND"]="SIMPLE_STOP_ORDER",
["TRANS_ID"]=p_TRANS_ID_STOP
}
res=sendTransaction(t)
message(res,1)
to_log("Выставли стоп заявку "..l_oper)
end
end
end
--обработка события транзакции
function OnTransReply(trans_reply)
id=tostring(trans_reply["trans_id"])
to_log("Обработка транзакции "..id)
--если это наша транзакция, обработаем ее
if id==p_TRANS_ID then
nord=trans_reply["order_num"]
to_log("Обработка транзакции номер заявки "..nord)
--если заявка выставилась - запоминаем ее номер, иначе считаем, что мы не в сделке
if nord==nil or nord==0 or nord=="0" then
message("Заявка не выставилась ",1)
in_trade=false
else
order_num=nord
end
end
if id==p_TRANS_ID_STOP then
message("Сообщение транзакции стоп ордера "..trans_reply["result_msg"],1)
nord=trans_reply["order_num"] --Номер заявки
--если заявка выставилась - запоминаем ее номер, иначе считаем, что мы закончили выставлять стоп заявку
if nord==nil then
message("Стоп заявка не выставилась ",1)
in_set_stop_loss=false
stop_loss_num=""
else
stop_loss_num=nord
end
end
end
function OnStop(stop_flag)
is_run=false
stop_flag=1
p_file:close();
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf'
Пользователь
Сообщений: Регистрация: 25.05.2018
25.08.2018 19:23:42
Скрытый текст
p_classcode="SPBFUT" --Код класса p_seccode="SBRF" --Код инструмента p_account="" --Код счета p_clientcode="" --Клиенткий код p_count=2 --Размер позиции p_spread=0.7 --Проскальзывание p_sell_level_RSI=60 --уровень RSI, при котором продаем p_buy_level_RSI=40 --уровень RSI, при котором покупаем p_TRANS_ID="2" --идентифкатор транзакций робота, нужен для того, что бы робот отличал свои транзакции от транзакций других роботов и ручных транзакций p_TRANS_ID_STOP="3" --по работе со стоп ордерами p_stop_loss_level=3 --Уровень стоп лосса добавить это p_bez_stop_level=3.1 -- Уровень безубытка p_traling_stop_level=1 --Уровень стоп лосса, при котором мы "подтягиваем" стоп лосс p_file = io.open("D:\\userlog.txt", "w") -- тут надо указать путь к файлу лога --Служебные переменные тут мы запоминаем is_run = true count = 0 in_trade = false --признак того, что мы в позиции order_num = "" --номер заявки по открытой сделке stop_loss_num = "" --номер стоп заявик по открытой сделке direction="" --последний тип операции last_price=0 --цена последней сделки по стратегии in_set_stop_loss = false --признак, что мы в данный момнет ожидаем результата выставления стоп лосса function main() while is_run do sleep(2000) robot() end end function to_log(a_msg) p_file:write(os.date().." "..a_msg.."\n") end function robot() local RSI=getNumCandles("RSI") local N=getNumCandles("Price") t,n,i=getCandlesByIndex("Price", 0, N-1, 1) RSI_t,RSI_n,RSI_i=getCandlesByIndex("RSI", 0, RSI-3, 2) --сигнла обрабатываем только если мы не в позиции if not(in_trade) then --сигнал на продажу (RSI пересекает уровень продажи сверху вниз) if RSI_t[0].close>p_sell_level_RSI and RSI_t[1].close<p_sell_level_RSI then Trade("S",count+p_count,t[0].close-p_spread) end --сигнал на покупку (RSI пересекает уровень покупки снизу вверх) if RSI_t[0].close<p_buy_level_RSI and RSI_t[1].close>p_buy_level_RSI then Trade("B",p_count-count,t[0].close+p_spread) end else
--проверить состояние стопа, не надо ли его сдвигать или изменить количество stop_loss_control()
end end --Сначала мы ищем нашу стоп заявку:для поиска используем функцию SearchItems, она у нас вызывает CALLBACK-функцию fn: function fn(par1) if stop_loss_num=="" then ----номер стоп заявик по открытой сделке return false end
if tonumber(par1) - tonumber(stop_loss_num)==0 then return true else return false end end function stop_loss_control() local N=getNumCandles("Price") -- индефикатор цены на графике N
if N==nil or N==0 then return end
p_t,p_n,p_i=getCandlesByIndex("Price", 0, N-1, 1)
local NO=getNumberOf("stop_orders") -- Получение данных из таблицы Стоп-заявки: local is_stop_order=true
if NO==nil or NO==0 then is_stop_order=false else t_so = SearchItems("stop_orders", 0, NO-1, fn, "order_num") --order_num = "" --номер заявки по открытой сделке end --если стоп лосса нет, то возможно, его надо выставить if t_so==nil and is_stop_order then is_stop_order = false end
if is_stop_order then if t_so[1]==nil then is_stop_order = false end end if not(is_stop_order) then if in_trade and count~=0 then --in_trade признак того, что мы в позиции if count>0 then send_stop_loss("B",count,last_price)--формируем стоп-лосс и выставляем его, вызвав функцию send_stop_loss, last_price --цена последней сделки по стратегии else send_stop_loss("S",count,last_price) end end return end --А дальше мы вычисляем разницу в ценах, проверяем условие стоп-лосса и, при необходимости перевыставляем его. До этого кода дойдет только в том случае, если у нас уже есть выставленный стоп-лосс: to_log("stop_loss_control найден стоп ордер count="..count) t_so_item=getItem("stop_orders", t_so[1]) delta_price=0;
if count>0 then to_log("count>0") delta_price=p_t[0].close-t_so_item.condition_price; --condition это состояние, p_t строка 79 l_direction="B" else to_log("count<=0") delta_price=t_so_item.condition_price-p_t[0].close l_direction="S" end
добавить тут if delta_price>=p_bez_stop_level or count~=t_so_item.qty then to_log("Послылаем новую стоп заявку price="..p_t[0].close.." количество "..count) send_stop_loss(l_direction,count,p_t[0].close) end --[[ После выставления стопа вначале должен выставиться p_bez_stop_level, а за ним p_traling_stop_level. Но до выставления безубытка трал должен игнорироваться.
Размышления: Я думал, например изначально traling = false if delta_price>=p_bez_stop_level or count~=t_so_item.qty then to_log("Послылаем новую стоп заявку price="..p_t[0].close.." количество "..count) send_stop_loss(l_direction,count,p_t[0].close) traling=true end if delta_price>= (p_traling_stop_level or count~=t_so_item.qty) and traling then to_log("Послылаем новую стоп заявку price="..p_t[0].close.." количество "..count) send_stop_loss(l_direction,count,p_t[0].close) end Вроде пока traling = false трал не будет работать. ]]
if delta_price>=p_traling_stop_level or count~=t_so_item.qty then to_log("Послылаем новую стоп заявку price="..p_t[0].close.." количество "..count) send_stop_loss(l_direction,count,p_t[0].close) end end function Trade(a_oper,a_count,a_price) if a_count>0 then --Количество сделки --Сначала пошлем обычную заявку t = { ["CLASSCODE"]=p_classcode, ["SECCODE"]=p_seccode, ["ACTION"]="NEW_ORDER", ["ACCOUNT"]=p_account, ["CLIENT_CODE"]=p_clientcode, ["TYPE"]="L", ["OPERATION"]=a_oper, ["QUANTITY"]=tostring(a_count), ["PRICE"]=tostring(a_price), ["EXPIRY_DATE"]="GTC", ["TRANS_ID"]=p_TRANS_ID } res=sendTransaction(t)
--заявку послали и сразу же мы оказались в позиции и будем в ней до тех пор, пока не закроется сделка --или пока не будет доказано обратное (мы узнаем, что сделка не прошла) in_trade=true
direction=a_oper--последний тип операции message("Количество сделки "..tostring(a_count).." тип операции "..a_oper.." Цена "..a_price,1) end end --Обработчик события сделки. function OnTrade(trade) nord=trade["order_num"] price=trade["price"] to_log("Совершена сделка: номер заявки "..tostring(nord).."; цена "..tostring(price)..": количество "..tostring(trade["qty"])) if nord==order_num then qty=trade["qty"] if direction=="B" then count=count+qty else count=count-qty end send_stop_loss(direction,count,price) last_price=price end end --Обработчик события создания стоп заявки function OnStopOrder(stop_order) --бит 0 (0x1) Заявка активна, иначе не активна if stop_order["order_num"]==stop_loss_num and bit.band(stop_order["flags"],0x1)==0x1 then to_log("сняли признак что мы в процессе выставления стоп оредра") in_set_stop_loss=false end --бит 0 (0x1) Заявка активна, иначе не активна, --бит 1 (0x2) Заявка снята. Если не установлен и значение бита 0 равно 0, то заявка исполнена --в этом случае мы считаем, что позция закрыта по стоп лоссу if stop_order["order_num"]==stop_loss_num and bit.band(stop_order["flags"],0x1)==0x0 and bit.band(stop_order["flags"],0x2)==0x0 then --stop_loss_num = "" --номер стоп заявик по открытой сделке in_set_stop_loss=false count=0 end end --Удалить стоп лосс function delete_stop_loss(a_num) t = { ["CLASSCODE"]=p_classcode, ["SECCODE"]=p_seccode, ["ACTION"]="KILL_STOP_ORDER", ["ACCOUNT"]=p_account, ["CLIENT_CODE"]=p_clientcode, ["TYPE"]="L", ["OPERATION"]=l_oper, ["STOP_ORDER_KIND"]="SIMPLE_STOP_ORDER", ["TRANS_ID"]=p_TRANS_ID_STOP, ["STOP_ORDER_KEY"]=tostring(a_num) } res=sendTransaction(t) message("Удаляем стоп лосс: сообщение "..res.."; номер "..a_num,1) end --Послать стоп заявку function send_stop_loss(a_direction,a_count,a_price) to_log("send_stop_loss in_set_stop_loss="..tostring(in_set_stop_loss)) if not(in_set_stop_loss) then if stop_loss_num~="" then delete_stop_loss(stop_loss_num) end if a_direction=="B" then l_oper="S" l_count=a_count dir=-1 else l_oper="B" l_count=-a_count dir=1 end l_price=a_price+p_stop_loss_level*dir if l_count>0 then to_log("send_stop_loss Зашли сюда",1) in_set_stop_loss=true
--Пошлем стоп заявку t = { ["CLASSCODE"]=p_classcode, ["SECCODE"]=p_seccode, ["ACTION"]="NEW_STOP_ORDER", ["ACCOUNT"]=p_account, ["CLIENT_CODE"]=p_clientcode, ["TYPE"]="L", ["OPERATION"]=l_oper, ["QUANTITY"]=tostring(l_count), ["PRICE"]=tostring(l_price+p_spread*dir), ["EXPIRY_DATE"]="GTC", ["STOPPRICE"]=tostring(l_price), ["STOP_ORDER_KIND"]="SIMPLE_STOP_ORDER", ["TRANS_ID"]=p_TRANS_ID_STOP } res=sendTransaction(t) message(res,1) to_log("Выставли стоп заявку "..l_oper) end end end --обработка события транзакции function OnTransReply(trans_reply) id=tostring(trans_reply["trans_id"])
to_log("Обработка транзакции "..id)
--если это наша транзакция, обработаем ее if id==p_TRANS_ID then nord=trans_reply["order_num"]
to_log("Обработка транзакции номер заявки "..nord)
--если заявка выставилась - запоминаем ее номер, иначе считаем, что мы не в сделке if nord==nil or nord==0 or nord=="0" then message("Заявка не выставилась ",1) in_trade=false else order_num=nord end end if id==p_TRANS_ID_STOP then message("Сообщение транзакции стоп ордера "..trans_reply["result_msg"],1) nord=trans_reply["order_num"] --Номер заявки --если заявка выставилась - запоминаем ее номер, иначе считаем, что мы закончили выставлять стоп заявку if nord==nil then message("Стоп заявка не выставилась ",1) in_set_stop_loss=false stop_loss_num="" else stop_loss_num=nord end end end function OnStop(stop_flag) is_run=false stop_flag=1 p_file:close(); end
Пользователь
Сообщений: Регистрация: 25.05.2018
25.08.2018 19:26:07
Я выделил красным цветом где, а синим свои мысли по поводу что примерно можно сделать, не знаю на сколько верным путем иду) новичок в этом.
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
28.08.2018 13:42:06
Добрый день. Да, Вы совершенно верно предположили необходимость использования дополнительного флага (в Вашем случе traling). Только нужно переменную traling заранее определить как false. Вот небольшой шаблон
Код
traling = false
function main()
if traling == false then
--что-то делаем, что нужно сделать первоочередно
traling = true
end
if traling == truet then
--что-то делаем, только если выполнен первоочередный шаг
end
end
можно еще использовать вот такую конструкцию:
Код
traling = false
function main()
if traling == false then
--что-то делаем, что нужно сделать первоочередно
traling = true
elseif traling == truet then
--в эту ветку уже не зайдем если зашли в ветку traling == false
end
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf'
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
28.08.2018 13:43:28
Опечатался... truet = true
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf'
Пользователь
Сообщений: Регистрация: 09.02.2015
QUIK software testing
28.08.2018 13:49:05
Вот описан синтаксис оператора if в Lua.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf'