ФОРТС: OnTradeTransaction() коды возврата - страница 5

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Kozitsyn
8856
Alexey Kozitsyn  

11.2.    Сбор за ошибочные транзакции.

Транзакции признаются ошибочными, если в ходе выполнения транзакции ей был присвоен код ошибки, указанный в Таблице 2. Для целей определения ошибочных транзакций под транзакцией понимается подача Заявки, отзыв Заявки, отзыв Заявки с одновременной подачей Заявки с иными условиями Сделки, отзыв пары Заявок с одновременной подачей пары Заявок с иными условиями Сделок.

Расчёт Сбора за ошибочные транзакции производится для каждого логина за период времени от момента приостановки торгов в целях проведения вечерней клиринговой сессии текущего Торгового дня (включая первую секунду приостановки) до момента приостановки торгов в целях проведения вечерней клиринговой сессии следующего Торгового дня (не включая первую секунду приостановки) (далее – Период расчёта).

Расчет величины Сбора за ошибочные транзакции производится по формуле:

 

 

где:

TranFee2 – величина Cбора за ошибочные транзакции, совершенные в течение Периода расчёта (в рублях с учетом НДС);

Cap – ограничение на максимальную величину Сбора за ошибочные транзакции, устанавливаемое решением Технического центра и публикуемое на сайте ПАО Московская Биржа;

xi – значение, рассчитываемое посекундно, округляемое до целых в меньшую сторону и определяемое по формуле:

 

где:

Qi – сумма всех баллов за i-тую секунду (баллы определяются в соответствии с Таблицей 2);

Li – лимит данного логина, который рассчитывается по формуле и округляется до целых:

 

 

где:

Capacityi – пропускная способность логина, определенная в порядке, предусмотренном пунктом 3.2 настоящего Приложения, действующая в i-тую секунду.

 

Таблица 2:

 

Тип Транзакции*

Результат выполнения (код ошибки)*

Балл Q

AddOrder

Возникла кросс-сделка (31)

Q1

Недостаточно средств клиента (332)

Q2

Недостаточно средств брокерской фирмы (333)

Q3

Заявка FOK не сведена (4103)

Q4

DelOrder

Заявка не найдена (14)

Q5

MoveOrder

Возникла кросс-сделка (31)

Q6

Заявка не найдена (50)

Q7

Недостаточно средств клиента (332)

Q8

Недостаточно средств брокерской фирмы (333)

Q9

DelUserOrders

Транзакция завершена успешно,

и не удалено ни одной заявки

Q10

* в соответствии с описанием Шлюза ФОРТС Plaza-2.

Значение баллов Q1-Q10 устанавливаются решением Технического центра и публикуются на сайте ПАО Московская Биржа.

Сбор за ошибочные Транзакции взимается в случае, если выполняется условие:

 

где:

TranFee2 – величина Cбора за ошибочные Транзакции, совершенные в течение Периода расчёта (в рублях с учетом НДС);

Capmin – ограничение на минимальную величину Сбора за ошибочные Транзакции, устанавливаемое решением Технического центра и публикуемое на сайте ПАО Московская Биржа,

Сбор за ошибочные Транзакции взимается с раздела клирингового регистра, к которому привязан логин, для которого определён Сбор за ошибочные Транзакции. 

Alexey Kozitsyn
8856
Alexey Kozitsyn  
Только формулы, к сожалению, не вставляются. 
kond777
197
kond777  
Dmitriy Skub:
Вы хотите, чтоб мы спились?)) Так сложно цифру написать?
 Alexey Kozitsyn скопипастил лишь некоторую часть текста этого положения. Стало понятнее? )) Боюсь, что Вам спится все равно придется, если желаете в этом разобраться. ))
kond777
197
kond777  

Какой код возврата имеет данная ошибка? 

2015.09.21 10:00:13     20845617        SBRF-3.16       buy limit       2.00 / 0.00             7 303                   2015.09.21 10:00:13             rejected        Инструмент отсутствует в текуще 
Mikhail Filimonov
5350
Mikhail Filimonov  

Возвращаясь к коду ошибки Invalid request

Я немного изменил функцию удаления ордера:

//+------------------------------------------------------------------+
// Remove order                                                      |
//+------------------------------------------------------------------+
void COrder::Remove()
{
  if ( ticket > 0 )
  {
    if ( OrderSelect( ticket ) )
    {
      ENUM_ORDER_STATE ord_state = ENUM_ORDER_STATE( OrderGetInteger( ORDER_STATE ) );
      if ( ( ord_state == ORDER_STATE_REQUEST_MODIFY ) || ( ord_state == ORDER_STATE_REQUEST_CANCEL ) ) return;
//---      
      mem_magic = ulong( OrderGetInteger( ORDER_MAGIC ) );
      mem_tick = GetTickCount();
      req_id = 0;
      MqlTradeRequest request = {0};
      MqlTradeResult  result  = {0};
            
      request.action = TRADE_ACTION_REMOVE;
      request.order = ticket;
          
      if ( OrderSendAsync( request, result ) )
      {
        if ( result.retcode == TRADE_RETCODE_PLACED )
        { 
          req_id = result.request_id;
//---          
          switch( order_status )
          {
            case BUY_ORDER:  state = ORD_BUY_DO_CANCEL;
                             break;
                
            case SELL_ORDER: state = ORD_SELL_DO_CANCEL;
                             break;           
          } 
          SetTransCount( true );
        }
        else
        {
          mem_magic = 0;
          mem_tick = 0;
          CheckError( result.retcode, "Remove: Ордер не удалён! Причина: ", order_status, ticket );
        }  
      }
      else
      {
        mem_magic = 0;
        mem_tick = 0;
        CheckError( result.retcode, "Remove: Ордер не отослан! Причина: ", order_status, ticket );
      }
    }
    else
    {
      ticket = 0;
      modify_count = 0;
    }
  }
  else
  {
    modify_count = 0;
  }
}

Функция CheckError()

//+------------------------------------------------------------------+
// Expert Check Error function                                       |
//+------------------------------------------------------------------+
void CheckError( const uint ret_code, const string err_msg, const ENUM_ORD_STATUS ord_status, const ulong a_ticket )
{
  switch( ret_code )
  {
    ........                              
    case TRADE_RETCODE_INVALID: Print( err_msg + GetRetCode( ret_code ), "; Билет = ", a_ticket );
                                break;                                                       
                
    default: Print( err_msg, GetRetCode( ret_code ), "; Билет = ", a_ticket );  
             break;            
  }
}

 Выставив ордер:

2015.11.25 15:07:30.773 Trades  'xxxxx': buy limit 5.00 SNGP-3.16 at 40718
2015.11.25 15:07:30.784 Trades  'xxxxx': buy limit 5.00 SNGP-3.16 at 40718 placed for execution in 10 ms

 МТ 5 сервер не прислал никакого ответа, сработала функция CheckOrders() и был получен билет ордера:

2015.11.25 15:07:31.849 Forts_trader (SNGP-12.15,H1)    CheckOrders: Buy ордер установлен. Билет = 23992887

После этого, НЕ прошла команда на удаление ордера (советник):

2015.11.25 15:07:31.865 Forts_trader (SNGP-12.15,H1)    Remove: Ордер не отослан! Причина: Неправильный запрос Билет = 23992887

 И это же подтвердил терминал:

2015.11.25 15:07:31.865 Trades  'xxxxx': failed cancel order #23992887 buy limit 5.00 SNGP-3.16 at 40718.00000 [Invalid request]

 

 Вопрос:

Какое же состояние ордера в памяти терминала ?

Почему Invalid request ? 

Я же получил билет из окружения терминала, значит терминал "знает", что ордер выставлен

Ведь позже, эта же функция удалила этот ордер с этим же билетом:

2015.11.25 15:15:03.245 Trades  'ххххх': cancel order #23992887 buy limit 5.00 SNGP-3.16 at 40718
2015.11.25 15:15:03.254 Trades  'ххххх': cancel order #23992887 buy limit 5.00 SNGP-3.16 at 40718 placed for execution in 8 ms
Sergey Chalyshev
8291
Sergey Chalyshev  
Михаил:

Возвращаясь к коду ошибки Invalid request

Я немного изменил функцию удаления ордера:

Функция CheckError()

 Выставив ордер:

 МТ 5 сервер не прислал никакого ответа, сработала функция CheckOrders() и был получен билет ордера:

После этого, НЕ прошла команда на удаление ордера (советник):

 И это же подтвердил терминал:

 

 Вопрос:

Какое же состояние ордера в памяти терминала ?

Почему Invalid request ? 

(Я же получил билет из окружения терминала, значит терминал "знает, что ордер выставлен")! 

Встречается еще такое:

2015.11.24 17:07:15.020 FORTS (MXI-12.15,M5)       ORDER_STATE = ORDER_STATE_REQUEST_ADD
Sergey Chalyshev
8291
Sergey Chalyshev  

Попробуй так:

if(!(OrderGetInteger(ORDER_STATE)==ORDER_STATE_PARTIAL || OrderGetInteger(ORDER_STATE)==ORDER_STATE_PLACED)) return; 
Mikhail Filimonov
5350
Mikhail Filimonov  
Sergey Chalyshev:

Встречается еще такое:

Сергей!

Мне почему-то кажется, что если есть билет (после выставления ордера), то не может быть

его состояние:

ORDER_STATE_REQUEST_ADD
Sergey Chalyshev
8291
Sergey Chalyshev  
Михаил:

Сергей!

Мне почему-то кажется, что если есть билет (после выставления ордера), то не может быть

его состояние:

Я тоже так думаю, но это не я придумал, эта ошибка из журнала операций.

После добавления этой проверки вывел все состояния, перед удалением и модификацией, в журнал. InvalidRequest больше не встречается.

Этот вопрос больше к работе сервера и разработчикам, как появляется ORDER_STATE_REQUEST_ADD.

Mikhail Filimonov
5350
Mikhail Filimonov  
Sergey Chalyshev:

Я тоже так думаю, но это не я придумал, эта ошибка из журнала операций.

После добавления этой проверки вывел все состояния, перед удалением и модификацией, в журнал. InvalidRequest больше не встречается.

Этот вопрос больше к работе сервера и разработчикам, как появляется ORDER_STATE_REQUEST_ADD.

Наверное, в терминале достаточно большой таймаут стоит на ожидание ответа сервера...
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий