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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir
6698
Vladimir  
Interesting:

MarketInfo(Symbol(),MODE_MARGININIT) = SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL)

Что тогда соответствует MODE_MARGINREQUIRED? Или иначе, как узнать размер свободных средств, необходимых для открытия 1 лота на покупку?

В Moving Average.mq5 эксперте от создателей mql5, лоты вычисляются так

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
input int    MovingPeriod       = 12;      // Moving Average period
input int    MovingShift        = 6;       // Moving Average shift
//---
int   ExtHandle=0;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
//--- select lot size
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

 Почему MaximumRisk такой маленький (0.02%) и к тому же делится на 1000 при вычислениях лотов? Что это 1000 представляет? Может 1000 = свободные средства, необходимые для покупки 1 лота помноженные на 100% (для перевода 0.02% в дробь 0.0002)? То есть свободные средства на покупку 1 лота равны $10 ($10x100%=1000). В правильном направлении думаю?

И ещё один вопрос. Существует ли ограничение на максимальное количество открытых ордеров?

Interesting
4236
Interesting  
gpwr:

Что тогда соответствует MODE_MARGINREQUIRED? Или иначе как узнать размер свободных средств, необходимых для открытия 1 лота на покупку?

И ещё один вопрос. Существует ли ограничение на максимальное количество открытых ордеров?


Задавался я этим вопросом.


Вот ответ разработчиков:

Rashid Umarov:

Посмотрите

SYMBOL_TRADE_CONTRACT_SIZE

Размер торгового контракта

double

и

SYMBOL_CURRENCY_MARGIN

Валюта в которой вычисляется залоговые средства

string


Как я понимаю самостоятельно придется вычислять

Interesting
4236
Interesting  

gpwr:

В Moving Average.mq5 эксперте от создателей mql5, лоты вычисляются так

 Почему MaximumRisk такой маленький (0.02%) и к тому же делится на 1000 при вычислениях лотов? Что это 1000 представляет? Может 1000 = свободные средства, необходимые для покупки 1 лота помноженные на 100% (для перевода 0.02% в дробь 0.0002)? То есть свободные средства на покупку 1 лота равны $10 ($10x100%=1000). В правильном направлении думаю?

И ещё один вопрос. Существует ли ограничение на максимальное количество открытых ордеров?


AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk

Эта строка рассчитывает риск как 2% от размера свободных средств. если я правильно понял. Почему эту сумму делят именно на 1000 это к разработчикам.


Но если я правильно понимаю то при депозите (свободных средствах) в 20,000$ советника рекомендует для открытия брать не более 2% от этой суммы (400$).

Резделив эту сумму на 1000 мы по логике получим лот в 0,4...

Interesting
4236
Interesting  

gpwr:

Существует ли ограничение на максимальное количество открытых ордеров?

Тоже задавался этим вопросом. Есть предложение над которым разработчики пока думают (для них кстати  - заявка 15802).
Vladimir
6698
Vladimir  
Interesting:

Эта строка рассчитывает риск как 2% от размера свободных средств. если я правильно понял. Почему эту сумму делят именно на 1000 это к разработчикам.

Но если я правильно понимаю то при депозите (свободных средствах) в 20,000$ советника рекомендует для открытия брать не более 2% от этой суммы (400$).

Резделив эту сумму на 1000 мы по логике получим лот в 0,4...

 

 

Теперь понял. В коде Moving Average.mq5 описка. Вместо

input double MaximumRisk        = 0.02;    // Maximum Risk in percentage

Нужно

input double MaximumRisk        = 0.02;    // Maximum Risk as a fraction of a free margin

Тогда деление на 1000 в вычислении лотов понятно: $100,000(lot size)/100(leverage) = 1000. Хотя разработчикам mql5 не гоже выставлять такой пример эксперта. Нужно заменить

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/1000.0,2);

На

double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(FreeMargin*MaximumRisk/LotRqdMgn,2);

А ещё лучше так

double Step       =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
int    Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double lot        =NormalizeDouble(MathFloor(FreeMargin*MaximumRisk/LotRqdMgn/Step)*Step,2);

 Хотя жалко что потярана MODE_MARGINREQUIRED. Может разработчики восстановят этот параметр чтобы уменьшить количество вычислений.

