Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER

Страницы: 1
RSS
Предотвращение убыточной продажи по TAKE_PROFIT_AND_STOP_LIMIT_ORDER
 
Здравствуйте!
Довольно часто сталкиваюсь со следующей ситуацией.

Выставляю заявку:
   
Код
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. Но как правильно обработать такую ситуацию и поможет ли это?
 
Хорошо поразмыслив, пришёл к выводу, что проблема не решаема средствами выставления заявок имеющегося типа.
Для себя решил проблему написав кастомный тейк-профит в виде постоянно запущенного lua-скрипта, который реализует нужную мне механику отслеживания цены и продажи.
 
Цитата
Дмитрий Ш написал:
       OFFSET             = str_price(tostring(spread)),
       OFFSET_UNITS       = "PRICE_UNITS",
       SPREAD             = str_price(tostring(offset)),
Если не секрет, зачем менять местами отступ и спред?
Всё пройдет. Но это не точно.
 
Спасибо! Это как раз и была причина убыточности. Замыленный взгляд упорно не замечал. Но постоянно работающий скрипт, действительно может реализовать необходимую стратегию гораздо точнее. Ещё раз спасибо! Теперь я хотя бы знаю, что ошибка была моя.
Страницы: 1
Читают тему
Наверх