"Errore di PositionSelect() fluttuante - pagina 4

 
prostotrader:

Ancora una volta, per "candidati", "medici", "professori" e "accademici".

Qualsiasi evento che arriva a OnTradeTransaction() può essere perso

Ecco perché penso che sia un errore che dopo aver ricevuto l'evento significativoTRADE_TRANSACTION_HISTORY_ADD

i dati nel terminale non saranno aggiornati!

In Aiuto(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Una richiesta di compravendita inviata manualmente dal terminale o tramite le funzioniOrderSend()/OrderSendAsync() può generare diverse transazioni commerciali consecutive sul server commerciale. L'ordine di arrivo di queste transazioni nel terminale non è garantito, quindi non possiamo costruire il nostro algoritmo di trading aspettando l'arrivo di alcune transazioni commerciali dopo altre. Inoltre, le transazioni possono essere perse quando vengono consegnate dal server al terminale.

Pertanto, non è chiaro perché questa funzione sia necessaria. Semplicemente non dovreste usarlo, tutto qui. Devi analizzare tu stesso la storia degli ordini e degli affari.

 
Dmitry Fedoseev:

In Aiuto(https://www.mql5.com/ru/docs/basis/function/events#ontradetransaction):

Non è quindi chiaro perché questa funzione sia necessaria. Semplicemente non dovresti usarlo, tutto qui. Dovete analizzare voi stessi la storia degli ordini e delle compravendite.

Grazie. Inoltre, non è necessario utilizzare tutte le altre funzioni :) (senza offesa)
 

Per quanto riguarda gli ordini, le posizioni e le transazioni.

Come scritto nell'aiuto - la sequenza delle transazioni non è garantita - la transazione di trasferimento dell'ordine alla storia può essere ricevuta prima della transazione della transazione.
Cambiare una posizione nel terminale è strettamente un risultato della ricezione di una transazione commerciale, quindi la sua ricezione è una garanzia che la posizione è cambiata.
Ottenere una transazione per trasferire un ordine nella cronologia assicura solo che l'ordine ha cessato di essere attivo (aperto) ed è stato spostato nella cronologia degli ordini.


Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

Per quanto riguarda questa frase.

Sembra essere rimasto nella documentazione di una delle versioni iniziali del terminale con trading asincrono. Sarà rimosso nel prossimo futuro. I colpevoli saranno giustiziati.

 
MQ Alexander:

Per quanto riguarda gli ordini, le posizioni e le transazioni.

Come scritto nell'aiuto - la sequenza delle transazioni non è garantita - una transazione di trasferimento di ordine alla storia può essere ricevuta prima di una transazione di un affare.
Cambiare una posizione nel terminale è strettamente un risultato della ricezione di una transazione commerciale, quindi la sua ricezione è una garanzia che la posizione è cambiata.
Ottenere una transazione per trasferire un ordine nella cronologia assicura solo che l'ordine ha cessato di essere attivo (aperto) ed è stato spostato nella cronologia degli ordini.


Per quanto riguarda questa frase.

Sembra essere rimasto nella documentazione di una delle versioni iniziali del terminale con trading asincrono. Sarà rimosso nel prossimo futuro. I colpevoli saranno giustiziati.

Grazie mille!

E io una mitragliatrice (o almeno un fucile), per partecipare alle riprese? :)

 

MQ Alexander!

Vorrei una spiegazione più estesa degli scambi e delle posizioni.

Perché TU hai scritto:

Изменение позиции в терминале происходит строго в результате получения сделочной транзакции, соответственно её получение является гарантией того что позиция поменялась.

E infatti risulta quanto segue:

Test Expert Advisor build 1375 apertura demo (è stato eseguito 2 volte)

//+------------------------------------------------------------------+
//|                                              Test_deff_order.mq5 |
//|                                                   Copyright 2016 |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
uint  order_req_id;
ulong order_ticket;
ulong magic=987142563;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   OrderPlace();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
    switch( trans.type )
    {
      case TRADE_TRANSACTION_REQUEST:
        if((order_req_id > 0) && (order_req_id==result.request_id))
        {
          if(result.retcode==TRADE_RETCODE_PLACED) order_ticket=result.order;
        }
      break;
      case TRADE_TRANSACTION_DEAL_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("Deal done. Ticket: ",trans.order);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD:
        if((order_ticket!=0) && (trans.order==order_ticket))
        {
         Print("History done. Ticket: ",order_ticket);
         if(HistoryOrderSelect(order_ticket))
         {
           double vol_cur = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_CURRENT);
           double vol_init = HistoryOrderGetDouble(order_ticket,ORDER_VOLUME_INITIAL);
           datetime time_setup=datetime(HistoryOrderGetInteger(order_ticket,ORDER_TIME_SETUP));
           double deals_vol = GetDealsVolume(Symbol(),order_ticket,time_setup);
           Print("Volume initial: ",vol_init," Volume current: ",vol_cur," Deals done: ",deals_vol);
           if(PositionSelect(Symbol()))
           {
            Print("Position exists.");
           }
           else
           {
            Print("Position NOT exists.");
           }
         }
        }
      break;
    }
  }
///----
double GetDealsVolume(const string a_symbol,const ulong a_ticket,const datetime start)
  {
   double volume=0;
   if(HistorySelect(start-180,TimeTradeServer()+180))
     {
      int deals=HistoryDealsTotal();
      if(deals>0)
        {
         for(int i=deals-1; i>=0; i--)
           {
            ulong deal_ticket=HistoryDealGetTicket(i);
            ulong ticket=ulong(HistoryDealGetInteger(deal_ticket,DEAL_ORDER));
            if(( ticket>0) && (ticket==a_ticket))
              {
               volume+=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
              }
           }
        }
     }
   return( volume );
  } 
//---
//+------------------------------------------------------------------+
//| Place order                                                      |
//+------------------------------------------------------------------+
void OrderPlace()
{
  ResetLastError();
  MqlTradeRequest request={0};
  MqlTradeResult  result={0};
  order_ticket=0;
  order_req_id=0;
    
//--- Fill structure
  request.action=TRADE_ACTION_DEAL;//PENDING;
  request.magic=magic;
  request.symbol=Symbol();
  request.volume=1;
  double step=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE); 
  request.price=0;//SymbolInfoDouble(Symbol(), SYMBOL_ASK);//-step;
  request.type = ORDER_TYPE_BUY;//BUY_LIMIT;
  request.comment = "";      
  request.type_filling = ORDER_FILLING_IOC; ///
  request.type_time = ORDER_TIME_DAY;
  if(OrderSendAsync(request, result))
  {
    if(result.retcode==TRADE_RETCODE_PLACED) 
    {
      order_req_id=result.request_id;
    }
    else
    {
      Print( __FUNCTION__, ": Error! Retcode: ",GetLastError());
    }
  }
  else
  {
    Print( __FUNCTION__, ": Order not sent!");
  }
}   
//+------------------------------------------------------------------+

Ed ecco i risultati:

Entrambe le volte TRADE_TRANSACTION_HISTORY_ADD è venuto prima, ma

nel primo caso non c'era posizione, ma nel secondo caso sì!

Come dovrei capirlo?

Ho dimenticato di allegare il log del terminale:

2016.08.15 15:37:14.935 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:17.694 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:17.702 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 8 ms
2016.08.15 15:37:17.721 Trades  '1007932': deal #7487011 buy 1.00 GAZR-9.16 at 13897 done (based on order #50942179)
2016.08.15 15:37:46.456 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897
2016.08.15 15:37:46.463 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942179 buy 1.00 GAZR-9.16 13897 placed for execution in 7 ms
2016.08.15 15:37:46.497 Trades  '1007932': deal #7487015 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942187)
2016.08.15 15:37:50.348 Experts expert Test_deff_order (GAZR-9.16,M1) removed
2016.08.15 15:37:51.845 Experts expert Test_deff_order (GAZR-9.16,M1) loaded successfully
2016.08.15 15:37:53.776 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market
2016.08.15 15:37:53.786 Trades  '1007932': exchange buy 1.00 GAZR-9.16 at market placed for execution in 9 ms
2016.08.15 15:37:53.807 Trades  '1007932': deal #7487017 buy 1.00 GAZR-9.16 at 13898 done (based on order #50942195)
2016.08.15 15:37:58.632 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898
2016.08.15 15:37:58.639 Trades  '1007932': exchange sell 1.00 GAZR-9.16 at market, close #50942195 buy 1.00 GAZR-9.16 13898 placed for execution in 7 ms
2016.08.15 15:37:58.664 Trades  '1007932': deal #7487020 sell 1.00 GAZR-9.16 at 13892 done (based on order #50942197)
2016.08.15 15:41:52.483 Experts expert Test_deff_order (GAZR-9.16,M1) removed
 

prostotrader, lascia che ti faccia una domanda intima. Perché sei così affezionato agli ordini storici e non agli scambi? :-))

MQ Alexander ha detto:

Что касается ордеров, позиций и сделок.

Come scritto nell'Aiuto - la sequenza delle transazioni in entrata non è garantita - la transazione di trasferimento dell'ordine alla storia può essere ricevuta prima della transazione.
Cambiare una posizione nel terminale è strettamente un risultato della ricezione di una transazione commerciale, quindi la sua ricezione è una garanzia che la posizione è cambiata.
Ottenere una transazione per trasferire l'ordine nella storia garantisce solo che l'ordine ha cessato di essere attivo (aperto) ed è stato trasferito nella storia dell'ordine.

E nel tuo caso

case TRADE_TRANSACTION_DEAL_ADD


quasi vuoto...

E un altro commento lirico. Nel concetto di MT5 la presenza di un ordine storico riflette il fatto che c'è stato un tentativo di fare un trade. E non è il fatto che sia stato eseguito. E per scoprirlo dobbiamo fare riferimento al commercio. Riflette già il risultato dell'operazione commerciale. Allora è più logico trattare le transazioni nel tuo codice...

 
Dennis Kirichenko:

prostotrader, lascia che ti faccia una domanda intima. Perché sei così affezionato agli ordini storici e non agli scambi? :-))

MQ Alexander ha detto:

E nel tuo caso


è quasi vuoto...

Rispondo alla tua domanda intima.

Probabilmente lavorate sul mercato FOREX e trattate con un singolo ordine,

Quindi si ostina a "mentire" in una questione che non capisce nemmeno.

Immaginate che ci siano due volanti in una macchina e due guidatori che guardano entrambi solo il

la strada. Come farebbe il 1° pilota a sapere che l'altro pilota sta sterzando (diciamo a destra)?

Guarda anche con attenzione:

Tutta la vostra logica primitiva è basata sull'esecuzione di un ordine a mercato, quindi,

Porto alla vostra attenzione che ci sono ordini limitati e pendenti

che può non essere eseguito completamente ma può essere eseguito in porzioni.

 
prostotrader:

Inoltre, guarda attentamente:

E cosa dovrei vedere lì?

Vi rendete conto che ottenete accidentalmente informazioni sulla posizione nel caso TRADE_TRANSACTION_HISTORY_ADD?

E vi è già stato detto che...
 

prostotrader:

Tutta la vostra logica primitiva si basa sull'esecuzione di un ordine a mercato, quindi,

Vorrei portare alla vostra attenzione che ci sono ordini limitati e in sospeso

che non può essere eseguito per intero ma in parti.

Piccola, non sta a te giudicare la mia logica primitiva...
 
Dennis Kirichenko:
Non sei tu a giudicare la mia logica primitiva...

E chi deve giudicare?

Giudico le vostre capacità dalle vostre dichiarazioni!

L'immagine non è chiaramente bella :(

È più chiaro, "professore"?

E non ricordo cheMQ Alexander ti abbia delegato a rispondere per lui.

Motivazione: