Проверка торговых условий в советнике - корректно?

 
// Проверка Баланса
   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))
     {
      Print("Lots не обеспечивает торговые требования");
      SendMail("EA BJH","Lots не обеспечивает торговые требования");
      ExpertRemove();  // Снять советник с графика
     }

То есть выясняем достаточность баланса обеспечить торговое требование к минимальному объёму, затем проверяем отношение баланса к Lots на предмет обеспечения размера контракта.

Может это вообще не надо?

Раньше я когда в тестере ставил депозит 100$ то тестер не ругался - он спокойно открывал ордера по лоту 0,01 а ведь это 100/0,01=10 000 - то есть торговые требования не обеспечиваются. Сейчас тестер выкидывает советника при тестах с депозитом 100$ ведь ему там задать плечо нельзя, если только сразу баланс указывать 10 000 = 100$ * плечо 100, тогда всё нормально будет. Но правда смотреть на график где с депозита с балансом в 10 000$  советник наторговывает 50 $ - смешно))) Никак не привыкну.

 
geratdc:

То есть выясняем достаточность баланса обеспечить торговое требование к минимальному объёму, затем проверяем отношение баланса к Lots на предмет обеспечения размера контракта.

Может это вообще не надо?

Раньше я когда в тестере ставил депозит 100$ то тестер не ругался - он спокойно открывал ордера по лоту 0,01 а ведь это 100/0,01=10 000 - то есть торговые требования не обеспечиваются. Сейчас тестер выкидывает советника при тестах с депозитом 100$ ведь ему там задать плечо нельзя, если только сразу баланс указывать 10 000 = 100$ * плечо 100, тогда всё нормально будет. Но правда смотреть на график где с депозита с балансом в 10 000$  советник наторговывает 50 $ - смешно))) Никак не привыкну.

AccountFreeMarginCheck

AccountFreeMarginCheck - Account Information - MQL4 Reference
AccountFreeMarginCheck - Account Information - MQL4 Reference
  • docs.mql4.com
AccountFreeMarginCheck - Account Information - MQL4 Reference
 

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

Вот ещё вопрос - почему Лот не рассчитывается?

 
geratdc:  То есть выясняем достаточность   Может это вообще не надо?

Вместо: Баланс счёта не обеспечивает ... - робот должен требовать: Хозяин, добавь деньжат. Все прособачил. Посмотрите пример обработки ошибок

 
// Проверка Баланса
   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();  // Снять советник с графика
     }

Разобрался я с депозитом и кредитным плечом, вот такой вариант оставил.

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