Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1124

 
macleta:
Gracias,¿la ndd es qué?

No siguió, no reemplazó todo. Es una macro.

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

No llevaba la cuenta, no reemplazaba todo. Es una macro.

Gracias.
 
¿Me pueden decir cómo saber la última posición abierta por su número mágico, tal vez haya una función que devuelva el valor del lote de la última posición abierta? Lo necesito en mql5
 
astrologer Аполонов:
Por favor, indíquenos cómo averiguar la última posición abierta por número mágico, ¿quizás haya una función que devuelva el valor del lote de la última posición abierta? Lo necesito en mql5

Hay varias formas, así que aclárelo: ¿la cuenta de operaciones es de tipo hedge o netting, en cuyo caso necesita conocer la posición: el asesor abre una posición y necesita conocer los parámetros de su última posición abierta?

 
astrologer Аполонов:
¿Me pueden decir cómo saber la última posición abierta por número mágico, tal vez haya una función que devuelva el valor del lote de la última posición abierta? Lo necesito en mql5

Ejemplo 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));
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

En OnTradeTransaction capturamos una transacción con el tipo

TRADE_TRANSACTION_DEAL_ADD

Añade la transacción al historial. Esto se hace como resultado de la ejecución de una orden o de las operaciones de saldo de la cuenta.

   if(type==TRADE_TRANSACTION_DEAL_ADD)


que sea nuestro símbolo y nuestra magia:

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


Busque una oferta de COMPRA o VENTA:

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


asegúrese de que este comercio es

DEAL_ENTRY_IN.

Entrada en el mercado

            if(deal_entry==DEAL_ENTRY_IN)
Archivos adjuntos:
Test.mq5  10 kb
 
astrologer Аполонов:
Por favor, indíquenos cómo averiguar la última posición abierta por número mágico, ¿quizás haya una función que devuelva el valor del lote de la última posición abierta? Lo necesito en mql5

Opción #2 - evitar la lista de artículos:

//+------------------------------------------------------------------+
//|                                             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)
  {

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


Revisa la lista de puestos

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


busca el tiempo de apertura de la posición más larga en milisegundos

TimeMsc

Obtieneel tiempo de apertura de una posición en milisegundos desde el 01.01.1970

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


comprobar - si el volumen es superior a "0,0" - se ha encontrado la posición:

   if(last_volume>0.0)
      Print("Last POSITIONS volume: ",DoubleToString(last_volume,2));
Archivos adjuntos:
Test.mq5  6 kb
 
Alexey Viktorov:

Para el tamaño de la pérdida, esta es la función

Basta con sustituir SL por TP

Aparentemente hay un doble riesgo como porcentaje de los fondos disponibles. ¿Cómo puedo establecer una cantidad específica de beneficios en dinero, por ejemplo, 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:

Ejemplo 1:

En OnTradeTransaction capturamos una transacción con el tipo

TRADE_TRANSACTION_DEAL_ADD

Añade la transacción al historial. Esto se hace como resultado de la ejecución de una orden o de las operaciones de saldo de la cuenta.


que sea nuestro símbolo y nuestra magia:


mira si es una operación de COMPRA o de VENTA:


asegúrese de que este comercio es

DEAL_ENTRY_IN.

entrar en el mercado

 
macleta:
Aparentemente, se trata de un doble riesgo como porcentaje de los fondos disponibles. ¿Cómo puedo establecer una cantidad específica de beneficios en dinero, por ejemplo, 1,5?

Bueno, esta es la línea

    RiskMony = floor(FreeMargin*risk/100);
Sólo hay que poner un número en lugar de una fórmula y ...
 

¿Cómo convertir, la posición del ratón, durante, pero sin tirar?

ChartTimeOnDropped
Razón de la queja: