Indicatori: Griglia - pagina 2

 
Prival:
ha pubblicato una nuova versione 3.09 su Code Base, è possibile scaricarla.

È possibile migliorarla ancora un po'.

if(ObjectFind(0,nm)<0) ObjectCreate(0,nm,OBJ_VLINE,0,t1,2);

In questi costrutti ObjectFind() è ovviamente inutile. Quando si crea con ObjectCreate() sarà simile a cercare nell'elenco in base al nome e creare un nuovo oggetto, oppure modificare i parametri dei punti di ancoraggio di quello esistente.
.

ObjectSetInteger(0,nm,OBJPROP_SELECTABLE,false);

Per gli oggetti creati dal programma MQL questa proprietà è forzata a false.

Allo stesso modo, non ha senso modificare il valore di OBJPROP_WIDTH, che sarà comunque uguale a 1.

Secondo le mie misurazioni, queste modifiche riducono il tempo di costruzione di circa il 10%.

 

Grazie, lo terrò presente. Sto lavorando a qualcosa in questo momento, ma c'è un problema.

Ho 8 grafici aperti con solo la griglia.

Simulo la disconnessione dalla rete per 5 minuti. Questa è l'immagine dopo la riaccensione della rete. 2 grafici si bloccano.

Allego una nuova versione della griglia 4.01.

File:
setka__1.mq5  15 kb
 
Prival:

Grazie, lo terrò presente. Sto lavorando a qualcosa in questo momento, ma c'è un problema.

Ho 8 grafici aperti con solo la griglia.

Simulo la disconnessione dalla rete per 5 minuti. Questa è l'immagine dopo la riaccensione della rete. 2 grafici si bloccano.

Allego una nuova versione della griglia, la versione 4.01.

Si tratta di una conseguenza dell'architettura del terminale e dell'algoritmo dell'indicatore. L'indicatore viene eseguito nel flusso di simboli, vale a dire che durante il suo calcolo molte operazioni con la storia sono impossibili: elaborazione dei tick, calcolo di altri indicatori, sincronizzazione della storia con il server, costruzione o caricamento della storia per timeframe di simboli, ecc.

Poiché l'indicatore Grid viene calcolato a lungo e utilizza dati provenienti da altri timeframe di simboli, è auspicabile interrompere il suo calcolo in caso di errore. Se non si vuole riscrivere il codice, è possibile farlo in questo modo:

bool isNewBar_i(datetime date,ENUM_TIMEFRAMES timeFrame,bool& error)

  {

...

   else
     {
      Print("Timeframe ",fTimeFrameName(timeFrame)," is not ready");
      error=true;

     }

e così:

      //--- определимся с цветом линии
      if(_Period<PERIOD_H1) if(isNewBar_i(time[i],PERIOD_H1,error) && _Period<PERIOD_M30) line_color=new_hour;
      if(_Period<PERIOD_D1) if(isNewBar_i(time[i],PERIOD_D1,error) && _Period<PERIOD_H4 ) line_color=new_day;
      if(_Period<PERIOD_W1) if(isNewBar_i(time[i],PERIOD_W1,error) && _Period<PERIOD_D1 ) line_color=new_week;
      if(_Period<PERIOD_MN1)if(isNewBar_i(time[i],PERIOD_MN1,error)&& _Period<PERIOD_MN1) line_color=new_mon;
      //---
      if(error) return(0);

File:
setka.mq5  15 kb
 
antt:

Questa è una conseguenza dell'architettura del terminale e dell'algoritmo dell'indicatore. L'indicatore viene eseguito nel flusso di simboli, vale a dire che nel processo di calcolo molte operazioni con la storia sono impossibili: elaborazione dei tick, calcolo di altri indicatori, sincronizzazione della storia con il server, costruzione o caricamento della storia per timeframe di simboli, ecc.

Non riesco a capire questa nozione di flusso, e ho letto la guida sull'accesso ai dati 50 volte (( lo script viene fornito come esempio. Ci vuole circa un minuto per eseguirlo (un tempo lungo), ma sembra che abbia iniziato a capirlo. Ho capito bene che mentre l'indicatore è in fase di calcolo, cioè la funzione ha iniziato a essere eseguita

int OnCalculate () {
tutte le risorse del computer (terminale) sono assegnate a questo task, e finché non viene eseguito (completato)

return(rates_total); }

Non si deve fare nulla di quanto segue:

- cercare di leggere la cronologia con questo simbolo, se manca

- richiedere un periodo di tempo diverso

- richiedere un altro simbolo

Credo di aver capito come rifare il programma, bisogna impostare tutte le linee alla prima chiamata e dimenticarsene fino a if(prev_calculated==0).

giusto?

S.Y.

  1. Commerciante - una persona che calpesta i rastrelli.
  2. Scemo - un trader principiante che non ha mai calpestato un rastrello e quindi è sicuro che non ci sia alcun rastrello.
  3. babbeo - un trader che calpesta regolarmente il rake ma è ancora sicuro che il rake non esista.
  4. Specialista stretto - un trader che conosce bene la tecnologia di calpestare lo stesso rake.
  5. Specialista ampio è un trader che calpesta più di due rastrelli in parallelo.
  6. Specialista dei sistemi meccanici - un trader in grado di automatizzare i colpi di rake.

Secondo la valutazione di Renat ho il livello 5 :-)) , https://www.mql5.com/ru/forum/1165/page3 ha fatto un ulteriore passo avanti )))

 

