Gemeinsam lernen und schreiben in MQL5 - Seite 13

 
Yedelkin:

Seltsam. Sie benötigen den Code für MQL5, der sich bereits auf der Website befinden sollte. Sie müssen nur nachschlagen. Das ist genau das, wovon ich spreche.

Aber das bleibt Ihnen überlassen.

Es ist eine sehr mühsame Suche, vielleicht sagt es Ihnen ja jemand.

Übrigens, ich habe diesen Code für mql5 umgeschrieben. Vielleicht kann es jemand gebrauchen.

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;
 
Meine Herren.
bitte kommentieren:

ENUM_TRADE_RETURN_CODES
Code ID Beschreibung
10004 TRADE_RETCODE_REQUOTE Antrag abgelehnt
10006 TRADE_RETCODE_REJECT Antrag abgelehnt
...
kein Code 10005. Ist dies nicht ein Fehler?
Hochachtungsvoll ...
 

Frage. Es gibt eine Funktion namens GetTickCount () - siegibt die Anzahl der seit dem Systemstart verstrichenenMillisekunden zurück. Der Hinweis besagt, dass "dieZählung durch die Auflösung des Systemtimers begrenzt ist. Da die Zeit als Ganzzahl ohne Vorzeichen gespeichert wird, läuft sie alle 49,7 Tage über , wenn der Computer ununterbrochen läuft".

Und was passiert, wenn der Zähler überläuft? Wird er zurückgesetzt und ein neuer Countdown gestartet, oder bleibt das System stehen?

 

Yedelkin:

Was passiert, wenn der Zähler überläuft? Wird die Zählung zurückgesetzt und ein neuer Zählvorgang gestartet oder bleibt das System stehen?

Er läuft über und beginnt bei Null.
 
Renat:
Es läuft über und beginnt von vorne.
OK, ich hab's!
 

Frage. Die Beschreibung von switch(expression){...} besagt, dass "der Ausdruck des switch-Operators vom Typ Ganzzahl sein muss". Ich habe die Beschreibung dieses Operators mit Ausdrücken anderer Typen im Internet gesehen. Wird die Verwendung des Switch-Operators um Ausdrücke vom Typ String erweitert?

 
Yedelkin:

Frage. Die Beschreibung von switch(expression){...} besagt, dass "der Ausdruck des switch-Operators vom Typ Ganzzahl sein muss". Ich habe die Beschreibung dieses Operators mit Ausdrücken anderer Typen im Internet gesehen. Werden wir den Switch-Operator um Ausdrücke vom Typ String erweitern?

Nein, das wird es leider nicht. Bei String-Typen nur, wenn ... sonst wenn ... sonst .

Die Verwendung von Integer-Typen in switch beschleunigt den switch-Operator um ein Vielfaches, als wenn

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

Nein, das wird es leider nicht. Bei String-Typen nur, wenn ... sonst wenn ... sonst

Die Verwendung von Integer-Typen in switch beschleunigt den Code um ein Vielfaches, als wenn

OK, danke für den Tipp!
 

Frage. In der Beschreibung der Funktion StringConcatenate() heißt es: "StringConcatenate() arbeitet schneller und sparsamer im Speicher als die String-Verknüpfung durch Additionsoperationen, da keine temporären Variablen vom Typ String verwendet werden. Ich habe die Beispiele aus dem Referenzhandbuch verwendet und sie leicht verändert:

   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);
Die Ausgabe ist:

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

Es hat sich herausgestellt, dass StringConcatenate langsamer arbeitet als String-Binding mit Additionsoperationen. Was ist das Problem?

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

Frage. In der Beschreibung der Funktion StringConcatenate() heißt es: "StringConcatenate() arbeitet schneller und sparsamer im Speicher als die String-Verknüpfung durch Additionsoperationen, da keine temporären Variablen vom Typ String verwendet werden. Ich habe Beispiele aus der Referenz verwendet und sie ein wenig verändert:

Ich habe die Ausgabe erhalten:

Es hat sich herausgestellt, dass StringConcatenate langsamer arbeitet als String-Binding mit Additionsoperationen. Wo liegt der Haken?

Der Begriff "Kontrolle" ist ein wenig missverständlich (wenn ich ihn richtig verstehe). Der Trick an der Funktion ist etwas anderes...

Ungefähr dieser Code

////////////////////////////////////////////////////////////////////////////////
//             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);
//----------------------------------------------------------------------------//   
}
////////////////////////////////////////////////////////////////////////////////

Und dieses Ergebnis

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

Höchstwahrscheinlich hätte die Zeile d= "" in die for-Schleife eingefügt werden müssen, aber ich glaube nicht, dass dieser Fehler große Auswirkungen auf das Ergebnis hat.