Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2462

 
Кто-нибудь понимает эту статью? https://www.mql5.com/ru/docs/trading/historyselectbyposition

Объясните, пожалуйста, как мне найти в истории сегодняшнего дня закрытые позиции? 

И посмотреть их время

Тёмный лес какой-то с этими айди
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Запрашивает историю сделок и ордеров, имеющих указанный идентификатор позиции. Параметры position_id [in]  Идентификатор позиции, который...
 
Ivan Butko #:
Объясните, пожалуйста, как мне найти в истории сегодняшнего дня закрытые позиции? 

Указанный Вами пример для другого - найти все сделки по уже известному идентификатору позиции.

А у Вас, понимаю, нужно найти идентификатор позиции и время её закрытия.

Лучше здесь смотрите пример: https://www.mql5.com/ru/docs/trading/historydealgetinteger

По найденным сделкам ищите сделки ENTRY_OUT и их идентификатор позиции.

В сделке ENTRY_OUT есть её время - это время закрытия позиции, идентификатор которой указан в DEAL_POSITION_ID

Документация по MQL5: Торговые функции / HistoryDealGetInteger
Документация по MQL5: Торговые функции / HistoryDealGetInteger
  • www.mql5.com
Возвращает запрошенное свойство сделки. Свойство сделки должно быть типа datetime, int. Существует 2 варианта функции. 1. Непосредственно...
 
Artyom Trishkin #:

Указанный Вами пример для другого - найти все сделки по уже известному идентификатору позиции.

А у Вас, понимаю, нужно найти идентификатор позиции и время её закрытия.

Лучше здесь смотрите пример: https://www.mql5.com/ru/docs/trading/historydealgetinteger

По найденным сделкам ищите сделки ENTRY_OUT и их идентификатор позиции.

В сделке ENTRY_OUT есть её время - это время закрытия позиции, идентификатор которой указан в DEAL_POSITION_ID

Благодарю Вас

 

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


Первое значение получается функцией SymbolInfoMarginRate(), а вот второе и третье не пойму как получить.

Символ USDJPY метаквотовский демосервер.


Вообще запутался. Вроде форекс, ничего сложного, но как рассчитать маржу не используя OrderCalcMargin()? 

У меня не хватает исходных данных и где их брать я не знаю, чтоб рассчитать вот это. Маржа по символу  USDJPY , в зависимости от размера лота, рассчитана функцией OrderCalcMargin(). 

1;  USDJPY; margin = 1000.00;  margin/1  = 1000.00
2;  USDJPY; margin = 2000.00;  margin/2  = 1000.00
3;  USDJPY; margin = 3000.00;  margin/3  = 1000.00
4;  USDJPY; margin = 5000.00;  margin/4  = 1250.00
5;  USDJPY; margin = 7000.00;  margin/5  = 1400.00
6;  USDJPY; margin = 10000.00; margin/6  = 1666.67
7;  USDJPY; margin = 13000.00; margin/7  = 1857.14
8;  USDJPY; margin = 16000.00; margin/8  = 2000.00
9;  USDJPY; margin = 19000.00; margin/9  = 2111.11
10; USDJPY; margin = 22000.00; margin/10 = 2200.00
11; USDJPY; margin = 25000.00; margin/11 = 2272.73
12; USDJPY; margin = 28000.00; margin/12 = 2333.33
13; USDJPY; margin = 31000.00; margin/13 = 2384.62
14; USDJPY; margin = 34000.00; margin/14 = 2428.57
15; USDJPY; margin = 37000.00; margin/15 = 2466.67
16; USDJPY; margin = 40000.00; margin/16 = 2500.00
17; USDJPY; margin = 43000.00; margin/17 = 2529.41
18; USDJPY; margin = 46000.00; margin/18 = 2555.56
19; USDJPY; margin = 49000.00; margin/19 = 2578.95
20; USDJPY; margin = 52000.00; margin/20 = 2600.00

Как рассчитать эту маржу не используя функцию OrderCalcMargin()?

 
Aleksandr Slavskii #:

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


Первое значение получается функцией SymbolInfoMarginRate(), а вот второе и третье не пойму как получить.

Символ USDJPY метаквотовский демосервер.


Вообще запутался. Вроде форекс, ничего сложного, но как рассчитать маржу не используя OrderCalcMargin()? 

У меня не хватает исходных данных и где их брать я не знаю, чтоб рассчитать вот это. Маржа по символу  USDJPY , в зависимости от размера лота, рассчитана функцией OrderCalcMargin(). 

