Автолот в МТ4 - страница 2

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

А если нужно, чтобы вручную можно было вводить депозит на каждые 0.01 лота? Как я в коде выше пытался сделать.

 

Я в коде не так хорошо понимаю, как в разработке систем и особенно их оптимизации.

Поэтому если кто-то заранее готов помочь реализовать идею в виде кода, за символическую сумму, напишите в лс сразу с ценой. Будет устраивать - проще вам заплатить.

Если взглянуть на код, там в целом можно копипастом обойтись +, возможно, пару переменных/функций подправить. Для знающего - минут на 5 делов. Кто средне в коде шарит - около часа.

Компилятор из мт4 в мт5 уже написан, вариант бота без автоММ в мт5 компилируется ок. Т.е. даже мт5 не нужно версию делать будет (я надеюсь, смотря какие изменения в мт4 будут).

Пример кода как это должно выглядеть - выше присылал.

Т.е. ничего менять в текущем коде не нужно. Просто добавить параметр Depo Per Lot, значащее сколько валюты депозита приходится на 0.01 лота в АвтоММ режиме.

 
Nikolay Shorin #:

А если нужно, чтобы вручную можно было вводить депозит на каждые 0.01 лота? Как я в коде выше пытался сделать.

так можете попробовать

extern double Depo_Per_Lot = 500;
....


void OnTick()
...
  if (OrderSend(Symbol(),OP_BUY, fmax((AccountBalance()/Depo_Per_Lot)*0.01, 0.01),NormalizeDouble(Ask,Digits),slippage,0,0,NULL,Magic)==-1) Print(GetLastError());
...


П.С. Вот ф-ия Ким И.В. если и здесь не поймете - он там все расжевал - то вы уже знаете что делать.

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • 2023.07.22
  • www.mql5.com
Самый большой фриланс c разработчиками программ на MQL5
 

Пробовал вот так, и различные его вариации. Но там перестаёт работать одна важная функция.

if (Lot>0) dLot=Lot;
  if (Lot<=0)
  {
    dLot=MathCeil((AccountBalance()-DepoPerLot)/DepoPerLot)/10;
  }
  return(dLot);


Пробовал как вы указали. Однако тут он начинает набирать кучу ордеров и сливает в итоге.

if (OrderSend(Symbol(),OP_BUY, fmax((AccountBalance()/DepoPerLot)*0.01, 0.01),NormalizeDouble(Ask,Digits),Split,0,0,NULL,Magic)==-1) Print(GetLastError());

Причем неважно в какую часть void OnTick() вставляю это условие, итог один:

Хотя автолот, вроде как, во втором случае он высчитывает верно.

 

Пробовал ещё вот так:

 if (Lot>0)
  (OrderSend(Symbol(),OP_BUY, fmax((AccountBalance()/DepoPerLot)*0.01, 0.01),NormalizeDouble(Ask,Digits),Split,0,0,NULL,Magic)==-1);

Результат аналогичен предыдущему.

 
Nikolay Shorin #:

Пробовал вот так, и различные его вариации. Но там перестаёт работать одна важная функция.


Пробовал как вы указали. Однако тут он начинает набирать кучу ордеров и сливает в итоге.

Причем неважно в какую часть void OnTick() вставляю это условие, итог один:

Хотя автолот, вроде как, во втором случае он высчитывает верно.


Срочно во фриланс
Я вам написал  пример исп ия  расчета лота  по  вашим хотелкам  в бай.
График тут абсолютно не важен. Это пример его исп ия  в открытии в бай. В селл - аналогично.
 

Пробовал из другого, написанного мне кода, внедрить в текущий. Но там некоторые ошибки появляются.

double calc_lot(int set_index, int num_orders)
{
   double lot_size = sets[set_index].lot;
   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;
   }
    
   if (num_orders >= sets[set_index].start_factor_knee - 1)
   {
      for (int i = sets[set_index].start_factor_knee - 1; i <= num_orders; i++)
      {
         if (use_arithmetic_multiplier)
            lot_size += mm_lot;
         else    
            lot_size *= sets[set_index].recovery_factor;
      }    
   }
        
   lot_size *= 100.0;
   lot_size = MathFloor(lot_size);
   lot_size /= 100.0;
    
   return lot_size;
}


У меня уже был один фрилансер. Месяц мурыжил, потом и вовсе пропал. Спасибо. Видимо без автолота обойдусь.

 
Nikolay Shorin #:

Пробовал из другого, написанного мне кода, внедрить в текущий. Но там некоторые ошибки появляются.


У меня уже был один фрилансер. Месяц мурыжил, потом и вовсе пропал. Спасибо. Видимо без автолота обойдусь.

ищете через Ctrl + F эту ф -ию открытия  и в неё вставляете то что я вам написал и все.
OrderSend.. .... 

Вот этот участок кода в неё ставите
fmax((AccountBalance()/DepoPerLot)*0.01, 0.01),NormalizeDouble(Ask,Digits),Split,0,0,NULL,Magic)==-1);

 И всё.
 
Nikolay Shorin #:

Пробовал ещё вот так:

Результат аналогичен предыдущему.

нее - так у вас ничего не получится, накидать функций без понимания как всё работает не канает, особенно тут, особенно при работе с деньгами, вам бы у курс програамирования mql4 хотябы глазками просмотреть, хотябы ту часть что про написание экспертов - рекомендую бесплатный курс видеоуроков от трейдлайэпро -  «Программирование на MQL4»
 
Aleksey Semenov #:
нее - так у вас ничего не получится, накидать функций без понимания как всё работает не канает, особенно тут, особенно при работе с деньгами, вам бы у курс програамирования mql4 хотябы глазками просмотреть, хотябы ту часть что про написание экспертов - рекомендую бесплатный курс видеоуроков от трейдлайэпро -  «Программирование на MQL4»
да у него там есть какой-то робот - просто была нужна ф-ия манименеджмента и все.
Ему тут люди помогли ее в коде сделать и всё.