Автолот в МТ4

 

Коллеги, всем привет.

Есть готовый советник на МТ4. В целом, за исключением некоторых моментов, меня в нём всё устраивает.

Осталось добавить в него единственную вещь: автолот на размер депозита. Т.е. если поставлю в этом поле 500, то на каждые 500 депозитв ставится 0.01 лота.

Пробовал сам делать, из различных советников вставлять. Постоянно какие-то ошибки вылазят. Ладно если бы только необъявленные переменные.


Найдутся здесь добрые люди, кто алгоритм объяснит по написанию в коде параметра автолот, или поделится частью кода, как правильно прописать автолот в общем коде - буду рад. Или если есть уже готовые решения здесь на форуме и вы знаете ссылку на статью - тоже хорошо.

За адекватные комментарии заранее спасибо!

 
Nikolay Shorin:

Коллеги, всем привет.

Есть готовый советник на МТ4. В целом, за исключением некоторых моментов, меня в нём всё устраивает.

Осталось добавить в него единственную вещь: автолот на размер депозита. Т.е. если поставлю в этом поле 500, то на каждые 500 депозитв ставится 0.01 лота.

Пробовал сам делать, из различных советников вставлять. Постоянно какие-то ошибки вылазят. Ладно если бы только необъявленные переменные.


Найдутся здесь добрые люди, кто алгоритм объяснит по написанию в коде параметра автолот, или поделится частью кода, как правильно прописать автолот в общем коде - буду рад. Или если есть уже готовые решения здесь на форуме и вы знаете ссылку на статью - тоже хорошо.

За адекватные комментарии заранее спасибо!

Вот можете за основу из учебника ф ию  взять расчета лота и её править под свои хотелки, если не шАрите всё равно, тогда во фриланс тут, там воплотят ф ию в коде.

Функция определения количества лотов - Создание обычной программы - Учебник по MQL4
Функция определения количества лотов - Создание обычной программы - Учебник по MQL4
  • book.mql4.com
Функция определения количества лотов - Создание обычной программы - Учебник по MQL4
 
Nikolay Shorin:

Коллеги, всем привет.

Есть готовый советник на МТ4. В целом, за исключением некоторых моментов, меня в нём всё устраивает.

Осталось добавить в него единственную вещь: автолот на размер депозита. Т.е. если поставлю в этом поле 500, то на каждые 500 депозитв ставится 0.01 лота.

Пробовал сам делать, из различных советников вставлять. Постоянно какие-то ошибки вылазят. Ладно если бы только необъявленные переменные.


Найдутся здесь добрые люди, кто алгоритм объяснит по написанию в коде параметра автолот, или поделится частью кода, как правильно прописать автолот в общем коде - буду рад. Или если есть уже готовые решения здесь на форуме и вы знаете ссылку на статью - тоже хорошо.

За адекватные комментарии заранее спасибо!

Могу предложить вот такой вариант. Сам использую во всех своих советниках. Расчёт - на каждую 1000 депозита минимальный шаг лота (там где maxlots). Дальше проверка на максимум-минимум допустимого лота, постановка стопов и тейков и разные способы открытия позиции.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BuyOrderRiskFixed747()
{
   double lotsize = MarketInfo(Symbol(), MODE_LOTSIZE) / AccountLeverage();
   double pipsize = 0.01 ;  // * 10
   double maxlots = NormalizeDouble(AccountFreeMargin() / 1000 * H1_RISK, 2) ;

   double lots = maxlots;

// calculate lot size based on current risk
   double lotvalue = 0.001;
   double minilot = MarketInfo(Symbol(), MODE_MINLOT);
   int powerscount = 0;
   while(minilot < 1)
   {
      minilot = minilot * MathPow(10, powerscount);
      powerscount++;
   }
   lotvalue = NormalizeDouble(lots, powerscount - 1);

   if(lotvalue < MarketInfo(Symbol(), MODE_MINLOT))     // make sure lot is not smaller than allowed value
   {
      lotvalue = MarketInfo(Symbol(), MODE_MINLOT);
   }
   if(lotvalue > MarketInfo(Symbol(), MODE_MAXLOT))     // make sure lot is not greater than allowed value
   {
      lotvalue = MarketInfo(Symbol(), MODE_MAXLOT);
   }
   double SL = Ask - SL_H1 * PipValue * Point;
   if(SL_H1 == 0)
      SL = 0;
   double TP = Ask + TP_H1 * PipValue * Point;
   if(TP_H1 == 0)
      TP = 0;

   int ticket = -1;
   if(ECNBroker_H1)
      ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 400, 0, 0, "TG_PULSE_1.0.9_H1_risk", MAGIC10, 0, Blue);
   else
      ticket = OrderSend(Symbol(), OP_BUY, lotvalue, Ask, 400, SL, TP, "TG_PULSE_1.0.9_H1_risk", MAGIC10, 0, Blue);
   if(ticket > -1)
   {
      if(ECNBroker_H1)
      {
         bool sel = OrderSelect(ticket, SELECT_BY_TICKET);
         bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
         if(ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
      }
      PrintToLog746();

   }
   else
   {
      Print("OrderSend() error - ", ErrorDescription(GetLastError()));
   }

}
 

если что-то прям совсем элементарное

(AccountBalance()/500)*0.01
 
Aleksey Semenov #:

если что-то прям совсем элементарное

Только я-бы перестраховался и написал-бы так

fmax((AccountBalance()/500)*0.01, 0.01);

Если баланс меньше 500 то по любому минимальный лот.

 

Коллеги, всем спасибо большое!) Завтра займусь этим и напишу что в итоге получилось.

 

Что в итоге пробовал. Изначально прописал такой код для автолота.

extern double          DepoPerLot         = 0;  //Depo Per 0.01 Lot (0-off)

double lot_size = sets[set_index];
   double mm_lot = lot_size;
    
   if (depo_per_lot >= 100)
   {
      double balance = AccountInfoDouble(ACCOUNT_BALANCE);

#ifdef IS_OPT
      lot_size = balance / depo_per_lot * sets[set_index].lot;
#else
      lot_size = balance / depo_per_lot * pairs_lots[set_index];
#endif

      mm_lot = lot_size;
   } 

Но вылезли ошибки:


Окей. Тогда попробовал вот такое:

extern double          DepoPerLot         = 0; //Depo Per 0.01 Lot (0-off)

int depo_per_lot;
double pairs_lots; 
double sets;

double lot_size = sets[set_index];
   double mm_lot = lot_size;
    
   if (depo_per_lot >= 100)
   {
      double balance = AccountInfoDouble(ACCOUNT_BALANCE);

#ifdef IS_OPT
      lot_size = balance / depo_per_lot * sets[set_index].lot;
#else
      lot_size = balance / depo_per_lot * pairs_lots[set_index];
#endif

      mm_lot = lot_size;
   }

Теперь ругается на строки:

double lot_size = sets[set_index]; 

lot_size = balance / depo_per_lot * pairs_lots[set_index];



что теперь то не так?

 
Эту строку ставите в переменную лот. Её потом отправляете в ф ию открытия позиции.
https://www.mql5.com/ru/forum/451104#comment_48288635

Вам же уже ответили.

 
Roman Shiredchenko #:
Эту строку ставите в переменную лот. Её потом отправляете в ф ию открытия позиции.
https://www.mql5.com/ru/forum/451104#comment_48288635

Вам же уже ответили.

Там же, как я понял, идёт от 500 баланса рассчет? Или от любого установленного, но с учетом того, что если депо менее 500 - в любом случае мин лот будет?

 
Nikolay Shorin #:

Там же, как я понял, идёт от 500 баланса рассчет? Или от любого установленного, но с учетом того, что если депо менее 500 - в любом случае мин лот будет?

Да. С любого. 500 берётся как шаг. 500 это 0.01 лота к предыдущему объему.
Если менее 500 то будет 0.01 лот.
 
Nikolay Shorin #:

Там же, как я понял, идёт от 500 баланса рассчет? Или от любого установленного, но с учетом того, что если депо менее 500 - в любом случае мин лот будет?

Кстати можете вообще без переменной сейчас с телефона - можете проверить без переменной эту строку ставите в ф ию открытия OrderSend() на место где указыаается объем, тоже должно сразу работать и всё. Если нет то можете через переменную Lot сделать и все. Не забудьте её объявить можете  сделать типа double.    Только не внешней. Т.к. внешние переменные изменять не рекомендуется.....