Imparare e scrivere insieme in MQL5 - pagina 13

 
Yedelkin:

Strano. Hai bisogno del codice per MQL5, che dovrebbe già essere sul sito web. Tutto quello che dovete fare è cercarlo. È esattamente quello di cui sto parlando.

Ma questo dipende da voi.

È una ricerca molto noiosa, forse qualcuno te lo dirà.

A proposito, ho rifatto questo codice per mql5. Forse qualcuno potrebbe usarlo.

input double risk=0.01;
   double lot_min =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double lot_max =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double lot_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   double contract=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   double free_margin=AccountInfoDouble(ACCOUNT_FREEMARGIN);
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);
   double lot;
   
     lot=NormalizeDouble(free_margin*risk*leverage/contract,2);
     lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
 
Signori.
si prega di commentare:

ENUM_TRADE_RETURN_CODES
Codice ID Descrizione
10004 TRADE_RETCODE_REQUOTE Richiesta rifiutata
10006 TRADE_RETCODE_REJECT Richiesta rifiutata
...
nessun codice 10005. Non è un errore?
Rispettosamente ...
 

Domanda. C'è una funzione chiamata GetTickCount () - restituisce il numero di millisecondi trascorsi dall'avvio del sistema. Lanota dice che "il conteggio è limitato dalla risoluzione del timer di sistema. Poiché il tempo è memorizzato come un numero intero senza segno, trabocca ogni 49,7 giorni quando il computer funziona continuamente".

E cosa succede quando il contatore trabocca? Si resetta e inizia un nuovo conto alla rovescia o il sistema si blocca?

 

Yedelkin:

Cosa succede quando il contatore trabocca? Si resetta e inizia un nuovo conteggio o il sistema si blocca?

Trabocca e riparte da zero.
 
Renat:
Trabocca e ricomincia da zero.
OK, capito!
 

Domanda. La descrizione di switch(expression){...} dice che "l'espressione dell'operatore switch deve essere di tipo intero". Ho visto la descrizione di questo operatore con espressioni di altri tipi su Internet. L'uso dell'operatore switch sarà esteso aggiungendo espressioni di tipo stringa?

 
Yedelkin:

Domanda. La descrizione di switch(expression){...} dice che "l'espressione dell'operatore switch deve essere di tipo intero". Ho visto la descrizione di questo operatore con espressioni di altri tipi su Internet. Estenderemo l'uso dell'operatore switch aggiungendo espressioni di tipo stringa?

No, purtroppo no. Per i tipi di stringa solo se ... altrimenti se ... else .

L'uso di tipi interi in switch velocizzerà l'operatore di switch diverse volte di più che se

Документация по MQL5: Основы языка / Типы данных / Целые типы
Документация по MQL5: Основы языка / Типы данных / Целые типы
  • www.mql5.com
Основы языка / Типы данных / Целые типы - Документация по MQL5
 
stringo:

No, purtroppo no. Per i tipi di stringa solo se ... altrimenti se ... else

L'uso di tipi interi in switch velocizzerà il codice diverse volte di più che se

OK, grazie per il suggerimento!
 

Domanda. La descrizione della funzione StringConcatenate() dice che "StringConcatenate() lavora più velocemente e in modo più economico in memoria rispetto al collegamento delle stringhe per mezzo di operazioni di addizione grazie al fatto che non vengono utilizzate variabili temporanee di tipo stringa". Ho usato gli esempi del Manuale di Riferimento, cambiandoli leggermente:

   string a="a",b="b",c;
   uint   start,stop;
   long   i,length=10000000;
//--- первый способ
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      c=a+b;
     }
   stop=GetTickCount();
   Print("time for 'c = a + b' = ",(stop-start)," milliseconds, i = ",i);


//--- второй способ
   a="a"; // заново инициализируем переменную a
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      StringAdd(a,b);
     }
   stop=GetTickCount();
   Print("time for 'StringAdd(a,b)' = ",(stop-start)," milliseconds, i = ",i);

//--- третий способ
   a="a";c="";  
   start=GetTickCount();
   for(i=0;i<length;i++)
     {
      int k=StringConcatenate(c,a,b);
      //c="";   //с такой строчкой работает ещё дольше.          
     }
   stop=GetTickCount();
   Print("time for 'StringConcatenate(c,a,b)' = ",(stop-start)," milliseconds, i = ",i);
L'uscita è:

DR 0 DoubleToString (EURGBP,M1) 22:15:55  time for 'c = a + b'              = 2359 milliseconds, i = 10000000
QE 0 DoubleToString (EURGBP,M1) 22:15:56  time for 'StringAdd(a,b)'          = 1031 milliseconds, i = 10000000
FE 0 DoubleToString (EURGBP,M1) 22:16:00  time for 'StringConcatenate(c,a,b)' = 3891 milliseconds, i = 10000000

Si è scoperto che StringConcatenate funziona più lentamente di string binding usando operazioni di addizione. Qual è il problema?

Документация по MQL5: Основы языка / Типы данных / Тип string
Документация по MQL5: Основы языка / Типы данных / Тип string
  • www.mql5.com
Основы языка / Типы данных / Тип string - Документация по MQL5
 
Yedelkin:

Domanda. La descrizione della funzione StringConcatenate() dice che "StringConcatenate() lavora più velocemente e in modo più economico in memoria rispetto al collegamento delle stringhe per mezzo di operazioni di addizione grazie al fatto che non vengono utilizzate variabili temporanee di tipo stringa". Ho usato esempi dalla Referenza, cambiandoli un po':

Ho ottenuto l'output:

Si è scoperto che StringConcatenate funziona più lentamente di string binding usando operazioni di addizione. Qual è l'intoppo?

È un po' un termine improprio per controllare (se ho capito bene). Il trucco della funzione è un'altra cosa...

Circa questo codice

////////////////////////////////////////////////////////////////////////////////
//             Global variables, used in working the trade system             //
////////////////////////////////////////////////////////////////////////////////
string a="Пример";
double b=1.26,c = 1.27;
string d;

uint   start,stop;

long   i,length=10000000;
////////////////////////////////////////////////////////////////////////////////
void OnStart()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

start=GetTickCount();
   
  for(i=0;i<length;i++)
  {
  d=a+(string)b+(string)c;
  }

stop=GetTickCount();

Print("time for 'd = a + b + c' = ",(stop-start)," milliseconds, i = ",i);

//Второй способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  StringAdd(d,a);
  StringAdd(d,(string)b);
  StringAdd(d,(string)c);
  }
stop=GetTickCount();

Print("time for 'StringAdd()' = ",(stop-start)," milliseconds, i = ",i);

//Третий способ
d= "";

start=GetTickCount();

  for(i=0;i<length;i++)
  {
  int k=StringConcatenate(d,a,b,c);
  }

stop=GetTickCount();

Print("time for 'StringConcatenate(d,a,b,c)' = ",(stop-start)," milliseconds, i = ",i);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

E questo risultato

2011.04.15 15:28:58     123 (EURUSD,D1) time for 'd = a + b + c' = 81094 milliseconds, i = 10000000
2011.04.15 15:30:24     123 (EURUSD,D1) time for 'StringAdd()' = 85828 milliseconds, i = 10000000
2011.04.15 15:31:46     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 81812 milliseconds, i = 10000000
2011.04.15 15:33:36     123 (EURUSD,D1) time for 'd = a + b + c' = 82938 milliseconds, i = 10000000
2011.04.15 15:35:00     123 (EURUSD,D1) time for 'StringAdd()' = 83859 milliseconds, i = 10000000
2011.04.15 15:36:21     123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 80719 milliseconds, i = 10000000

PS

Molto probabilmente, la linea d= "" avrebbe dovuto essere messa nel ciclo for, ma non credo che questo bug abbia molto effetto sul risultato.