Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 166

 
fxsaber:
for (int i =::ArrayResize(TmpSort, ::ArraySize(ARRAY)) - 1; i >= 0; i--)

Ich rate Ihnen nicht, es so zu schreiben. Wenn das System nicht in der Lage ist, dem Array die erforderliche Menge an Speicher zuzuweisen, läuft das Programm unbemerkt weiter, was unvorhersehbare Folgen hat.

 
Alexey Navoykov:

Ich rate Ihnen nicht, es so zu schreiben. Wenn das System nicht in der Lage ist, die erforderliche Menge an Speicher für das Array zuzuweisen, läuft das Programm unauffällig weiter, was zu unvorhersehbaren Folgen führt.

Für den realen Handel bin ich verpflichtet, dies zu tun.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: HistoryTicks

fxsaber, 2019.09.10 18:58

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: HistoryTicks

fxsaber, 2018.12.10 13:55

Wenn Sie die folgende Zeile am Anfang eines beliebigen MT4/5 Expert Advisors schreiben
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

dann erhalten Sie eine detaillierte Benachrichtigung, falls ein Fehler bei der Ausführung von ArrayResize oder ArrayCopy auftritt.

Dies ermöglicht es Ihnen, schwer zu identifizierende Probleme bei der Weitergabe von Informationen durch Arrays zu erkennen, aber - was noch wichtiger ist - eine Meldung zu erhalten, dass der EA aufgrund eines Arrays außerhalb des Bereichs angehalten wurde (was nicht die Schuld des EA ist). Zum Beispiel wegen eines Speichermangels oder eines anderen Fehlers. Mit anderen Worten: Sie werden sofort wissen, dass ein anormales Anhalten des EA stattgefunden hat, und es nicht zufällig erst einige Stunden später bemerken.


Die HistoryTicks-Bibliothek enthält diese Zeile bereits (es besteht keine Notwendigkeit, sie hinzuzufügen), denn der Hauptzweck der Tools ist die Bekämpfung von Expert Advisors auf realen Konten.


Im Terminaljournal gab es nur einen solchen Eintrag in einem anderen Projekt.

MemoryException 4471871064 bytes not available, 0 heapmin result


Dank der eingefügten Zeile können die Einzelheiten des Geschehens im Benutzerprotokoll eingesehen werden

Alert: ThirdPartyTicks - ERROR in int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int)! - see the logs.
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 64: ::MQLInfoString(MQL_PROGRAM_PATH) = C:\Program Files\ICMarkets - MetaTrader 5\MQL5\Scripts\fxsaber\ThirdPartyTicks.ex5
PROGRAM_SCRIPT
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 66: typename(T) = MqlTick
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 67: sizeof(T) = 60
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 68: Res = -1
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 69: NewSize = 129140
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 70: Reserve = 74402041
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 71: ::ArraySize(Array) = 129139
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 72: PrevSize = 129139
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 73: NewSize*sizeof(T) = 7748400
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 74: PrevSize*sizeof(T) = 7748340
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 75: Reserve*sizeof(T) = 169155164
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 76: ::GetLastError() = 4004
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 77: DuringTime = 1195
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 79: ::TerminalInfoInteger(TERMINAL_BUILD) = 2138
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 80: ::TerminalInfoInteger(TERMINAL_DISK_SPACE) = 6344
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 81: ::TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL) = 16301
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 82: ::TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) = 31530
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 83: ::TerminalInfoInteger(TERMINAL_MEMORY_TOTAL) = 32602
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 84: ::TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1072
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 86: ::ChartID() = 132088214536525342
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 87: ::PeriodSeconds() = 60
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 88: ::Symbol() = EURUSD
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 89: ::TimeCurrent() = 2019.09.10 19:49:15
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 90: ::TimeLocal() = 2019.09.10 19:49:12
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 94: ::SymbolInfoTick(_Symbol,Tick) = true
 time = 2019.09.10 19:49:13.178 bid = 1.10436 ask = 1.10439 last = 0.00000 volume = 0 2 TICK_FLAG_BID
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],const int,const int), Line = 97: ::ChartSetInteger(0,CHART_BRING_TO_TOP,true) = true
array out of range in 'Array.mqh' (11,10)
 

Bitte schlagen Sie ein Analogon der MQL4-Funktion MarketInfo(asymbol, MODE_MARGIN_REQUIRED) in MQL5 vor.

Ich muss den Betrag an freien Mitteln erhalten, der erforderlich ist, um 1 Los zum Kauf zu eröffnen.

Ich habe verschiedene Varianten der Funktion SymbolInfoDouble(symbol, ...) in MQL5 ausprobiert, ich kann die richtige Variante nicht finden, sie gibt überall 0 zurück.

 
Elena Baranova:

Bitte schlagen Sie ein Analogon der MQL4-Funktion MarketInfo(asymbol, MODE_MARGIN_REQUIRED) in MQL5 vor.

Ich muss den Betrag an freien Mitteln erhalten, der erforderlich ist, um 1 Los zum Kauf zu eröffnen.

Ich habe verschiedene Varianten der Funktion SymbolInfoDouble(symbol, ...) in MQL5 ausprobiert, ich kann die richtige Variante nicht finden, sie gibt überall 0 zurück.

https://www.mql5.com/ru/articles/2555#not_enough_money

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 

Es tut mir leid, ich habe nicht verstanden, warum ich diesen Link brauche. Ich habe dort keine Antwort auf meine Frage gefunden.

 
Elena Baranova:

Es tut mir leid, ich habe nicht verstanden, warum ich diesen Link brauche. Ich habe dort keine Antwort auf meine Frage gefunden.

Was genau haben Sie an dem Artikel nicht verstanden?

Beispiele für Kontrollen:

MQL5

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
 
Vladimir Karputov:

Was genau haben Sie an dem Artikel nicht verstanden?

Beispiele für Kontrollen:

MQL5

Sie müssenden Betrag an freien Mittelnerhalten, der für die Eröffnung von 1 Lot zum Kauf benötigt wird.

Was hat der Scheck in dem Artikel damit zu tun?

 
Elena Baranova:

Siemüssenden Betrag der verfügbaren Mittelerhalten, der erforderlich ist, um 1 Los zum Kauf zu eröffnen.

Was hat der Scheck aus dem Artikel damit zu tun?

Denn der Artikel lehrt das sorgfältige Studium der Materie.

Das Beispiel enthält sogar die vollständige Funktion, die vor dem Absenden des Handelsauftrags zu prüfen ist.


Erstens:

//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);

und sofort den Verweis:

KONTO_MARGEN_FREI

Höhe der freien Mittel auf dem Konto in der Einzahlungswährung, die für die Positionseröffnung zur Verfügung stehen

AccountInfoDouble


und zwei ist der Mindestscheck:

   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
Документация по MQL5: Информация о счете / AccountInfoDouble
Документация по MQL5: Информация о счете / AccountInfoDouble
  • www.mql5.com
Информация о счете / AccountInfoDouble - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Elena Baranova:

Siemüssenden Betrag der verfügbaren Mittelerhalten, der erforderlich ist, um 1 Los zum Kauf zu eröffnen.

Was hat der Scheck aus dem Artikel damit zu tun?

dachten Sie nicht, dass Sie Probleme haben würden, den Kurzcode zu lesen, dann lesen Sie die Hilfehttps://www.mql5.com/ru/docs/trading/ordercalcmargin

 
Vladimir Karputov:

Der Artikel lehrt zwar das sorgfältige Studium der Materie.

Das Beispiel zeigt sogar die vollständige Funktion der Überprüfung vor dem Senden eines Handelsauftrags.


Erstens:

und gleich die Referenz:

KONTO_MARGEN_FREI

Höhe der freien Mittel auf dem Konto in der Einzahlungswährung, die für die Positionseröffnung zur Verfügung stehen

AccountInfoDouble


und zwei - Mindestkontrolle:

Kontogröße in der Währung der Einlage zur Eröffnung einer Position, die ich nicht benötige

Ich berechne die Losgröße als Prozentsatz des Saldos.

Ich muss den Betrag derverfügbaren Mittelerhalten, der erforderlich ist, um 1 Los zum Kauf zu eröffnen.

Grund der Beschwerde: