Errori, bug, domande - pagina 2654

 

Qualcuno può illuminarci sulla seguente domanda:

Avere una dll scritta in C# ma compilata:

- Per MT5 solito progetto C# - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 bit, ma avvolto in chiamate C gestite

Le fonti dll sono identiche al 100%, tranne il wrapper MT4, ovviamente,

OS Win10-64

Bene, la domanda è perché MT4 chiama le funzioni esattamente 4 volte più velocemente, le cifre sono circa 100 000 chiamate dll su MT4 per 7,5 secondi, MT5 per 30 secondi

 
Igor Makanu:

Qualcuno può illuminarci sulla seguente domanda:

Avere una dll scritta in C# ma compilata:

- Per MT5 solito progetto C# - Net Framework dll - 64 bit

- MT4 - Net Framework dll - 32 bit, ma avvolto in chiamate C gestite

Le fonti dll sono identiche al 100%, tranne il wrapper MT4, ovviamente,

OS Win10-64

Bene, la domanda è perché MT4 chiama le funzioni esattamente 4 volte più velocemente, le cifre sono circa 100 000 chiamate dll su MT4 per 7,5 secondi, MT5 per 30 secondi

IMHO. C-runtime in un caso e una macchina virtuale nell'altro.

 
perso una nuova funzionalità sul forum, dove il nome, cognome, data e accanto alle traduzioni del pulsante, i numeri - 1 2 3 , non tutti hanno, ieri penso che non ho avuto, perché non tutti, e qual è la definizione di pagine?
 

Un'interfaccia grafica è implementata nell'Expert Advisor. Sono anche implementati gli eventi dell'utente (ad esempio, eventi di cambiamento della GUI). Eseguo il debug su dati reali (F5). Non appena metto un breakpoint su un evento utente - il debugger si ferma, ma la successiva pressione di F5 (continuazione del debug) non porta ad alcun cambiamento nella GUI stessa. Domanda: dovrebbe essere così o è un bug del debugger?

Se rimuovo il breakpoint (il debug continua) - i cambiamenti nella GUI sono normali.

MT5, build 2340.

 
Vladimir Simakov:

IMHO. C-runtime in un caso e una macchina virtuale nell'altro.

c'è un .Net virtuale in entrambe le dll

Ho trovato la differenza nel codice, ho anche gettato la classe base a 32 bit in un thread separato, perché non ha altro modo di lavorare

Ho fatto le stesse manipolazioni per MT5, i risultati sono più o meno gli stessi (tre test ciascuno):

MT5: ciclo 100000 , tempo 8.482981 sec , ciclo 100000 , tempo 8.638789 sec , ciclo 100000 , tempo 8.390046 sec

MT4: ciclo 100000, tempo 7.128857 sec, ciclo 100000, tempo 7.176361 sec, ciclo 100000, tempo 7.205439 sec


Ok, supponiamo che sia un qualche tipo di liquore di Microsoft
 

Saluti! Buone vacanze a tutti gli uomini !!!!
Non capisco quale sia lo strano bug con la visualizzazione a zig zag dell'equità nel tester. Non capisco lo strano bug con la visualizzazione a zig zag dell'equità nel tester. Se cambio l'impostazione "Settlement method" da "Exchanging Stoks" a "Forex", il capitale viene visualizzato normalmente. Ho avuto la stessa esperienza qualche anno fa, volevo provare a collegare MT5 a un fondo, l'ho provato, mi sono spaventato e ho rinunciato. Ora ho provato di nuovo e la stessa cosa. È strano?

 
Perché non c'è modo di implementare una funzione con un argomento "universale" che possa passare qualsiasi variabile indipendentemente dalla sua "origine": lvalue, rvalue, letterale o variabile temporanea?
Il problema è risolvibile per i metodi delle classi contenitore "tipizzate", ma non lo è per le funzioni normali.

La contraddizione principale è che per trasferire strutture è necessario usare il trasferimento per riferimento, e per letterali e variabili temporanee - trasferimento per valore.
Come risultato, otteniamo un errore di compilazione per i tipi lvalue normali perché entrambe le funzioni sovraccaricate sono adatte alla chiamata.
Come soluzione parziale e solo per i tipi "primitivi", si possono costruire 12 funzioni sovraccaricate:
#define  CREATE_LITERAL_PARAMETER_CALL_HANDLERS_VOID_T1_P2_L2(current_func_name, main_func_name, param_1)          \
   template<typename T> void current_func_name(param_1 p1, const string  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const long    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const int     value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const short   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const char    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ulong   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uint    value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const ushort  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const uchar   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const double  value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const float   value){ main_func_name(p1, value);}      \
   template<typename T> void current_func_name(param_1 p1, const bool    value){ main_func_name(p1, value);}    
Ma se una funzione deve accettare due argomenti "universali", allora solo 144 funzioni sovraccaricate sono necessarie per implementarla, mentre nel caso di tre tali argomenti, sono necessarie tutte le 1728 funzioni sovraccaricate.


