Come si apre correttamente un ordine a mercato? - pagina 5

 
Gennady Mazur:

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?

Inoltre, potete controllare l'apertura di una posizione provando a selezionarla. Ed è meglio provare più volte.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
C'è sia un ritardo che la conferma che la posizione è già in atto.

Ho anche notato che non c'è nessun controllo OrderCheck(Request, checkResult), il che è male.
 

Oh, e anche in ordine di mercato - prezzo = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); lascia perdere

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
 
Alexey Viktorov:
Inoltre, è possibile controllare l'apertura della posizione provando a selezionarla. Ed è meglio provare più volte

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
C'è sia il ritardo che la conferma che la posizione è già stata aperta.

Ho anche notato che non c'è nessun controllo OrderCheck(Request, checkResult), il che è male.

E se la posizione esistesse già?

O se c'è già una posizione ma l'ordine non viene riempito completamente?

 
Alexey Viktorov:
Inoltre, si può controllare l'apertura della posizione provando a selezionarla. E diversi tentativi sono migliori.

         int n = 0;
          do
           {
            n++;
           }
          while(!PositionSelectByTicket(tradeResult.deal) && n < 5);
C'è sia il ritardo che la conferma che la posizione è già in atto.

Inoltre ho notato che non c'è nessun controllo OrderCheck(Request, checkResult) e questo è male.

Bene, forse inseriròOrderCheck(Request, checkResult)
Grazie

Ma non mi piace particolarmente un tale ciclo

 
prostotrader:

Oh, e anche in ordine di mercato - prezzo = 0

Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); lascia perdere

bool SendOrderSyncMode()
  {
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
   order_ticket=0;
   request.action = TRADE_ACTION_DEAL;
   request.magic  = 9876543211;
   request.symbol = Symbol();
   request.volume = 1;
   request.price  = 0;
   request.type=ORDER_TYPE_BUY;
   request.comment="Sync mode";
   request.type_filling=ORDER_FILLING_FOK;
   request.type_time=ORDER_TIME_DAY;
   if(OrderSend(request,result))
     {
      if((result.retcode==TRADE_RETCODE_DONE) || (result.retcode==TRADE_RETCODE_PLACED))
        {
         if(result.order>0)
           {
            order_ticket=result.order;
            Print(__FUNCTION__," Order sent in sync mode");
            return(true);
           }
         else
           {
            Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
           }
        }
      else
        {
         Print(__FUNCTION__," Error order sent in sync mode! Retcode = ",result.retcode);
        }
     }
   else
     {
      Print(__FUNCTION__," Order not sent in sync mode.");
     }
   return(false);
  }
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   switch(trans.type)
     {
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket > 0) && (trans.order == order_ticket))
      {
        //Вот здесь и смотрим что произошло
      }
      break;
     }
  }
Grazie mille per la descrizione così dettagliata...e la spiegazione....
E riguardo al prezzo.... sì, sono più abituato a MT4, e lì devi sempre mettere il prezzo...
 
Sergey Chalyshev:

Ripetere

Oltre a questo, si dovrebbe anche controllare lo stato dell'ordine e se è già apparso nella storia o no.

Lo scambio non funziona con le posizioni, solo con gli ordini.

Davvero?
 
Gennady Mazur:
Avresti ragione se dovessi mettere ordini pendenti, ma io lavoro per mercato, e qui il biglietto si ottiene conResults.deal
Ancora, l'ordine viene inviato prima, poi viene eseguito.
 
Sergey Chalyshev:

Non capisco cosa significa il tuo sorriso?

Non mi aspettavo di sentirti dire questo. Quali pause, o stai scherzando?

Pausa dopo OrderSend() in modo che le informazioni di mercato e la storia possano essere aggiornate.
 
Sergey Chalyshev:

Cattiva eredità forex.

...

Dovresti stare attento a come lo dici. Altrimenti tanto vale parlare della mutazione genetica degli aderenti a FOORTS.
 
Sergey Chalyshev:

E se la posizione esistesse già?

O c'è già una posizione ma l'ordine non è stato riempito completamente?

Sì, e io sono tutto per la mia siepe. Ammetto che non avevo ragione. O totalmente sbagliato. :-)
Motivazione: