for (int i =::ArrayResize(TmpSort, ::ArraySize(ARRAY)) - 1; i >= 0; i--)
Не советую так писать. Если системе не удастся выделить требуемый объём памяти под массив, то программа продолжит спокойно работать, приведя к непредсказуемым последствиям.
Не советую так писать. Если системе не удастся выделить требуемый объём памяти под массив, то программа продолжит спокойно работать, приведя к непредсказуемым последствиям.
то получите подробное уведомление на случай, если произошла ошибка при выполнении 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&[],constint,constint)! - see the logs.
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 64: ::MQLInfoString(MQL_PROGRAM_PATH) = C:\Program Files\ICMarkets - MetaTrader 5\MQL5\Scripts\fxsaber\ThirdPartyTicks.ex5
PROGRAM_SCRIPTint ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 66: typename(T) = MqlTickint ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 67: sizeof(T) = 60int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 68: Res = -1int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 69: NewSize = 129140int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 70: Reserve = 74402041int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 71: ::ArraySize(Array) = 129139int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 72: PrevSize = 129139int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 73: NewSize*sizeof(T) = 7748400int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 74: PrevSize*sizeof(T) = 7748340int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 75: Reserve*sizeof(T) = 169155164int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 76: ::GetLastError() = 4004int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 77: DuringTime = 1195int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 79: ::TerminalInfoInteger(TERMINAL_BUILD) = 2138int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 80: ::TerminalInfoInteger(TERMINAL_DISK_SPACE) = 6344int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 81: ::TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL) = 16301int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 82: ::TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) = 31530int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 83: ::TerminalInfoInteger(TERMINAL_MEMORY_TOTAL) = 32602int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 84: ::TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1072int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 86: ::ChartID() = 132088214536525342int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 87: ::PeriodSeconds() = 60int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 88: ::Symbol() = EURUSD
int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 89: ::TimeCurrent() = 2019.09.1019:49:15int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 90: ::TimeLocal() = 2019.09.1019:49:12int ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 94: ::SymbolInfoTick(_Symbol,Tick) = true
time = 2019.09.1019:49:13.178 bid = 1.10436 ask = 1.10439 last = 0.00000 volume = 02TICK_FLAG_BIDint ARRAYRESIZE::ArrayResize_Real<MqlTick>(MqlTick&[],constint,constint), Line = 97: ::ChartSetInteger(0,CHART_BRING_TO_TOP,true) = true
array out of range in 'Array.mqh' (11,10)
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
Извините, не поняла зачем мне эта ссылка. Не увидела там ответа на мой вопрос.
Что именно не увидели в статье?
Примеры проверки:
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))
{
//--- что-то пошло не так, сообщим и вернем falsePrint("Error in ",__FUNCTION__," code=",GetLastError());
return(false);
}
//--- если не хватает средств на проведение операцииif(margin>free_margin)
{
//--- сообщим об ошибке и вернем falsePrint("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
return(false);
}
//--- проверка прошла успешноreturn(true);
}
//--- вызовем функцию проверкиif(!OrderCalcMargin(type,symb,lots,price,margin))
{
//--- что-то пошло не так, сообщим и вернем falsePrint("Error in ",__FUNCTION__," code=",GetLastError());
return(false);
}
//--- если не хватает средств на проведение операцииif(margin>free_margin)
{
//--- сообщим об ошибке и вернем falsePrint("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
return(false);
}
Не советую так писать. Если системе не удастся выделить требуемый объём памяти под массив, то программа продолжит спокойно работать, приведя к непредсказуемым последствиям.
Не советую так писать. Если системе не удастся выделить требуемый объём памяти под массив, то программа продолжит спокойно работать, приведя к непредсказуемым последствиям.
Для реала в обязательном порядке ставлю это.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: HistoryTicks
fxsaber, 2019.09.10 18:58
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: HistoryTicks
fxsaber, 2018.12.10 13:55
Если в любом MT4/5-советнике в начале прописать такую строкуто получите подробное уведомление на случай, если произошла ошибка при выполнении ArrayResize или ArrayCopy.
Это позволяет увидеть сложно идентифицируемые проблемы при передаче информации через массивы, но еще более важно - получить сообщение, что советник остановился из-за array out of range (не по вине автора советника). Например, из-за нехватки памяти или другого сбоя. Т.е. Вы будете сразу знать, что произошла нештатная остановка советника, а не случайно заметите это через несколько часов.
Библиотека HistoryTicks уже содержит эту строку (доп. прописывать не нужно), т.к. основная цель инструментария - боевые советники на реальных счетах.
В журнале Терминала была только такая запись в другом проекте.
Благодаря вставленной строке, в пользовательском журнале стали видны подробности произошедшего
Подскажите, пожалуйста, аналог MQL4 функции MarketInfo(asymbol, MODE_MARGIN_REQUIRED) в MQL5.
Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.
Перебрала разные варианты функции SymbolInfoDouble(symbol, ...) в MQL5, не могу найти нужный вариант, везде возвращается 0.
Подскажите, пожалуйста, аналог MQL4 функции MarketInfo(asymbol, MODE_MARGIN_REQUIRED) в MQL5.
Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.
Перебрала разные варианты функции SymbolInfoDouble(symbol, ...) в MQL5, не могу найти нужный вариант, везде возвращается 0.
https://www.mql5.com/ru/articles/2555#not_enough_money
https://www.mql5.com/ru/articles/2555#not_enough_money
Извините, не поняла зачем мне эта ссылка. Не увидела там ответа на мой вопрос.
Извините, не поняла зачем мне эта ссылка. Не увидела там ответа на мой вопрос.
Что именно не увидели в статье?
Примеры проверки:
MQL5
Что именно не увидели в статье?
Примеры проверки:
MQL5
Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.
Причем тут проверка из статьи?
Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.
Причем тут проверка из статьи?
Притом, что статья учит прилежному изучению материала.
В примере даже дана полная функция на проверку перед отсылкой торгового приказа.
Раз:
и сразу справка:
ACCOUNT_MARGIN_FREE
Размер свободных средств на счете в валюте депозита, доступных для открытия позиции
AccountInfoDouble
и два - минимальная проверка:
Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.
Причем тут проверка из статьи?
не думал, что у Вас будут сложности в чтении короткого кода, тогда читайте справку https://www.mql5.com/ru/docs/trading/ordercalcmargin
Притом, что статья учит прилежному изучению материала.
В примере даже дана полная функция на проверку перед отсылкой торгового приказа.
Раз:
и сразу справка:
ACCOUNT_MARGIN_FREE
Размер свободных средств на счете в валюте депозита, доступных для открытия позиции
AccountInfoDouble
и два - минимальная проверка:
Размер свободных средств на счете в валюте депозита, доступных для открытия позиции мне не нужен
Я рассчтитываю размер лота как % от баланса.
Нужно получить Размер свободных средств, необходимых для открытия 1 лота на покупку.