Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1124

 
macleta:
Obrigado,ndd é o quê?

Não seguiu, não substituiu tudo. É uma macro.

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

Não se manteve a par, não substituiu tudo. É uma macro.

Obrigado. (risos)
 
Pode dizer-me como saber a última posição aberta pelo seu número mágico, talvez exista uma função que devolva o valor do lote da última posição aberta? Preciso dele em mql5
 
astrologer Аполонов:
Por favor aconselhe como descobrir a última posição aberta por número mágico, talvez exista uma função que devolva o valor do lote da última posição aberta? Preciso dele em mql5

Há várias maneiras, por isso, esclareça: o tipo de conta de negociação é hedge ou netting, caso em que precisa de saber sobre a posição: o consultor abre uma posição e precisa de conhecer os parâmetros da sua última posição aberta?

 
astrologer Аполонов:
Pode dizer-me como saber a última posição aberta por número mágico, talvez exista uma função que devolva o valor do lote da última posição aberta? Preciso dele em mql5

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

Na OnTradeTransaction, apanhamos uma transacção com o tipo

TRADE_TRANSACTION_DEALDEAL_ADD

Acrescentar a transacção à história. Isto é feito como resultado da execução de ordens ou de transacções de saldos de contas.

   if(type==TRADE_TRANSACTION_DEAL_ADD)


certifique-se de que é o nosso símbolo e a nossa magia:

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


Procure um negócio de COMPRA ou VENDA:

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


certifique-se de que este comércio é

DEAL_ENTRY_IN.

Entrada no mercado

            if(deal_entry==DEAL_ENTRY_IN)
Arquivos anexados:
Test.mq5  10 kb
 
astrologer Аполонов:
Por favor aconselhe como descobrir a última posição aberta por número mágico, talvez exista uma função que devolva o valor do lote da última posição aberta? Preciso dele em mql5

Opção #2 - contornar a lista de itens:

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

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


Percorrer a lista de posições

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


procurar a posição mais longa de tempo aberto em milissegundos

TimeMsc

Obtém o tempo deabrir uma posição em milissegundos desde 01.01.1970

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


verificar - se o volume for superior a "0,0" - a posição foi encontrada:

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

Para o tamanho da perda, aqui está a função

Basta substituir SL por TP

Aparentemente, existe um risco duplo como percentagem dos fundos disponíveis. Como posso fixar um montante específico de lucro em dinheiro, por exemplo 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:

Exemplo #1:

Na OnTradeTransaction, apanhamos uma transacção com o tipo

TRADE_TRANSACTION_DEALDEAL_ADD

Acrescentar a transacção à história. Isto é feito como resultado da execução de ordens ou de transacções de saldos de contas.


certifique-se de que é o nosso símbolo e a nossa magia:


ver se se trata de uma transacção de COMPRA ou VENDA:


certifique-se de que este comércio é

DEAL_ENTRY_IN.

a entrar no mercado

 
macleta:
Aparentemente, isto é o dobro do risco em percentagem dos fundos disponíveis. Como posso fixar um montante específico de lucro em dinheiro, por exemplo 1,5?

Bem, aqui está a linha

    RiskMony = floor(FreeMargin*risk/100);
Basta colocar um número em vez de uma fórmula e ...
 

Como converter, posição do rato, durante, mas sem atirar?

ChartTimeOnDropped