Errori, bug, domande - pagina 590

 
Swan:

Per tutte le barre l'indicatore è calcolato una volta sola - cioè può essere un po' lento all'avvio sulla storia agromadica.

Successivamente una coppia di valori viene ricalcolata - tutto deve funzionare :)

Non dimenticate che i programmatori sono persone a cui piace saltare manualmente nel loro tempo libero dalla programmazione. E ogni nuovo timeframe è un'altra deinizializzazione e inizializzazione dell'anatomia dell'indicatore, tutti i calcoli saranno eseguiti di nuovo. Perciò, ArrayInitialize() sarà attivata ogni volta, quando si salta da un TF all'altro. Se l'indicatore è complesso con diversi buffer che hanno bisogno di essere reinizializzati, i ritardi si accumulano, e non parlo nemmeno di overflow di memoria, che viene allocata automaticamente.

Come sono ingenuo! Mi trovo sempre fiducioso, che l'inizializzazione in OnInit() sia sufficiente, e posso perdere tempo in questa fase, affondando la testa in compiti più pressanti in OnCalculate(). Ma no, non è così. A proposito, la scrittura più o meno riuscita di indicatori complessi non mi ha fatto capire perché ArrayInitialize() deve essere contenuta esattamente in OnCalculate(), controllandola ad ogni tick, invece della primaria e unica inizializzazione in OnInit(). Attraverso la mia esperienza, ho trovato solo casi in cui il rifiuto di questa variante ha immediatamente causato problemi, ma di questo parlerò più avanti. Per ora vorrei notare che dal punto di vista della semplice e ovvia logica umana (piuttosto che logica del codice) ArrayInitialize() in OnCalculate() sembra molto riprovevole, tenendo conto che non ho mai incontrato casi in cui

if(prev_calculated<7) // или < чего-то там...
La prima volta il programma verrebbe attivato più di una volta - all'avvio iniziale. Cioè, appaiono nuovi frattali e la condizione è silenziosa. Quindi cosa diavolo sta facendo in OnCalculate()?

Sono ancora più ingenuo nel credere che

handle=iFractals(_Symbol,_Period);

Si suppone che io sia obbligato a ereditare automaticamente gli array di pulizia e l'effetto dell'algoritmo economico da Fractals.mq5 originale, che è anche lì, ma in una forma leggermente diversa. Ma - ancora e ancora no!!! Ho dovuto pensarci due volte e creare il mio codice copiando dall'indicatore, di cui uso il manico. Ricordo come ho analizzato il codice degli indicatori per la prima volta e sono stato preso alla sprovvista confrontando Fractals.mq5 e l'esempio di iFractals dalla Guida, e mi sono reso conto che il secondo codice era più grande del primo (anche dopo averlo abbreviato molto). Non lo so. Tira tutti i miei cappelli, ma i programmatori in realtà si aspettano di inserire qualcosa nel loro codice in una riga riferendosi a un'intera libreria, classe o qualcos'altro di voluminoso lì, ma qui...

Ora rivelerò l'essenza del problema che ho menzionato prima. Allego il codice dell'indicatore iFractals semplificato ai frattali superiori. Nell'esempio iniziale, il buffer è riempito per tutta la storia. Cambiamo la situazione copiando solo una parte della storia. Commentiamo l'assegnazione dei valori copiati per il primo calcolo e impostiamo il nostro valore più piccolo:

values_to_copy=100; // то же, что amount
Ora saltiamo sui timeframe e inorridiamo di fronte agli artefatti frattali che sono apparsi. Non riuscivo a pensare a niente di meglio che copiare automaticamente il blocco di codice non ereditato clean up arrays da Fractals.mq5 per pulire quella parte di storia dove i frattali non sono necessari:
   if(bars_calculated<7)
   {
      ArrayInitialize(FractalUpBuffer,EMPTY_VALUE);
      Print("the condition is true; ArraySize(FractalUpBuffer)=",ArraySize(FractalUpBuffer));
   }
Ora tutto(con un sacco di ridondanza!!!) è pulito perfettamente, e allo stesso tempo Print() mostra quando e quante volte la reinizializzazione funzionerà, oltre a visualizzare la dimensione del buffer. Possiamo vedere che non sono 100, ma molto di più. Se devo togliere la polvere da un tavolo, pulisco la polvere dal tavolo invece di pulire tutto l'appartamento. O il trucco è rassicurarmi a tutti i costi che i superamenti di memoria e di tempo non sono niente, si può trovare un modo per risolvere il problema indirettamente e ignorare il palese divoramento di risorse al di fuori del mio controllo?


Cigno:

Un fx, alcune dimensioni dovranno essere impostate... Perché fare un ciclo curvo con limiti diversi, quando si può fare un ciclo diretto con gli stessi limiti)

Altrimenti, l'indicatore sarà basato sulle stampelle.

Onestamente, non volevo essere un peso, ma ho capito in anticipo che i simpatizzanti avrebbero scavato tutto il codice. È come nell'aneddoto su Chapay e Petka, quando Vasily Ivanovich tornò, chiese una pala - risultò rotta - il cavallo fu sepolto - il villaggio fu attaccato dai bianchi mentre Chapay era via. Rendendomi conto che chi vuole entrare nei dettagli del codice altrui molto probabilmente non apparirà, posso solo fare riferimento all'output dell'indicatore, che (a parte i freni e altre mancanze) alla fine sarà: https://www.mql5.com/ru/forum/1111/page577#comment_119227. E ora pensateci e dite: è ragionevole pensare che tutto sia semplice lì e suggerire soluzioni apparentemente ovvie?

Non per niente semplifico e limito il codice prima di chiedere qualcosa in qualsiasi parte particolare. Per questo ti chiedo di limitarti solo a questo, e di non riesumare tutto il cavallo, a meno che non ci sia un dilettante...

In realtà, il quarto - speciale - buffer è più lungo in linea di principio dei primi tre (uguale in lunghezza), e grazie a SetIndexBuffer() si estende per tutta la storia! Se espandiamo i limiti del ciclo al quarto buffer e allo stesso tempo ridimensioniamo i primi tre array ad esso, allora almeno il numero di elementi nel ciclo aumenterà, il che aumenterà il tempo stimato di lettura del segmento di elementi del buffer completamente lasciato. Questa è solo la punta di un iceberg di problemi che emergeranno con tale variante di algoritmo. Inoltre, ci vorrà più tempo per reinizializzare gli altri buffer perché la loro dimensione è diventata più grande. La quarta matrice speciale non può essere riempita esplicitamente con EMPTY_VALUE in else, poiché l'indicatore ha una grave trasposizione di frattali da altri timeframe secondo un certo algoritmo, dove non c'è corrispondenza tra gli indici dei primi tre buffer e il quarto buffer...

Cigno:

//e i valori EMPTY_VALUE sono assegnati agli elementi 0 e 1 degli array, mm... e sulle ultime tre barre)

Come mai? Perché non tutti? Questo non lo capisco. Puoi spiegare? In realtà, non mi riferisco all'assegnazione dei soli valori reali (effettivi), ma alla perlustrazione inevitabile dell'intero buffer. ArrayInitialize(), così come molte altre funzioni di array, sono basate su un ciclo che è implicito per i programmatori finali di MQL.

La domanda su superamento della memoria rimane valida, e gli sviluppatori dovrebbero pensare di introdurre un parametro aggiuntivo inArrayInitialize() che specifichi il numero e meglio ancora i limiti della reinizializzazione del buffer.

P.S.: mi sembra di indovinare perché ArrayInitialize() in OnInit() non è efficiente qui. I buffer sono dinamici, cambiano dimensione, e in OnInit() si inizializzano con valori solo una volta e per la lunghezza corrente, non conoscendo ancora le dimensioni reali dei buffer in OnCalculate().

File:
cleanup.mq5  2 kb
 
papaklass:

L'indicatore nel visualizzatore non funziona:

Nel terminale in linea, funziona bene:

Può dare qualche dettaglio? Come è arrivato l'indicatore sul grafico del visualizzatore?
 
papaklass:

Inserisco le seguenti linee nel codice dell'Expert Advisor

Metto questi tre indicatori su un grafico pulito e salvo il modello come Expert Advisor. La foto è online nel mio post precedente.

Sto eseguendo l'Expert Advisor nel visualizzatore.

1. Mostra il modello salvato

2. Provate a eseguire la visualizzazione senza il modello (cioè cancellate prima il relativo file tpl). Nell'ultima build 555, gli indicatori personalizzati aggiunti automaticamente dovrebbero essere visualizzati correttamente.

 
papaklass:

Tutto funziona. Grazie.

Rimosso il modello. In esperto in OnInit() prescritto:

Mostra il tuo modello. L'indicatore dovrebbe anche essere visualizzato normalmente con il modello (cioè c'è un problema e dovrebbe essere risolto)
 
papaklass:

Inviare il file *.tpl

Ora provato di nuovo con il modello - non funziona. Rimuovendo il template - funziona.

Grazie. Ci occuperemo della questione.
 

x100intraday:

Ora pensateci e ditemi, vale la pena credere che tutto lì sia semplice e suggerire soluzioni apparentemente ovvie?

tutti i geni sono semplici.

Non ho potuto fare il resto. L'aneddoto sulla domanda sul forum, come rimuovere le tonsille mi ricorda :)

Non sono sicuro di come farlo... Non sono sicuro di come farlo.

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//+------------------------------------------------------------------+
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  clrGray
#property indicator_color2  clrGray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
//--- input parameters
input int BarsCount=100;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }
//+------------------------------------------------------------------+
//|  Fractals                                                        |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//---
   if(rates_total<5) return(0);