Interesting
4236
Interesting  
Interesting:
stringo:
Короткие имена всегда использовались только для отображения в подокне индикатора
Так там и не отображается, или это ошибка или я чего-то не понял...
Ошибку нашел и справил, 16051 можно закрывать.
Vladimir
6698
Vladimir  

Я не знаю в правильном ли месте я помещаю свои сообщения о багах. Если нет, пожалуйста поправьте меня.

При тестировании своего советника, я специально создал такую ситуацию чтобы посмотерть правильно ли тестер определяет маржу. Итак, депо на 100 долларов. Торгуем EURUSD. Минимальный размер лота 0.1. В советнике такой код на расчёт лотов

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);

Тестер выдаёт такие ошибки

2010.06.08 22:28:57 Core 1 no enough money [instant buy 0.10 EURUSD at 1.19242]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.24, NewFreeMargin: -19.24
2010.06.08 22:28:57 Core 1 1000   100
2010.06.08 22:28:57 Core 1 no enough money [instant buy 0.10 EURUSD at 1.19180]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.18, NewFreeMargin: -19.18
2010.06.08 22:28:57 Core 1 1000   100
2010.06.08 22:28:57 Core 1 no enough money [instant buy 0.10 EURUSD at 1.19362]
2010.06.08 22:28:57 Core 1 PrevBalance: 100.00, PrevEquity 100.00, PrevMargin: 0.00, NewMargin: 119.36, NewFreeMargin: -19.36
2010.06.08 22:28:57 Core 1 1000   100

Судя по этим сообщениям, свободные маржа, необходимая для покупки 1 лота, LotRqdMgn, равна 1000, что вроде правильно. Свободная маржа FreeMargin=100. Умножаем 0.1 лот на 1000 и получаем 100. То есть средств достаточно для открытия 1-го лота. Но тестер сообщает что средств недостаточно. Где ошибка?

MetaQuotes
Админ
26967
Renat Fatkhullin  
gpwr:

Судя по этим сообщениям, свободные маржа, необходимая для покупки 1 лота, LotRqdMgn, равна 1000, что вроде правильно. Свободная маржа FreeMargin=100. Умножаем 0.1 лот на 1000 и получаем 100. То есть средств достаточно для открытия 1-го лота. Но тестер сообщает что средств недостаточно. Где ошибка?

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

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

Vladimir
6698
Vladimir  
Renat:

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

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

 

Спасибо Ренат. Понял свою ошибку. Изменил формулу расчёта LotRqdMgn и всё тепрь работает правильно. 

Interesting
4236
Interesting  

Новое слово в библиотечном деле или удивительное рядом...


Создал я значит советника который использует библиотеку, проверил, все работает. Сформировал архив в который включил эксперта, эту библиотеку и еще несколько файлов MQL5 и MQH. Отдал архив на тесты заказчику.


И все бы нечего, да решил провести тесты на другом терминале. Распаковал я значит этот архив и захотел эксперта на график прицепить, ага сейчаза (10 раз)...


Причем в журнале терминала вот эти две строки пишутся:

2010.06.10 09:54:51    Experts    Expert MechanicalTrading-Infinity-2010 (EURUSD,Daily) removed
2010.06.10 09:54:51    Experts    Loading of MechanicalTrading-Infinity-2010 (EURUSD,Daily) failed


Стал разбираться что и как работает (верней не работает) и обнаружил для себя удивительный факт - Терминал видит в каталоге скомпилированную библиотеку (в виде *.ex5) но при этом в том упорно ее "мочит", что по сути как понимаете не очень есть хорошо...

После перебора возможных причин такого поведения терминала решил поместить в каталог с библиотекой оригинальный файл (в виде *.mq5). файл поместил, при этом даже не компилировал его. Попробовал добавить эксперта на график - о чудо, все заработало.


По ходу пьесы у меня созрел ряд вопросов:

1. Почему эксперт не работает если библиотека представлена только в виде .ex5?

2. Почему терминал упорно удаляет этот файл из каталога?

3. Почему в журнале терминала нет внятного комментария по поводу всего вышеперечисленного?

4. Почему в документации не сказано о возможности подобного поведения?


и наконец пятый и заключительный вопрос  - как с этим всем бороться и что я делаю не так (можеет терминалу не хватает одного EX5 файла и он ищет что-то, например заголовочник или саму библиотеку)?


PS

Кстати, с самим экспертом такая же фигня происходит, упорно удаляется *.ex5 файл... :(



Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий