Особенности языка mql5, тонкости и приёмы работы - страница 166

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

Не советую так писать. Если системе не удастся выделить требуемый объём памяти под массив, то программа продолжит спокойно работать, приведя к непредсказуемым последствиям.

 
Alexey Navoykov:

Не советую так писать. Если системе не удастся выделить требуемый объём памяти под массив, то программа продолжит спокойно работать, приведя к непредсказуемым последствиям.

Для реала в обязательном порядке ставлю это.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: HistoryTicks

fxsaber, 2019.09.10 18:58

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: HistoryTicks

fxsaber, 2018.12.10 13:55

Если в любом MT4/5-советнике в начале прописать такую строку
#include <fxsaber\HistoryTicks\ArrayResize.mqh> // https://www.mql5.com/ru/code/20298

то получите подробное уведомление на случай, если произошла ошибка при выполнении ArrayResize или ArrayCopy.

Это позволяет увидеть сложно идентифицируемые проблемы при передаче информации через массивы, но еще более важно - получить сообщение, что советник остановился из-за array out of range (не по вине автора советника). Например, из-за нехватки памяти или другого сбоя. Т.е. Вы будете сразу знать, что произошла нештатная остановка советника, а не случайно заметите это через несколько часов.


Библиотека HistoryTicks уже содержит эту строку (доп. прописывать не нужно), т.к. основная цель инструментария - боевые советники на реальных счетах.


В журнале Терминала была только такая запись в другом проекте.

MemoryException 4471871064 bytes not available, 0 heapmin result


Благодаря вставленной строке, в пользовательском журнале стали видны подробности произошедшего

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)
 

Подскажите, пожалуйста, аналог MQL4 функции MarketInfo(asymbol, MODE_MARGIN_REQUIRED) в MQL5.

Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.

Перебрала разные варианты  функции SymbolInfoDouble(symbol, ...) в MQL5, не могу найти нужный вариант, везде возвращается 0.

 
Elena Baranova:

Подскажите, пожалуйста, аналог MQL4 функции MarketInfo(asymbol, MODE_MARGIN_REQUIRED) в MQL5.

Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.

Перебрала разные варианты  функции SymbolInfoDouble(symbol, ...) в MQL5, не могу найти нужный вариант, везде возвращается 0.

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

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

Извините, не поняла зачем мне эта ссылка. Не увидела там ответа на мой вопрос.

 
Elena Baranova:

Извините, не поняла зачем мне эта ссылка. Не увидела там ответа на мой вопрос.

Что именно не увидели в статье?

Примеры проверки:

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:

Что именно не увидели в статье?

Примеры проверки:

MQL5

Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.

Причем тут проверка из статьи?

 
Elena Baranova:

Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.

Причем тут проверка из статьи?

Притом, что статья учит прилежному изучению материала.

В примере даже дана полная функция на проверку перед отсылкой торгового приказа. 


Раз:

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

и сразу справка:

ACCOUNT_MARGIN_FREE

Размер свободных средств на счете  в валюте депозита, доступных для открытия позиции

AccountInfoDouble


и два - минимальная проверка:

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

Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.

Причем тут проверка из статьи?

не думал, что у Вас будут сложности в чтении короткого кода, тогда читайте справку https://www.mql5.com/ru/docs/trading/ordercalcmargin

 
Vladimir Karputov:

Притом, что статья учит прилежному изучению материала.

В примере даже дана полная функция на проверку перед отсылкой торгового приказа. 


Раз:

и сразу справка:

ACCOUNT_MARGIN_FREE

Размер свободных средств на счете  в валюте депозита, доступных для открытия позиции

AccountInfoDouble


и два - минимальная проверка:

Размер свободных средств на счете  в валюте депозита, доступных для открытия позиции мне не нужен

Я рассчтитываю размер лота как % от баланса.

Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.

Причина обращения: