Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 166

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

Non vi consiglio di scrivere in questo modo. Se il sistema non riesce ad allocare la quantità di memoria necessaria all'array, il programma continuerà a girare tranquillamente, portando a conseguenze imprevedibili.

 
Alexey Navoykov:

Non vi consiglio di scrivere in questo modo. Se il sistema non riesce ad allocare la quantità di memoria necessaria per l'array, il programma continuerà a girare tranquillamente, portando a conseguenze imprevedibili.

L'ho messo necessariamente per il conto reale.

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Biblioteche: HistoryTicks

fxsaber, 2019.09.10 18:58

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Biblioteche: HistoryTicks

fxsaber, 2018.12.10 13:55

Se si scrive la seguente linea all'inizio di qualsiasi Expert Advisor MT4/5
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

poi ottenere una notifica dettagliata nel caso ci sia un errore durante l'esecuzione di ArrayResize o ArrayCopy.

Questo ti permette di vedere problemi difficili da identificare nel passaggio di informazioni attraverso gli array, ma ancora più importante, ottenere un messaggio che l'EA si è fermato a causa di un array fuori portata(non è colpa dell'EA). Per esempio, a causa di una mancanza di memoria o di qualche altro guasto. In altre parole, saprete subito che si è verificato un arresto anomalo dell'EA, piuttosto che notarlo accidentalmente qualche ora dopo.


La libreria HistoryTicks contiene già questa linea (non c'è bisogno di aggiungerla), perché lo scopo principale degli strumenti - combattere gli Expert Advisors su conti reali.


Nel diario del Terminal, c'era solo una registrazione di questo tipo in un altro progetto.

MemoryException 4471871064 bytes not available, 0 heapmin result


Grazie alla linea inserita, i dettagli di ciò che è successo possono essere visti nel log dell'utente

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)
 

Si prega di suggerire un analogo della funzione MQL4 MarketInfo(asymbol, MODE_MARGIN_REQUIRED) in MQL5.

Ho bisogno di ottenere la quantità di fondi liberi necessari per aprire 1 lotto per comprare.

Ho provato diverse varianti della funzione SymbolInfoDouble(symbol, ...) in MQL5, non riesco a trovare la variante giusta, restituisce 0 ovunque.

 
Elena Baranova:

Si prega di suggerire un analogo della funzione MQL4 MarketInfo(asymbol, MODE_MARGIN_REQUIRED) in MQL5.

Ho bisogno di ottenere la quantità di fondi liberi necessari per aprire 1 lotto per comprare.

Ho provato diverse varianti della funzione SymbolInfoDouble(symbol, ...) in MQL5, non riesco a trovare la variante giusta, restituisce 0 ovunque.

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

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

Mi dispiace, non ho capito perché avevo bisogno di questo link. Non ho visto la risposta alla mia domanda.

 
Elena Baranova:

Mi dispiace, non ho capito perché avevo bisogno di questo link. Non ho visto la risposta alla mia domanda.

Cosa esattamente non ha visto nell'articolo?

Esempi di controllo:

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:

Cosa esattamente non ha visto nell'articolo?

Esempi di controllo:

MQL5

È necessario ottenerela quantità di fondi liberi necessari per aprire 1 lotto per comprare.

Cosa c'entra il controllo nell'articolo?

 
Elena Baranova:

Necessità di ottenerela quantità di fondi disponibili necessari per aprire 1 lotto da acquistare.

Cosa c'entra l'assegno dell'articolo?

Perché l'articolo insegna lo studio diligente del materiale.

L'esempio ti dà anche la funzione completa da controllare prima di inviare l'ordine di compravendita.


Uno:

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

e immediatamente il riferimento:

CONTO_MARGINE_LIBERO

Dimensione dei fondi liberi nel conto nella valuta di deposito, disponibili per l'apertura della posizione

AccountInfoDouble


e due è il controllo minimo:

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

Necessità di ottenerela quantità di fondi disponibili necessari per aprire 1 lotto da acquistare.

Cosa c'entra l'assegno dell'articolo?

non pensavi di avere problemi a leggere il codice breve, allora leggi l'aiutohttps://www.mql5.com/ru/docs/trading/ordercalcmargin

 
Vladimir Karputov:

Mentre l'articolo insegna lo studio diligente del materiale.

L'esempio dà anche la funzione completa di controllo prima di inviare un ordine di compravendita.


Uno:

e subito il riferimento:

CONTO_MARGINE_LIBERO

Dimensione dei fondi liberi nel conto nella valuta di deposito, disponibili per l'apertura della posizione

AccountInfoDouble


e due - controllo minimo:

Dimensione dei fondi liberi nel conto nella valuta di deposito disponibile per aprire la posizione di cui non ho bisogno

Calcolo la dimensione del lotto come % del saldo.

Ho bisogno di ottenere la quantità difondi disponibili necessari per aprire 1 lotto per comprare.

Motivazione: