FORTS: Códigos de retorno OnTradeTransaction() - página 5

 

11.2Cobrança por transações errôneas.

As transações serão reconhecidas como errôneas se durante o curso da transação tiver sido atribuído um código de erro, conforme indicado na Tabela 2. Para determinar transações errôneas, entende-se por transação a apresentação de uma Ordem, retirada de uma Ordem, retirada de uma Ordem com apresentação simultânea de uma Ordem com condições de Transação diferentes, retirada de um par de Ordens com apresentação simultânea de um par de Ordens com condições de Transação diferentes.

O cálculo da Taxa para Transações Erradas deve ser feito para cada Login para o período desde a suspensão de negociação para a sessão de compensação noturna do Dia de Negociação atual (incluindo o primeiro segundo de suspensão) até a suspensão de negociação para a sessão de compensação noturna do Dia de Negociação seguinte (não incluindo o primeiro segundo de suspensão) (doravante - o Período de Cálculo).

O cálculo do valor da Taxa para transações errôneas será feito de acordo com a fórmula:

onde:

TranFee2 - o valor da Taxa para transações erradas feitas durante o Período de Liquidação (em rublos incluindo o IVA);

Cap - um limite para o valor máximo da Taxa para transações erradas estabelecido pelo Centro Técnico e publicado no site da Bolsa de Valores de Moscou;

xi- valor calculado por segundo, arredondado para baixo para números inteiros e determinado pela fórmula:

onde:

Qi- a soma de todos os pontos para o i-ésimo segundo (os pontos são determinados de acordo com a Tabela 2);

Li- o limite do login dado, que é calculado de acordo com a fórmula e arredondado para números inteiros:

Onde:

Capacityi- capacidade do login, determinada de acordo com o procedimento estipulado no ponto 3.2 deste anexo, válida para o i-ésimo segundo.

Tabela 2:

Tipo de transação*

Resultado da execução (código de erro)*

Pontuação Q

AddOrder

Ocorreu uma transação cruzada (31)

Q1

Insuficiência de fundos do cliente (332)

Q2

Insuficiência de fundos da corretora (333)

Q3

Oferta FOK não consolidada (4103)

Q4

DelOrder

Ordem não encontrada (14)

Q5

MoveOrder

Ocorreram trapaças (31)

Q6

Nenhumaordem foiencontrada (50)

Q7

Insuficiência de fundosdo cliente (332)

Q8

Fundosinsuficientesdaempresa decorretagem(333)

Q9

DelUserOrders

A transação foi concluída com sucesso,

e nenhuma ordem é excluída

Q10

* de acordo com a descrição do FORTS Plaza-2 Gateway.

Os valores dos pontos Q1-Q10 são estabelecidos por uma decisão do Centro Técnico e são publicados no site da Bolsa de Valores de Moscou.

Uma taxa para Transações errôneas será cobrada se a condição for cumprida:

onde:

TranFee2 - o valor da Taxa por Transações errôneas feitas durante o Período de Liquidação (em rublos incluindo o IVA);

Capmin- uma restrição ao valor mínimo da Taxa para Transações errôneas estabelecida pelo Centro Técnico e publicada no site da Bolsa de Valores de Moscou,

A taxa para Transações errôneas é cobrada a partir da seção de registro de compensação à qual o login para o qual a taxa para Transações errôneas é determinada está vinculada.

 
Infelizmente, apenas as fórmulas não são inseridas.
 
Dmitriy Skub:
Você quer que fiquemos bêbados?)) É tão difícil escrever uma figura?
Alexey Kozitsyn copiou apenas parte do texto desta disposição. Está mais claro agora? )) Temo que você ainda terá que dormir se quiser entender isso. ))
 

Qual é o código de retorno para este erro?

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        Инструмент отсутствует в текуще 
 

Retornando ao código de erro de solicitação inválida

Mudei a função para apagar um pouco o pedido:

//+------------------------------------------------------------------+
// 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;
  }
}

Função 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;            
  }
}

Após fazer o pedido:

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

O servidor MT 5 não enviou nenhuma resposta, a função CheckOrders() foi acionada e um ticket de pedido foi recebido:

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

Depois disso, o comando para apagar a ordem (EA) NÃO foi aprovado:

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

E isto também foi confirmado pelo terminal:

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]

Pergunta:

Qual é a situação da ordem na memória do terminal ?

Por que um pedido inválido?

Recebi um bilhete do ambiente do terminal, então o terminal "sabe" que o pedido está feito!

Afinal, mais tarde, a mesma função eliminou esta ordem com o mesmo bilhete:

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
 
Михаил:

Retornando ao código de erro de solicitação inválida

Mudei a função para apagar um pouco o pedido:

Função CheckError().

Após fazer o pedido:

O servidor MT 5 não enviou nenhuma resposta, a função CheckOrders() foi acionada e um ticket de pedido foi recebido:

Depois disso, o comando para apagar a ordem (EA) NÃO foi aprovado:

E isto também foi confirmado pelo terminal:

Pergunta:

Qual é a situação do pedido na memória do terminal ?

Por que um pedido inválido?

(recebi o bilhete do ambiente do terminal, então o terminal "sabe que o pedido foi feito")!

Há também isto:

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

Tente desta forma:

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

Há mais destes:

Sergei!

Por alguma razão me parece que se houver um bilhete (após a emissão de um mandado), não pode haver

seu estado:

ORDER_STATE_REQUEST_ADD
 
Михаил:

Sergei!

De alguma forma me parece que, se houver um bilhete (após a emissão de um mandado), não pode haver

Seu status:

Eu também penso assim, mas não é minha idéia, este erro é do diário de transações.

Após adicionar esta verificação, colocar todos os estados, antes de apagar e modificar, no registro. O InvalidRequest não ocorre mais.

Esta pergunta é mais para as operações do servidor e para os desenvolvedores comoORDER_STATE_REQUEST_ADD aparece.

 
Sergey Chalyshev:

Eu também acho que sim, mas não foi minha idéia, este erro é do registro da operação.

Após adicionar esta verificação, colocar todos os estados, antes de apagar e modificar, no registro. O InvalidRequest não ocorre mais.

Esta pergunta é mais para as operações do servidor e para os desenvolvedores comoORDER_STATE_REQUEST_ADD aparece.

Deve haver um tempo bastante longo no terminal esperando pela resposta do servidor.