Как рассчитать эту маржу не используя функцию OrderCalcMargin()?

Может вот это поможет?

SYMBOL_MARGIN_INITIAL

Начальная (инициирующая) маржа обозначает размер необходимых залоговых средств в маржинальной валюте для открытия позиции объемом в один лот. Используется при проверке средств клиента при входе в рынок.

 

Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().

double

SYMBOL_MARGIN_MAINTENANCE

Поддерживающая маржа по инструменту. В случае если задана – указывает размер маржи в маржинальной валюте инструмента, удерживаемой с одного лота. Используется при проверке средств клиента при изменении состояния счета клиента. Если поддерживающая маржа равна 0, то используется начальная маржа.

 

Для получения информации о размере взимаемой маржи в зависимости от типа и направления ордера используется функция SymbolInfoMarginRate().

double

Документация по MQL5: Получение рыночной информации / SymbolInfoMarginRate
Документация по MQL5: Получение рыночной информации / SymbolInfoMarginRate
  • www.mql5.com
Возвращает коэффициенты взимания маржи в зависимости от типа и направления ордера. Параметры name [in]  Имя символа. order_type [in]  Тип...
 
Alexey Viktorov #:

Может вот это поможет?

Увы, не поможет.

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

void Margin()
  {
   double MarginInit = 0, MarginMain = 0, Lots = 1;
   if(!SymbolInfoMarginRate(_Symbol, ORDER_TYPE_BUY, MarginInit, MarginMain))
      return ;

   double InitialMargin  =  SymbolInfoDouble(_Symbol, SYMBOL_MARGIN_INITIAL);
   double MaintenanceMargin  =  SymbolInfoDouble(_Symbol, SYMBOL_MARGIN_MAINTENANCE);
   double margin = 0;

// Lots * Contract_Size / Leverage * Margin_Rate
   if((ENUM_SYMBOL_CALC_MODE)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_CALC_MODE) == SYMBOL_CALC_MODE_FOREX)
      margin = Lots * SymbolInfoDouble(_Symbol, SYMBOL_TRADE_CONTRACT_SIZE) / AccountInfoInteger(ACCOUNT_LEVERAGE) * MarginInit;

   Print(_Symbol, "; margin =", margin);
  }

На всех форекс символах, выдаёт ноль.

А что не так в этом методе?

Справка говорит, что считать маржу надо по этой формуле  Lots * Contract_Size / Leverage * Margin_Rate

Где у меня ошибка?


ЗЫ. Собственно зачем заморачиваться с поиском маржи, если есть  OrderCalcMargin?  Да просто, эта функция в тестере работает через раз, может в начале тестирования возвращать ноль, а потом начать нормально работать, а может и наоборот глюкнуть.

Может она и в терминале так же работает.Не проверял. Вот это будет реально подстава от разработчиков)

 
Aleksandr Slavskii #:

Увы, не поможет.

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

На всех форекс символах, выдаёт ноль.

А что не так в этом методе?

Справка говорит, что считать маржу надо по этой формуле  Lots * Contract_Size / Leverage * Margin_Rate

Где у меня ошибка?


ЗЫ. Собственно зачем заморачиваться с поиском маржи, если есть  OrderCalcMargin?  Да просто, эта функция в тестере работает через раз, может в начале тестирования возвращать ноль, а потом начать нормально работать, а может и наоборот глюкнуть.

Может она и в терминале так же работает.Не проверял. Вот это будет реально подстава от разработчиков)

//+------------------------------------------------------------------+
//|                                                   До_Аута(4).mq4 |
//|                        Copyright 2023, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
input double lot_inp=0.01; //объем
MqlTick tik;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   string name_id=" ",base=" ",quote=" ",currency= " ",sym=" ";
   int    leverage=0;
   double bid=0.0,
          ask=0.0,
          size_contract=0.0,
          res=0.0;
   name_id=ChartSymbol(0); //Возвращает имя символа текущего графика.
   base=SymbolInfoString(name_id,SYMBOL_CURRENCY_BASE);    //Базовая ваюта инструмента
   quote=SymbolInfoString(name_id,SYMBOL_CURRENCY_PROFIT); //Валюта прибыли
   currency= AccountCurrency();  // валюта депозита
   leverage=AccountLeverage();   // плечо текущего счета
   size_contract=SymbolInfoDouble(name_id,SYMBOL_TRADE_CONTRACT_SIZE);//Размер торгового контракта
//---Определим размер маржи для обратной котировки---------
    if(base!=currency&&quote==currency)  //Если валюта прибыли,-валюта депозита
    {
    sym=base+currency;
    Print(sym);
    if(SymbolInfoTick(sym,tik))
    bid=tik.bid;
    res=(size_contract*lot_inp)/leverage*bid;
    }
//---Подсчитаем маржу для прямой котировки-----------------
    if(base==currency&&quote!=currency)//Если валюта депозита,- базовая для инструмента
    {
    res=(size_contract*lot_inp)/leverage;
    }
//---Рассчитаем маржу для «кросс-курса»---------------------
    if(base!=currency&&quote!=currency)//Если в символе инструмента нет базовой валюты депозита
    {
    if(SymbolInfoTick(base+currency,tik))
    bid=tik.bid;
    res=(size_contract*lot_inp)/leverage*bid;
    } 
//---Рассчитаем маржу для «XAUUSD»
    if(name_id=="XAUUSD")
    {
    if(SymbolInfoTick(name_id,tik))
    bid=tik.bid;
    res=(lot_inp*bid/leverage*100);
    }
    Print("res = ",res);                    
  }
//+------------------------------------------------------------------+
 
Galim_V #:

Один и десять лотов.

Верхние строчки этот скрипт. Нижние правильные.

EURUSD
res = 1088.67
EURUSD
res = 10886.7

1; EURUSD; margin = 1088.71
10; EURUSD; margin = 24661.30

Спасибо, в этом скрипте более понятно написаны методы для обратных пар и кросов, чем в книге.

Но проблему он не решил.

 
Aleksandr Slavskii #:

Увы, не поможет.

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

На всех форекс символах, выдаёт ноль.

А что не так в этом методе?

Справка говорит, что считать маржу надо по этой формуле  Lots * Contract_Size / Leverage * Margin_Rate

Где у меня ошибка?


ЗЫ. Собственно зачем заморачиваться с поиском маржи, если есть  OrderCalcMargin?  Да просто, эта функция в тестере работает через раз, может в начале тестирования возвращать ноль, а потом начать нормально работать, а может и наоборот глюкнуть.

Может она и в терминале так же работает.Не проверял. Вот это будет реально подстава от разработчиков)

На счёте MQ-Demo всё вроде как работает. Сделайте упрощённый код для проверки, покажите всем… Может подскажут в чём ошибка.


Я пользуюсь функцией OrderCheck() и не смотрите, что там написано 

Функция OrderCheck() проверяет достаточность средств для совершения требуемой торговой операции. Результаты проверки помещаются в поля структуры MqlTradeCheckResult

Достаточно посмотреть структуру 

struct MqlTradeCheckResult 
  { 
   uint         retcode;             // Код ответа 
   double       balance;             // Баланс после совершения сделки 
   double       equity;              // Эквити после совершения сделки 
   double       profit;              // Плавающая прибыль 
   double       margin;              // Маржевые требования 
   double       margin_free;         // Свободная маржа 
   double       margin_level;        // Уровень маржи 
   string       comment;             // Комментарий к коду ответа (описание ошибки) 
  };

и увидим, что и баланс, и эквити после сделки покажет, и маржу, и прочее… И пользоваться этой функцией вовсе не напряжно. Структура запроса MqlTradeRequest заполняется по-любому. Так вот её делаем на глобальном уровне, заполняем, проверяем и прямо с этой структурой отправляем OrderSend(). Правда есть беда в том, что в СБ она работает как-то не так. Я не понял причину, просто для открытия позиции не стал пользоваться СБ.

 

Alexey Viktorov #:

Я пользуюсь функцией OrderCheck() и не смотрите, что там написано 

Достаточно посмотреть структуру 

и увидим, что и баланс, и эквити после сделки покажет, и маржу, и прочее… И пользоваться этой функцией вовсе не напряжно. Структура запроса MqlTradeRequest заполняется по-любому. Так вот её делаем на глобальном уровне, заполняем, проверяем и прямо с этой структурой отправляем OrderSend(). Правда есть беда в том, что в СБ она работает как-то не так. Я не понял причину, просто для открытия позиции не стал пользоваться СБ.

Когда-то давно столкнулся с тем, что OrderCheck() иногда, в каких-то редких условиях, возвращает false, хотя реально средств достаточно и ордер успешно отправляется (неттинг, ФОРТС, Открытие).

Поскольку ситуация трудновоспроизводимая, не стал исследовать, что именно в таком случае возвращается в структуре, а просто отказался от использования этой функции.