Errori, bug, domande - pagina 1126

 

Sto scrivendo un ToR per un EA MT4 con una priorità sull'elaborazione accelerata dei dati.

Per favore, consigliate se la sequenza dei calcoli o il campionamento (qual è il nome corretto - rappresentativo?) è importante per accelerare.

Allego due varianti sotto forma di immagini che mostrano gli schemi a blocchi.

Se puoi, per favore scrivi come dovrebbe apparire il codice se l'esecuzione selettiva dei blocchi sarà - un layout puramente primitivo, e se questo darà un aumento significativo della velocità!

File:
Logic_V_01.png  26 kb
Logic_V_02.png  30 kb
 
void OnStart()
{
        uchar max=0;
        for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
        for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает
        for(int t=0;t<ULONG_MAX;t++)  {max++;}    //так нет предупреждения и цикл не пашет
        Print("Done!");
}
 

Come si spiega questa chiusura di una posizione nel tester? È dovuto all'allargamento dello spread?

Screenshot della piattaforma di trading MetaTrader

EURUSD, M20, 2014.04.12

Alfa-Forex, MetaTrader 5, reale

temp_file_screenshot_63279.png

EURUSD, M20, 2014.04.12, Alfa-Forex, MetaTrader 5, Reale


 
Crucian:

Come si spiega questa chiusura di una posizione nel tester? È l'allargamento dello spread?

[img]https://charts.mql5.com/4/434/eurusd-m20-alfa-foreks-temp-file-screenshot-63279-png.png[/img]

Se lo spread si è allargato (e a giudicare dallo screenshot - di 720 punti! su cinque cifre), allora tutto è corretto.

La posizione di vendita ha chiuso al prezzo Ask. Questo è se i fermi sono stati posizionati.

A proposito, il tuo brokerAlfa-Forex hasolo spread giganteschi alla fine della settimana e all'inizio.

Probabilmente sono stati registrati nella cronologia delle quotazioni e il tester ha simulato il trading su di essi.

Le soste per il fine settimana sono pericolose - non salveranno comunque dal divario, e l'allargamento dello spread può facilmente prenderti.

 
Fleder:
for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает

Nessun errore qui perchéLONG_MAX+1< 0

for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
Qui l'avvertimento è valido (t<LONG_MAX sempre vero se t int ) ciclo infinito
 
void OnStart()
{
  uchar max=0;
  for(int t=0;t<ULONG_MAX-1 e0;t++)  {max++;}      //так цикл работает, предупреждения нет так как ULONG_MAX-1e0 имеет тип double
  for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
  Print("Done!");
}
 
Fleder:
for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
Non c'è nessun errore qui, perché ULONG_MAX-1< 0, cioè l'operazione di confronto è convertita in int o long - più precisamente c'è un confronto bitwise
 
A100:
Non c'è errore perché ULONG_MAX-1< 0, perché l'operazione di confronto è ridotta a int

Allora come spiegarlo:

void OnStart()
{
  long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
  Print(ULONG_MAX-1);      //18446744073709551614
  Print(ULONG_MAX);        //18446744073709551615
}
 
A100:
Non c'è nessun errore qui perché ULONG_MAX-1< 0, cioè l'operazione di confronto è cast a int o long

Intendi il confronto nell'espressione testata nel ciclo?

Perché non sembra così in un semplice confronto.

 
A100:

Basta scambiarli :)

Cosa fa questo riarrangiamento? t era inferiore a ULONG_MAX-1 e lo è ancora.

void OnStart()
{
  long t=0;
  Print( (t < ULONG_MAX-1) == (ULONG_MAX-1 < t)); //false
}