Функция расчета лота от размера депозита. - страница 5

 
Alexey Volchanskiy:

А в чем проблема? Вычисляете размер лота, потом надо этот размер нормализовать, чтобы он был кратен минимальному изменению лота. Вот функция со всеми проверками для MQL4.


Alexey Volchanskiy:

А в чем проблема? Вычисляете размер лота, потом надо этот размер нормализовать, чтобы он был кратен минимальному изменению лота. Вот функция со всеми проверками для MQL4.


Здравствуйте.

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

Спасибо.

 
KhuKhu:


Здравствуйте.

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

Спасибо.


Как превратить - очень интересный вопрос )) Процентов в ней нет, это просто обертка над стандартной функцией со всеми проверками на возможные ошибки.

 
Alexey Volchanskiy:

Как превратить - очень интересный вопрос )) Процентов в ней нет, это просто обертка над стандартной функцией со всеми проверками на возможные ошибки.


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

 

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

Но я хотел добиться, чтобы можно было открыть ордер объемом равным Баланс-%. Т.е. депо 5000 долл. - 10%=500 долл. На 500 долл. купить один ордер, который откроется только на одном баре.  Но я перезапустил советник и близкого результата нет. Возможно ли поправить? 

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

//--------------------------------------------------------------------
// openbuy.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --




int start()                                     // Спец.функция start
  {
   
  
   
   
   int Dist_SL =0;                             // Заданный SL (pt)
   int Dist_TP =0;                              // Заданный TP (pt)
   double Prots=0.10;                           // Процент своб. ср.
   string Symb=Symbol();                        // Финанс. инструмент
   double SL,TP;
//--------------------------------------------------------------- 2 --
/*  
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   int Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return (0);                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return(0);                             // Выход из start()
           }
         string Tip   =OrderType();                    // Тип выбранного орд.

        }
     }
 */ 
 
 

  
   while(true)                                  // Цикл открытия орд.
     {
      int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Мин. дистанция
      double Min_Lot=MarketInfo(Symb,MODE_MINLOT);// Мин. стоим. лотов
      double Step   =MarketInfo(Symb,MODE_LOTSTEP);//Шаг изменен лотов
      double Free   =AccountBalance();       // Свободн средства
      double One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);//Стоим.лота
      //--------------------------------------------------------- 3 --
    /*   int Total=0;
   for(int i = 1; i<OrdersTotal(); i++)
   {
   if(OrderSelect(i-1,SELECT_BY_POS)==false) Total++;
   }
   Alert ("Общее кол-во ордеров больше одного");
   if ((Total>1)==true)
   Alert ("Пропустил");
      
    */
  
    
    
      
      double Lot=MathFloor(Free*Prots/One_Lot/Step)*Step;// Лоты
      if (Lot<Min_Lot)                          // Если меньше допуст
        {
         Alert(" Не хватает денег на ", Min_Lot," лотов");
         break;                                 // Выход из цикла  
        }
      //--------------------------------------------------------- 4 --
      if (Dist_SL<Min_Dist)                     // Если меньше допуст.
        {
         Dist_SL=Min_Dist;                      // Установим допуст.
         Alert(" Увеличена дистанция SL = ",Dist_SL," pt");
        }
      //--------------------------------------------------------- 5 --
      if (Dist_TP<Min_Dist)                     // Если меньше допуст.
        {
         Dist_TP=Min_Dist;                      // Установим допуст.
         Alert(" Увеличена дистанция TP = ",Dist_TP," pt");
        }
      //--------------------------------------------------------- 6 --
      Alert("Торговый приказ отправлен на сервер. Ожидание ответа..");
      
      
     /*  int TekBar = -1; // Текущий бар.

if (TekBar == Bars)return(0); // На одном баре только одна сделка.
TekBar = Bars; // На одном баре только одна сделка.
    */  
      
      if ( Close[0]>Close[1])
      int ticket=OrderSend(Symb, OP_BUY, Lot, Ask, 2, SL, TP);
      
      if ( Close[0]<Close[1])
      
      ticket=OrderSend(Symb, OP_SELL, Lot, Bid, 2, SL, TP);
      
      //--------------------------------------------------------- 7 --
      if (ticket>0)                             // Получилось :)
        {
         Alert ("Открыт ордер Buy ",ticket);
         break;                                 // Выход из цикла
        }
      //--------------------------------------------------------- 8 --
      int Error=GetLastError();                 // Не получилось :(
      switch(Error)                             // Преодолимые ошибки
        {
         case 135:Alert("Цена изменилась. Пробуем ещё раз..");
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
         case 136:Alert("Нет цен. Ждём новый тик..");
            while(RefreshRates()==false)        // До нового тика
               Sleep(1);                        // Задержка в цикле
            continue;                           // На след. итерацию
         case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
            Sleep(500);                         // Простое решение
            RefreshRates();                     // Обновим данные
            continue;                           // На след. итерацию
        }
      switch(Error)                             // Критические ошибки
        {
         case 2 : Alert("Общая ошибка.");
            break;                              // Выход из switch
         case 5 : Alert("Старая версия клиентского терминала.");
            break;                              // Выход из switch
         case 64: Alert("Счет заблокирован.");
            break;                              // Выход из switch
         case 133:Alert("Торговля запрещена");
            break;                              // Выход из switch
         default: Alert("Возникла ошибка ",Error);// Другие варианты   
        }
      break;                                    // Выход из цикла
     }
//--------------------------------------------------------------- 9 --
   Alert ("Скрипт закончил работу -----------------------------");
   return(0);                                      // Выход из start()
  }
//-------------------------------------------------------------- 10 --
 
KhuKhu:

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


моя старая функция расчета лота по проценту, для разных валют

Вам необходим код? 

Функция расчета автолота:

Внешние переменные:

extern string autolot_="Настройки автолота";
extern double Lots=0.1;                   // Фиксирвоанный лот 
extern bool DynamicLot=false;             // Динамический лот
extern double LotBalancePcnt=20;          // % от депозита
extern double MaxLot=999;                 // Максимальный лот при расчете

Функция:



double GetSizeLot(double ll=1) //Функция возвращает значение лотов, 
  {
   
   string lotcalc;
   double pr;
   string Valdepo=AccountCurrency();
//если включен ММ то значение лотов, 
   double Lot2,MinLots,MaxLots;
   int lotdig;
   if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)lotdig=2; else lotdig=1;
   if(Valdepo=="USD")
     {
      if(StringSubstr(Symbol(),0,3)=="USD")Lot2=NormalizeDouble(AccountFreeMargin()*LotBalancePcnt*
         AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else if(StringSubstr(Symbol(),3,3)=="USD")Lot2=NormalizeDouble(AccountFreeMargin()*LotBalancePcnt*
         AccountLeverage()/Ask/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else
        {
         pr=MarketInfo(StringSubstr(Symbol(),0,3)+"USD",MODE_ASK);
         if(pr!=0)Lot2=NormalizeDouble(AccountFreeMargin()*LotBalancePcnt*AccountLeverage()/pr/100/
            MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
         else Lot2=NormalizeDouble(AccountFreeMargin()*LotBalancePcnt*AccountLeverage()/100/
            MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
        }
     }
   if(Valdepo=="EUR")
     {
      if(StringSubstr(Symbol(),0,3)=="EUR")Lot2=NormalizeDouble(AccountFreeMargin()*LotBalancePcnt*
         AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else
        {
         pr=MarketInfo("EUR"+StringSubstr(Symbol(),0,3),MODE_BID);
         if(pr!=0)Lot2=NormalizeDouble(AccountFreeMargin()*LotBalancePcnt*AccountLeverage()*pr/100/
            MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
         else Lot2=NormalizeDouble(AccountFreeMargin()*LotBalancePcnt*AccountLeverage()/100/
            MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
        }
     }

   if(Valdepo=="RUR" || Valdepo=="RUB")
     {
      if(StringSubstr(Symbol(),0,3)=="USD")Lot2=NormalizeDouble(AccountFreeMargin()/40*
         LotBalancePcnt*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else if(StringSubstr(Symbol(),3,3)=="USD")Lot2=NormalizeDouble(AccountFreeMargin()/40*
         LotBalancePcnt*AccountLeverage()/Ask/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else
        {
         pr=MarketInfo(StringSubstr(Symbol(),0,3)+"USD",MODE_ASK);
         if(pr!=0)Lot2=NormalizeDouble(AccountFreeMargin()/40*LotBalancePcnt*AccountLeverage()/pr/100/
            MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
         else Lot2=NormalizeDouble(AccountFreeMargin()/40*LotBalancePcnt*AccountLeverage()/100/
            MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
        }
     }

   MinLots=MarketInfo(Symbol(),MODE_MINLOT);
   MaxLots=MaxLot;
   lotcalc=" Autolot="+Lot2;
   if(!DynamicLot)Lot2=Lots;

   if(Lot2 < MinLots) Lot2 = MinLots;
   if(Lot2 > MaxLots) Lot2 = MaxLots;
   lotcalc=lotcalc+" MinLots="+MinLots+" LOT="+NormalizeDouble(Lot2,lotdig);
   Print(lotcalc);
   return(NormalizeDouble(Lot2,lotdig));
  }
//+------------------------------------------------------------------+