Caractéristiques du langage mql5, subtilités et techniques - page 166

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

Je ne vous conseille pas de l'écrire de cette façon. Si le système ne parvient pas à allouer la quantité de mémoire requise au tableau, le programme continuera à s'exécuter tranquillement, ce qui entraînera des conséquences imprévisibles.

 
Alexey Navoykov:

Je ne vous conseille pas de l'écrire de cette façon. Si le système ne parvient pas à allouer la quantité de mémoire requise pour le tableau, le programme continuera à s'exécuter tranquillement, ce qui entraînera des conséquences imprévisibles.

Je l'ai forcément mis pour le compte réel.

Forum sur le trading, les systèmes de trading automatisés et l'essai de stratégies de trading

Bibliothèques : HistoryTicks

fxsaber, 2019.09.10 18:58

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bibliothèques : HistoryTicks

fxsaber, 2018.12.10 13:55

Si vous écrivez la ligne suivante au début de tout conseiller expert MT4/5
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

puis recevoir une notification détaillée en cas d'erreur lors de l'exécution de ArrayResize ou ArrayCopy.

Cela vous permet de voir les problèmes difficiles à identifier dans le passage de l'information à travers les tableaux, mais plus important encore, d'obtenir un message indiquant que l'EA s'est arrêté à cause d'un tableau hors de portée(pas la faute de l'EA). Par exemple, en raison d'un manque de mémoire ou d'une autre défaillance. En d'autres termes, vous saurez immédiatement qu'un arrêt anormal de l'EA a eu lieu, plutôt que de le remarquer accidentellement quelques heures plus tard.


La bibliothèque HistoryTicks contient déjà cette ligne (il n'est pas nécessaire de l'ajouter, car l'objectif principal des outils - combattre les Expert Advisors sur des comptes réels.


Dans le journal du terminal, il n'y avait qu'un tel enregistrement dans un autre projet.

MemoryException 4471871064 bytes not available, 0 heapmin result


Grâce à la ligne insérée, les détails de ce qui s'est passé peuvent être vus dans le journal de l'utilisateur.

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)
 

Veuillez suggérer un analogue de la fonction MQL4 MarketInfo(asymbol, MODE_MARGIN_REQUIRED) dans MQL5.

J'ai besoin d'obtenir le montant des fonds libres nécessaires pour ouvrir un lot à acheter.

J'ai essayé différentes variantes de la fonction SymbolInfoDouble(symbol, ...) dans MQL5, je n'arrive pas à trouver la bonne variante, elle renvoie 0 partout.

 
Elena Baranova:

Veuillez suggérer un analogue de la fonction MQL4 MarketInfo(asymbol, MODE_MARGIN_REQUIRED) dans MQL5.

J'ai besoin d'obtenir le montant des fonds libres nécessaires pour ouvrir un lot à acheter.

J'ai essayé différentes variantes de la fonction SymbolInfoDouble(symbol, ...) dans MQL5, je n'arrive pas à trouver la bonne variante, elle renvoie 0 partout.

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

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

Je suis désolé, je n'ai pas compris pourquoi j'avais besoin de ce lien. Je n'y ai pas vu la réponse à ma question.

 
Elena Baranova:

Je suis désolé, je n'ai pas compris pourquoi j'avais besoin de ce lien. Je n'y ai pas vu la réponse à ma question.

Qu'est-ce que vous n'avez pas vu exactement dans l'article ?

Exemples de contrôle :

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:

Qu'est-ce que vous n'avez pas vu exactement dans l'article ?

Exemples de contrôle :

MQL5

Vous devez obtenirle montant des fonds libres nécessaires pour ouvrir un lot à acheter.

Qu'est-ce que le chèque dans l'article a à voir avec cela ?

 
Elena Baranova:

Besoin d'obtenirle montant des fonds disponibles nécessaires pour ouvrir 1 lot à acheter.

Quel est le rapport avec le chèque de l'article ?

Parce que l'article enseigne l'étude diligente de la matière.

L'exemple vous donne même la fonction complète à vérifier avant d'envoyer l'ordre de transaction.


Un :

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

et immédiatement la référence :

COMPTE_MARGE_LIBRE

Taille des fonds libres sur le compte dans la devise de dépôt, disponibles pour l'ouverture de positions.

AccountInfoDouble


et deux est le contrôle minimum :

   //--- вызовем функцию проверки
   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:

Besoin d'obtenirle montant des fonds disponibles nécessaires pour ouvrir 1 lot à acheter.

Quel est le rapport avec le chèque de l'article ?

Je ne pensais pas que vous auriez des difficultés à lire le code court, alors lisez l'aidehttps://www.mql5.com/ru/docs/trading/ordercalcmargin.

 
Vladimir Karputov:

Bien que l'article enseigne l'étude diligente de la matière.

L'exemple donne même la fonction complète de vérification avant l'envoi d'un ordre de transaction.


Un :

et tout de suite la référence :

COMPTE_MARGE_LIBRE

Taille des fonds libres sur le compte dans la devise de dépôt, disponibles pour l'ouverture de positions.

AccountInfoDouble


et deux - contrôle minimum :

Taille des fonds libres sur le compte dans la monnaie de dépôt disponibles pour ouvrir la position dont je n'ai pas besoin

Je calcule la taille du lot en % du solde.

J'ai besoin d'obtenir le montant desfonds disponibles nécessaires pour ouvrir un lot à acheter.

Raison: