Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1110

 
if(OrderSelect(ticket, SELECT_BY_TICKET)){
      double lots;
      string symbol = OrderSymbol(); 
      while(true){
         RefreshRates();
         double price;
         parseClosePrice(OrderType(), symbol, price);
         if(OrderClose(OrderTicket(), OrderLots(), price, 500)){
            break;
         }else{
            Print(GetLastError());
         }              
         Sleep(1000);
      }   

Erro de devolução 4108 às vezes - bilhete errado para OrderClose. É possível que OrderTicket() não corresponda ao bilhete em OrderSelect? A variável do bilhete pode ser igual a zero.

Demoro muito tempo para reproduzir o erro, é mais fácil de perguntar.
 
Dmitri Custurov:

Erro de retorno 4108 às vezes - bilhete errado para OrderClose. É possível que OrderTicket() não corresponda ao bilhete em OrderSelect ? A variável do bilhete pode ser igual a zero.

Demoro muito tempo para reproduzir o erro, é mais fácil de perguntar.

Você seleciona um pedido por bilhete. Você tem certeza de que a ordem selecionada ainda não está fechada? Mas você tenta fechá-lo novamente ... Verifique o horário de fechamento após selecionar com sucesso o bilhete.

 
Artyom Trishkin:

Você está selecionando o pedido no bilhete. E você tem certeza de que a ordem selecionada ainda não está fechada? Mas você está tentando fechá-lo novamente. Verifique o horário de fechamento após uma seleção bem sucedida no bilhete.

Vou verificar quando reproduzir o erro. Tenho todos os bilhetes armazenados em variáveis globais. Quando o pedido é fechado, eles são apagados. Antes de OrderSelect(), o bilhete é retirado de variáveis globais. Se o bilhete não estiver em variáveis - esta variável será 0, e assim a ordem não deve ser selecionada e OrderSelect() retornará falsa. Mas em geral, sim, vale a pena verificar. Obrigado.

 
Dmitri Custurov:

Vou verificar quando reproduzir o erro. Tenho todos os bilhetes armazenados em variáveis globais. Quando o pedido é fechado, eles são apagados. Antes de OrderSelect(), o bilhete é retirado de variáveis globais. Se o bilhete não estiver em variáveis - esta variável será 0, e assim a ordem não deve ser selecionada e OrderSelect() retornará falsa. Mas em geral, sim, vale a pena verificar. Obrigado.

É padrão verificar o preço de fechamento quando um pedido é selecionado por bilhete. Você não saberia de outra forma se a ordem é fechada e selecionada da lista de ordens fechadas, ou se ainda está aberta e selecionada da lista de ordens de mercado.

A maneira mais míope é armazenar os bilhetes em variáveis globais. Eles devem ser retirados do ambiente comercial - as informações atuais estão lá.

 
Artyom Trishkin:

É padrão verificar o preço de fechamento quando um pedido é selecionado por bilhete. Você não saberá de outra forma se o pedido está fechado e selecionado da lista de fechados, ou se ainda está aberto e selecionado da lista de fechados do mercado.

É o mais míope para armazenar bilhetes em variáveis globais. Eles devem ser retirados do ambiente comercial - as informações atuais estão lá.

Se eu selecionar assim: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), é suposto resolver parcialmente o problema? Guardo os bilhetes em variáveis globais por outros motivos, bem, também os utilizei neste caso.

 
Dmitri Custurov:

Se eu selecionar assim: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), é suposto resolver parcialmente o problema? Guardo bilhetes em variáveis globais por outros motivos, e os utilizei também neste caso.

Não, não será - o pool (MODE_TRADES) é ignorado durante a seleção por bilhete.

 
Dmitri Custurov:

Erro de devolução 4108 às vezes - bilhete errado para OrderClose. É possível que OrderTicket() não corresponda ao bilhete em OrderSelect ? A variável do bilhete pode ser igual a zero.

Levo muito tempo para reproduzir o erro, é muito mais fácil de perguntar.

Geralmente é suficiente para verificar as ordens do mercado:

OrderCloseTime() == 0 // pedido está aberto

OrderCloseTime() > 0 //o pedido está fechado

para ordens de limite, você também deve verificar o preço de fechamento; se for igual a 0, a ordem de limite foi cancelada

 
Obrigado a todos vocês por suas respostas, eu entendo ))
 

Olá!

Compartilhe o código usando o método PositionClosePartial, se você puder.

Teoricamente eu entendo como funciona, mas gostaria de ver algum código de trabalho.

Ou me aconselhar onde procurar.

Agradecemos antecipadamente.

 
odyn:

Olá!

Compartilhe o código usando o método PositionClosePartial, se você puder.

Teoricamente eu entendo como funciona, mas gostaria de ver algum código de trabalho.

Ou me aconselhar onde procurar.

Agradeço antecipadamente.

Na verdade, é apenas uma linha de código. Mas você tem que obter o bilhete de posição para isso. Aqui está o Expert Advisor da OnInit que abre posição com 0,2 lote e fecha metade da posição na OnTick.

//+------------------------------------------------------------------+
//|                                                           00.mq5 |
//|                                          © 2020, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+
#property copyright "© 2020, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
ulong posTicket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
  trade.SetExpertMagicNumber(111);
  trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.2, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//---
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
  if(PositionSelectByTicket(posTicket) && PositionGetDouble(POSITION_VOLUME) > 0.1)
    trade.PositionClosePartial(posTicket, 0.1);
 }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
//---
  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)
   {
    if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == 111 && PositionGetString(POSITION_SYMBOL) == _Symbol)
      posTicket = PositionGetInteger(POSITION_TICKET);
   }
 }
//+------------------------------------------------------------------+

Ou aqui está o código completo da classe CTrade

//+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- for hedging mode only
   if(!IsHedging())
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- check volume
   double position_volume=PositionGetDouble(POSITION_VOLUME);
   if(position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   return(OrderSend(m_request,m_result));
  }
Arquivos anexados:
00.mq5  5 kb
Razão: