Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 854

 
Sto armeggiando con CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) e mi rendo conto che non è esattamente organizzato all'interno. Si tratta di 2 codici di ritorno - bool e ResultRetcode(). RetCode non è sempre azzerato internamente prima di restituire false, quindi se PositionClose dà false, RetCode può anche restituire TRADE_RETCODE_DONE. Sarebbe bello per gli sviluppatori sincronizzare questi 2 valori di ritorno.
 
. ... Rick D. ... .:
Sto armeggiando con CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX) e mi rendo conto che non è esattamente organizzato all'interno. Si tratta di 2 codici di ritorno - bool e ResultRetcode(). RetCode non è sempre azzerato internamente prima di restituire false, quindi se PositionClose dà false, RetCode può anche restituire TRADE_RETCODE_DONE. Sarebbe bello per gli sviluppatori sincronizzare questi 2 valori di ritorno.

Codice + esempio + log.

 
Ho trovato uno strano bug. Forse è solo per me.

COrderInfo::OrderType() restituisce sempre 0.

Per controllarlo, puoi inserire manualmente qualsiasi ordine pendente (BuyStop, SellStop, ...),
poi inserirlo nello script.
#include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart()
{
  ulong ticket = 250262937; //здесь ваш тикет
  
  if (!m_order.Select(ticket))
  {
    PrintFormat("COrderInfo::Select(#%I64u) failed", ticket);
    return;
  }
  
  PrintFormat("OrderType= %d", m_order.Type());
}

Forse qualcosa con la tabella delle funzioni virtuali? Nel debug, arrivo solo all'int virtuale CObject::Type()

PS. L'ho già capito da solo. COrderInfo ha 2 metodi simili: Type() e OrderType().

 
Vladimir Karputov:

Codice + esempio + registri.

Vedi che situazione intendo.

#include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart()
{ 
  int LErr;
  bool bRC;
  double price;

  ResetLastError();
  
  price = 0.0;
  bRC = m_trade.Buy(0.1, "EURUSD", price, 0.0, 0.0);

  LErr = GetLastError();

  PrintFormat("! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
  //---

  ulong ticket = 1; //Позиции с таким тикетом нет
  
  ResetLastError();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError();
  
  PrintFormat("! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

Non vedo alcun metodo SetResultRetcode e SetResultComment in CTrade per resettarli prima di ogni nuova operazione.

Devo ereditare la mia classe, dove aggiungo un solo metodo


class CTradeEx : public CTrade
{
public:
  void SetResult(MqlTradeResult& result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... .:

Vedi che situazione intendo.

Non vedo alcun metodo SetResultRetcode e SetResultComment in CTrade per resettarli prima di ogni nuova operazione.

Per quale motivo? Funzioni completamente inutili.

Primo: si spara in aria - si invia un ordine di scambio senza prima controllare - senza controllare ciò che l'operazione ha restituito. Guardate il riferimento:PositionClose è di tipo bool.

In secondo luogo, guardiamo la catena di chiusura della posizione: quando la posizione non viene trovata (non può essere selezionata dal ticket specificato), viene restituito "false".

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean

A quel punto, le strutture non vengono cancellate da nessuna parte - perché non ha senso - dopo tutto, la posizione non poteva essere selezionata prima, quindi non ci sono informazioni nelle strutture.

 
Vladimir Karputov:

Qual è il punto? Funzioni completamente inutili.

Primo: si spara in aria - si invia un ordine di scambio senza prima controllare - senza controllare ciò che l'operazione ha restituito. Guardiamo il riferimento:PositionClose è di tipo bool.

In secondo luogo, guardiamo la catena di chiusura della posizione: quando la posizione non viene trovata (non può essere selezionata dal ticket specificato), viene restituito "false".

Allo stesso tempo, le strutture non vengono cancellate da nessuna parte, poiché non ha senso - dopo tutto, la posizione non poteva essere selezionata prima, quindi non ci sono informazioni nelle strutture.

1) Possiamo anche dire che ResetLastError() è una funzione assolutamente inutile.

2) C'è un controllo del risultato restituito. Immaginate, per analogia, di chiamare qualche funzione WinAPI, questa restituisce un errore, e GetLastError() (analogo di ResultRetcode) restituisce qualsiasi ultimo codice.

Se aggiungo un controllo prima di chiamare PositionClose (cosa che farò), non sovrascrive nessun altro controllo prima di altre chiamate, quando il RetCode non cambierà.

Il mio Expert Advisor scrive informazioni nel log. Tutto ciò di cui ho bisogno è di scrivere in log sane ResultRetcode e ResultComment se qualche chiamata restituisce false.

 
. ... Rick D. ... .:

1) Potremmo anche dire che ResetLastError() è completamente inutile.

2) C'è un controllo dei risultati di ritorno. Immaginate, per analogia, di chiamare qualche funzione WinAPI, questa restituisce un errore, e GetLastError() (analogo di ResultRetcode) restituisce qualsiasi ultimo codice.

Se aggiungo un controllo prima di chiamare PositionClose (cosa che farò), non sovrascrive nessun altro controllo prima di qualsiasi altra chiamata quando il RetCode non cambia.

Il mio Expert Advisor scrive informazioni nel log. Tutto quello che devo fare è scrivere ResultRetcode e ResultComment sani nel log se qualche chiamata restituisce false.

Leggete nell'aiuto della classe CTrade quando avete bisogno dicontrollare il risultato dell'esecuzione della richiesta di compravendita (codice di ritorno del server di compravendita) chiamando il metodoResultRetcode().

 
Vladimir Karputov:

Leggere nell'aiuto della classe CTrade quandocontrollare il risultato dell'esecuzione della richiesta di compravendita (codice di ritorno del server di compravendita) chiamando il metodoResultRetcode().

Si può affermare che.

1) Se PositionClose restituisce false, allora il Retcode non viene mai riempito?

2) Se PositionClose ritorna true, allora il Retcode è sempre popolato?

 
Vladimir Karputov:

Ordine -> commercio -> posizione. Prendi il prezzo di apertura della posizione.

Potete mostrare un'immagine di come questo Ordine -> commercio -> posizione, è al di sotto di dove i commerci sono scritti quindi non permette di copiare lì


 
Seric29:

Puoi mostrare un'immagine di come questo Order -> trade -> position, è in basso dove sono scritti i trade e quindi non ti permette di copiare.


Per favore, riscrivi la tua domanda o metti dei segni di punteggiatura, o meglio ancora aggiungi un'immagine cosa, dove e chi. Altrimenti si scopre che vedo lettere familiari, ma non riesco a capire il significato e il tuo punto.