Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 697

 
yaaarik777:

Buona giornata a tutti! Potete per favore consigliarmi come impostare la cancellazione di un ordine in un EA?

La situazione è la seguente:

Mettiamo 2 ordini pendenti in direzioni diverse, non appena uno di essi scatta, l'altro viene rimosso e non viene più esposto.

Sarei molto grato per qualsiasi aiuto.

Grazie.

Ci sono diversi modi per farlo. Uno di questi è usareOnTradeTransaction.

Nel catturare la transazione

AGGIUNGERE UNA TRANSAZIONE COMMERCIALE

Aggiungere la transazione alla cronologia. Eseguito come risultato dell'esecuzione di un ordine o di transazioni di saldo del conto.

e fare in modo che questa transazione sia un'entrata nel mercato:

DEAL_ENTRY_IN

Ingresso nel mercato


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

Questa transazione avrà luogo una volta che l'ordine pendente è scattato e la transazione è stata inserita nella storia.

Una volta che abbiamo catturato questa transazione, abbiamo solo bisogno di cancellare tutti i nostri restanti ordini in sospeso:

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

Codice EA comune (solo qui ho specificato la magia uguale a "0" - dovreste impostare la vostra 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());
  }
//+------------------------------------------------------------------+
 

Un'altra domanda sull'evento OnDeinit:

questo codice funzionerà:

void OnDeinit(const int reason)

{

se(motivo==REASON_REMOVE)

{

codice per chiudere la posizione(se presente)

}

}

In generale, abbiamo bisogno di sapere se è possibile chiudere la posizione nella gestione dell'evento OnDeinit

 

Buon pomeriggio esperti, per favore condividete le vostre esperienze.

C'è un array di valori, riflette qualche oggetto/campo, cioè se c'è un compito di designare questo oggetto/campo in qualche modo, quali sono le azioni possibili.

Per esempio, sarebbe opportuno mettere questa matrice nella rete di mappe di Kohonen, se il volume della matrice può raggiungere migliaia di celle di x e y?

Forse puoi suggerire come infilare uno degli array bidimensionali (con grande dimensionalità) in una rete Kohonen.

E se Kohon è adatto all'analisi - ricorsione degli array (array in un array).

O forse qualcuno può aiutare a porre le domande giuste


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:

Ci sono diversi modi per farlo. Uno è usareOnTradeTransaction.

In catturiamo la transazione

AGGIUNGERE UNA TRANSAZIONE COMMERCIALE

Aggiungere la transazione alla cronologia. Eseguito come risultato dell'esecuzione di un ordine o di transazioni di saldo del conto.

e fare in modo che questa transazione sia un'entrata nel mercato:

DEAL_ENTRY_IN

Ingresso nel mercato


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

Questa transazione avrà luogo una volta che l'ordine pendente è scattato e la transazione è stata inserita nella storia.

Una volta che abbiamo catturato questa transazione, dobbiamo solo cancellare tutti gli ordini in sospeso:

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

Codice EA generico (solo qui ho specificato la magia uguale a "0" - dovreste impostare la vostra 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());
  }
//+------------------------------------------------------------------+

Grazie, ma come dovrebbe essere implementato in MQL4? Mi scuso per non aver specificato subito.

 
yaaarik777:

Grazie, ma come lo formatto per MQL4? Mi scuso per non essere stato subito più specifico.

Non è vero. Non consulto la vecchia lingua e il terminale. Fate le vostre domande sul vecchio terminale nella sezione:MQL4 e MetaTrader 4 (22693)
 

Perché becco un errore nel mercato azionario e dei futures e tutto va bene nel forex e nelle materie prime?

fallito vendere limite 1.00 USDRUB_TOM a 63.8679 sl: 63.8829 tp: 63.8329 [scadenza non valida]

 
-Aleks-:

Perché becco un errore nel mercato azionario e dei futures e tutto va bene nel forex e nelle materie prime?

fallito vendere limite 1.00 USDRUB_TOM a 63.8679 sl: 63.8829 tp: 63.8329 [scadenza non valida]

è necessario aggiungere un parametro

request.type_time=ORDER_TIME_DAY;
 

Ciao colleghi, ho una domanda su mql5:

Come calcolare il profitto sulle posizioni aperte oggi (se la posizione è stata aperta ieri e chiusa oggi, allora questa posizione non viene presa in considerazione) ????

 
Dmitry Melnichenko:

Ciao colleghi, ho una domanda su mql5:

Come calcolare il profitto sulle posizioni aperte oggi (se la posizione è stata aperta ieri e chiusa oggi, allora questa posizione non viene presa in considerazione) ????

Ovviamente, confrontando l'ora di apertura della posizione con l'ora di inizio della giornata.
 
Vitalie Postolache:
Ovviamente, confrontando l'ora di apertura della posizione con l'ora di inizio della giornata.
Ma se la posizione è stata aperta ieri e chiusa oggi, allora la cronologia mostrerà un Trade con l'orario di apertura oggi, chiude solo la posizione di ieri! O mi sbaglio?
Motivazione: