Errori, bug, domande - pagina 815

 
tol64:

Potete dirmi perché si verifica un errore quando si ottiene l'handle di un indicatore, se il nome dell'indicatore da chiamare è contenuto in una variabile?

Cioè, non c'è nessun errore come questo:

È così che otteniamo l'errore 4802 (l'indicatore non può essere creato):

Leggete qui sutester_indicator.
 
marketeer:
Leggete qui l'indicatore tester_indicator.
Sì, ho già letto e riletto tutto molte volte. )) Ma non sono riuscito ad ottenere ciò di cui ho bisogno. E ho bisogno di impostare il nome dell'indicatore su una variabile.
 
tol64:
Ho letto e riletto tutto più e più volte. )) Ma non posso ottenere ciò di cui ho bisogno. E ho bisogno di impostare il nome dell'indicatore su una variabile.
Allora, avete aggiunto la proprietà test_indicator? Credo di non poterne fare a meno.
 
marketeer:
Allora, hai aggiunto la proprietà test_indicator? Non credo che avrei potuto farlo senza.

L'ho provato. Qualcosa non funziona così. Potresti mostrarmi un esempio (forse lo sto facendo male)?

P.S. Ha funzionato. Non potrebbe essere più semplice. Fuori a riposare. ))

P.S2. Ma ottengo la dipendenza dal fatto che devo registrare tutti gli indicatori attraverso la proprietà test_indicator. Cioè, se il nome dell'indicatore è specificato da un parametro esterno e un utente ha un nuovo indicatore, dobbiamo aprire nuovamente il codice. Questo non è esattamente quello che vogliamo.

 
tol64:

P.S2. Ma abbiamo ancora la dipendenza di dover scrivere tutti gli indicatori attraverso la proprietà test_indicator. Cioè, se il nome dell'indicatore è specificato da un parametro esterno e un utente ha un nuovo indicatore, dobbiamo aprire nuovamente il codice. Questo non è esattamente quello che vogliamo.

Si fa in cinque. L'ho usato per costruire indici da altri indici selezionati a caso. Forse gli sviluppatori ci diranno cosa ne pensano.
 
marketeer:
Ecco come si fa in cinque. L'ho usato io stesso per costruire indici da diversi altri indici selezionati a caso. Forse gli sviluppatori ci diranno cosa ne pensano.

Il fatto è che gli EA nel tester di MT5 sono lanciati fuori dal terminale e non hanno tutto l'ambiente di libreria che c'era in MT4.

Per esempio, l'Expert Advisor viene inviato al cloud a tutti e per passare ulteriori collegamenti, dobbiamo:

  1. usare nomi di indicatori statici nelle chiamate, il che permette al compilatore di prescrivere automaticamente le dipendenze dell'esperto
  2. prescrivere esplicitamente tramite proprietà la lista degli indicatori richiesti per costruire manualmente la lista delle dipendenze.

Se si utilizzano chiamate di indicatori dinamici, allora è necessario prescrivere manualmente l'elenco degli indicatori utilizzati. Quando si esegue un test di terzi, tutti i file dipendenti vengono inviati insieme all'Expert Advisor. Questi possono essere sia locali (sono comunque fuori dal terminale), sia remoti o agenti cloud.

Questo è il prezzo da pagare per "premere start e non pensare ad altro, tutto funziona automaticamente".

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
Renat:

Il punto è che gli EA nel tester di MT5 girano fuori dal terminale e non hanno tutto l'ambiente di libreria che aveva MT4.

Questo è il prezzo da pagare per "premere start e non pensare ad altro, tutto funziona automaticamente".

Questo è comprensibile, ma d'altra parte gli utenti hanno regolarmente una contro-domanda, perché la solita ed efficace flessibilità è stata persa. Avete infatti implementato solo un modello di binding statico. E la gente chiede anche il collegamento dinamico. L'idea è che anche se qualcosa viene inviato al cloud, inizia ad essere contato e improvvisamente accede ad una torretta esterna, è possibile interrogarlo e recuperarlo in modo simile al resto dell'ambiente, che viene passato dal terminale all'agente. Beh, è solo un pensiero ad alta voce. Non ho fatto questa domanda ;-).
 

Questa domanda potrebbe essere già stata sollevata, ma non l'ho trovata nel forum.

Nel seguente codice (nel metodo test()), quando si prende un descrittore costante (riferimento) a un oggetto e lo si assegna a uno non costante, il compilatore (MetaEditor 5.00, Build 687) non genera un errore:

class A{
   public:
      void someDo() {}
};

class B{
   public:
      void B( A* aA ) : mA( aA ) {}
      const A* getA() { return (mA); }   
   private:
      A* mA;
};

void test(){
   A a;
   B b( GetPointer( a ) );

   //Ошибки нет. И это правильно   
   const A* a1 = b.getA();
   //Ошибка есть: "...someDo' - call non-const method for constant object..". И это правильно   
   a1.someDo();
   
   //Ошибки нет. Это НЕ правильно(CONST A* B::getA())!
   A* a2 = b.getA();
   //ошибки нет. Правильно (а2 не const)
   a2.someDo();
}
 
mvk:

Questa domanda potrebbe essere già stata sollevata, ma non l'ho trovata nel forum.

Nel seguente codice (nel metodo test()), quando si ottiene un descrittore costante (riferimento) a un oggetto e lo si assegna a uno non costante, il compilatore (MetaEditor 5.00, Build 687) non genera un errore:

questo sarebbe il caso senza l'errore.

class A{
   public:
      void someDo() const {};
};
 

domanda per gli sviluppatori sulla velocità dei puntatori agli oggetti


Perché il primo codice

class CSomeObj
{
public:
   double prm;
};

CSomeObj arr;

void OnStart()
{
        EventSetTimer(1);

        uint s0=GetTickCount();
        for (int i=0; i<100000000; i++) arr. prm=10;
        Print("1=", GetTickCount()-s0);
        
        s0=GetTickCount();
        CSomeObj *item=GetPointer(arr);
        for (int i=0; i<100000000; i++) item. prm=10;
        Print("2=", GetTickCount()-s0);
}

funziona due volte più velocemente del secondo?

2012.08.21 09:56:40 info (EURUSD,D1) 2=1654
2012.08.21 09:56:38 info (EURUSD,D1) 1=795

si può ottimizzare per aumentare la velocità?