Non sono richieste altre tempistiche.

se non ti dispiace. Impostare le barre mac. nella finestra Unlimit e passare attraverso M15, M5 e M1. postare il risultato nel log qui. Ho qualcosa di sbagliato su M1 - ho scritto al servizio di assistenza. Voglio solo capire se è un problema solo mio o di tutti.

Ecco il mio log.

2010.06.17 11:39:55 Grid (EURUSD,M1) Fallimento o prima esecuzione Time= 1.2 sec per 1293476 barre ObjectsTotal= 48010 _time= 2002.10.25 06:41:00
2010.06.17 11:39:52 Grid (EURUSD,M5) Fallimento o prima esecuzione Time= 0.0 sec per 847192 barre ObjectsTotal= 423 _time= 2010.06.02 21:35:00
2010.06.17 11:39:48 Griglia (EURUSD,M15) Fallimento o prima esecuzione Time= 0.0 sec per 285186 barre ObjectsTotal= 962 _time= 2010.05.04 22:00:00

grazie in anticipo. versione griglia 4.11

 
Prival:

Non riesco a capire questa nozione di thread, e ho letto la guida sull'accesso ai dati 50 volte (( lo script è dato lì come esempio. Ci vuole circa un minuto per l'esecuzione (un tempo lungo), ma credo di iniziare a capire. Ho capito bene che mentre il calcolo dell'indicatore è in corso, cioè la funzione ha iniziato a essere eseguita, il calcolo dell'indicatore è in corso.

http://ru.wikipedia.org/wiki/Thread


int OnCalculate () {
tutte le risorse del computer (terminale) sono assegnate a questo task, e finché non viene eseguito (terminato)

return(rates_total); }

Non tutte le risorse. Ma la maggior parte dei calcoli relativi a questo simbolo attenderà fino al completamento di OnCalculate().


Non si deve fare nulla di quanto segue:

- cercare di leggere la cronologia di questo simbolo, se questa è mancante

Sì. Se non c'è abbastanza cronologia per il simbolo corrente, l'esecuzione di OnCalculate() non migliorerà di certo.


- richiedere un altro timeframe

È possibile richiederlo, ma se i dati mancano o sono insufficienti, non ha senso aspettare in OnCalculate(). Lo stesso vale per i dati di altri indicatori per il simbolo corrente.

- richiedere un altro simbolo

Si può richiedere, teoricamente si può anche aspettare nel ciclo che appaiano tutti i dati necessari, perché l'elaborazione dei dati di un altro simbolo (storico, indicatori) avviene in un altro thread. Ma è meglio non farlo, il ciclo di attesa in OnCalculate() interromperà l'elaborazione dei dati del simbolo corrente.

