OnTransReply и sendTransaction

Страницы: 1
RSS
OnTransReply и sendTransaction, Не вызывается OnTransReply
 
Добрый день.

Собственно проблема в том, что OnTransReply  не вызывается после sendTransaction
Как узнать какие ошибки возникли при попытке сделать sendTransaction
Использую quik junior
Код
function SL_TP(Price, Type)
    -- ID транзакции
    trans_id = trans_id + 1;

    -- Находит направление для заявки
    local operation = "";
    local price = "0"; -- Цена, по которой выставится заявка при срабатывании Стоп-Лосса (для рыночной заявки по акциям должна быть 0)
    local stopprice = ""; -- Цена Тейк-Профита
    local stopprice2 = ""; -- Цена Стоп-Лосса
    local market = "YES"; -- После срабатывания Тейка, или Стопа, заявка сработает по рыночной цене
    -- Если открыт BUY, то направление стоп-лосса и тейк-профита SELL, иначе направление стоп-лосса и тейк-профита BUY
    if Type == 'BUY' then
        operation = "S"; -- Тейк-профит и Стоп-лосс на продажу(чтобы закрыть BUY, нужно открыть SELL)
        -- Если не акции
        if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then
            price = tostring(math.floor(getParamEx(CLASS_CODE, SEC_CODE, 'PRICEMIN').param_value)); -- Цена выставляемой заявки после страбатывания Стопа минимально возможная, чтобы не проскользнуло
            market = "NO";  -- После срабатывания Тейка, или Стопа, заявка сработает НЕ по рыночной цене
        end;
        stopprice    = tostring(Price + TAKE_PROFIT*SEC_PRICE_STEP); -- Уровень цены, когда активируется Тейк-профит
        stopprice2    = tostring(Price - STOP_LOSS*SEC_PRICE_STEP); -- Уровень цены, когда активируется Стоп-лосс
    else -- открыт SELL
        operation = "B"; -- Тейк-профит и Стоп-лосс на покупку(чтобы закрыть SELL, нужно открыть BUY)
        -- Если не акции
        if CLASS_CODE ~= 'QJSIM' and CLASS_CODE ~= 'TQBR' then
            price = tostring(math.floor(getParamEx(CLASS_CODE, SEC_CODE, 'PRICEMAX').param_value)); -- Цена выставляемой заявки после страбатывания Стопа максимально возможная, чтобы не проскользнуло
            market = "NO";  -- После срабатывания Тейка, или Стопа, заявка сработает НЕ по рыночной цене
        end;
        stopprice    = tostring(Price - TAKE_PROFIT*SEC_PRICE_STEP); -- Уровень цены, когда активируется Тейк-профит
        stopprice2    = tostring(Price + STOP_LOSS*SEC_PRICE_STEP); -- Уровень цены, когда активируется Стоп-лосс
    end;
    -- Заполняет структуру для отправки транзакции на Стоп-лосс и Тейк-профит
    local Transaction = {
        ["ACTION"]              = "NEW_STOP_ORDER", -- Тип заявки
        ["TRANS_ID"]            = tostring(trans_id),
        ["CLASSCODE"]           = CLASS_CODE,
        ["SECCODE"]             = SEC_CODE,
        ["ACCOUNT"]             = ACCOUNT,
        ["OPERATION"]           = operation, -- Операция ("B" - покупка(BUY), "S" - продажа(SELL))
        ["QUANTITY"]            = "1", -- Количество в лотах
        ["PRICE"]               = price, -- Цена, по которой выставится заявка при срабатывании Стоп-Лосса (для рыночной заявки по акциям должна быть 0)
        ["STOPPRICE"]           = stopprice, -- Цена Тейк-Профита
        ["STOP_ORDER_KIND"]     = "TAKE_PROFIT_AND_STOP_LIMIT_ORDER", -- Тип стоп-заявки
        ["EXPIRY_DATE"]         = "TODAY", -- Срок действия стоп-заявки ("GTC" – до отмены,"TODAY" - до окончания текущей торговой сессии, Дата в формате "ГГММДД")
        -- "OFFSET" - (ОТСТУП)Если цена достигла Тейк-профита и идет дальше в прибыль,
        -- то Тейк-профит сработает только когда цена вернется минимум на 2 шага цены назад,
        -- это может потенциально увеличить прибыль
        ["OFFSET"]              = tostring(2*SEC_PRICE_STEP),
        ["OFFSET_UNITS"]        = "PRICE_UNITS", -- Единицы измерения отступа ("PRICE_UNITS" - шаг цены, или "PERCENTS" - проценты)
        -- "SPREAD" - Когда сработает Тейк-профит, выставится заявка по цене хуже текущей на 100 шагов цены,
        -- которая АВТОМАТИЧЕСКИ УДОВЛЕТВОРИТСЯ ПО ТЕКУЩЕЙ ЛУЧШЕЙ ЦЕНЕ,
        -- но то, что цена значительно хуже, спасет от проскальзывания,
        -- иначе, сделка может просто не закрыться (заявка на закрытие будет выставлена, но цена к тому времени ее уже проскочит)
        ["SPREAD"]              = tostring(100*SEC_PRICE_STEP),
        ["SPREAD_UNITS"]        = "PRICE_UNITS", -- Единицы измерения защитного спрэда ("PRICE_UNITS" - шаг цены, или "PERCENTS" - проценты)
        -- "MARKET_TAKE_PROFIT" = ("YES", или "NO") должна ли выставится заявка по рыночной цене при срабатывании Тейк-Профита.
        -- Для рынка FORTS рыночные заявки, как правило, запрещены,
        -- для лимитированной заявки на FORTS нужно указывать заведомо худшую цену, чтобы она сработала сразу же, как рыночная
        ["MARKET_TAKE_PROFIT"]  = market,
        ["STOPPRICE2"]          = stopprice2, -- Цена Стоп-Лосса
        ["IS_ACTIVE_IN_TIME"]   = "NO",
        -- "MARKET_TAKE_PROFIT" = ("YES", или "NO") должна ли выставится заявка по рыночной цене при срабатывании Стоп-Лосса.
        -- Для рынка FORTS рыночные заявки, как правило, запрещены,
        -- для лимитированной заявки на FORTS нужно указывать заведомо худшую цену, чтобы она сработала сразу же, как рыночная
        ["MARKET_STOP_LIMIT"]   = market,
        ["COMMENT"]             = "Простой MA-робот ТЕЙК-ПРОФИТ и СТОП-ЛОСС"
    }
    -- Отправляет транзакцию на установку ТЕЙК-ПРОФИТ и СТОП-ЛОСС
    sendTransaction(Transaction);
   
 -- Ждет, пока не получит статус текущей транзакции (переменные "trans_Status" и "trans_result_msg" заполняются в функции OnTransReply())
    while Run and trans_Status == nil do sleep(10); end;


Собственно на этой проверке все переходит в бесконечный цикл.

Код
function OnTransReply(trans_reply)
message("OnTransReply")

 if trans_reply.trans_id == trans_id then
      trans_Status = trans_reply.status;
      trans_result_msg  = trans_reply.result_msg;
   end;
end;
 
Надо прочитать документацию:
sendTransaction
Функция предназначена для отправки транзакций в торговую систему.  
Формат вызова:  
STRING result sendTransaction(TABLE transaction) Параметры:  
  • result – строка, содержащая текст ошибки, если она  случилась при обработке транзакции;
 
При посыле транзакции с завышенным числом лотов в терминале выскакивает сообщение "Превышен лимит по бумаге", но в возврате от sendTransaction -- пустая строка.
Это баг или фича?
 
Enfernuz,

sendTransaction возвращает только ошибки возникающие ДО отправки транзакции на сервер. Например, неправильный синтаксис.
Все остальное, приходит в OnTransReply
Страницы: 1
Читают тему
Наверх