//---
   if(prev_calculated<7)
     {
      limit=2;
      if(rates_total-2>BarsCount) limit=rates_total-BarsCount;
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,limit);//отрисовываются и расчитываются только значения на последних BarsCount барах
      PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,limit);

      for(i=rates_total-2;i<rates_total;i++)//Последним двум барам присваивается EMPTY_VALUE. Исправил циферку в соответствии с iFractal(там фрактал может быть на 2ом баре)
         {
         ExtUpperBuffer[i]=EMPTY_VALUE;
         ExtLowerBuffer[i]=EMPTY_VALUE;
         }
     }
   else
      {
      limit=prev_calculated-3;//Здесь от prev_calculated правильнее считать..
      
      //---Добавленным с появлением нового бара элементам массивов присваиваем значение EMPTY_VALUE//Возможно всё будет нормально и без этого.
      if(rates_total>prev_calculated)
         {
         for(i=prev_calculated;i<rates_total;i++)
            {
            ExtUpperBuffer[i]=EMPTY_VALUE;
            ExtLowerBuffer[i]=EMPTY_VALUE;
            }
         }
      //---
      }
//---
   for(i=limit;i<rates_total-2 && !IsStopped();i++)//Исправил циферку
     {
      //---- Upper Fractal
      if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2])
         ExtUpperBuffer[i]=High[i];
      else ExtUpperBuffer[i]=EMPTY_VALUE;
      //---- Lower Fractal
      if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2])
         ExtLowerBuffer[i]=Low[i];
      else ExtLowerBuffer[i]=EMPTY_VALUE;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
Fractals
Fractals
  • voti: 8
  • 2010.01.26
  • MetaQuotes Software Corp.
  • www.mql5.com
Фракталы (Fractals) — это один из пяти индикаторов торговой системы Билла Вильямса, позволяющий обнаруживать дно или вершину.
 
Swan:

tutti i geni sono semplici.

Non ho potuto fare il resto. L'aneddoto sulla domanda sul forum, come rimuovere le tonsille mi ricorda :)

L'esempio di frattali indicatore ortodosso imho limitato. forse aiuterà...

In realtà, scrivo l'indicatore tramite una maniglia... Ma mi piace l'idea di rifiutare da ArrayInitialize() in favore del riempimento manuale esplicito con valori EMPTY_VALUE. Grazie, cercherò di fare un nuovo pasticcio che spero di non dover pulire più tardi. Anche se ci saranno sottigliezze e inconvenienti, li prevedo in anticipo... ma non importa.
 

Prossimo codice:

struct Pos
{
   int x;
   int y;
};

class Test
{
public:
   Test(const Pos& other)
      : pos(other)
   {
      Print("other = {", other.x, ", ", other.y, "}");
      Print("pos = {", pos.x, ", ", pos.y, "}");
   }
   
public:
   Pos pos;
};

int OnInit()
{
   Pos pos = {123, 456};
   Test test(pos);
   
   return(0);
}

Uscite:

2011.12.05 22:01:28 RectLabel (EURUSD,H1) pos = {12, 176314750}
2011.12.05 22:01:28 RectLabel (EURUSD,H1) altro = {123, 456}

Quindi, la lista di inizializzazione non ha funzionato, c'è della spazzatura nella struttura. È un bug o no?

 

Ho scollegato due agenti dal cloud e continuano a connettersi ai server del cloud ogni 30 secondi.

MO 0 Rete 00:00:17 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
LK 0 Rete 00:00:47 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RG 0 Rete 00:01:17 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
NS 0 Network 00:01:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RO 0 Rete 00:02:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
OK 0 Rete 00:02:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
MG 0 Rete 00:03:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
DR 0 Rete 00:03:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
DN 0 Rete 00:04:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
EJ 0 Network 00:04:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
GF 0 Rete 00:05:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RR 0 Rete 00:05:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
NN 0 Rete 00:06:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
KJ 0 Rete 00:06:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
QF 0 Rete 00:07:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
HQ 0 Rete 00:07:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
PM 0 Rete 00:08:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
QI 0 Rete 00:08:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
KE 0 Rete 00:09:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
NQ 0 Rete 00:09:51 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
OM 0 Rete 00:10:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
RI 0 Rete 00:10:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
LE 0 Rete 00:11:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
EP 0 Rete 00:11:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
IL 0 Network 00:12:18 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
HH 0 Network 00:12:48 connesso a 2.agents.mql5.com (attraverso un server proxy 192.168.0. )
FD 0 Rete 00:13:18 connesso a 2.agents.mql5.com (attraverso un server proxy

 
Konstantin83:

Ho scollegato due agenti dal cloud e continuano a connettersi ai server del cloud ogni 30 secondi.

Andiamo da Servicedesk.

Per favore, chiarisci come esattamente ti sei disconnesso? Avete cancellato (congelato) i servizi? Si prega di allegare i log degli agenti problematici.

Le impostazioni proxy nei tuoi log sono un po' strane. Hai scritto le impostazioni del proxy nelle configurazioni del tuo agente? Allegate common.ini del vostro agent manager alla domanda.