Características del lenguaje mql5, sutilezas y técnicas - página 166

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

No te aconsejo que lo escribas así. Si el sistema no asigna la cantidad de memoria necesaria a la matriz, el programa seguirá ejecutándose en silencio, lo que tendrá consecuencias imprevisibles.

 
Alexey Navoykov:

No te aconsejo que lo escribas así. Si el sistema no asigna la cantidad de memoria necesaria para la matriz, el programa seguirá ejecutándose en silencio, lo que tendrá consecuencias imprevisibles.

Para el comercio real estoy obligado a poner esto.

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Bibliotecas: HistoryTicks

fxsaber, 2019.09.10 18:58

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bibliotecas: HistoryTicks

fxsaber, 2018.12.10 13:55

Si escribe la siguiente línea en el comienzo de cualquier Asesor Experto de MT4/5
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

y obtener una notificación detallada en caso de que haya un error al ejecutar ArrayResize o ArrayCopy.

Esto le permite ver problemas difíciles de identificar en el paso de información a través de arrays, pero aún más importante, obtener un mensaje de que el EA se ha detenido debido a un array fuera de rango(no es culpa del EA). Por ejemplo, por falta de memoria o algún otro fallo. En otras palabras, sabrá de inmediato que se ha producido una parada anormal del EA, en lugar de notarlo accidentalmente unas horas más tarde.


La biblioteca HistoryTicks ya contiene esta línea (no es necesario añadirla), porque el propósito principal de las herramientas - la lucha contra los Asesores Expertos en cuentas reales.


En el diario de la Terminal, sólo había un registro de este tipo en otro proyecto.

MemoryException 4471871064 bytes not available, 0 heapmin result


Gracias a la línea insertada, se pueden ver los detalles de lo ocurrido en el registro de usuarios

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)
 

Por favor, sugiera un análogo de la función MQL4 MarketInfo(asymbol, MODE_MARGIN_REQUIRED) en MQL5.

Necesito conseguir la cantidad de fondos libres necesarios para abrir 1 lote para comprar.

He probado diferentes variantes de la función SymbolInfoDouble(symbol, ...) en MQL5, no puedo encontrar la variante correcta, devuelve 0 en todas partes.

 
Elena Baranova:

Por favor, sugiera un análogo de la función MQL4 MarketInfo(asymbol, MODE_MARGIN_REQUIRED) en MQL5.

Necesito conseguir la cantidad de fondos libres necesarios para abrir 1 lote para comprar.

He probado diferentes variantes de la función SymbolInfoDouble(symbol, ...) en MQL5, no puedo encontrar la variante correcta, devuelve 0 en todas partes.

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

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

Lo siento, no entendí por qué necesitaba este enlace. No vi la respuesta a mi pregunta allí.

 
Elena Baranova:

Lo siento, no entendí por qué necesitaba este enlace. No vi la respuesta a mi pregunta allí.

¿Qué es exactamente lo que no has visto en el artículo?

Ejemplos de comprobación:

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é es exactamente lo que no has visto en el artículo?

Ejemplos de comprobación:

MQL5

Necesita obtenerla cantidad de fondos libres necesarios para abrir 1 lote para comprar.

¿Qué tiene que ver el cheque en el artículo?

 
Elena Baranova:

Necesidad de obtenerla cantidad de fondos disponibles necesarios para abrir 1 lote para comprar.

¿Qué tiene que ver el cheque del artículo?

Porque el artículo enseña el estudio diligente del material.

El ejemplo incluso le da la función completa para comprobar antes de enviar la orden de comercio.


Uno:

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

e inmediatamente la referencia:

MARGEN_DE_CUENTA_LIBRE

Tamaño de los fondos libres en la cuenta en la moneda del depósito, disponible para la apertura de posiciones

AccountInfoDouble


y dos es el cheque mínimo:

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

Necesidad de obtenerla cantidad de fondos disponibles necesarios para abrir 1 lote para comprar.

¿Qué tiene que ver el cheque del artículo?

no creía que tuviera problemas para leer el código corto, entonces lea la ayudahttps://www.mql5.com/ru/docs/trading/ordercalcmargin

 
Vladimir Karputov:

Mientras que el artículo enseña el estudio diligente del material.

El ejemplo incluso da la función completa de comprobar antes de enviar una orden de comercio.


Uno:

y enseguida la referencia:

MARGEN_DE_CUENTA_LIBRE

Tamaño de los fondos libres en la cuenta en la moneda del depósito, disponible para la apertura de posiciones

AccountInfoDouble


y dos - cheque mínimo:

Tamaño de los fondos libres en la cuenta en la moneda del depósito, disponible para abrir una posición que no necesito

Calculo el tamaño del lote como % del saldo.

Necesito obtener la cantidad defondos disponibles necesarios para abrir 1 lote para comprar.