Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 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);
      }   

A volte restituisce l'errore 4108 - biglietto sbagliato per OrderClose. È possibile che OrderTicket() non corrisponda al biglietto in OrderSelect? La variabile biglietto può essere uguale a zero.

Mi ci vuole molto tempo per riprodurre l'errore, è più facile chiedere.
 
Dmitri Custurov:

A volte restituisce l'errore 4108 - biglietto sbagliato per OrderClose. È possibile che OrderTicket() non corrisponda al biglietto in OrderSelect? La variabile biglietto può essere uguale a zero.

Mi ci vuole molto tempo per riprodurre l'errore, è più facile chiedere.

Si seleziona un ordine per biglietto. Sei sicuro che l'ordine selezionato non sia già chiuso? Ma voi provate a chiuderlo di nuovo ... Controlla l'orario di chiusura dopo aver selezionato con successo il biglietto.

 
Artyom Trishkin:

Stai selezionando l'ordine sul biglietto. E sei sicuro che l'ordine selezionato non sia già chiuso? Ma state cercando di chiuderla di nuovo. Controlla l'orario di chiusura dopo una selezione riuscita sul biglietto.

Controllerò quando riprodurrò l'errore. Ho tutti i biglietti memorizzati in variabili globali. Quando l'ordine viene chiuso, vengono cancellati. Prima di OrderSelect() il biglietto viene preso dalle variabili globali. Se il biglietto non è nelle variabili - questa variabile sarà 0, e quindi l'ordine non dovrebbe essere selezionato e OrderSelect() restituirà false. Ma in generale, sì, vale la pena controllare. Grazie.

 
Dmitri Custurov:

Controllerò quando riprodurrò l'errore. Ho tutti i biglietti memorizzati in variabili globali. Quando l'ordine viene chiuso, vengono cancellati. Prima di OrderSelect() il biglietto viene preso dalle variabili globali. Se il biglietto non è nelle variabili - questa variabile sarà 0, e quindi l'ordine non dovrebbe essere selezionato e OrderSelect() restituirà false. Ma in generale, sì, vale la pena controllare. Grazie.

È standard controllare il prezzo di chiusura quando un ordine è selezionato dal ticket. Non sapresti in nessun altro modo se l'ordine è chiuso e selezionato dalla lista degli ordini chiusi, o se è ancora aperto e selezionato dalla lista degli ordini a mercato.

Il modo più miope è quello di memorizzare i biglietti in variabili globali. Dovrebbero essere presi dall'ambiente di trading - le informazioni attuali sono lì.

 
Artyom Trishkin:

È standard controllare il prezzo di chiusura quando un ordine è selezionato dal ticket. Non saprai in nessun altro modo se l'ordine è chiuso e viene selezionato dalla lista degli ordini chiusi, o se è ancora aperto e viene selezionato dalla lista degli ordini a mercato.

È il più miope memorizzare i biglietti in variabili globali. Dovrebbero essere presi dall'ambiente di trading - le informazioni attuali sono lì.

Se seleziono così: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), dovrebbe risolvere parzialmente il problema? Memorizzo i biglietti in variabili globali per altri motivi, beh, l'ho usato anche in questo caso.

 
Dmitri Custurov:

Se seleziono così: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), dovrebbe risolvere parzialmente il problema? Memorizzo i biglietti in variabili globali per altri motivi, e li ho usati anche in questo caso.

No, non lo farà - il pool (MODE_TRADES) è ignorato durante la selezione per biglietto.

 
Dmitri Custurov:

A volte restituisce l'errore 4108 - biglietto sbagliato per OrderClose. È possibile che OrderTicket() non corrisponda al biglietto in OrderSelect? La variabile del biglietto potrebbe essere uguale a zero.

Mi ci vuole molto tempo per riprodurre l'errore, è molto più facile chiedere.

Di solito è sufficiente controllare gli ordini di mercato:

OrderCloseTime() == 0 //l'ordine è aperto

OrderCloseTime() > 0 //l'ordine è chiuso

per gli ordini limite, si dovrebbe anche controllare il prezzo di chiusura; se è uguale a 0, l'ordine limite è stato cancellato

 
Grazie a tutti per le vostre risposte, ho capito ))
 

Ciao!

Condividete il codice usando il metodo PositionClosePartial, se potete.

Teoricamente capisco come funziona, ma mi piacerebbe vedere del codice funzionante.

O consigliarmi dove cercare.

Grazie in anticipo.

 
odyn:

Ciao!

Condividete il codice usando il metodo PositionClosePartial, se potete.

Teoricamente capisco come funziona, ma mi piacerebbe vedere del codice funzionante.

O consigliarmi dove cercare.

Vi sono grato in anticipo.

In realtà è solo una linea di codice. Ma devi ottenere il biglietto di posizione per questo. Ecco l'Expert Advisor di OnInit che apre la posizione con 0,2 lotti e chiude metà della posizione in 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);
   }
 }
//+------------------------------------------------------------------+

Oppure ecco il codice completo della 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));
  }
File:
00.mq5  5 kb