Organizzazione del ciclo dell'ordine - pagina 5

 
Vasiliy Sokolov:

Il looping è una delle tecniche di programmazione più pericolose. Causa errori strani e poco frequenti che sono quasi impossibili da analizzare.

Al contrario, si dovrebbe cercare di terminare un thread utente il più rapidamente possibile, invece di andare in loop. Se vuoi avere una "mano sul polso" - analizza OnTradeTransaction in MT5. MT4 non è generalmente adatto per questi giochi, perché la semplicità è peggio del furto, come si dice.

Non intendevo una realizzazione concreta, ma il principio del TS che si agita dopo qualsiasi pausa. Bene e dove c'è una terribile fissazione - non è chiaro. Come non è chiaro, perché c'è una fretta di finire un thread utente.

 
fxsaber:

Dov'è il looping spaventoso lì - non è chiaro.

Chiamare OnTick da OnTick è un ciclo non banale attraverso la ricorsione:

// Редкий, но правильный костяк модификации ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
  if (OrderSelect(i, SELECT_BY_POS))
    if (OrderModify(OrderTicket(), Price, SL, TP, OrderExpiration()))     
    {
      i = OrdersTotal(); // Хотя бы так
      
      // А лучше так
      // OnTick(); break; // вместо строки выше лучше делать такой вызов (переполнения стека от рекурсивных вызовов быть не должно)
    }

Né è chiaro perché ci sia una fretta di terminare il thread degli utenti.

Stiamo lavorando con un modello event-driven. Quindi abbiamo bisogno di gestire l'evento corrente il più velocemente possibile per aspettare il prossimo. Il tempo trascorso nel thread è un buco nero. Più tempo passiamo nel flusso, più l'ambiente di trading è obsoleto.

 
Vasiliy Sokolov:

Chiamare OnTick da OnTick è un ciclo non banale attraverso la ricorsione:

A quanto pare, questa è l'unica cosa che fa da deterrente.

Stiamo lavorando con un modello di eventi. Pertanto, abbiamo bisogno di gestire l'evento corrente il più velocemente possibile per aspettare il prossimo. Il tempo trascorso nel flusso è un buco nero. Più tempo passiamo nel flusso, più l'ambiente di trading con cui lavoriamo è obsoleto.

Beh, non è vero!
 
:
void OnTick()
{
   for(int i = 0; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
      OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                        // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                        // Для дальнейшего анализа например в OnTransaction
   }
}

Non ci capiamo per niente. Non credo che ci possa essere alcun dialogo tra noi.

 
Vasiliy Sokolov:
:

Dove hai visto una pausa nel tuo codice, la cui semplice presenza è l'unica ragione per scuotere il TS da zero? Tu non ce l'hai!

 
fxsaber:

Dove hai visto una pausa nel tuo codice, la cui semplice presenza è l'unica ragione per scuotere il TS da zero? Non ce l'avete!

Quindi questo codice è un'illustrazione del perché il thread corrente deve essere terminato il prima possibile. Non dovreste nemmeno provare a richiedere l'ambiente di trading in OnTick:

void OnTick()
{
   for(int i = 0; i < symbols.Total(); i++)
   {
      request.symbol = symbols.At(i); 
      OrderSendAsynch(request, result); // Начиная с этой строки, анализировать торговое окружение в текущем потоке не имеет смысла
                                        // Единственная верная стратегия - как можно быстрее завершить цикл, и выйти из OnTick
                                        // Для дальнейшего анализа например в OnTransaction      
   }
   // Далее торговое окружение начинает меняться. Мы не можем анализировать его в OnTick
   // Бессмысленно зацикливать OnTick дальше.
   // Результат работы этого кода будет неопределен
   Sleep(50);
   int total_1 = OrdersTotal();
   Sleep(50);
   int total_2 = OrdersTotal();
   //Результат операции не определен
   if(total_1 == total_2)
}

Una volta che siamo al punto in cui le due variabili sono confrontate, non possiamo confrontarle perché l'ambiente continua a cambiare. I valori in total_1 e total_2 non sono più uguali tra loro, o sono entrambi obsoleti, o non contengono il numero di ordini esistenti, o contengono i valori corretti. È inutile combattere un ambiente di trading che cambia in OnTick, invece basta uscire da OnTick, subito dopo il ciclo for, e aspettare nuovi eventi che indicano che l'ambiente di trading è cambiato.

 
Vasiliy Sokolov:

Quindi questo codice è un'illustrazione del perché il thread corrente dovrebbe essere terminato il più rapidamente possibile. Non si può nemmeno tentare di interrogare l'ambiente di trading in OnTick:

Una volta che siamo al punto in cui le due variabili sono confrontate, non possiamo confrontarle perché l'ambiente continua a cambiare. I valori in total_1 e total_2 non sono più uguali tra loro, o sono entrambi obsoleti, o non contengono il numero di ordini esistenti, o contengono i valori corretti. È inutile lottare con il cambiamento dell'ambiente di scambio in OnTick, invece, abbiamo solo bisogno di uscire da OnTick, subito dopo il ciclo for, e aspettare nuovi eventi che indicano che l'ambiente di scambio è cambiato.

Allora perché hai messo delle pause?


Ancora una volta, dopo qualsiasi pausa (slittamenti o ordini commerciali sincroni) TC deve essere scosso - la logica di trading deve ripartire da zero. Di conseguenza, se si usano ordini di compravendita asincroni, le pause menzionate non si verificano e c'è un'uscita dalla Event-Function in attesa di un nuovo evento. Se non ci sono operazioni asincrone, l'intera logica di trading può anche essere messa in uno script in loop.

 
fxsaber:

Allora perché hai messo delle pause?

Ancora una volta, dopo qualsiasi pausa (slittamenti o ordini commerciali sincroni) il TS deve essere riavviato - la logica di trading deve ripartire da zero. Di conseguenza, se si usano ordini di compravendita asincroni, le pause menzionate non si verificano e c'è un'uscita dalla Event-Function in attesa di un nuovo evento. Se non ci sono operazioni asincrone, l'intera logica di trading può anche essere messa in uno script in loop.

Io parlerò di Thomas e tu parlerai di Yury. In breve, finiamo il nostro dialogo. Continuate a creare i vostri script in loop. Sì, funziona davvero, ma non può essere raccomandato come metodo di lavoro.

 

Sono interessato a conoscere la loro opinione su questa situazione in MT4, come la gestiscono?


Il ToR di Expert Advisor è quello di mantenere gli ordini pendenti e le posizioni aperte su una certa distanza fissa dal prezzo corrente su ogni tick.


Lascia che le modifiche del broker durino un po' più a lungo dell'intervallo di tempo medio tra i tick di prezzo.


Quindi, eseguiamo un ciclo inverso (in direzione decrescente di SELECT_BY_POS) e facciamo OrderModify corrispondente.


Quindi, durante questo ciclo, impacchettato in OnTick, può accadere quanto segue

  1. OrdiniTotale può aumentare (a mano, per esempio, riempimenti aperti o parziali).
  2. Si può verificare una reindicizzazione degli ordini e delle posizioni pendenti (per esempio, alcuni ordini pendenti sono stati eseguiti durante il ciclo, o alcuni ordini pendenti sono stati cancellati manualmente, e alcuni ordini pendenti sono stati piazzati su una macchina con un ping corto).
  3. 1° o 2° punto, ma non si verifica l'errore OrderSelect e OrderModify. Proprio durante il ciclo a causa di p.1/2 alcuni ordini/posizioni finiranno per mancare.

Cosa fare?

La domanda è indirettamente collegata alla discussione precedente, ma questo non è per la sua continuazione (argomento chiuso). Ho bisogno di risolvere alcune sfumature non ovvie in MT4Orders per MT5. Quindi sarebbe utile sentire le opinioni sulle situazioni descritte da chi è bravo con MT4 nello specifico. E non sono l'unico che può trovarlo utile.


Risolvi il problema attraverso OnTimer - questo è probabilmente il primo suggerimento. Ma non ne abbiamo bisogno - solo OnTick.

 
fxsaber:

Sono interessato a conoscere la loro opinione su questa situazione in MT4, come la gestiscono?


Il ToR di Expert Advisor è quello di mantenere gli ordini pendenti e le posizioni aperte su una certa distanza fissa dal prezzo corrente su ogni tick.


Lascia che le modifiche del broker durino un po' più a lungo dell'intervallo di tempo medio tra i tick di prezzo.


Quindi, eseguiamo un ciclo inverso (in direzione decrescente di SELECT_BY_POS) e facciamo OrderModify corrispondente.


Quindi, durante questo ciclo, impacchettato in OnTick, può accadere quanto segue

  1. OrdiniTotale può aumentare (a mano, per esempio, riempimenti aperti o parziali).
  2. Si può verificare una reindicizzazione degli ordini e delle posizioni pendenti (per esempio, alcuni ordini pendenti sono stati eseguiti durante il ciclo, o alcuni ordini pendenti sono stati cancellati manualmente, e alcuni ordini pendenti sono stati piazzati su una macchina con un ping corto).
  3. 1° o 2° punto, ma non si verifica l'errore OrderSelect e OrderModify. Proprio durante il ciclo a causa di p.1/2 alcuni ordini/posizioni finiranno per mancare.

Cosa fare?

La domanda è indirettamente collegata alla discussione precedente, ma questo non è per la sua continuazione (argomento chiuso). Ho bisogno di risolvere alcune sfumature non ovvie in MT4Orders per MT5. Quindi sarebbe utile sentire l'opinione sulle situazioni descritte da chi è bravo con MT4 nello specifico. E non sono l'unico che può trovarlo utile.


Risolvi il problema attraverso OnTimer - questo è probabilmente il primo suggerimento. Ma lasciamo perdere - solo OnTick.

In primo luogo, la situazione non è standard e pochissime persone, se non nessuna, l'hanno mai risolta.

Puramente in teoria:

Non dobbiamo organizzare un ciclo inverso per OrderModify, quindi lasciamo che sia diretto.

int i, total = OrdersTotal();
for(i = 0; i < total; i++)

Poi controlliamo i cambiamenti dell'elenco degli ordini

if(total != OrdersTotal())
 {
  i = 0;
  total = OrdersTotal();
  continue;
 }

Se la quantità di ordini è cambiata, ricominceremo questo ciclo con una nuova quantità di ordini.

Un'altra domanda:

fxsaber:

  1. OrdiniTotale può aumentare (a mano, per esempio, riempimenti aperti o parziali).
  2. La reindicizzazione degli ordini e delle posizioni pendenti può avvenire (per esempio, qualche ordine pendente è stato eseguito durante un ciclo, o alcuni ordini pendenti sono stati cancellati manualmente, e alcuni ordini pendenti sono stati messi su un ping corto).
  3. 1° o 2° punto, ma non si verifica l'errore OrderSelect e OrderModify. È solo che durante il ciclo a causa di p.1/2 alcuni ordini/posizioni finiranno per mancare.

È comprensibile che se sono stati aggiunti, loro o altri mancheranno. Ma se fossero semplicemente cancellati? Non saremmo in grado di andare oltre l'elenco degli ordini?