Errori, bug, domande - pagina 1177

 
svds75:

Salve. Potete dirmi perché quando interrogo le proprietà di una linea di tendenza, la variabile res è sempre vera, anche se ho impostato manualmente la bandiera per mostrare solo W1, o solo MN1?

Deve essere mostrato solo su una delle metà.

...ottenere... - sta ottenendo delle proprietà. E se res=true, è solo un'indicazione del successo del recupero delle proprietà.

Per impostare le proprietà, usare ...set...

 

Come continuazione del mio post precedente, sono riuscito a trovare l'area problematica che porta al bug usando il metodo scientifico.

Abbiamo una tale libreria con la funzione:

//---- testbuglib.mq5 ------

#property library

class A { }; class B   { private:    A* a; public:    A* b; }; int Test() export {   return 0; }

Ecco il file principale:

#include <Files\File.mqh>  // тут можно указать любой файл mqh

#import "testbuglib.ex5"
  int Test();
#import  

int OnInit() {  Test(); return 0; }

L'Expert Advisor risultante non funziona e visualizza nel log: "EX5 loading failed".

File:
TestBug.mq5  1 kb
 
svds75:

Salve. Potete dirmi perché la variabile res è sempre vera quando si richiedono le proprietà della linea di tendenza, anche se ho impostato manualmente la bandiera per mostrare solo W1, o solo MN1?

Voglio che sia mostrato solo su una delle metà.

Numero errato di parametri, stai chiamando la funzione come 1 opzione e dovresti chiamarla come 2 o confrontare il risultato.
 
TheLiteShadow:
Questo è vero, ma significa che ad ogni nuova barra tutti gli ultimi "indici" dei buffer dati devono essere "puliti"? La domanda è: perché? In MT4 non c'era questa situazione, capisco, durante l'inizializzazione l'avevo pulito, ma allora dovrebbe essere fatto da MT stesso, per lo stesso motivo, nell'inizializzazione dovrebbe essere fatto da MT e non dal programmatore, a che scopo il buffer dell'indicatore è semplicemente un'allocazione di memoria non capisco bene...
Quando ho fatto questa domanda alcuni anni fa, mi è stato detto che questo viene fatto per scopi di ottimizzazione. Inizializzi esattamente quanto ti serve. E se compilate subito alcuni dati di calcolo, non c'è bisogno di pre-scrivere degli zeri. La MT5 è diversa dalla MT4 in molti modi.
 
marketeer:
Quando ho fatto questa domanda qualche anno fa, mi è stato detto che era per l'ottimizzazione. Inizializzate esattamente quanto vi serve. E se compilate subito alcuni dati di calcolo, non c'è affatto bisogno di pre-scrivere degli zeri. La MT5 è diversa dalla MT4 in molti modi.
Il fatto che MT4 sia diverso da MT5 è compreso da tutti, ma non sarei d'accordo sull'ottimizzazione, e il programmatore ha troppo da tenere sotto controllo in più, non paragonabile ai linguaggi di basso livello, ma per me è superfluo, in generale, è chiaro, grazie...
 
TheLiteShadow:
Numero errato di parametri, stai chiamando la funzione come 1 opzione e dovresti chiamarla come 2 o confrontare il risultato.
Ho provato anche in questo modo. Anche se le bandiere funzionano davvero (la linea si mostra solo una volta), e Expert Advisor vede che entrambe le bandiere sono abilitate.
long res;
ObjectGetInteger(0,"line",OBJPROP_TIMEFRAMES,OBJ_PERIOD_W1|OBJ_PERIOD_MN1,res);
if((bool)res) Alert("линия line показывается на OBJ_PERIOD_W1 и OBJ_PERIOD_MN1");
 
svds75:
Provate in questo modo. Anche se le bandiere reali funzionano (la linea è mostrata solo su un timeframe), Expert Advisor vede che entrambe le bandiere sono abilitate.

Cosa vuoi veramente? Lei sta chiedendo visibilità su scadenze settimanali o mensili. Quindi il programma restituirà true se almeno uno di essi è acceso.

Richiedetelo separatamente in 2 chiamate.

 
svds75:
Ho provato anche in questo modo. Anche se le bandiere reali funzionano (la linea mostra solo una metà) e l'EA vede che entrambe le bandiere sono abilitate.

Quindi forse è necessario impostare direttamente la visibilità?

 ObjectSetInteger(0,"line",OBJPROP_TIMEFRAMES,OBJ_PERIOD_W1);
 
svds75:

Salve. Potete dirmi perché la variabile res è sempre vera quando si richiedono le proprietà della linea di tendenza, anche se ho impostato manualmente la bandiera per mostrare solo W1, o solo MN1?

Voglio che sia mostrato solo su una delle metà.

Poiché la linea esiste sempre, legge sempre il valore. Linea invisibile non significa che non ci sia una linea.
 
barabashkakvn:

Quindi forse è necessario impostare direttamente la visibilità?

No, devo impostare la visibilità manualmente e controllarla programmaticamente.