Errori, bug, domande - pagina 1747

 

Come posso rimuovere l'incollaggio visivo degli oggetti NOT LABEL alle coordinate temporali delle barre?

Ho impostato la coordinata temporale dell'oggetto su secondi, ma si visualizza come se la impostassi sul timeframe.

Ho scavato la domanda

Forum sul trading, sistemi di trading automatico e test di strategia

Errori, bug, domande

Andrew Petras, 2014.11.26 13:34

Sono molto bravo a spostare oggetti come triangolo, ellisse o rettangolo, e i punti di ancoraggio sono sproporzionatamente "fluttuanti".

Non dipende da queste impostazioni


Creo


trascinare e rilasciare


Il rettangolo è "alla deriva" del secondo punto, il triangolo e l'ellisse hanno il terzo punto.

Si può rimediare a questo? Ho bisogno di "misure" precise.

Quando seleziono "Precise time scale", il binding menzionato scompare e tutto viene mostrato come dovrebbe essere. Tuttavia, non ho trovato da nessuna parte in MQL5 come abilitare/disabilitare questo parametro. Non è previsto?

 

Ho davvero bisogno di aiuto! Sto cercando di capire la causa di questo strano comportamento da qualche ora. Alla fine ho scritto un EA con un risultato abbastanza inaspettato

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

Il risultato (bottom-up)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

SymbolInfoTick a volte restituisce (bisogna aspettare) un tick con un tempo inferiore al precedente!

Che diavolo è tutto questo? Configurazione

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
 
fxsaber:

Ho davvero bisogno di aiuto! Sto cercando di capire la causa di questo strano comportamento da qualche ora. Alla fine ho scritto un EA con un risultato abbastanza inaspettato

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

Il risultato (bottom-up)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

SymbolInfoTick a volte restituisce (bisogna aspettare) un tick con un tempo inferiore al precedente!

Che diavolo è tutto questo? Configurazione

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
Sì, non sei l'unico che ha bisogno di aiuto qui. È da qualche settimana che cerco di arrotolare le zecche normalmente in una candela. Quindi... le zecche sono ancora crude. Offerta in SD#1598238
 

Linea magica

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Sequenza di azioni (rigorosa)

  1. Mettete i file allegati nella stessa cartella. Poi con il mouse in MetaEditor
  2. File->Apri->Seleziona Test.mqh->Tasto Apri
  3. Edit->Search and Replace->Replace->compila i campi Find: e 'Replace with:' come mostrato sotto->il pulsante 'Replace All

Risultato:

Impostazioni qui: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

File:
Test.mqh  1 kb
key.mqh  1 kb
 
Alexey Kozitsyn:
Sì, non sei l'unico che ha bisogno di aiuto qui. È da qualche settimana che cerco di arrotolare bene i miei tic in una candela. Quindi... i tic sono ancora grezzi. Offerta in SD#1598238
I tic stanno rotolando nella candela normalmente.
 
fxsaber:
Tiki rotola nella candela normalmente.
Davvero? E i volumi corrispondono? E avete fatto i controlli? E puoi anche mostrare i registri?
 
Alexey Kozitsyn:
Davvero? E i volumi sono gli stessi? E avete eseguito i controlli? E puoi anche mostrare i registri?

Ha fatto il controllo - guarda il codobase. Non preoccupatevi della mancata corrispondenza tra i volumi delle candele e quelli calcolati, perché si tratta di un tick di confine, che può cadere in una barra o nell'altra. Questo non è il principio. Ho anche postato l'indicatore di rotazione degli scambi sul forum. Quindi non c'è nessun problema.

Nel tuo caso, se diventi molto nerd, puoi prendertela con il meccanismo di creazione delle barre, ma non con CopyTicks.

 

Errore di compilazione

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

E se si rimuove la linea (*), tutto è a posto. Cosa c'è di sbagliato in B::f(uint)? Se si guarda la situazione dall'altro lato

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

possiamo vedere gli svantaggi fondamentali dell'algoritmo MQL di ricerca di una funzione corrispondente. Nel 2° esempio, B::f(uint) sarà chiamato fino a quando non ci sarà nessuna stringa (**). Non appena appare la linea (**), A::f(int) sarà chiamato. Significa che i cambiamenti nella classe base influenzano il risultato finale, mentre in C++ B::f(uint) sarà sempre chiamato indipendentemente dai cambiamenti nella classe base, il che garantisce la stabilità del risultato finale.

In MQL, si scopre che lo sviluppatore della classe A ha appena inventato una nuova funzione pubblica-protetta-privata e per questo l'utente della classe B ha smesso di compilare il codice e/o, cosa più critica, il risultato finale è cambiato

 
A100:

Linea magica

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Sequenza di azioni (rigorosa)

  1. Mettete i file allegati nella stessa cartella. Poi con il mouse in MetaEditor
  2. File->Apri->Seleziona Test.mqh->Tasto Apri
  3. Edit->Search and Replace->Replace->compilare i campi Find: e 'Replace with:' come mostrato sotto->il pulsante 'Replace All

Risultato:

Impostazioni qui: https://www.mql5.com/ru/forum/1111/page1127#comment_795376

Grazie per il post, il bug sarà risolto nel prossimo aggiornamento.
 
A100:

Errore di compilazione

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

E se si rimuove la linea (*), tutto è a posto. Cosa c'è di sbagliato in B::f(uint)? Se si guarda la situazione dall'altro lato

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

possiamo vedere gli svantaggi fondamentali dell'algoritmo MQL di ricerca di una funzione corrispondente. Nel 2° esempio, B::f(uint) sarà chiamato fino a quando non ci sarà nessuna stringa (**). Non appena appare la linea (**), A::f(int) sarà chiamato. Significa che i cambiamenti nella classe base influenzano il risultato finale, mentre in C++ B::f(uint) sarà sempre chiamato indipendentemente dai cambiamenti nella classe base, il che garantisce la stabilità del risultato finale.

In MQL, si scopre che lo sviluppatore della classe A ha appena inventato una nuova funzione pubblica\protetta\privata e per questo l'utente della classe B ha smesso di compilare il codice e/o, più criticamente, il risultato finale è cambiato.

Solo la costante "1" nella chiamata b.f( 1 ) è interpretata come int. Fate una conversione esplicita e tutto funzionerà:

b.f( (uint)1 );