Ошибки, баги, вопросы - страница 9

 
DC2008:

Для переменных типа double не корректно использовать условие ==. Рекомендуется сравнивать примерно вот так:


Могу добавить к этому, что хоть и с некоторым опозданием, но мы все же написали статью на эту тему - Особенности работы с числами типа double в MQL4. Все сказанное в ней остается и будет оставаться актуальным для любого языка программирования, когда дело касается работы с вещественными числами (double и float в MQL5).
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

Для переменных типа double не корректно использовать условие ==. Рекомендуется сравнивать примерно вот так:


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

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

в лог периодически начали поступать вот такие сообщения

2010.06.15 14:48:09 MemoryException 4915200 bytes not available

что делать ? если нужно отправлю в поддержку, только вот что отправлять незнаю ((
 

 
Prival:

в лог периодически начали поступать вот такие сообщения

2010.06.15 14:48:09 MemoryException 4915200 bytes not available

что делать ? если нужно отправлю в поддержку, только вот что отправлять незнаю ((
 

Не хватает оп. памяти. Проверьте размеры динамических массивов, скорее всего, попытка выделить памяти больше, чем имеется.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

Для переменных типа double не корректно использовать условие ==. Рекомендуется сравнивать примерно вот так:


  Суть вопроса была не в этом, если я правильно понял. то в конце пользовательской функции всегда надо ставить оператор return
 
joo:
Не хватает оп. памяти. Проверьте размеры динамических массивов, скорее всего, попытка выделить памяти больше, чем имеется.
нет не в этом дело. скорее всего что то с серверами. там работы идут видно какието. дыра в данных появилась. часто теряется связь с сервером. история не подкачивается. скорее всего это вызвало ошибку.
 
sergey1294:
  Суть вопроса была не в этом, если я правильно понял. то в конце пользовательской функции всегда надо ставить оператор return

Вроде ответ о == был по сути. Действительно в функции типа double должен быть где-то return(...). Не обязательно в конце. Использование оператора == в if() return(); может выдать false если у вас LotStep типа 0.1000000000000000001. Тогда не один return не срабатывает и функция ничего не возвращает. Хотя в Вашем случае, скорее всего ретёрну не нравится NormalizeDouble внутри. В Вашем работающем варианте, исправьте конец на return(NormilizeDouble(lot,2)) и посмотрите если он работает. Мне самому интересно.

 
gpwr:

Вроде ответ о == был по сути. Действительно в функции типа double должен быть где-то return(...). Не обязательно в конце. Использование оператора == в if() return(); может выдать false если у вас LotStep типа 0.1000000000000000001. Тогда не один return не срабатывает и функция ничего не возвращает. Хотя в Вашем случае, скорее всего ретёрну не нравится NormalizeDouble внутри. В Вашем работающем варианте, исправьте конец на return(NormilizeDouble(lot,2)) и посмотрите если он работает. Мне самому интересно.

В конце обязательно, должен быть return(...), но до него может дело и не дойти (если сработает одно из If условий)...
 
Interesting:
В конце обязательно, должен быть return(...), но до него может дело и не дойти (если сработает одно из If условий)...
 Вот это меня и интересовало, в четверке не обязательно было его ставить в конце. 
 

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);
Renat
:

Ошибка в том, что Вы забыли о валюте маржи в своих расчетах.  Баланс = 100 USD, а маржевые требования = 100 EUR (119 USD).

Поэтому и нельзя совершить операцию - все верно.

Хочу возвратиться к своеу вопросу о правильном вычислении маржи. Как Ренат заметил, в моих вычислениях, LotRqdMgn (необходимая мржа для покупки 1 лота) не учитывает цену валюты. Тут вспомнил что видел такую таблицу

Identifier

Description

Formula

SYMBOL_CALC_MODE_FOREX

Forex mode - calculation of profit and margin for Forex

Margin:  Lots*Contract_Size/Leverage

Profit:   (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_FUTURES

Futures mode - calculation of margin and profit for futures

Margin: Lots *InitialMargin*Percentage/100

Profit:  (close_price-open_price)*TickPrice/TickSize*Lots

SYMBOL_CALC_MODE_CFD

CFD mode - calculation of margin and profit for CFD

Margin: Lots *ContractSize*MarketPrice*Percentage/100

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDINDEX

CFD index mode - calculation of margin and profit for CFD by indexes

Margin: (Lots*ContractSize*MarketPrice)*TickPrice/TickSize

Profit:  (close_price-open_price)*Contract_Size*Lots

SYMBOL_CALC_MODE_CFDLEVERAGE

CFD Leverage mode - calculation of margin and profit for CFD at leverage trading

Margin: (Lots*ContractSize*MarketPrice*Percentage)/Leverage

Profit:  (close_price-open_price)*Contract_Size*Lots

То есть получается что в таблице ошибка: вместо Lots*Contract_Size/Leverage, должно быть Price*Lots*Contract_Size/Leverage.

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