Как получить кол-во лотов, составляющих 100% депо.

 

МТ5 используется для работы на срочном рынке Московской биржи.

В настоящее время делаем советник для тестирования и возможной дальнейшей работы в качестве робота.

Не могу понять, как заставить советник в автоматическом режиме считать кол-во лотов.

Распишу понятнее, что имею в виду.

Допустим у нас депозит - 1 000 000 руб. Стоимость 1 лота BR - 35 502 руб. (это полная стоимость. Не ГО!). Таким образом чтобы нагрузить депо на 100% мне надо купить 28 лотов (1 000 000 / 35502). Т.е. я под 100% загрузкой подразумеваю именно чистую загрузку в расчете от реальной стоимости. Не по ГО. Учитывая же ГО максимально возможная загрузка составляет 134 лота.

Так вот, могу ли я в настройках тестера указать, чтобы он использовал 100% загрузку? Если да, то как? И как сделать, если я хочу, к примеру, разбить входы - делать набор позиции: первый вход на 33%, второй на 33% и третий на 33%.

 

double mgnSymb,LOT

if(OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1,SymbolInfoDouble(Symbol(),SYMBOL_BID),mgnSymb)LOT=AccountInfoDouble(ACCOUNT_BALANCE)/mgnSymb;


 
Renat Akhtyamov:

double mgnSymb,LOT

if(OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1,SymbolInfoDouble(Symbol(),SYMBOL_BID),mgnSymb)LOT=AccountInfoDouble(ACCOUNT_BALANCE)/mgnSymb;


а разве полученное таким образом "mgnSymb" не будет являться ГО контракта?

 
StarleyNSK:

а разве полученное таким образом "mgnSymb" не будет являться ГО контракта?

пожалуйста проверьте работу кода самостоятельно

 
Так вот я и проверяю. Получается, что он просто возвращает то, что в МТ5 называется маржой, а на бирже - ГО. Ну т.е. результат деления депозита на эту самую маржу. Но вопрос-то был в другом. Как получить кол-во без плеч. Есть ли вообще в МТ обычная "волшебная" кнопка в настройках тестера или советника - работать на такой-то процент от депо? В том же АмиБрокере такое было. Тут...   поле "плечи" возле поля "начальный" депозит ни на что не влияет. Да и цифры там непонятные. К бирже отношения не имеющие. Также отчего-то постоянно скидывается настройка "освобождать накопленную прибыль в конце дня". 
 
StarleyNSK:
Так вот я и проверяю. Получается, что он просто возвращает то, что в МТ5 называется маржой, а на бирже - ГО. Ну т.е. результат деления депозита на эту самую маржу. Но вопрос-то был в другом. Как получить кол-во без плеч. Есть ли вообще в МТ обычная "волшебная" кнопка в настройках тестера или советника - работать на такой-то процент от депо? В том же АмиБрокере такое было. Тут...   поле "плечи" возле поля "начальный" депозит ни на что не влияет. Да и цифры там непонятные. К бирже отношения не имеющие. Также отчего-то постоянно скидывается настройка "освобождать накопленную прибыль в конце дня". 

а это, разве не то?

//+------------------------------------------------------------------+
//|                                           TradeSizeOptimized.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define   MA_MAGIC   1234502
//---
input double MaximumRisk        = 0.02;    // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor
//---
string   txt;
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int i=orders-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
            continue;
         //--- check Expert Magic number
         if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC)
            continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0)
            break;
         if(profit<0.0)
            losses++;
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol)
      lot=minvol;

   double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   StringConcatenate(txt,"Средства=",DoubleToString(TradeSizeOptimized(),2));
   DrawLABEL(3,"cm 6",txt,5,25,clrLime,ANCHOR_RIGHT);
  }
//+------------------------------------------------------------------+
//|   DrawLABEL                                                      |
//+------------------------------------------------------------------+
void DrawLABEL(int c,string name,string text,int X,int Y,color clr,int ANCHOR=ANCHOR_LEFT,int FONTSIZE=8)
  {
   if(ObjectFind(0,name)==-1)
     {
      ObjectCreate(0,name,OBJ_LABEL,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_CORNER,c);
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,X);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,FONTSIZE);
      ObjectSetString(0,name,OBJPROP_FONT,"Arial");
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR);
     }
   ObjectSetString(0,name,OBJPROP_TEXT,text);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
  }
//+------------------------------------------------------------------+

--------------------------------------

вот - например у Вас 100 000 , рассчитывает с каким лотом откроется  = 1.32

TradeSizeOptimized 100000 TradeSizeOptimized

 
StarleyNSK:
Так вот я и проверяю. Получается, что он просто возвращает то, что в МТ5 называется маржой, а на бирже - ГО. Ну т.е. результат деления депозита на эту самую маржу. Но вопрос-то был в другом. Как получить кол-во без плеч. Есть ли вообще в МТ обычная "волшебная" кнопка в настройках тестера или советника - работать на такой-то процент от депо? В том же АмиБрокере такое было. Тут...   поле "плечи" возле поля "начальный" депозит ни на что не влияет. Да и цифры там непонятные. К бирже отношения не имеющие. Также отчего-то постоянно скидывается настройка "освобождать накопленную прибыль в конце дня". 

умножьте маржу за 1 лот на плечо и поделите на (100*баланс)

делов то

 
Deposit /(   SYMBOL_TRADE_CONTRACT_SIZE * текущ. цена)
Причина обращения: