Как узнать величину маржи до открытия позиции? - страница 3

 
SanAlex:

Спасибо! теперь понял - ну правда, я и догадывался что оно так. а так большое Спасибо! когда то пытался найти эту функции так и не нашёл. теперь и не помню, что то хотел с ней придумать.

а как посчитать объем, который открыть можно с учетом риска?

без этой функции вообще никак

это даже странно, т.к. основа основ ...

только нужно попросить у функции маржу на 1 лот

затем баланс умножить на риск и поделить на ответ функции, получим открываемый лот

А перед открытием сделки, умножить открываемый лот на маржу за лот и сравнить с доступной

 
Renat Akhtyamov:

а как посчитать объем, который открыть можно с учетом риска?

без этой функции вообще никак

это даже странно, т.к. основа основ ...

только нужно попросить у функции маржу на 1 лот

затем баланс умножить на риск и поделить на ответ функции, получим открываемый лот

А перед открытием сделки, умножить открываемый лот на маржу за лот и сравнить с доступной

Тю всем известная формула. и MQL выборку берет.

 

а вот пытаюсь всё прибавить 

//+------------------------------------------------------------------+
//|                                            AccountInfoDouble.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"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double fMargin = 0.0;
   double fMargin1 = 0.0;
   double fMargin2 = 0.0;
   double fMargin3 = 0.0;
   (int)OrderCalcMargin(ORDER_TYPE_BUY, "EURUSD", 0.01, SymbolInfoDouble("EURUSD", SYMBOL_BID), fMargin);
   (int)OrderCalcMargin(ORDER_TYPE_BUY, "GBPUSD", 0.01, SymbolInfoDouble("GBPUSD", SYMBOL_BID), fMargin1);
   (int)OrderCalcMargin(ORDER_TYPE_BUY, "USDCHF", 0.01, SymbolInfoDouble("USDCHF", SYMBOL_BID), fMargin2);
   (int)OrderCalcMargin(ORDER_TYPE_BUY, "USDJPY", 0.01, SymbolInfoDouble("USDJPY", SYMBOL_BID), fMargin3);
   printf("EURUSD fMargin =  %G",fMargin);
   printf("GBPUSD fMargin =  %G",fMargin1);
   printf("USDCHF fMargin =  %G",fMargin2);
   printf("USDJPY fMargin =  %G",fMargin3);
   printf("ALL fMargin =  %G",fMargin+fMargin1+fMargin2+fMargin3);
//---
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble("GBPUSD",SYMBOL_ASK,price))
      return;
   if(!OrderCalcMargin(ORDER_TYPE_BUY,"GBPUSD",0.01,price,margin))
      return;
   if(margin<=0.0)
      return;
   printf("price =  %G",price);
   printf("margin =  %G",margin);
//--- выведем всю информацию, доступную из функции AccountInfoDouble()
   /*
      printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));
      printf("ACCOUNT_CREDIT =  %G",AccountInfoDouble(ACCOUNT_CREDIT));
      printf("ACCOUNT_PROFIT =  %G",AccountInfoDouble(ACCOUNT_PROFIT));
      printf("ACCOUNT_EQUITY =  %G",AccountInfoDouble(ACCOUNT_EQUITY));
      printf("ACCOUNT_MARGIN =  %G",AccountInfoDouble(ACCOUNT_MARGIN));
      printf("ACCOUNT_MARGIN_FREE =  %G",AccountInfoDouble(ACCOUNT_MARGIN_FREE));
      printf("ACCOUNT_MARGIN_LEVEL =  %G",AccountInfoDouble(ACCOUNT_MARGIN_LEVEL));
      printf("ACCOUNT_MARGIN_SO_CALL = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL));
      printf("ACCOUNT_MARGIN_SO_SO = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_SO));
   */
  }
//+------------------------------------------------------------------+

Снимок OIK 2

 

Всёже иногда надо читать статьи в которых есть примеры…

Нехватка средств для проведения торговой операции

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- получим цену открытия
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- значения необходимой и свободной маржи
   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

хотя я тоже, полностью это не читал…))))

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
 
SanAlex:

а вот пытаюсь всё прибавить

не понятно, зачем?
 
Renat Akhtyamov:
не понятно, зачем?

пока и сам не знаю.

вот пока ковырялся - нашёл способ как  пары менять. Когда то искал так и не нашёл - а сейчас сам до-тюкался как реализовать.

//+------------------------------------------------------------------+
//|                                            AccountInfoDouble.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"
#property script_show_inputs
//+------------------------------------------------------------------+
//| ENUM_FOREX_MAJOR                                                 |
//+------------------------------------------------------------------+
enum ENUM_FOREX_MAJOR
  {
   EURUSD=0, // EURUSD
   GBPUSD=1, // GBPUSD
   USDCHF=2, // USDCHF
   USDJPY=3, // USDJPY
  };
//+------------------------------------------------------------------+
input ENUM_FOREX_MAJOR major = EURUSD; // forex.major.set
//---
string symb_name[]= {"EURUSD","GBPUSD","USDCHF","USDJPY"};
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double priceL=0.0;
   double marginL=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symb_name[major],SYMBOL_ASK,priceL))
      return;
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symb_name[major],0.01,priceL,marginL))
      return;
   if(marginL<=0.0)
      return;
   printf("price =  %G",priceL);
   printf("margin =  %G",marginL);
  }
//+------------------------------------------------------------------+