Il grande e terribile MT4 per sempre (o come strategizzare una transizione) - pagina 20

 
Andrey Khatimlianskii:

Non si può parlare con la lingua. Dovresti insegnarmi. Io, per favore.

C'è un problema, e non è solo in questo broker.
E il problema non è nell'attesa dell'esecuzione di un ordine specifico (quello è un altro discorso), ma nel fatto che al momento dell'esecuzione dell'ordine scompaiono temporaneamente da tutte le liste (aperte, chiuse, affari, posizioni).

Potremmo usare un'altra stampella, naturalmente. Ma vogliamo trovare una soluzione umana. E così fxsaber ci lavora pubblicamente, ascoltando i latrati dei benpensanti che passano.

Personalmente, spero che tu possa capire la documentazione

Mentre l'Expert Advisor gestisce le transazioni commerciali usando il gestore OnTradeTransaction(), il terminale continua a gestire le transazioni commerciali appena arrivate. Pertanto, lo stato di un conto commerciale può cambiare già mentre OnTradeTransaction() è in esecuzione. Per esempio, mentre un programma MQL5 gestisce un evento di aggiunta di un nuovo ordine, questo può essere eseguito, cancellato dalla lista di quelli aperti e spostato nella storia. Più avanti, il programma sarà informato di tutti questi eventi.
e questo si applica non solo al gestore dell'evento OnTradeTransaction(), ma anche a qualsiasi parte del codice dopo che OrderSend() è stato inviato. Attendere il completamento della transazione. Non ci sono e non ci saranno altre opzioni. Pensate perché tutto è così semplice in mql4? Beh, è perché queste aspettative sono poste lontano dai vostri occhi. E in MQL5, in qualche modo si pensa che tutti i controlli e le aspettative siano stampelle. Perché?
 
Alexey Viktorov:

Personalmente, spero che tu abbia abbastanza comprensione per queste parole di documentazione

E questo riguarda non solo il gestore dell'evento OnTradeTransaction(), ma anche qualsiasi parte di codice dopo l'invio di OrderSend(). Attendere il completamento della transazione. Non ci sono e non ci saranno altre opzioni. Pensate perché tutto è così semplice in mql4? Beh, è perché queste aspettative sono poste lontano dai vostri occhi. E in MQL5, in qualche modo si pensa che tutti i controlli e le aspettative siano stampelle. Perché?

Alexey, sei fuori tema. Mi dispiace, non ho tempo né voglia di spiegare tutto di nuovo.

 

ha provato in questo modo:

void OnTrade()
{
   HistorySelect(TimeCurrent(),0);
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

5 volte ho eseguito il mio codice, fino a quando esattamente 10 posizioni si aprono

 
Igor Makanu:

ha provato in questo modo:

Esegui il mio codice 5 volte, finché non si aprono esattamente 10 posizioni

Sembra un errore nell'impostazione degli input di HistorySelect.

 
fxsaber:

Sembra un errore nell'impostazione degli input di HistorySelect.

per raggiungere il server e sincronizzare

l'ha riscritto come una sceneggiatura:

//+------------------------------------------------------------------+
void OnStart()
{
   MqlTradeRequest BuyRequest = {0};
   MqlTradeResult result = {0};
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.type_filling = GetFilling();
   datetime t_start = TimeCurrent();
   while(PositionsTotal() < 10)
   {
      BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
      if(!HistorySelect(TimeCurrent(), t_start) || ! OrderSend(BuyRequest, result)) continue;
      if(PositionsTotal() >= 10) return;
   }
}
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
{
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
//+------------------------------------------------------------------+

l'ha eseguito diverse volte, apre anche 10 posizioni, ha aggiunto l'ora di inizio attuale dello script

 
Igor Makanu:

l'idea di raggiungere il server e sincronizzare

l'ha riscritto come una sceneggiatura:

l'ha eseguito alcune volte, apre anche 10 posizioni, ha aggiunto l'ora di inizio attuale dello script

Cosa mostrerà questo cambiamento?

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

      if(!_B(HistorySelect(TimeCurrent(), t_start), 1) || ! OrderSend(BuyRequest, result)) continue;
 
fxsaber:

Cosa mostrerà questo cambiamento?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0 mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh è attivo.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 20 mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) Alert: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

le posizioni sono ancora 10pc, nessun raddoppio ancora
 
Igor Makanu:

Le posizioni sono ancora 10 pezzi, nessun raddoppio ancora

Si può vedere chiaramente dal tempo di esecuzione di HistorySelect che non sta richiedendo nulla al server Trade.


Diverse versioni.

  1. Siete fortunati.
  2. Questo ramo ha causato un cambiamento silenzioso nella nuova build del Terminale. Il che è facile da confermare se c'è un contraccolpo in quelli vecchi.
  3. Comportamento insolito di HistorySelect quando From >= To.
  4. Server commerciale. Nome?


Prova allo stesso modo a sbarazzarti del raddoppio qui.

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

Il grande e potente MT4 per sempre (o come strategizzare correttamente per passare)

fxsaber, 2021.05.05 02:04

// Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  while (!IsStopped() && (PositionsTotal() <= 1)) // Закончим, когда появится более одной позиции.
    if (PositionsTotal() == 1)
      Trade.PositionClose(PositionGetTicket(0)); // Если есть позиция - закрываем.
    else if (!OrdersTotal())
      Trade.Buy(0.01); // Если нет позиции и ордера - открываем позицию.
}

Esegui questo codice su un conto demo vuoto e vedi se due posizioni si aprono in pochi secondi.

 

Sono venuto per caso e l'ho letto - è un peccato!

Non bisogna fidarsi di nessuno!
 
fxsaber:

Si può vedere chiaramente dal tempo di esecuzione di HistorySelect che non richiede nulla al server Trade.


Diverse versioni.

  1. Siete fortunati.
  2. Questo ramo ha causato un cambiamento silenzioso nella nuova build del Terminale. Il che è facile da confermare se c'è un contraccolpo in quelli vecchi.
  3. Comportamento insolito di HistorySelect quando From >= To.
  4. Server commerciale. Nome?


Prova allo stesso modo a sbarazzarti del raddoppio qui.

1. ahimè, non possiamo sopravvivere nel nostro business senza di esso ))

2. Chiedo pochi giorni fa quale build (non beta) è rilevante, silenzio, ho deciso di non aggiornare, su un portatile e su un PC è difficile capire quali build sono rilevanti - non ho lavorato con i terminali per un paio di mesi, non seguo. Ora sul PC build 2903.

3. Passo, tu sei responsabile di questo banchetto, gli sviluppatori sono silenziosi, la mia ipotesi... pollice nel cielo, penso che il problema è nella latenza di rete, e prese multiple? terminale, nessuna sincronizzazione, un socket prezzi, un altro OrderSend, un altro dove OnTrade()..... così i pacchetti stanno volando da dove e dove

4. ho robotforex + 100 mbps ottico (ETTH), ho avuto un cattivo internet mobile e fhopin sul mio computer portatile prima


Ho provato per 2 minuti, lo script ha sbandierato per 2 minuti, sempre una posizione, nessuna inversione, ho tolto lo script a mano