Indicatori Tick Size, Tick Rate, Tick Spread e Tick Logger - Pagina 3

 

Publi

Indicatori Tick Size, Tick Rate, Tick Spread e Tick Logger

 

Publi

Pagina 3 di 4 PrimaPrima 1234 UltimaUltima
Risultati da 21 a 30 di 35

Discussione: Indicatori Tick Size, Tick Rate, Tick Spread e Tick Logger

  1. #21

    Citazione Originariamente Scritto da ;
    La mia comprensione di come gli indior vengono eseguiti in MT è che tutti gli indior vengono eseguiti su ciò che MT chiama il thread principale insieme alla piattaforma, e gli EA e gli script vengono eseguiti sul thread di esecuzione. Gli EA non ricevono tick per dire ma fanno una copia dei dati dal thread principale su cui eseguire. ecco perché se esegui uno script in un ciclo e lo usi per fare trading devi usare la funzione refresshrate(). o lo script non vedrà mai dati freschi. Se un EA o Script chiama un indior con diciamo la funzione iCustom, in realtà carica una seconda copia dell'indior sul retro...
    Ottime informazioni, CockeyedCowboy. Grazie per tutti i tuoi sforzi! Sia tu che rooicol siete dei maghi di MT4!

  2. #22

    Citazione Originariamente Scritto da ;
    zznbrm all quindi noto che puoi avere due grafici aperti con lo stesso simbolo e tutti gli stessi indiori su ogni finestra. che viene aggiornata solo una finestra alla volta, la finestra con la barra del titolo illuminata viene eseguita per prima con le altre eseguite in ordine z una alla volta. Ho caricato due finestre con il codice per rallentare l'esecuzione, per verificarlo. Keit
    ?? interessante, non ci avevo mai pensato prima, ho solo vagamente presunto che lo facesse tutto in una volta, ma immagino che debba funzionare in un ordine sequenziale. Si tratta di informazioni utili relative a GlobalVariableSet() e FileWrite(), se si dispone di altri grafici che eseguono GlobalVariableGet() e FileRead().

  3. #23
    zznbrm Grazie per la lezione di oggi, ci sono solo poche persone che guarderò il loro codice, il tuo. .... La mia comprensione di come gli indior vengono eseguiti in MT è che tutti gli indior vengono eseguiti su ciò che MT chiama il thread principale insieme alla piattaforma, e gli EA e gli script vengono eseguiti sul thread di esecuzione. Gli EA non ricevono tick per dire ma fanno una copia dei dati dal thread principale su cui eseguire. ecco perché se esegui uno script in un ciclo e lo usi per fare trading devi usare la funzione refresshrate(). o lo script non vedrà mai dati freschi. Se un EA o uno Script chiama un indior con, ad esempio, la funzione iCustom, in realtà carica una seconda copia dell'indior sul retro degli EA, quindi più indior chiama, più codice viene caricato sul retro dell'EA, più lento è l'EA verrà eseguito, l'indor sul grafico non è accessibile da un EA. tutto così noto che si possono avere due grafici aperti con lo stesso simbolo e tutti gli stessi indiori su ogni finestra. che viene aggiornata solo una finestra alla volta, la finestra con la barra del titolo illuminata viene eseguita per prima con le altre eseguite in ordine z una alla volta. Ho caricato due finestre con il codice per rallentare l'esecuzione, per verificarlo. Keit

  4. #24

    Citazione Originariamente Scritto da ;
    Vedi, ho detto nel mio primo post, sei un programmatore migliore; Mi manca totalmente la barca su questo. Sembra che tu non abbia bisogno di sporcare i buffer per riempirli MT lo fa per noi. Guarda tutta questa finestra di dialogo che si può imparare per questo, ho aggiunto dichiarazioni di stampa per vedere quando si apre una nuova barra MT sposterà indietro i dati senza alcun lavoro da parte nostra. E qui stavo scrivendo loop per niente.
    Sono contento che tu abbia risolto. Per quanto riguarda il trading e la programmazione, imparo qualcosa di nuovo ogni singolo giorno.
    Citazione Originariamente Scritto da ;
    Tuttavia, non credo che il motivo per cui il numero di tick elaborati sia il motivo che hai citato (che i tick in arrivo durante l'esecuzione della funzione speciale start () vengono ignorati). Il tempo impiegato per eseguire questo pezzo di codice è minuscolo. Anche se crei un ciclo e gli fai eseguire il codice 10.000 volte per ogni tick e cronometralo per farlo, ci vogliono circa 200 millisecondi: questo codice sopra richiede al mio computer circa 200 ms, quindi 2/100 di millisecondo per iterazione. Penso che sia troppo improbabile che arrivino così tanti tick durante questa minuscola finestra....
    Sì, hai assolutamente ragione. Questi semplici indios impiegano forse 1 millisecondo per elaborare un segno di spunta. La mia ipotesi migliore è che ci sia un'altra elaborazione MT4 interna (che si verifica prima/dopo l'esecuzione della nostra funzione di avvio indiors) che sta causando il ritardo nell'elaborazione di nuovi tick. ?? difficile speculare senza vedere il codice MT4 interno. I tick in arrivo vengono probabilmente ricevuti tramite un qualche tipo di coda di messaggi. Penso che gli indios siano sul loro thread per l'esecuzione. Non sono sicuro degli EA. Per gli indios/EA, c'è probabilmente una quantità minima di sovraccarico associato all'elaborazione di ogni tick (al di fuori della nostra funzione di avvio). Questo sovraccarico può essere di 10 ms o 100 ms a seconda della complessità dei grafici. Scommetto che il sito web mql4.com ha alcune informazioni sulle cose che accadono per ogni tick in arrivo. Indipendentemente da ciò, scommetto che la risposta è là fuori da qualche parte... ma la spiegazione è probabilmente molto tecnica e coinvolge code di messaggi e processi single/multi-thread ed è ben oltre la mia comprensione di MT4.

  5. #25

    Citazione Originariamente Scritto da ;
    Ok, rimuoviamo la parte dell'istogramma. Non è ancora corretto, la chiamata di funzione 'SetIndexEmptyValue()' imposta il valore del buffer solo se non ha valore e la funzione init() viene eseguita solo una volta all'inizio del programma. lì dopo viene eseguita solo la funzione start (), fino a quando non la interrompi, deinit () verrà eseguito all'uscita, ma se esegui questo codice l'unica cosa che fa la funzione start () è aggiungere uno all'elemento zero del buffer ad ogni segno di spunta, non svuota mai quell'elemento quando si apre una nuova barra, quindi qual è il tuo conteggio ogni ...
    Sì, quando attacchi il suo indior la funzione speciale int init() imposta gadblVolume[0] a 0. Lo fa solo una volta. Quindi per ogni segno di spunta successivo aggiunge 1 ad esso. Quando viene creata una nuova candela, gadblVolume[0] viene nuovamente riportato a 0 (MT lo fa come dici tu nel post successivo), quindi inizia a contare di nuovo 1 su ogni tick. Bellissimo; ma non vedo il punto nel sapere quanti tick MT non sta ricevendo senza capire PERCH?? non li sta ricevendo

  6. #26

    Citazione Originariamente Scritto da ;
    Ben fatto!
    Grazie, felice che ti piacciano!
    Citazione Originariamente Scritto da ;
    - Scusa per il diversivo qui. Se lo desideri, alcuni o tutti questi post verranno eliminati.
    Va bene, non preoccuparti.
    Citazione Originariamente Scritto da ;
    Su una nota in qualche modo correlata che sono sicuro che avrai notato...
    Sì, anch'io ne ho uno, solo che non pensavo che la maggior parte delle persone sarebbe stata interessata. Il mio l'ho fatto in modo un po' diverso, anche se ora preferisco il tuo perché è molto più elegante. Ecco come appare il mio: Codice inserito #property copyright Codificato da #property indior_chart_window int start() { static int TickCount; datetime statico CandleOpenTime; if(CandleOpenTime!=Ora#91;0#93 { CandleOpenTime=Ora#91;0#93;; TickCount=0; } TickCount ; double PercentageProcessed=(TickCount/Volume#91;0#93*100; Comment(DoubleToStr(PercentageProcessed,1),%); ritorno(0); } Tuttavia, non credo che il motivo per cui il numero di tick elaborati sia il motivo che hai citato (che i tick in arrivo durante l'esecuzione della funzione speciale start() vengono ignorati). Il tempo impiegato per eseguire questo pezzo di codice è minuscolo. Anche se crei un ciclo e gli fai eseguire il codice 10.000 volte per ogni tick, e cronometralo per farlo, ci vogliono circa 200 millisecondi: Inserted Code #property copyright Coded by #property indior_chart_window int start() { int ms1=GetTickCount(); for(int i=0; ilt;10000; i ) { static int TickCount; datetime statico CandleOpenTime; if(CandleOpenTime!=Ora#91;0#93 { CandleOpenTime=Ora#91;0#93;; TickCount=0; } TickCount ; double PercentageProcessed=(TickCount/Volume#91;0#93*100; Comment(DoubleToStr(PercentageProcessed,1),%); } int ms2=GetTickCount(); int Durata=ms2-ms1; Commento(Durata); ritorno(0); } Questo codice sopra richiede al mio computer circa 200 ms, quindi 2/100 di millisecondo per iterazione. Penso che sia troppo improbabile che arrivino così tanti tick durante questa minuscola finestra. Sarei interessato a sapere perché Volume[] != numero di tick.

  7. #27
    zznbrm Vedi, ho detto nel mio primo post, sei un programmatore migliore di quello; Mi manca totalmente la barca su questo. Sembra che tu non abbia bisogno di sporcare i buffer per riempirli MT lo fa per noi. Guarda tutta questa finestra di dialogo che si può imparare per questo, ho aggiunto dichiarazioni di stampa per vedere quando si apre una nuova barra MT sposterà indietro i dati senza alcun lavoro da parte nostra. E qui stavo scrivendo loop per niente. Keit

  8. #28

    Citazione Originariamente Scritto da ;
    Ok, rimuoviamo la parte dell'istogramma. Non è ancora corretto, la chiamata di funzione 'SetIndexEmptyValue()' imposta il valore del buffer solo se non ha valore e la funzione init() viene eseguita solo una volta all'inizio del programma. lì dopo viene eseguita solo la funzione start (), fino a quando non la interrompi, deinit () verrà eseguito all'uscita,
    Sì, è corretto.
    Citazione Originariamente Scritto da ;
    ma se stai eseguendo questo codice l'unica cosa che fa la funzione start() è aggiungere uno all'elemento zero del buffer su ogni tick, non svuota mai quell'elemento quando si apre una nuova barra, quindi qual è il tuo conteggio ogni tick ...
    Beh, non so cosa dirti ... sta funzionando esattamente come dovrebbe per me. Aggiungi l'indior a un grafico M1 e sono sicuro che vedrai che sta contando i tick per barra come previsto.

  9. #29
    Ok, rimuoviamo la parte dell'istogramma. Non è ancora corretto, la chiamata di funzione 'SetIndexEmptyValue()' imposta il valore del buffer solo se non ha valore e la funzione init() viene eseguita solo una volta all'inizio del programma. lì dopo viene eseguita solo la funzione start (), fino a quando non la interrompi, deinit () verrà eseguito all'uscita, ma se esegui questo codice l'unica cosa che fa la funzione start () è aggiungere uno all'elemento zero del buffer su ogni segno di spunta, non svuota mai quell'elemento quando si apre una nuova barra, quindi qual è il tuo conteggio è ogni segno di spunta che arriva dall'avvio del programma. e continua ad aggiungere finché non si ferma. quindi non ottieni un conteggio vero di tick per barra che ricevi tick mentre il programma è attivo, Keit

  10. #30

    Citazione Originariamente Scritto da ;
    Capisco un po 'di più ora di quello che stai facendo ma ancora confuso, stai creando un istogramma sui dati come in una cronologia o solo la barra aperta e ignorando qualsiasi cronologia. se stai solo guardando la barra aperta, allora devi ancora azzerare quel buffer all'inizio di ogni barra, o sono ancora nel bosco qui, il modo in cui il codice aggiungerà a un solo elemento per tutto il tempo il l'indie sta correndo, pensavo stessi contando i tick per battuta?? Keit
    rooicol - Ci scusiamo per la diversione qui. Se lo desideri, alcuni o tutti questi post verranno eliminati. CockeyedCowboy - Ok... ora capisco cosa stai dicendo. L'istogramma non viene utilizzato per questo esercizio... i dati del buffer sono la parte importante. Ho semplicemente copiato un vecchio (molto semplicemente) indior che disegnava un istogramma, ma non ci ho fatto caso. Inoltre, la storia non ha importanza per questo indior. Poiché non esiste una cronologia dei tick in MT4, qualsiasi dato passato è irrilevante. Ora, alla tua domanda principale (credo) sull'azzeramento del buffer per una nuova barra. Questa riga nell'init si occupa di ciò: SetIndexEmptyValue( 0, 0.0 ); Senza quella riga, il valore del buffer per ogni nuova barra viene inizializzato su quello che sembra essere il valore massimo intero. Ma con questa riga, il valore del buffer per ogni nuova barra viene inizializzato a zero. ?? il modo corretto per inizializzare ogni barra su 0? Forse no, ma per questo esercizio sembra funzionare. Non stiamo parlando di un indior pronto per la produzione qui. Questo è semplicemente un indior di base per testare rapidamente qualcosa. Puoi rimuovere la parte dell'istogramma ed eseguire semplicemente questo codice: Codice inserito #property indior_chart_window #property indior_buffers 1 double gadblVolume#91;#93;; int init() { IndiorShortName( LiveVolume ); IndiorDigits( 0 ); SetIndexBuffer( 0, gadblVolume ); SetIndexLabel( 0, Live Volume ); SetIndexStyle( 0, DRAW_NONE ); SetIndexEmptyValue( 0, 0.0 ); ritorno(0); } int inizio() { gadblVolume#91;0#93; = 1,0; ritorno(0); }

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
Il sito di forexmad utilizza cookie
Il sito di forexmad utilizza cookie, alcuni dei quali già installati. Per avere maggiori informazioni sui nostri cookie ti preghiamo di cliccare qui. Ti preghiamo di cliccare sul bottone a destra per accettare i nostri cookie. Se continui a navigare sul sito di forexmad assumeremo che sei d'accordo ad utilizzarli.