То есть выясняем достаточность баланса обеспечить торговое требование к минимальному объёму, затем проверяем отношение баланса к Lots на предмет обеспечения размера контракта.
Может это вообще не надо?
Раньше я когда в тестере ставил депозит 100$ то тестер не ругался - он спокойно открывал ордера по лоту 0,01 а ведь это 100/0,01=10 000 - то есть торговые требования не обеспечиваются. Сейчас тестер выкидывает советника при тестах с депозитом 100$ ведь ему там задать плечо нельзя, если только сразу баланс указывать 10 000 = 100$ * плечо 100, тогда всё нормально будет. Но правда смотреть на график где с депозита с балансом в 10 000$ советник наторговывает 50 $ - смешно))) Никак не привыкну.
AccountFreeMarginCheck
- docs.mql4.com
if(AccountFreeMarginCheck(Symbol(),OP_BUY,Lots)<=0 || GetLastError()==134) return;
Это условие надо ставить перед каждым OrderSend()? Мне бы проверку прямо вначале работы когда ещё нет открытых позиций.
// Проверка Баланса if(cn==0 && AccountBalance()/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE)<SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)) { Print("Баланс счёта не обеспечивает торговые требования"); SendMail("EA BJH","Баланс счёта не обеспечивает торговые требования"); ExpertRemove(); // Снять советник с графика } // Проверка Lots else if(cn==0 && AccountBalance()/Lots<SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE)/3) { Print("Lots не обеспечивает торговые требования"); SendMail("EA BJH","Lots не обеспечивает торговые требования"); ExpertRemove(); // Снять советник с графика }
Пока вот так допетрил, ну там для торговли советником при трёхкратным Lots: Если Lots = 0.01, то максимум Lots = 0,03
Если deposit 100$ то баланс при плече 1:100 будет 10 000$ итого 10 000 / 0,03 = 33 333,333 < 33 333.333 (SYMBOL_TRADE_CONTRACT_SIZE/3)
Вроде прокатывает пока по тестам, там по торговым условиям
SYMBOL_TRADE_CONTRACT_SIZE * SYMBOL_VOLUME_MIN = 100 000 * 0,01 = 1 000 $ (баланс счёта минимальный) - у меня баланс с плечом получается 10 000 $, то есть максимальный Lots на такой баланс 0,1
Правильно я считаю?
(NormalizeDouble(AccountFreeMargin()/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE),2)-Lots*(CountTrades()+1));
Вот ещё вопрос - почему Лот не рассчитывается?
Вместо: Баланс счёта не обеспечивает ... - робот должен требовать: Хозяин, добавь деньжат. Все прособачил. Посмотрите пример обработки ошибок
// Проверка Баланса if(cn==0 && AccountBalance()*AccountLeverage()/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE)<SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)) { Print("Баланс счёта не обеспечивает торговые требования"); SendMail("EA BJH","Баланс счёта не обеспечивает торговые требования"); ExpertRemove(); // Снять советник с графика } // Проверка Lots else if(cn==0 && AccountBalance()*AccountLeverage()/Lots<SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE)) { Print("Lots не обеспечивает торговые требования"); SendMail("EA BJH","Lots не обеспечивает торговые требования"); ExpertRemove(); // Снять советник с графика }
Разобрался я с депозитом и кредитным плечом, вот такой вариант оставил.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
То есть выясняем достаточность баланса обеспечить торговое требование к минимальному объёму, затем проверяем отношение баланса к Lots на предмет обеспечения размера контракта.
Может это вообще не надо?
Раньше я когда в тестере ставил депозит 100$ то тестер не ругался - он спокойно открывал ордера по лоту 0,01 а ведь это 100/0,01=10 000 - то есть торговые требования не обеспечиваются. Сейчас тестер выкидывает советника при тестах с депозитом 100$ ведь ему там задать плечо нельзя, если только сразу баланс указывать 10 000 = 100$ * плечо 100, тогда всё нормально будет. Но правда смотреть на график где с депозита с балансом в 10 000$ советник наторговывает 50 $ - смешно))) Никак не привыкну.