Errori, bug, domande - pagina 1405

 
Tapochun:
Potete dirmi, per favore, quali valori di spread vengono passati all'array spread[] quando OnCalculate() viene chiamato nell'indicatore? Valori massimi/minimi/medi per candela?
Quelli che il terminale riceve dal server.
 

È sorta una domanda sull'ordine in cui la .dll viene caricata. Se dichiarato

#import "Test1.dll" //1
#import "Test2.dll" //2
#import

saranno caricati in ordine inverso, cioè "Test2.dll" per primo. Sembrerebbe che non faccia alcuna differenza. Si è scoperto che fa la differenza e in alcuni casi (.dll richiede un certo ordine di caricamento) fallisce: Sappot caricare 'Test1.dll'.
La
questione è se cambiare l'ordine di carico in diretto, che dal punto di vista del codice sarebbe più logico - o se assicurare che questo ordine non venga cambiato in futuro (in modo che il codice regolato sull'ordine inverso non smetta improvvisamente di funzionare). Al momento dobbiamo adattare il codice all'ordine inverso.

 

Costruire 1191. Errore di compilazione: errore di generazione del codice


Non so nemmeno dove cercare il motivo. Ma nella build 1162 tutto è ok.

 
A100:

Costruire 1191. Errore di compilazione: errore di generazione del codice


Non so nemmeno dove cercare il motivo. Ma nella build 1162 tutto è ok.

Si prega di inviare il codice a servicedesk.
 
Alexander:
Si prega di inviare il codice a servicedesk.

È pesantemente distribuito - cercherò di metterlo tutto in un file.

Altro codice - nota il tempo - è probabilmente 20 volte più grande

 
Ilyas:

Ad oggi sono noti due casi:
1) In operazione bool &= (espressione bool)
2) Una virgola in più nelle sequenze di inizializzazione: val={ {...},{...}, }

Ecco il primo caso - ho molte operazioni di questo tipo nel mio codice. Non ho avuto problemi prima quando avevo la build 1159. Quando possiamo aspettarci delle correzioni?

 

Errore di generazione del codice

Ho inviato il codice sorgente a servicedesk: #1332553

 
Alexander:
Si prega di inviare il codice a servicedesk.

errore di generazione del codice


//build 1191
class A {};
class B : public A {};
void f( A& a ) {}
B *h() { return new B; }
void OnStart()
{
        f( h() );
}

Per favore, fate attenzione a non finire come ho descritto nella tasca. Se potete farlo senza * come funziona ora e ha funzionato prima nel seguente esempio

//build 1191
class A {};
void f( A& a ) {}
A *h() { return new A; }
void OnStart()
{
        f(  h() ); //нормально
        f( *h() ); //нормально
}
per favore fatelo, se no - forse ha senso rollare tutto indietro prima di iniziare a usare l'innovazione

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

Bug, bug, domande

A100, 2015.08.26 10:35

In effetti state offrendo un'entrata semplice e diretta

a = (b + c) - d*e + f;
sostituire con
*a = (*b + *c) - *d**e + *f;
E questo per cosa? In modo da poter scrivere
bool c = *a == *b;

mentre una funzione speciale può essere utilizzata per confrontare i puntatori all'uguaglianza, e tutte le altre operazioni aritmetiche (addizione, sottrazione, moltiplicazione, ecc.) con i puntatori non hanno alcun significato di per sé, e sono interessanti solo in termini di poterle sovraccaricare.

Solo creando una base matematica e una classe derivata, ridefinendo diverse (piuttosto che una o due) operazioni aritmetiche, rendendole virtuali e poi testando espressioni complesse (non solo a = b + c) sulla loro base - solo questo vi avvicinerà alla comprensione che tutto è ora fatto OTTIMAMENTE. Nel frattempo, stai ragionando ad un livello base.

Se prendete il confronto dei puntatori di uguaglianza in una funzione separata, vi rimane solo un(!) collo di bottiglia

class A {};

A *a = b; //однозначно присвоение указателю значения
a = b;    //неоднозначно
che dovrebbe comunque essere trattato come un'assegnazione e non una chiamata operator=(), perché attualmente non c'è altra sintassi per assegnare un valore a un puntatore, mentre a.operator=( b ) può anche essere chiamato esplicitamente
 
A100:


Altro codice - attenzione al tempo - deve essere cresciuto di 20 volte

Questo è un nuovo compilatore ottimizzante per MQL5 (MQL4 non ce l'ha).

Dovete pagare per un codice di destinazione migliore con un tempo di compilazione più lungo. Alcune lunghe funzioni composte da centinaia di linee sono molto difficili da ottimizzare.

 
Renat Fatkhullin:

Ecco come funziona il nuovo compilatore ottimizzatore per MQL5 (è assente in MQL4).

Per un codice di destinazione migliore si deve pagare un tempo di compilazione più lungo. Alcune lunghe funzioni composte da centinaia di linee, sono molto ostinate nell'ottimizzazione.

È davvero necessario? Non è troppo alto il prezzo di questo "codice di alta qualità"? Rallentare la velocità di compilazione decine di volte per un guadagno di prestazioni relativamente piccolo... Tanto più che in molti casi, questo guadagno non è molto importante, e allungare il tempo di compilazione è una tortura per il programmatore.

Non sarebbe meglio fare le opzioni di compilazione "Debug" e "Release"?