"Posição flutuanteSelect() erro - página 4

 
prostotrader:

Mais uma vez, para "candidatos", "médicos", "professores" e "acadêmicos".

Qualquer evento vindo à OnTradeTransaction() pode ser perdido

É por isso que eu acho que é um erro que após receber um evento significativoTRADE_TRANSACTION_HISTORY_ADD

os dados no terminal não serão atualizados!

Em Ajuda(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Uma solicitação comercial enviada manualmente do terminal ou através das funçõesOrderSend()/OrderSendAsync() pode gerar várias transações comerciais consecutivas no servidor comercial. A ordem de chegada dessas transações ao terminal não é garantida, portanto, não podemos construir nosso algoritmo comercial na espera da chegada de algumas transações comerciais depois de outras. Além disso, as transações podem ser perdidas ao serem entregues do servidor ao terminal.

Portanto, não está claro por que esta função é de todo necessária. Você simplesmente não deve usá-lo, só isso. Você mesmo tem que analisar o histórico de pedidos e negócios.

 
Dmitry Fedoseev:

Em Ajuda(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Não está claro, portanto, por que esta função é necessária. Você simplesmente não deve usá-lo, é tudo. Você mesmo tem que analisar a história das ordens e dos negócios.

Obrigado. Além disso, você também não precisa usar todas as outras funções :) (sem ofensa)
 

Quanto a pedidos, posições e transações.

Como escrito na ajuda - a seqüência de transações não é garantida - uma transação de transferência de ordem para o histórico pode ser recebida mais cedo do que uma transação de uma transação.
Mudar uma posição no terminal é estritamente o resultado do recebimento de uma transação comercial, portanto seu recebimento é uma garantia de que a posição mudou.
A obtenção de uma transação para transferir uma ordem para o histórico garante apenas que a ordem deixou de estar ativa (aberta) e foi movida para o histórico da ordem.


Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

Quanto a esta frase.

Parece ter permanecido na documentação de uma das versões iniciais do terminal com comércio assíncrono. Ela será removida em um futuro próximo. Os culpados serão executados.

 
MQ Alexander:

Quanto a pedidos, posições e transações.

Como escrito na ajuda - a seqüência de transações não é garantida - uma transação de transferência de ordem para o histórico pode ser recebida mais cedo do que uma transação de uma transação.
Mudar uma posição no terminal é estritamente o resultado do recebimento de uma transação comercial, portanto seu recebimento é uma garantia de que a posição mudou.
A obtenção de uma transação para transferir uma ordem para o histórico garante apenas que a ordem deixou de estar ativa (aberta) e foi movida para o histórico da ordem.


Quanto a esta frase.

Parece ter permanecido na documentação de uma das versões iniciais do terminal com comércio assíncrono. Ela será removida em um futuro próximo. Os culpados serão executados.

Muito obrigado!

E eu uma metralhadora (ou pelo menos uma espingarda), para participar do tiroteio? :)

 

MQ Alexander!

Gostaria de uma explicação mais detalhada sobre os ofícios e as posições.

Porque VOCÊ escreveu:

Изменение позиции в терминале происходит строго в результате получения сделочной транзакции, соответственно её получение является гарантией того что позиция поменялась.

E, de fato, acontece o seguinte:

Teste Expert Advisor construir 1375 abertura de demonstração (foi executado 2 vezes)

//+------------------------------------------------------------------+
//|                                              Test_deff_order.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
uint  order_req_id;
ulong order_ticket;
ulong magic=987142563;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   OrderPlace();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
    switch( trans.type )
    {
      case TRADE_TRANSACTION_REQUEST:
        if((order_req_id > 0) && (order_req_id==result.request_id))
        {
          if(result.retcode==TRADE_RETCODE_PLACED) order_ticket=result.order;
        }
      break;
      case TRADE_TRANSACTION_DEAL_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("Deal done. Ticket: ",trans.order);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("History done. Ticket: ",order_ticket);
         if(HistoryOrderSelect(order_ticket))
         {
           double vol_cur = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_CURRENT);
           double vol_init = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_INITIAL);
           datetime time_setup=datetime(HistoryOrderGetInteger(order_ticket,ORDER_TIME_SETUP));
           double deals_vol = GetDealsVolume(Symbol(),order_ticket,time_setup);
           Print("Volume initial: ",vol_init," Volume current: ",vol_cur," Deals done: ",deals_vol);
           if(PositionSelect(Symbol()))
           {
            Print("Position exists.");
           }
           else
           {
            Print("Position NOT exists.");
           }
         }
        }
      break;
    }
  }
///----
double GetDealsVolume(const string a_symbol,const ulong a_ticket,const datetime start)
  {
   double volume=0;
   if(HistorySelect(start-180,TimeTradeServer()+180))
     {
      int deals=HistoryDealsTotal();
      if(deals>0)
        {
         for(int i=deals-1; i>=0; i--)
           {
            ulong deal_ticket=HistoryDealGetTicket(i);
            ulong ticket=ulong(HistoryDealGetInteger(deal_ticket,DEAL_ORDER));
            if(( ticket>0) && (ticket==a_ticket))
              {
               volume+=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
              }
           }
        }
     }
   return( volume );
  } 
