Come lavorare correttamente in MT5 con OrderSend - pagina 2

 
fxsaber:
Questo è già un argomento terminologico. La brutta situazione è stata descritta in dettaglio sopra. Le librerie standard non ne tengono conto.

No.

Ma continuate a persistere. Non lo spiegherò ulteriormente.

 
Renat Fatkhullin:

No.

Ma continuate a persistere. Non lo spiegherò ulteriormente.

La gente ne scrive sul forum. E più di una volta. La reazione è proprio questa.

 
fxsaber:

La gente ne scrive sul forum. E più di una volta. La reazione è proprio questa.

La gente non vuole pensare da sola, ma vuole che gli altri lo facciano per loro... Purtroppo questo è il caso.
 
prostotrader:

Vuoi che ti aiuti ad aggirare questi inconvenienti (per esperienza personale di trading con i robot MT5 su un conto reale)?

Aggiunto

Assolutamente gratis :)

Aggiungete anche il vostro al salvadanaio.

Forum sul trading, sistemi di trading automatico e test di strategie di trading

In attesa della risposta del server dopo l'invio di OrderSend()

Denis Sartakov, 2016.10.08 15:43

La funzione è sincrona, solo che la storia non viene aggiornata in modo sincrono con il completamento di questa funzione,

Lo sto facendo in questo modo, penso che sia più facile che armeggiare con OnTrade(), e altre cose:

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+

 
prostotrader:
La gente non vuole pensare da sola, ma vuole che gli altri lo facciano per loro... Purtroppo questo è il caso.

Le persone non solo pensano, ma condividono anche le loro soluzioni. Gli sviluppatori tacciono su questo, purtroppo.

Non un solo esempio nella documentazione su questo argomento. E questo con la funzione principale.

 
fxsaber:

Le persone non solo pensano, ma condividono anche le loro soluzioni. Gli sviluppatori tacciono su questo, purtroppo.

Non un solo esempio nella documentazione su questo argomento. E questo con la funzione principale.

L'esempio che hai fatto sopra è, scusami, una completa assurdità.

Non è il posto giusto per iniziare!

 
prostotrader:

L'esempio che hai fatto sopra è, scusami, una completa assurdità.

Non è il posto giusto per iniziare!

La mia variante

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

fxsaber, 2016.10.09 09:39

Se viene inviato un OrderSend, bisogna RICORDARE (è qui che si trova la potenziale vulnerabilità) che è stato fatto. Poi ignora la storia corrente (ambiente di trading) finché non arriva il messaggio OnTrade appropriato. Una volta arrivato, RICORDATI di DIMENTICARE.

Quando non c'è REMEMBER, ci si può fidare della storia come in MT4.


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   is_busy=false; 
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!is_busy && (order_ticket==0)) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};
     
     if(PositionSelect(Symbol()))
     {
       if(OrderSend(request, result)
       {
         if(result.retcode==TRADE_RETCODE_PLACED) //для биржи TRADE_RETCODE_PLACED
         {
           if(result.order>0)
           {
             is_busy=true;
             order_ticket=result.order;
             Print("Order plased, ticket = ",result.order);
           }
           else
           {
             Print("Internal error!");
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print("Order NOT send!");
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

Approfittatene.

 
prostotrader:

Usalo.

Allora, in cosa è diverso da quello che ho scritto sopra? Un buon uomo mi ha persino inviato una bibbia seria sull'argomento.

La gente sta trovando soluzioni. Si trattava del fatto che gli stessi sviluppatori non ce l'hanno nemmeno nel SB.

 
fxsaber:

Quindi in che modo questo è diverso da quello che ho scritto sopra? Ho anche avuto un buon uomo che mi ha lasciato una bibbia seria sull'argomento.

La gente sta trovando soluzioni. Si trattava del fatto che gli stessi sviluppatori non ce l'hanno nemmeno nel SB.

Se non ti piace, non usarlo.