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

 
yaaarik777:

Bom dia a todos! Pode, por favor, aconselhar como definir a eliminação de uma encomenda numa EA?

A situação é a seguinte:

Colocamos 2 ordens pendentes em direcções diferentes, assim que uma delas dispara, a outra é retirada e já não é exibida.

Ficaria muito grato por qualquer ajuda.

Obrigado.

Há várias maneiras de o fazer. Uma delas está a utilizar aOnTradeTransaction.

Ao apanhar a transacção

TRADE_TRANSACTION_DEALDEAL_ADD

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

e certificar-se de que esta transacção é uma entrada no mercado:

DEAL_ENTRY_IN

Entrada no mercado


//+------------------------------------------------------------------+
//| 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_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }

Esta transacção terá lugar assim que a ordem pendente for accionada e a transacção tiver sido introduzida na história.

Depois de termos apanhado esta transacção, só precisamos de eliminar todas as nossas restantes ordens pendentes:

//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }

Código EA comum (apenas aqui especifiquei magia igual a "0" - deve definir a sua própria magia):

//+------------------------------------------------------------------+
//|                                       There will be only one.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade         m_trade;                      // trading object
COrderInfo     m_order;                      // pending orders object
//---
ulong          m_magic=0;                // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   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_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }
//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 

Outra questão sobre o evento OnDeinit:

este código irá funcionar:

nulo OnDeinit(const int razão)

{

if(reason===REASON_REMOVE)

{

código para fechar a posição(se houver)

}

}

Geralmente, precisamos de saber se é possível fechar a posição no tratamento de eventos OnDeinit

 

Boa tarde peritos, por favor partilhem as vossas experiências.

Existe um conjunto de valores, que reflecte algum objecto/campo, ou seja, se existe uma tarefa para designar este objecto/campo de alguma forma, quais são as acções possíveis.

Por exemplo, seria apropriado colocar esta matriz na rede de mapas de Kohonen, se o volume da matriz puder atingir milhares de células de x e y?

Talvez possa sugerir como enfiar uma das matrizes bidimensionais (com grande dimensionalidade) numa rede Kohonen.

E se Kohon é adequado para análise - recorrência de matrizes (matrizes numa matriz).

Ou talvez alguém possa ajudar a fazer as perguntas certas


1 1 1 1 1 2 4 6 8
1 1 1 1 2 3 5 7 9
1 1 1 1 3 4 6 8 10
1 1 1 2 4 5 7 9 11
1 1 1 3 5 6 8 10 12
1 1 1 4 6 7 9 11 13
1 1 1 5 7 8 10 12 14
1 1 2 6 8 9 11 13 15
1 1 3 7 9 10 12 14 16
1 1 4 8 10 11 13 15 17
1 2 5 9 11 12 14 16 18
1 3 6 10 12 13 15 17 19
1 4 7 11 13 14 16 18 20
1 5 8 12 14 15 17 19 21
1 6 9 13 15 16 18 20 22
2 7 10 14 16 17 19 21 1
3 8 11 15 17 18 20 22 1
4 9 12 16 18 19 21 1 1
5 10 13 17 19 20 22 1 1
6 11 14 18 20 21 1 1 1
7 12 15 19 21 22 1 1 1
8 13 16 20 22 1 1 1 1
9 14 17 21 1 1 1 1 1
10 15 18 22 1 1 1 1 1
 
Vladimir Karputov:

Há várias maneiras de o fazer. Uma delas é utilizar aOnTradeTransaction.

Em nós apanhamos a transacção

TRADE_TRANSACTION_DEALDEAL_ADD

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

e certificar-se de que esta transacção é uma entrada no mercado:

DEAL_ENTRY_IN

Entrada no mercado


//+------------------------------------------------------------------+
//| 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_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }

Esta transacção terá lugar assim que a ordem pendente for accionada e a transacção tiver sido introduzida na história.

Depois de termos apanhado esta transacção, só precisamos de eliminar todas as ordens pendentes:

//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }

Código genérico EA (apenas aqui especifiquei magia igual a "0" - deve definir a sua própria magia):

//+------------------------------------------------------------------+
//|                                       There will be only one.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade         m_trade;                      // trading object
COrderInfo     m_order;                      // pending orders object
//---
ulong          m_magic=0;                // magic number
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   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_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            CloseAll();
           }
     }
  }
//+------------------------------------------------------------------+
//| Close All Orders                                                 |
//+------------------------------------------------------------------+
void CloseAll()
  {
   Print(__FUNCTION__);
   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_order.SelectByIndex(i))
         if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
            m_trade.OrderDelete(m_order.Ticket());
  }
//+------------------------------------------------------------------+

Obrigado, mas como deve ser implementado na MQL4? Peço desculpa por não especificar de imediato.

 
yaaarik777:

Obrigado, mas como posso formatá-lo para a MQL4? Peço desculpa por não ter sido mais específico de imediato.

Não tem. Não faço consultas sobre a antiga língua e o terminal. Faça as suas perguntas sobre o terminal antigo na secção:MQL4 e MetaTrader 4 (22693)
 

Porque é que apanho um erro no mercado de acções e futuros, mas está tudo bem no mercado cambial e de mercadorias?

limite de venda falhado 1,00 USDRUB_TOM a 63,8679 sl: 63,8829 tp: 63,8329 [Validade inválida]

 
-Aleks-:

Porque é que apanho um erro no mercado de acções e futuros e tudo está bem em forex e mercadorias?

limite de venda falhado 1,00 USDRUB_TOM a 63,8679 sl: 63,8829 tp: 63,8329 [Validade inválida]

é necessário acrescentar um parâmetro

request.type_time=ORDER_TIME_DAY;
 

Olá colegas, tenho uma pergunta sobre o mql5:

Como calcular o lucro das posições abertas hoje (se a posição foi aberta ontem e fechada hoje, então esta posição não é tida em conta) ????

 
Dmitry Melnichenko:

Olá colegas, tenho uma pergunta sobre o mql5:

Como calcular o lucro das posições abertas hoje (se a posição foi aberta ontem e fechada hoje, então esta posição não é tida em conta) ????

Obviamente, comparando a hora em que a posição foi aberta com a hora do início do dia.
 
Vitalie Postolache:
Obviamente, comparando a hora de abertura da posição com a hora do início do dia.
Mas se a posição foi aberta ontem e fechada hoje, então a história mostrará uma Transacção com a hora de abertura hoje, ela apenas fecha a posição de ontem! Ou estarei eu errado?
Razão: