Errori, bug, domande - pagina 2222

 
Alexander:

Riproduzione stabile? Quale costruzione?

Sì, il problema è riproducibile. Versione 1870.
 

Domanda.

Supponiamo che io lavori con diversi simboli in un Expert Advisor o indicatore, o meglio con tutti i simboli che vengono visualizzati nella finestra di Market Watch.

Il compito è quello di catturare il momento di un nuovo tick su uno qualsiasi dei simboli.

Finora vedo solo un paio di opzioni:
  1. Attraverso un timer con il polling di tutti i simboli. (naturalmente, potete solo interrogare il nuovo valore diTimeCurrent(), ma in questo caso l'errore sarà di 1 secondo, perché questa funzione restituisce un valore in secondi)
  2. ad ogni simbolo in OnTick (o OnCalculate) per generare un evento personalizzato attraverso EventChartCustom

Lo svantaggio della prima opzione è la non ottimalità in termini di risorse e rilevanza dei dati. OnTimer martellerà principalmente in idle, e quando cattura una nuova citazione, l'errore del tempo di arrivo sarà uguale alla periodicità del timer.

Lo svantaggio della seconda variante è la macchinosità, soprattutto se ci sono decine di simboli.

Ho capito bene che non ci sono altre opzioni (più semplici ed eleganti)? O (spero) mi sbaglio?

 
Nikolai Semko:

Domanda.

Supponiamo che io lavori con diversi simboli in un Expert Advisor o indicatore, o meglio con tutti i simboli che sono visualizzati nella finestra di Market Watch.

Il compito è quello di catturare il momento di un nuovo tick su uno qualsiasi dei simboli.

Per ora vedo solo un paio di opzioni:
  1. Attraverso un timer con il polling di tutti i simboli. (naturalmente, potete solo interrogare il nuovo valore diTimeCurrent(), ma in questo caso l'errore sarà di 1 secondo, perché questa funzione restituisce un valore in secondi)
  2. ad ogni simbolo in OnTick (o OnCalculate) per generare un evento personalizzato attraverso EventChartCustom

Lo svantaggio della prima opzione è la non ottimalità in termini di risorse e rilevanza dei dati. OnTimer martellerà principalmente in idle, e quando cattura una nuova citazione, l'errore del tempo di arrivo sarà uguale alla periodicità del timer.

Lo svantaggio della seconda variante è la macchinosità, soprattutto se ci sono decine di simboli.

Ho capito bene che non ci sono altre opzioni (più semplici ed eleganti)? O (spero) mi sbaglio?

Forse questo vi aiuterà? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Strumenti sintetici con quotazioni in tempo reale

La piattaforma di trading permette di creare strumenti finanziari sintetici - strumenti basati su uno o più strumenti esistenti. Basta impostare una formula per calcolare le quotazioni e la piattaforma genererà tick in tempo reale per lo strumento sintetico, oltre a creare la sua cronologia dei minuti.
Come funziona

Si crea uno strumento sintetico e si imposta la formula per esso.
La piattaforma calcolerà i suoi tick con una frequenza di 10 volte al secondo (e solo se il prezzo di almeno uno strumento nella formula cambia).
 
SEM:

Forse questo vi aiuterà? https://www.metatrader5.com/ru/terminal/help/trading_advanced/custom_instruments

Strumenti sintetici con quotazioni in tempo reale

La piattaforma di trading permette di creare strumenti finanziari sintetici - strumenti basati su uno o più strumenti esistenti. Basta impostare la formula per il calcolo delle quotazioni e la piattaforma genererà i tick dello strumento sintetico in tempo reale e creerà la sua cronologia dei minuti.
Come funziona

Si crea uno strumento sintetico e si imposta la formula per esso.
La piattaforma calcolerà i suoi tick con una frequenza di 10 volte al secondo (e solo se il prezzo di almeno uno strumento nella formula è cambiato).

Sì, certo, anche quella variante ha diritto alla vita. Grazie!
Ma, di fatto, è la stessa della mia variante #1 con periodicità del timer di 100 ms e con gli stessi svantaggi.

L'opzione 2 mi sembra più razionale, però.

A proposito, mi sono ricordato che l'opzione 2 è già stata discussa qui.


 
Nikolai Semko:

Sì, certo, anche questa variante ha diritto alla vita. Grazie!
Tuttavia, in sostanza, è la stessa della variante #1 di cui sopra con periodo del timer di 100 ms.

Non sarebbe più semplice fare un EA legato al simbolo su cui lavora. Poi apri tutti i simboli e applica il modello con questo EA ad ogni grafico.

for(int i=PositionsTotal()-1;i>=0;i--)
     {
      if(PositionGetSymbol(i)==Symbol())
        {
         //Код
        };

     }
 
SEM:
Non sarebbe più semplice fare un EA legato al simbolo su cui lavora. Poi apri tutti i simboli, e per ogni grafico applica un modello con questo EA.

È chiaro che questo può essere fatto. La questione è che non so qualcosa ed è possibile tracciare il momento esatto di arrivo della quotazione per un altro simbolo attraverso il codice di un solo EA multivaluta.
Ma sembra che la variante 2 tramite interrupts personalizzati sia l'unica soluzione razionale.

 
Nikolai Semko:

Sì, è chiaro che si può fare così. La questione è che non so qualcosa, ed è possibile catturare il momento esatto di arrivo della quotazione per un altro simbolo attraverso il codice di un solo Expert Advisor multivaluta.
Ma sembra che la variante 2 tramite interrupts personalizzati sia l'unica soluzione razionale.

Attuazione.

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2018.01.28
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
Nikolai Semko:
  1. tramite timer con polling di tutti i caratteri. (Naturalmente, potreste semplicemente interrogare il nuovo valore diTimeCurrent(), ma in questo caso l'errore sarebbe di 1 secondo, perché questa funzione restituisce un valore in secondi).

Ho ragione nel supporre che non ci siano altre opzioni (più semplici ed eleganti)? O (spero) mi sbaglio?

Timer di millisecondi + SymbolInfoTick() otterrà il tempo in millisecondi.

 
fxsaber:

Attuazione.

Sì, ho già dato questo link alla tua implementazione nel post 22214. Lo dirò di nuovo - penso che questa variante sia la più ragionevole finora. E non sembra esserci un'implementazione migliore in termini di carico minimo della CPU e rilevanza del momento risultante di un nuovo tick.
 
Nikolai Semko:
  1. через таймер c опросом всех символов. (можно, конечно, только опрашивать новое значение функции TimeCurrent(), но в этом случае погрешность будет равна 1 секунде, т.к. эта функция возвращает значение в секундах)

Я правильно понимаю, что других вариантов (более простых и изящных) не существует? Или (надеюсь) я не прав?

Timer di millisecondi + SymbolInfoTick() ottiene il tempo in millisecondi.

Alexey Kozitsyn:

Timer di millisecondi + SymbolInfoTick() ottiene il tempo in millisecondi.

È la variante 1. Intendevo un costrutto del genere (timer millisecondo + ciclo SymbolInfoTick()). Ho menzionatoTimeCurrent() perché restituisce"l'ora di arrivo dell'ultima quotazione per qualsiasi simbolo disponibile nella finestra di Market Watch", non solo per il simbolo corrente, ma purtroppo restituisce solo secondi, che è molto scortese per i tick.
Oggettivamente, la variante con interrupt dell'utente è più ragionevole, perché non c'è bisogno di organizzare un ciclo con la costosa funzione SymbolInfoTick costantemente, anche quando le quotazioni stanno dormendo, caricando così il processore di tempo inattivo. Inoltre, l'errore di calcolo di un nuovo tick può essere uguale alla periodicità del timer, e tutti i tick saranno persi tra l'esecuzione di OnTimer, se tali tick erano più di 1.
SZZ Stiamo parlando di mql5. Su mql4 le interruzioni utente non funzionano correttamente. Pertanto, l'mql4 può utilizzare solo il timer.
Motivazione: