Прошу написать простой советник для новичка. - страница 2

 

Пишу функцию управления капиталом. Возникли следующие вопросы.

1. Как остановить работу советника при достижении средств на счете 500$.

2.  В правилах чемпионата написано: Минимальный размер сделок 0.1 лота, максимальный - 5 лотов с шагом 0.1 лота на каждый ордер.

Это означает что после 1-й сделки лот можно увеличивать до 0.2 и так до 5? Или лот увеличивается только при достижении капиталом определенного уровня, скажем было 10000 стало 20000 и только тогда можно увеличивать лот?

Эти вещи читал:

 Функции управления капиталом в экспертах 

Написание советника в MQL5 с использованием объектно-ориентированного подхода 

MACD Sample разбирал. Пока что написал такие вещи:

//+------------------------------------------------------------------+
//|  возвращает размер средств, необходимых для открытия позиции     |
//+------------------------------------------------------------------+
void Money_M()
{
   Lots=AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000;
Lots=MathMin(5,MathMax(0.1,Lots));
   if(Lots<0.1)
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
}
//+---------------------------------------------------------------
//--- Вычисляем размер лота
double CalculateVolume()
  {
   int leverage=(int)AccountInfoInteger(ACCOUNT_LEVERAGE);                  // Размер предоставляемого на торговом счете плеча
   double lot_min =SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);            // Минимальный объем для заключения сделки
   double lot_max =SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);            // Максимальный объем для заключения сделки
   double lot_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);           // Минимальный шаг изменения объема для заключения сделки
   double contract=SymbolInfoDouble(Symbol(),SYMBOL_TRADE_CONTRACT_SIZE);   // Размер торгового контракта
   double vol;                                                              // Размер лота
//--- Обработка ошибок
   if(lot_min<0 || lot_max<=0.0 || lot_step<=0.0)
     {
      Print("CalculateVolume: invalid SymbolInfoDouble() results [",lot_min,",",lot_max,",",lot_step,"]");
      return(0);
     }
   if(leverage<=0)
     {
      Print("CalculateVolume: invalid AccountInfoInteger(ACCOUNT_LEVERAGE) [",AccountInfoInteger(ACCOUNT_LEVERAGE),"]");
      return(0);
     }
//--- basic formula
   vol=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk*AccountInfoInteger(ACCOUNT_LEVERAGE)/contract,2);
//--- additional calculation
//   ...
//--- check min, max and step
   vol=NormalizeDouble(vol/lot_step,0)*lot_step;
   if(vol<lot_min) vol=lot_min;
   if(vol>lot_max) vol=lot_max;
//---
   return(vol);
  }
//+------------------------------------------------------------------+

//--- Вычисляем размер лота  
void LotsCalc()
{
if((AccountInfoDouble(ACCOUNT_BALANCE)<1000))
  {
   Alert("Хватит наторговался! Всего 1000 рублей осталось!");
  }
else  
{
Lots=AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000*10;
Lots=Lots+0.1;
if(Lots<0.1) Lots=0.1;
if(Lots>5) Lots=5;
if(Lots<1) Lots=NormalizeDouble(Lots,1);
if(Lots>1)Lots=NormalizeDouble(Lots,0);
}
}  

 

 

 Подскажите пожалуйста где еще можно помотреть подобные примеры.

 
AM2:

2.  В правилах чемпионата написано: Минимальный размер сделок 0.1 лота, максимальный - 5 лотов с шагом 0.1 лота на каждый ордер.

Это означает что после 1-й сделки лот можно увеличивать до 0.2 и так до 5? Или лот увеличивается только при достижении капиталом определенного уровня, скажем было 10000 стало 20000 и только тогда можно увеличивать лот?


Это означает, что сервер принимает только ордера с объемом 0.1<=V<=5.0. На порядок выставления объема никаких ограничений нет, хотите сразу торгуйте по 5 лотов, хотите - сначала 10 раз по 1 лоту, затем 20 раз по 0.2 лота, хотите - случайным образом.

Кроме еще одного ограничения - объемы должны быть кратны 0.1 лота. Можно выставить 0.1 лот, но нельзя 0.11 лота. Можно 4.9 лота, но нельзя 4.99 лота. Это как в магазине - минимальная денежная единица 1 копейка, нет цен с дробной частью от копейки.

Если эксперт молотит ордерами с неправильными объемами:

  • больше 5 лота;
  • меньше 0.1 лота;
  • не кратно 0.1 лот
то таких участников будут снимать с чемпионата.
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 

А что Вы понимаете под 'остановить работу советника' :

   - закрыть все позиции и выгрузить эксперт с графика

   - закрыть все позиции и запретить открывать новые

   - просто запретить советнику торговать

   ?


 
Valmars:

А что Вы понимаете под 'остановить работу советника' :

   - закрыть все позиции и выгрузить эксперт с графика

   - закрыть все позиции и запретить открывать новые

   - просто запретить советнику торговать

   ?

Нужно чтобы советник не выставлял больше заявки при достижении средств на счете 500$. Больше интересуют два последних пункта. 1-й я нашел как реализуется:

https://www.mql5.com/ru/docs/common/expertremove 

 3-й пункт наверное так можно реализовать:

if(Buy_Condition && (!PositionSelect(_Symbol)) && (AccountInfoDouble(ACCOUNT_BALANCE)>1000))
     {  
         Money_M();
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = Ask;                                                 // последняя цена ask
         mrequest.sl = NormalizeDouble(Ask - STP*_Point,_Digits);              // Stop Loss
         mrequest.tp = NormalizeDouble(Ask + TKP*_Point,_Digits);              // Take Profit
         mrequest.volume = Lots;                                               // количество лотов для торговли
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
     }

 Остается 2-й пункт. Например если средства достигли определенного уровня  закрываем все позиции и запрещаем открывать новые.

Документация по MQL5: Общие функции / ExpertRemove
Документация по MQL5: Общие функции / ExpertRemove
  • www.mql5.com
Общие функции / ExpertRemove - Документация по MQL5