Здравствуйте!
Довольно часто сталкиваюсь со следующей ситуацией.
Выставляю заявку:
Код |
---|
Spread = 6
Offset = 3
-- В целых ценах не будет дробной части.
function str_price(str)
local n = tonumber(str)
local m = math.floor(n)
if n == m then
return tostring(m)
else
return tostring(n)
end
end
function Limit(ticker, quantity, tp_price)
local step = tonumber(getParamEx("TQBR", ticker, "sec_price_step").param_value)
local spread = Spread * step
local offset = Offset * step
local transaction = {
ACCOUNT = Account,
CLIENT_CODE = ClientCode,
ACTION = "NEW_STOP_ORDER",
TRANS_ID = tostring(os.time()),
OPERATION = "S", -- Продажа.
STOP_ORDER_KIND = "TAKE_PROFIT_AND_STOP_LIMIT_ORDER",
CLASSCODE = "TQBR",
SECCODE = ticker,
QUANTITY = tostring(quantity),
STOPPRICE = str_price(tostring(tp_price)), -- Take Profit.
EXPIRY_DATE = "GTC", -- До отмены.
OFFSET = str_price(tostring(spread)),
OFFSET_UNITS = "PRICE_UNITS",
SPREAD = str_price(tostring(offset)),
SPREAD_UNITS = "PRICE_UNITS",
MARKET_TAKE_PROFIT = "YES",
STOPPRICE2 = "0", --стоп цена
MARKET_STOP_LIMIT = "YES"
}
error = sendTransaction(transaction)
if error ~= "" then
msg = "Error on Limit %d %s %.5f (%s)."
message(msg:format(quantity, ticker, tp_price, error))
end
end
|
При этом tp_price рассчитывается от средней цены покупки buy_price (wa_position_price из таблицы depo_limits) следующим образом:
Код |
---|
BrokerSpread = 0.0006
tp_price = (buy_price * 1.005) * (1.0 + Percent)
tp_price = tp_price + (buy_price + tp_price) * BrokerSpread |
Проблема в том, что довольно часто в итоге при ожидании "лучшей" цены выставляется продажа по цене меньше, чем buy_price.
Может быть кто-то знает, как изменить тело transaction или обработчик какой-то написать, чтобы оперативно снимать (а ещё лучше предотвращать постановку) заявку на продажу.
P.S. Во время написания последних строк пришла мысль снимать и переставлять тейк-профит на стадии "расчета", если цена опустилась ниже buy_price. Но как правильно обработать такую ситуацию и поможет ли это?