Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 247

 
(NormalizeDouble(AccountFreeMargin()/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE),2)-Lots*(CountTrades()+1));

Сочинил формулу для расчёта лота, скажите где может быть ошибка? Не открывается ордер из-за некорректности какой-то.

Формула пока актуальна для депозита 100$ и выше при плече 1-100 и выше. А если депозит без плеча 1 000$ получается что формула не рабочая, так как Фримаржин/контракт = 0,01  и вычесть из такого значения уже не получится так как торговые условия не выполнятся.


А с другой стороны зачем вычитать если ФРи Маржин уже учитывает открытые позиции да? Тогда это будет выглядеть так-

lot=NormalizeDouble(AccountFreeMargin()/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE),2)

Пойду потестирую

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...
 
geratdc:   Сочинил формулу для расчёта лота, скажите где может быть ошибка? Не открывается ордер из-за некорректности какой-то.
      Лот=NormalizeDouble(0.65*AccountBalance()*AccountLeverage()/          // Использую такую формулу
                             MarketInfo(_Symbol, MODE_LOTSIZE),2);
 
STARIJ:

Приветствую)) А что за 0,65? откуда это

Я про левередж (плечо) думал, но пришёл к выводу что баланс то уже по идее указывается с учётом плеча. Или я не прав? 


А 0,65 это резерв под 35% просадку чтоли? чтобы маржинколл не вызвался? Кстати хорошая мысль, а то вот так лот подберёшь потом убыток пойдёт по позициям и капец

Во! формула сработала после того как минусование убрал, прикольно)) короче был лот 0,02, потом когда три позиции в просадку ушли аварийный лот рассчитлся как 0,1, то есть в 5 раз! То что надо, потестирую может правда коэффициент защитный поставлю Хотя там у меня функция и так чуткая на продолжение роста убытков при открытом аварийном ордере, практически проблем не должно быть.

Коллега, благодарю за ценные мысли! пойду тестить!


Я вот ещё проверять торговые условия вздумал. Как вам такой код? 


// Проверка Баланса
   if(cn==0 && TradeCheck==true && AccountBalance()/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE)<SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN))
     {
      Print("Баланс счёта не обеспечивает торговые требования");
      SendMail("EA BJH","Баланс счёта не обеспечивает торговые требования");
      ExpertRemove();  // Снять советник с графика
     }
// Проверка Lots
   else if(cn==0 && TradeCheck==true && AccountBalance()/Lots<SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE))
     {
      Print("Lots не обеспечивает торговые требования");
      SendMail("EA BJH","Lots не обеспечивает торговые требования");
      ExpertRemove();  // Снять советник с графика
     }
Файлы:
1.gif  10 kb
 
geratdc:   Коллега, благодарю за ценные мысли! пойду тестить!

Если перевернуть - BUY вместо SELL   и   SELL вместо BUY - будет лучше

     Попробуйте, Коллега!!!

Робот вместо констатации факта должен выдавать рекомендации: Хозяин, добавь деньжат. Те, что были, уже прособачил...

 
STARIJ:

Если перевернуть - BUY вместо SELL   и   SELL вместо BUY - будет лучше

     Попробуйте, Коллега!!!

Робот вместо констатации факта должен выдавать рекомендации: Хозяин, добавь деньжат. Те, что были, уже прособачил...


Да всё норм, там специально левые настройки были чтобы отработку аварийного ордера вызвать - надо было посмотреть какой лот подберёт. 

lot=NormalizeDouble(AccountFreeMargin()/SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE),2);

Пока вот такой вариант оставил. Раньше через баланс считал, думаю по марже свободной корректнее будет, но итог тот же. По результатам тестов уже посмотрим потом.

 
geratdc:   Да всё норм

Интернет включили! Можно на почту писать?

 
STARIJ:

     Вот так надо? Уровни -0,75   и  +0,75

Проще одна переменная. Вначале 0. Затем +1    -1     +1     -1


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

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

Отбились - это как? Он на нас нападал? Отбились когда - до запуска? Как могли отбиваться, если только что запуск? Перед отправкой читайте - все ли здесь понятно

 
STARIJ:

Отбились - это как? Он на нас нападал? Отбились когда - до запуска? Как могли отбиваться, если только что запуск? Перед отправкой читайте - все ли здесь понятно


Хорошо, не отбились, а произвел отскок от линии. При условии, что советник ставится на другую машину / терминал или в случае выключения компьютера, перезапуска терминала, он (советник) начал работать сразу, вычислив, на каком уровне последний раз была цена и выставив нужное значение переменной, а не ждал пока цена достигнет нужного уровня. Надеюсь понятно описал.

 
AlGuruХорошо, не отбились, а произвел отскок от линии. При условии, что советник ставится на другую машину / терминал или в случае выключения компьютера, перезапуска терминала, он (советник) начал работать сразу, вычислив, на каком уровне последний раз была цена и выставив нужное значение переменной, а не ждал пока цена достигнет нужного уровня. Надеюсь понятно описал.

При чем здесь другая машина или терминал? Или выключение - перезапуск. Может быть имеется в виду включение компьютера или запуск советника? Почему обязательно отскок, а если уход за линию уровня и обратное пересечение. И если подождет - это всего лишь пропуск одной возможности при включении. Можно это сначала отбросить, а когда все сделаете - вернуться к этому. И потом, откуда берутся линии, когда они появляются, кто их ставит, или как советник их вычисляет. Если они ставятся на другом компьютере или до выключения компьютера - цена может уйти далеко. Если уровни вычисляет сам советник - это другое дело. А теперь смотрите: цена отбилась от верхнего уровня и в течение часа побродила между уровнями. И тут мы включили компьютер, запустили советник. Видимо, нужно этому отскоку приписать время действия. Час прошел - все, отскок забыт. ... Видите, сколько вопросов возникает! А говорите понятно. Вам понятно, Вы знаете существо вопроса. А со стороны - это тьма. Искусство программировать - это умение самостоятельно поставить кучу вопросов и найти на них ответы. Посмотрите скрипт - может тут есть рациональное зерно

//+-------------------------------------------------------+
//| Проверка                                     PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  bool ДостигнутПервыйУровень=false,
       ДостигнутВторойУровень=false;
  int Переменная1=0, Переменная2=0;
  double Уровень;
  int x;

  Alert("----- Снизу вверх --------");
  for(x=13; x<27; x++)
  {
    Уровень=round(sin(x)*10)/10;

    if(Уровень>0.75)
    {
      Переменная1=1;
      Переменная2=0;
    }

    if(Уровень<-0.75)
    {
      Переменная1=0;
      Переменная2=1;
    }

    Alert("  ", x, "       ", Уровень, "        ", Переменная1, "        ", Переменная2);
  }
  Alert("Номер  Уров  Пер1  Пер2");
}
Причина обращения: