Come si apre correttamente un ordine a mercato?

 

Recentemente ho sollevato un argomento sulla riapertura degli ordini. Pensavo di aver risolto il problema, dato che tutto funzionava molto bene per una settimana. Ma oggi ho riscontrato un problema simile solo all'apertura.
Si sono aperti molti ordini su Finam, e 9 su Otkritie...anche se solo un ordine avrebbe dovuto aprirsi in tutti i casi.

Ecco uno snippet di codice dall'EA

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

cioè possiamo vedere dal codice che se l'operazione ha successo, aumenta la variabileOpenOrders, che inizialmente è uguale a 0

Se è superiore a 0, non dovrebbe esserci un'ulteriore apertura dell'ordine, ma l'intera pila di ordini viene aperta con il commento Ordine1.

Controllo se c'è una risposta positiva nella funzione che apre l'ordine e se il biglietto d'ordine è stato ricevuto, ma per qualche motivo questa funzione restituisce falso, anche se l'ordine è effettivamente impostato.

Spiegare cosa c'è di sbagliato, come risolvere questo problema?

 
Presumo che l'informazione sull'accordo non sia ancora arrivata. Qui (evidenziato in rosso) ci si affida alla fortuna. Ed è una signora capricciosa :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
 
Gennady Mazur:

Recentemente ho sollevato la questione della riapertura degli ordini. Pensavo di aver risolto il problema perché tutto funzionava molto bene per una settimana. Ma oggi ho riscontrato un problema simile solo con l'apertura.
Un numero molto elevato di ordini si è aperto su Finam, e 9 su Otkritie... anche se in tutti i casi si sarebbe dovuto aprire un solo ordine.

Ecco uno snippet di codice dall'EA

    if(OpenOrders<1)
    {
        Coment="Open Sell "+string(OpenOrders+1);
        ret=OpenSellPosition(_Symbol,volume,Coment,Sleeppage,Filling);
    }
    
    
  if(ret)
  {
    OpenOrders++;
    PriceLastOpen=price;
  }

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
}

cioè possiamo vedere dal codice che se l'operazione ha successo, aumenta la variabileOpenOrders, che inizialmente è uguale a 0

Se è superiore a 0, non dovrebbe esserci un'ulteriore apertura dell'ordine, ma l'intera pila di ordini viene aperta con il commento Ordine1.

Controllo se c'è una risposta positiva nella funzione che apre l'ordine e se il biglietto d'ordine è stato ricevuto, ma per qualche motivo questa funzione restituisce falso, anche se l'ordine è effettivamente impostato.

Puoi spiegare cosa c'è di sbagliato e come risolvere questo problema?

Cattiva eredità forex.

Dovresti controllare irisultati.ordine.

Se l'ordine viene effettuato, non significa che l'affare sia già stato fatto.

 
Sergey Chalyshev:

Cattiva eredità forex.

Dobbiamo controllare.ordine.

Se viene piazzato un ordine, non significa che un'operazione sia già stata eseguita.

Avresti ragione se mettessi ordini pendenti, ma io lavoro per mercato e qui il biglietto si ottiene conResults.deal
 
Dennis Kirichenko:
Presumo che l'informazione sull'accordo non sia ancora arrivata. Qui (evidenziato in rosso) ci si affida alla fortuna. Ed è una signora capricciosa :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
No, questo risultato è presente, questo non è un ordine di ticket sul server, questa è un'operazione temporanea di ticket, che sarà poi sostituita da una posizione di ticket
 
Dennis Kirichenko:
Presumo che l'informazione sull'accordo non sia ancora arrivata. Qui (evidenziato in rosso) ci si affida alla fortuna. Ed è una signora capricciosa :-))

bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=10, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK)
{
  MqlTradeRequest Request;
  MqlTradeResult Results;
  ZeroMemory(Request);
  ZeroMemory(Results);
  Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
  Request.action=TRADE_ACTION_DEAL;
  Request.type=ORDER_TYPE_SELL;
  Request.symbol=symbol;
  Request.volume=volume;      
  Request.deviation=deviation;
  Request.comment=comment;  
  Request.type_filling=filling;
  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);

  }
  return(false);
}
E mi è stato assicurato in un thread precedente, il guru di questo forum, che questa informazione arriva sempre ... quasi istantaneamente ... e se il server ha risposto positivamente il biglietto non viene emesso, l'ordine è fallito
 

È necessario registrare tutte le transazioni. Per esempio, così:

prima nella "testata" colleghiamo la classe CTrade trade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

e qui c'è un esempio di operazione Buy:

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

quindi si possono ottenere due errori: primo livello - l'operazione non ha superato il controllo di base e secondo livello - controllo del biglietto di scambio.

Poi, se c'è un problema, puoi usare i log per capirlo.

Aggiunto: quanto sopra è vero per il modo di funzionamento SYNC.

 

Ora i guru qui insegneranno anche a te ))

Объясните что не так, как решить данную проблему? 

Con la tua esperienza, è sconveniente fare queste domande qui.

 
Vladimir Karputov:

È necessario registrare tutte le transazioni. Per esempio, così:

prima nell'"intestazione" colleghiamo la classe CTrade trade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

ed ecco un esempio di operazione Buy:

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

quindi si possono ottenere due errori: primo livello - l'operazione non ha superato il controllo di base e secondo livello - controllo del biglietto di scambio.

Poi, se c'è un problema, puoi usare i log per capirlo.

Aggiunto: quanto sopra è vero per il modo di funzionamento SYNC.

È esattamente così che ho fatto.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
solo con il mio codice
 
Vladimir Karputov:

È necessario registrare tutte le transazioni. Per esempio, così:

prima nella "testata" colleghiamo la classe CTrade trade

#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object

e qui c'è un esempio di operazione Buy:

   if(m_trade.Buy(lots,NULL,m_symbol.Ask(),sl,tp))
     {
      if(m_trade.ResultDeal()==0)
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());

      else
         Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription());
     }
   else
      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
            ", description of result: ",m_trade.ResultRetcodeDescription());

in modo da ottenere due errori: primo livello - l'operazione non ha superato il controllo di base e secondo livello - controllo del biglietto di scambio.

Poi, se c'è un problema, puoi usare i log per capirlo.

Aggiunto: quanto sopra è vero per il modo di funzionamento SYNC.

Oh e un'altra cosa, la funzione standard supporta l'esecuzione degli ordini, la loro archiviazione, perché ho usato SeaTrade per l'apertura, fino a quando sono arrivato a uno scambio dove gli ordini non volevano essere eseguiti in quanto era impossibile determinare l'archiviazione
 
Gennady Mazur:
È esattamente quello che ho fatto.

  bool res=false;
  res=OrderSend(Request,Results);
  if(res)
  {
    if(Results.deal>0) return(true);
    else return(false);
  }
  return(false);
ma con il mio codice.
E la registrazione? Dovete emettere sia il completamento dell'operazione con successo che soprattutto il fallimento con un codice di errore.