//---
//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void OrderPlace()
{
  ResetLastError();
  MqlTradeRequest request={0};
  MqlTradeResult  result={0};
  order_ticket=0;
  order_req_id=0;
    
//--- Fill structure
  request.action=TRADE_ACTION_DEAL;//PENDING;
  request.magic=magic;
  request.symbol=Symbol();
  request.volume=1;
  double step=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE); 
  request.price=0;//SymbolInfoDouble(Symbol(), SYMBOL_ASK);//-step;
  request.type = ORDER_TYPE_BUY;//BUY_LIMIT;
  request.comment = "";      
  request.type_filling = ORDER_FILLING_IOC; ///
  request.type_time = ORDER_TIME_DAY;
  if(OrderSendAsync(request, result))
  {
    if(result.retcode==TRADE_RETCODE_PLACED) 
    {
      order_req_id=result.request_id;
    }
    else
    {
      Print( __FUNCTION__, ": Error! Retcode: ",GetLastError());
    }
  }
  else
  {
    Print( __FUNCTION__, ": Order not sent!");
  }
}   
//+------------------------------------------------------------------+

E aqui, os resultados:

Ambas as vezes TRADE_TRANSACTION_HISTORY_ADD veio primeiro, mas

no primeiro caso não havia posição, mas no segundo caso era!

Como devo entender isso?

Esqueci de anexar o diário de bordo do terminal:

2016.08.15 15:37:14.935 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:17.694 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:17.702 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 8 ms
2016.08.15 15:37:17.721 Trades  '1007932': deal #7487011 buy 1.00 GAZR-9.16 at 13897 done (based on order #50942179)
2016.08.15 15:37:46.456 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897
2016.08.15 15:37:46.463 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897 placed for execution in 7 ms
2016.08.15 15:37:46.497 Trades  '1007932': deal #7487015 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942187)
2016.08.15 15:37:50.348 Experts expert Test_deff_order (GAZR-9.16,M1) removed
2016.08.15 15:37:51.845 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:53.776 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:53.786 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 9 ms
2016.08.15 15:37:53.807 Trades  '1007932': deal #7487017 buy 1.00 GAZR-9.16 at 13898 done (based on order #50942195)
2016.08.15 15:37:58.632 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898
2016.08.15 15:37:58.639 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898 placed for execution in 7 ms
2016.08.15 15:37:58.664 Trades  '1007932': deal #7487020 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942197)
2016.08.15 15:41:52.483 Experts expert Test_deff_order (GAZR-9.16,M1) removed
 

prostotrader, deixe-me fazer-lhe uma pergunta íntima. Por que você gosta tanto de ordens históricas e não gosta de ofícios? :-))

MQ Alexander disse:

Что касается ордеров, позиций и сделок.

Como escrito na Ajuda - a seqüência de transações recebidas não é garantida - a transação de transferência de pedidos para o histórico pode ser recebida antes da transação.
Mudar uma posição no terminal é estritamente resultado do recebimento de uma transação comercial, portanto, seu recebimento é uma garantia de que a posição mudou.
A obtenção de uma transação para transferir a ordem para o histórico só garante que a ordem deixou de estar ativa (aberta) e foi transferida para o histórico da ordem.

E no seu caso

case TRADE_TRANSACTION_DEAL_ADD


quase vazio...

E outra observação lírica. No conceito de MT5, a presença de uma ordem histórica reflete o fato de que houve uma tentativa de fazer uma troca. E não é o fato de ter sido executado. E, para descobrir, precisamos nos referir ao comércio. Ela já reflete o resultado da operação comercial. Então é mais lógico lidar com transações em seu código.

 
Dennis Kirichenko:

prostotrader, deixe-me fazer-lhe uma pergunta íntima. Por que você gosta tanto de ordens históricas e não gosta de ofícios? :-))

MQ Alexander disse:

E no seu caso


está quase vazio...

Estou respondendo à sua pergunta íntima.

Você provavelmente trabalha no mercado FOREX e lida com um único pedido,

Portanto, você "mente" persistentemente em um assunto que você nem mesmo entende.

Imagine que há dois volantes em um carro e dois motoristas que olham apenas para o

a estrada. Como o 1º motorista saberia que o outro motorista está dirigindo (digamos à direita)?

Veja também com cuidado:

Toda sua lógica primitiva é baseada na execução de uma ordem de mercado, portanto,

Vou chamar sua atenção para o fato de que há ordens limitadas e pendentes

que pode não ser totalmente executada, mas pode ser executada em porções.

 
prostotrader:

Além disso, olhe com cuidado:

E o que eu deveria ver lá?!

Você percebe que você acidentalmente obtém informações de posição no caso de TRADE_TRANSACTION_HISTORY_ADD?

E já lhe foi dito que...
 

prostotrader:

Toda sua lógica primitiva é baseada na execução de uma ordem de mercado, portanto,

Gostaria de chamar sua atenção para o fato de que existem ordens limitadas e pendentes

que pode não ser executado por inteiro, mas em partes.

Querida, não cabe a você julgar minha lógica primitiva...
 
Dennis Kirichenko:
Não é você que deve julgar minha lógica primitiva...

E quem deve julgar?

Eu julgo suas habilidades pelas suas declarações!

O quadro não é claramente bonito :(

Isso faz mais sentido, "Professor"?

E não me lembro deMQ Alexander ter delegado você para responder por ele.