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

 
Не подскажите, как организовать скрипт выставления такого лота, когда забиваешь количество пунктов стоп-лосса, а скрипт бы рассчитывал лот... чтобы был риск 2%
 
Ivan Butko #:
Не подскажите, как организовать скрипт выставления такого лота, когда забиваешь количество пунктов стоп-лосса, а скрипт бы рассчитывал лот... чтобы был риск 2%

MQL4

//+---------------------------------------------------------------------------+
//|    Функция расщета риска от процента и расстояния  (c) Boshetunmay 2021   |
//+---------------------------------------------------------------------------+
double LotSize(int sl,double risk)
  {
   double Free = AccountFreeMargin();
   double LotVal  = MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта 1 лота
   double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT);
   double Step    = MarketInfo(Symbol(),MODE_LOTSTEP);
   if(sl<=0)
      return(Min_Lot); // исключение деления на ноль
   double Lot     = NormalizeDouble((MathFloor((Free*risk/100)/(sl*LotVal)/Step)*Step),2);
   if(Lot<Min_Lot)
      Lot=Min_Lot;
   if(Lot>Max_Lot)
      Lot=Max_Lot;
   return(Lot);
  }
//--- End ---
 
Volodymyr Zubov #:

MQL4

Спасибо большое!

Оперативно 
 
Maxim Kuznetsov #:

ну так и вычисляйте её (или вспоминайте/берите из каких-то структур). У вас, при трале лимиток, из-за того что X постоянный, для всех ордеров получается одинаковая цена, и они "сбиваются в кучу".

а может это все таки связано с подсчетом/выбором по какому то параметру?

ведь у меня в функции стоит выбор последнего ордера

 
Ivan Butko #:

Спасибо большое!

Оперативно 

смотря что вы разумеете под risk%, - стоит добавлять AccountMargin() к Free; просто обратите внимание, а то возможны сюрпризы

 
законопослушный гражданин #:

а может это все таки связано с подсчетом/выбором по какому то параметру?

ведь у меня в функции стоит выбор последнего ордера

хотел раньше написать - не делайте так никогда :-) не перебирайте все ордера/позиции терминала и тем более не полагайтесь на значение pos при этом (не учитывайте первый или последний в том переборе). 

ваши ордера ? храните всё  про них в ваших структурах и массивах. 

 
Maxim Kuznetsov #:

хотел раньше написать - не делайте так никогда :-) не перебирайте все ордера/позиции терминала и тем более не полагайтесь на значение pos при этом (не учитывайте первый или последний в том переборе). 

ваши ордера ? храните всё  про них в ваших структурах и массивах. 

да вроде во многих советниках так сделано. а в чем риск?

 
Maxim Kuznetsov #:

ваши ордера ? храните всё  про них в ваших структурах и массивах. 

А их - в файлах или глобальных переменных терминала, на случай внезапной перезагрузки, потери питания и т.п.

 
законопослушный гражданин #:

да вроде во многих советниках так сделано. а в чем риск?

риск остаться "в числе многих советников" :-) то есть исключительно для тестера

во первых перебирать все ордера это долго. Советник оперирует 5-10 ордерами, в терминале их сотни. Уже одного этого достаточно

во вторых не гарантируется какая-либо очерёдность/сортировка ордеров. 

и наконец - если есть возможность делать хорошо и красиво, то зачем делать плохо и страшно ? :-) 

---

просто к примеру :

оперируете сеткой - сделайте себе класс Grid. В сетке есть уровни и связанные с ними ордера/позиции - сделайте в ней массив объектов GridLevel и прочие. Когда надо синхронизироваться с терминалом (а это очень редко), использовать OrderSelect(SELECT_BY_TICKET).

обратите внимание - внутри OnTick у вас почти не останется циклов. Вы получаете Bid,Ask и сразу всё знаете. Работать будет пулей, будет меньше ошибок при отправке приказов. И расширять/дополнять это будет гораздо проще

 
Maxim Kuznetsov #:

риск остаться "в числе многих советников" :-) то есть исключительно для тестера

во первых перебирать все ордера это долго. Советник оперирует 5-10 ордерами, в терминале их сотни. Уже одного этого достаточно

во вторых не гарантируется какая-либо очерёдность/сортировка ордеров. 

и наконец - если есть возможность делать хорошо и красиво, то зачем делать плохо и страшно ? :-) 

---

просто к примеру :

оперируете сеткой - сделайте себе класс Grid. В сетке есть уровни и связанные с ними ордера/позиции - сделайте в ней массив объектов GridLevel и прочие. Когда надо синхронизироваться с терминалом (а это очень редко), использовать OrderSelect(SELECT_BY_TICKET).

обратите внимание - внутри OnTick у вас почти не останется циклов. Вы получаете Bid,Ask и сразу всё знаете. Работать будет пулей, будет меньше ошибок при отправке приказов. И расширять/дополнять это будет гораздо проще

спасибо. буду учить как сделать теперь)

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