Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1124

 
macleta:
Спасибо, ndd это что?

Не уследил, не все заменил. Это макрос такой

#define ndd(A) NormalizeDouble(A, _Digits)
 
Alexey Viktorov:

Не уследил, не все заменил. Это макрос такой

Спасибо.
 
Подскажите пожалуйста как узнать последнюю открытую позицию по магическому номеру, может есть функция возвращающая значение лота по последней открытой позиции? Нужно именно на mql5
 
astrologer Аполонов:
Подскажите пожалуйста как узнать последнюю открытую позицию по магическому номеру, может есть функция возвращающая значение лота по последней открытой позиции? Нужно именно на mql5

Есть несколько способов, поэтому уточните: тип торгового счёта - хедж или неттинг, в каком случае нужно узнать о позиции: советник открывает позиции и ему нужно узнать параметры своей последней открытой позиции?

 
astrologer Аполонов:
Подскажите пожалуйста как узнать последнюю открытую позицию по магическому номеру, может есть функция возвращающая значение лота по последней открытой позиции? Нужно именно на mql5

Пример #1:

//+------------------------------------------------------------------+
//|                                             Trading engine 3.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
/*
   barabashkakvn Trading engine 3.042
*/
#include <Trade\SymbolInfo.mqh>
//---
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
//--- input parameters
input ulong    InpMagic             = 200;         // Magic number
//---
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_ticket       =0;
      long     deal_order        =0;
      long     deal_time         =0;
      long     deal_time_msc     =0;
      long     deal_type         =-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      long     deal_reason       =-1;
      long     deal_position_id  =0;
      double   deal_volume       =0.0;
      double   deal_price        =0.0;
      double   deal_commission   =0.0;
      double   deal_swap         =0.0;
      double   deal_profit       =0.0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      string   deal_external_id  ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);
         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);
         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);

         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
        }
      else
         return;
      ENUM_DEAL_ENTRY enum_deal_entry=(ENUM_DEAL_ENTRY)deal_entry;
      if(deal_symbol==m_symbol.Name() && deal_magic==InpMagic)
        {
         if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)
           {
            if(deal_entry==DEAL_ENTRY_IN)
              {
               Print("Last DEAL IN volume: ",DoubleToString(deal_volume,2));
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

В OnTradeTransaction ловим транзакцию с типом

TRADE_TRANSACTION_DEAL_ADD

Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета.

   if(type==TRADE_TRANSACTION_DEAL_ADD)


смотрим, чтобы это был наш символ и наш magic:

      if(deal_symbol==m_symbol.Name() && deal_magic==InpMagic)


смотрим, чтобы это была СДЕЛКА BUY или SELL:

         if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)


смотрим, чтобы эта СДЕЛКА была

DEAL_ENTRY_IN

Вход в рынок

            if(deal_entry==DEAL_ENTRY_IN)
Файлы:
Test.mq5  10 kb
 
astrologer Аполонов:
Подскажите пожалуйста как узнать последнюю открытую позицию по магическому номеру, может есть функция возвращающая значение лота по последней открытой позиции? Нужно именно на mql5

Вариант #2 - перебор списка позиций:

//+------------------------------------------------------------------+
//|                                             Trading engine 3.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
/*
   barabashkakvn Trading engine 3.042
*/
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
//--- input parameters
input ulong    InpMagic             = 200;         // Magic number
//---
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   ulong    last_time   = 0;
   double   last_volume = 0.0;

   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
           {
            if(m_position.TimeMsc()>last_time)
              {
               last_time=m_position.TimeMsc();
               last_volume=m_position.Volume();
              }
           }
   if(last_volume>0.0)
      Print("Last POSITIONS volume: ",DoubleToString(last_volume,2));
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {

//---
  }
//+------------------------------------------------------------------+


Обходим список позиций 

   for(int i=PositionsTotal()-1; i>=0; i--)


ищем наибольшее время открытия позиции в миллисекундах

TimeMsc

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

            if(m_position.TimeMsc()>last_time)
              {
               last_time=m_position.TimeMsc();
               last_volume=m_position.Volume();
              }


проверяем - если объём больше "0.0" - значит позиция была найдена:

   if(last_volume>0.0)
      Print("Last POSITIONS volume: ",DoubleToString(last_volume,2));
Файлы:
Test.mq5  6 kb
 
Alexey Viktorov:

Для размера убытков вот такая функция

В ней достаточно заменить SL на TP

Судя по всему, здесь double risk в процентах от свободных средств. Как задать конкретную сумму  профита в деньгах, например 1.5? 
double RiskLots(double risk, int TP)
{
  double RiskMony, Lot;
  double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
  double margin = SymbolInfoDouble(_Symbol, SYMBOL_MARGIN_INITIAL);
  double FreeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
    long accountLeverage = AccountInfoInteger(ACCOUNT_LEVERAGE);
    RiskMony = floor(FreeMargin*risk/100);
     Lot = NormalizeDouble(RiskMony*_Point/NormalizeDouble(TP*_Point*tickValue, _Digits), 2);
     //
  return(Lot);
}
 
Благодарю Vladimir Karputov:

Пример #1:

В OnTradeTransaction ловим транзакцию с типом

TRADE_TRANSACTION_DEAL_ADD

Добавление сделки в историю. Осуществляется в результате исполнения ордера или проведения операций с балансом счета.


смотрим, чтобы это был наш символ и наш magic:


смотрим, чтобы это была СДЕЛКА BUY или SELL:


смотрим, чтобы эта СДЕЛКА была

DEAL_ENTRY_IN

Вход в рынок

 
macleta:
Судя по всему, здесь double risk в процентах от свободных средств. Как задать конкретную сумму  профита в деньгах, например 1.5? 

Ну так вот-же строка

    RiskMony = floor(FreeMargin*risk/100);
Просто вместо формулы ставьте число и ...
 

Как преобразовать, положение мыши, во время, но без бросания?

ChartTimeOnDropped