Suggerimento:
Infine, permette agli utenti di passare letterali e variabili temporanee come argomenti di funzioni const ref.
Che sia una direttiva separata # - qualunque cosa...
 

Difetti nel funzionamento della cache della funzione template/classe:
(non corretto da MT5 (build 2340)) ** Comportamento indefinito, si crea un oggetto complesso avvolto con tipo interno "C" diverse volte e si scopre che è un tipo di dati completamente diverso, forse "B", forse "int", qualunque cosa si voglia...
(non corretto da MT5 (build 2340)) * Errore di compilazione, bug sul passaggio di un puntatore di funzione come argomento const ref template.
(non corretto da MT5(build 2340)) * Errore di compilazione, l'oggetto B<int> può essere creato dopo l'oggetto di classe B<void*>, ma se fatto prima, si verifica un errore di compilazione.


Difetti nella funzione template/classe di lavoro:
(non corretto da MT5 (build 2340)) ** Errore di compilazione, bug all'interno della funzione template, il puntatore passato all'interno dell'operazione diconversione esplicita del tipo si comporta come una classe altrimenti come un puntatore.
(non corretto da MT5 (build 2340)) ** Errore di compilazione, bug con la generazione del codice della classe template mentre si usa la classe interna.
(non corretto da MT5 (build 2340)) ** Errore di compilazione, bug nel tentativo di accedere alla classe interna per il parametro template della funzione template.
(non corretto da MT5 (build 2340)) ** Errore di compilazione, bug nella generazione di un metodo/classe di template, il processo di "auto-sostituzione" del parametro del template sfugge all'ambito nel codice principale del programma.
(non corretto da MT5 (build 2340)) * Errore di compilazione, il bug con la classe template non genera automaticamente il codice quando la classe template agisce come valore di ritorno per il metodo template.
(non corretto da MT5 (build 2340)) * Errore di compilazione, bug nella definizione della classe interna - non c'è la possibilità di fare riferimento allo spazio dei nomi globale esplicitamente quando si specifica la classe base.


Difetti nelle chiamate di funzione sovraccaricate disadattamento della priorità in MQL rispetto al C++:
(non corretto da MT5 (build 2340)) *** Errore di compilazione quando c'è un'eredità di classe A <= B <= C <= D e sono implementate due funzioni di sovraccarico, per esempio, una con parametro A* e una con parametro B*, allora passare in tale funzione un oggetto C* o D* in MQL causa un errore di compilazione "ambiguous call to overloaded function".
(non corretto da MT5 (build 2340)) ** Runtime, errore di priorità per le chiamate a funzioni template sovraccaricate.



Suggerimenti:
link- sul permettere ai letterali e alle variabili temporanee di essere passati come argomenti di funzioni const ref.
link- quandosi spostano i file del progetto nella scheda Progetto, per i file spostati che sono aperti e si trovano nelle schede ME, per aggiornare automaticamente il loro percorso di localizzazione.
link- per introdurre la funzionalità della dichiarazione typedef in MQL.
link- circa la possibilità di forzare la generazione di costruttori di copia e operatori di assegnazione predefiniti.


 

Sto chiedendo aiuto, sono completamente fuori dal giro.

In OnChartEvent, premendo `C` cancello/ripristino il grafico dei prezzi.

E tutto andrebbe bene, ma se il layout della tastiera non è selezionato inglese - non funziona.


Come rendere il rilevamento della pressione di `C` indipendente dal layout selezionato?

 
fxsaber:

Sto chiedendo aiuto, sono completamente fuori dal giro.

In OnChartEvent, premendo `C` cancello/ripristino il grafico dei prezzi.

E tutto andrebbe bene, ma se il layout della tastiera non è selezionato inglese - non funziona.


Come fare in modo che il rilevamento della pressione di `C` sia indipendente dal layout selezionato?

Necessità di controllarelparam

//+------------------------------------------------------------------+
//|                                                 TranslateKey.mq5 |
//+------------------------------------------------------------------+
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
  {
   if(id==CHARTEVENT_KEYDOWN)
     {
      short sym=TranslateKey((int)lparam);
      //--- if the entered character is successfully converted to Unicode
      if(sym>0)
         Print("lparam: ",lparam,", ",sym,"'",ShortToString(sym),"'");
      else
         Print("Error in TranslateKey for key=",lparam);
     }
  }
//+------------------------------------------------------------------+

Per entrambi i layout di tastiera ru e en (sia minuscolo che maiuscolo) lparam sarà 67:

TranslateKey (EURUSD,H1)        lparam: 67, 67'C'
TranslateKey (EURUSD,H1)        lparam: 67, 1057'С'
TranslateKey (EURUSD,H1)        Error in TranslateKey for key=20
TranslateKey (EURUSD,H1)        lparam: 67, 1089'с'
TranslateKey (EURUSD,H1)        lparam: 67, 99'c'