.

Credo di aver capito come rifare il programma, è necessario impostare tutte le linee alla prima chiamata e dimenticarsene se(prev_calculated==0).

La raccomandazione generale quando si scrivono indicatori personalizzati: se viene rilevato un errore, una mancanza di dati, interrompere immediatamente l'esecuzione di OnCalculate() con return(0). Al tick successivo, effettuare un nuovo tentativo di calcolo su if(prev_calculated==0).
 
Prival:

se non è troppo complicato. Impostare le barre del mac. nella finestra Unlimit e passare attraverso M15, M5 e M1. Il risultato che sarà nel log, postarlo qui. Ho qualcosa che non va su M1 - ha scritto all'assistenza. Voglio solo vedere se il problema è mio o di tutti.

2010.06.17 11:58:59 6op0k (EURUSD,M1) Fallimento o prima esecuzione Tempo=0.1sec per 4009008 barre ObjectsTotal=403_time=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Fallimento o prima esecuzione Tempo=0.0sec per 847196 barre ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Fallimento o prima esecuzione Tempo=0.0sec per 285187 barre ObjectsTotal=1108_time=2010.05.04 22:15:00
 
antt:
2010.06.17 11:58:59 6op0k (EURUSD,M1) Fallimento o prima esecuzione Tempo=0,1sec per 4009008 barre ObjectsTotal=403Ora=2010.06.15 07:45:00
2010.06.17 11:58:54 6op0k (EURUSD,M5) Fallimento o prima esecuzione Tempo=0.0sec per 847196 barre ObjectsTotal=605_time=2010.06.02 21:55:00
2010.06.17 11:58:44 6op0k (EURUSD,M15) Fallimento o prima esecuzione Tempo=0.0sec per 285187 barre ObjectsTotal=1108_time=2010.05.04 22:15:00

Grazie. significa che finalmente ho scritto tutto correttamente e l'indicatore funziona davvero come volevo. il fallimento che ho avuto è un problema del terminale (hai tutto normale). _time=2010.06.15 07:45:00). è un peccato che gli sviluppatori tacciano nel service dex. almeno scrivessero un paio di parole (( tipo

problema riprodotto...pensiamo...grazie

 
Prival:

Grazie. significa che finalmente ho scritto tutto correttamente e l'"indicatore" funziona davvero come volevo. il fallimento che ho avuto è un problema con il terminale (si sta facendo bene. _time=2010.06.15 07:45:00). è un peccato che gli sviluppatori tacciano nel service dex. almeno scrivessero un paio di parole (( tipo

problema riprodotto... pensiamo... grazie.

e può essere corretto:

se su H1 gravfik per portare una linea verticale o orizzontale, poi passare a un altro intervallo di tempo, le linee non legati all'indicatore vengono cancellati.

Questo è un indicatore molto comodo per controllare la storia per determinare visivamente il passo del prezzo, ma a causa del fatto che i segni (linee verticali e orizzontali) messi su intervalli di tempo più vecchi scompaiono quando si passa a un intervallo di tempo più piccolo, diventa scomodo.

 

L'indicatore ha risolto perfettamente il problema della visualizzazione utilizzabile della scala dei prezzi nelle finestre del terminale.

La compilazione nelle build fino alla 3021 inclusa non mostra errori e tutto viene disegnato correttamente (anche se si lancia la versione precedentemente compilata in una nuova build del terminale).

La compilazione nelle build successive non mostra errori, ma nel terminale l'addizionatore non disegna il markup verticale e nei log scrive: 1 leaked strings left

Avendo commentato la riga:

StringConcatenate(nome_linea,IntegerToString(str.hour,2,'0'),":":",IntegerToString(str.min,2,'0'),"_N",line_counter);

l'errore nei log del terminale scompare (anche se le linee non vengono disegnate).

Da che parte scavare? Come rianimare un grande strumento?