Проверка на достаточность средств - страница 2

 

Всем привет!

Вот такая задача возникла... для MQL4

Имеем открытые ордера на инструменте, и по алгоритму ставим отложенный ордер на +N пунктов от текущей цены, и надо проверить хватит ли средств на счете для открытия отложенного ордера.

AccountFreeMarginCheck проверяет только по текущей цене, а надо чтобы проверил по цене +N пунктов.

Для подсчета размера средств на цена +N по открытым ордерам использовал функцию немного доработанную:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru               |
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Calculation:                                                                                   |
//|    mn - MagicNumber                ( -1  - любой магик)                      |
//+----------------------------------------------------------------------------+
double ProfitIFTakeInCurrency(int mn)
  {
   int    i, k=OrdersTotal(); // Подсчёт открытых позиций
   double m;                  // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
   double l;                  // Размер контракта в базовой валюте инструмента
   double p;                  // Размер пункта в валюте котировки
   double t;                  // Минимальный шаг изменения цены инструмента в валюте котировки
   double v;                  // Размер минимального изменения цены инструмента в валюте депозита
   double s=0;                // Подсчёт стопа в валюте депозита

   l=MarketInfo(Symbol(), MODE_LOTSIZE);
   m=MarketInfo(Symbol(), MODE_PROFITCALCMODE);
   p=MarketInfo(Symbol(), MODE_POINT);
   t=MarketInfo(Symbol(), MODE_TICKSIZE);
   v=MarketInfo(Symbol(), MODE_TICKVALUE);

   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && (mn<0 || OrderMagicNumber()==mn))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderType()==OP_BUY)
                 {
                  if(m==0) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
                  if(m==1) s+=(dt-OrderOpenPrice())/p*v/t/l*OrderLots();
                  if(m==2) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
                  s+=OrderCommission()+OrderSwap();
                 }
               if(OrderType()==OP_SELL)
                 {
                  if(m==0) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
                  if(m==1) s+=(OrderOpenPrice()-dt)/p*v/t/l*OrderLots();
                  if(m==2) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
                  s+=OrderCommission()+OrderSwap();
                 }
              }
           }
        }
     }
   return(s);
  }


где dt = значение : цена+N пунктов

Возвращает (s)  Профит/Убыток по текущим открытым ордерам на цена+N

Далее можно узнать какие будут свободные средства на цене+N

       double AcFrM=NormalizeDouble(AccountFreeMargin()+s,2);
 

И вот тут уже надо бы проверить достаточность средств для открытия отложки на этой цене. Как это можно сделать?

Пробовал так:

  
   needmargin=NormalizeDouble(l/pl*dt*LL,2);

   if(AcFrM<needmargin) {

// Делаем что-нибудь... средств на открытие отложки не хватит

    }

Но что-то не очень работает... тем более при обратных парах USDJPY например, и для кроссов вообще не подходит.


И будет ли работать предложенный ранее код:

if(Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AcFrM)
 {
   // тут условие

 }

где AcFrM - рассчитанные свободные средства на цена+N пунктов ?





AccountFreeMarginCheck - Документация на MQL4
  • docs.mql4.com
AccountFreeMarginCheck - Документация на MQL4
 
Mikhail Maloyarov:

Всем привет!

Вот такая задача возникла... для MQL4

Имеем открытые ордера на инструменте, и по алгоритму ставим отложенный ордер на +N пунктов от текущей цены, и надо проверить хватит ли средств на счете для открытия отложенного ордера.

AccountFreeMarginCheck проверяет только по текущей цене, а надо чтобы проверил по цене +N пунктов.

Для подсчета размера средств на цена +N по открытым ордерам использовал функцию немного доработанную:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru               |
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Calculation:                                                                                   |
//|    mn - MagicNumber                ( -1  - любой магик)                      |
//+----------------------------------------------------------------------------+
double ProfitIFTakeInCurrency(int mn)
  {
   int    i, k=OrdersTotal(); // Подсчёт открытых позиций
   double m;                  // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
   double l;                  // Размер контракта в базовой валюте инструмента
   double p;                  // Размер пункта в валюте котировки
   double t;                  // Минимальный шаг изменения цены инструмента в валюте котировки
   double v;                  // Размер минимального изменения цены инструмента в валюте депозита
   double s=0;                // Подсчёт стопа в валюте депозита

   l=MarketInfo(Symbol(), MODE_LOTSIZE);
   m=MarketInfo(Symbol(), MODE_PROFITCALCMODE);
   p=MarketInfo(Symbol(), MODE_POINT);
   t=MarketInfo(Symbol(), MODE_TICKSIZE);
   v=MarketInfo(Symbol(), MODE_TICKVALUE);

   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && (mn<0 || OrderMagicNumber()==mn))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderType()==OP_BUY)
                 {
                  if(m==0) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
                  if(m==1) s+=(dt-OrderOpenPrice())/p*v/t/l*OrderLots();
                  if(m==2) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
                  s+=OrderCommission()+OrderSwap();
                 }
               if(OrderType()==OP_SELL)
                 {
                  if(m==0) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
                  if(m==1) s+=(OrderOpenPrice()-dt)/p*v/t/l*OrderLots();
                  if(m==2) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
                  s+=OrderCommission()+OrderSwap();
                 }
              }
           }
        }
     }
   return(s);
  }


где dt = значение : цена+N пунктов

Возвращает (s)  Профит/Убыток по текущим открытым ордерам на цена+N

Далее можно узнать какие будут свободные средства на цене+N

       double AcFrM=NormalizeDouble(AccountFreeMargin()+s,2);
 

И вот тут уже надо бы проверить достаточность средств для открытия отложки на этой цене. Как это можно сделать?

Пробовал так:

  
   needmargin=NormalizeDouble(l/pl*dt*LL,2);

   if(AcFrM<needmargin) {

// Делаем что-нибудь... средств на открытие отложки не хватит

    }

Но что-то не очень работает... тем более при обратных парах USDJPY например, и для кроссов вообще не подходит.


И будет ли работать предложенный ранее код:

if(Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AcFrM)
 {
   // тут условие

 }

где AcFrM - рассчитанные свободные средства на цена+N пунктов ?


:) сам вопрос задал и сам же ответил. Вроде работает :)





 

MarketInfo тоже даст размер маржи только на основании текущей цены. Поэтому на ее основе можно считать достаточность средств для открытия любой сделки только для тех валютных пар, у которых базовая валюта совпадает с валютой депозита.

Сам же алгоритм расчета достаточно прост (формулы см. здесь - https://www.mql5.com/ru/docs/constants/environment_state/marketinfoconstants#enum_symbol_calc_mode), но при первом ознакомлении достаточно легко запутаться.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: