Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1207

 

mql5 (siepe)

Come implementareun algoritmo di chiusura delle posizioni in due condizioni?

1 caso. Se ci sono 2 posizioni aperte, allora chiudete quella con più profitto del... 2 caso. Se ci sono 2 o più posizioni aperte, allora chiudi facendo la media...

Ora ho due metodi per chiudere queste posizioni,

Per 1 caso confronta le posizioni per profitto e chiudi quella con più profitto, per 2 casi chiudi tutte le posizioni per Equity, facendo la media.

Questi metodi funzionano bene separatamente, ma non insieme, perché uno dei due eventi cade sotto la distribuzione di entrambi i metodi.

Non riesco a separarli. Di conseguenza entrambi i casi sono chiusi per lo più su Equity con la chiusura di tutte le posizioni. Questo porta al fatto che nel primo caso la posizione desiderata viene cancellata e riaperta.

Come risultato. Doppia diffusione, doppia commissione. È frustrante)))

Lo schema di impostazione degli ordini e delle posizioni si presenta così Per VENDERE (e inoltre solo per VENDERE).

Ordine limite. VENDERE_LIMITE

posizione. VENDERE(sempre tra un ordine e l'altro)

Ordine di arresto.SELL_STOP

Allego il grafico.

Chiusura delle posizioni.

1. Se scatta un ordine di stop, cioè due o più posizioni appaiono allo stesso tempo, si dovrebbe chiudere una posizione che ha un profitto più alto di... (20)

2. se è scattato un ordine Limit, cioè due o più posizioni sono aperte simultaneamente, il loro valore medio (per Equity) dovrebbe essere chiuso... (15)

Domanda. Come separare questi due metodi, in modo che gestiscano solo il proprio evento?

Forse c'è qualche altro metodo per gestire queste due condizioni?

Esempi di metodi che uso.

//+---------------------------------------------------------------------+
//|  -- ЗАКРЫВАЕМ ОДНУ ИЗ ДВУХ ПОЗИЦИЙ С НИЗУ, ГДЕ ПРОФИТ БОЛЬШЕ ЧЕМ ---|
//+---------------------------------------------------------------------+ 
ulong ticket_n=ULONG_MAX;  double profit=DBL_MIN;

     if(invert_close == true) //Проверка на наличие 2х и более поз.
     {
     int positions=PositionsTotal();
     for(int i=PositionsTotal()-1; i>=0; i--)
     {
     ulong tmp_ticket=PositionGetTicket(i);
     if(ticket_n!=0)
     {
     double tmp_profit=PositionGetDouble(POSITION_PROFIT);
     if(tmp_profit>profit+Prof_eqw_niz)// допустим 20
     {
     ticket_n=tmp_ticket;
     profit=tmp_profit;
     }
     }
     }
//-----------
     if(ticket_n!=ULONG_MAX)
     m_trade.PositionClose(ticket_n);
     invert_close = false;
     Print("------  ЗАКРЫЛИ ТОЛСТУЮ ---------");
     }       

//+---------------------------------------------------------------------+
//|                     Э К В И Т И   ДЛЯ SELL_LIMIT                    |
//+---------------------------------------------------------------------+
   npos_ALL=0; NPos_ALL(npos_ALL);
   if (npos_ALL>=Metod_Eqw && m_account.Equity()>= m_account.Balance()+Prof_eqw)//Допустим 15
   {
   CloseAllPositions();
   Print("------  ЗАКРЫЛИ ВСЕ ---------");
   }
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Vladpedro:


Le posizioni sono aperte dal simbolo su cui lavora l'EA? Si usa il numero magico?
 
Vladimir Karputov:
Le posizioni sono aperte dal simbolo su cui lavora l'EA? Si usa il numero magico

Sì, dal simbolo attuale. Sì, si usa la magia.

 
Vladpedro:

Sì, dal personaggio attuale. Sì, si usa la magia.

Spiegare la seconda condizione, cosa significa?(Se 2 o più posizioni sono aperte, allora chiudete facendo la media del valore... )

 
Vladimir Karputov:

Spiegare la seconda condizione, cosa significa?(Se 2 o più posizioni sono aperte, chiudere facendo la media sul valore... )

Significa: se due o più posizioni sono aperte e l'Equity è maggiore del saldo di qualsiasi valore (diciamo 15), allora tutte le posizioni sono chiuse.

Per esempio, vengono aperte tre posizioni. La prima ha una perdita corrente di -10, la seconda ha un profitto di -5, la terza ha un profitto di +30 e in totale +15, tutte le posizioni possono essere chiuse.

Se non è stato raggiunto un profitto medio di +15, le posizioni saranno chiuse dal proprio SL o TP preimpostato. (Questa è una specie di terza condizione per la chiusura delle posizioni, ma non ci sono problemi, quindi l'ho omessa).

 
Vladpedro:

Questo significa: se due o più posizioni sono aperte e l'Equity è maggiore del saldo di qualsiasi valore (diciamo 15), allora tutte le posizioni saranno chiuse.

Per esempio, tre posizioni sono aperte. La prima ha una perdita corrente di -10, la seconda ha un profitto di -5, la terza ha un +30+ totale di +15, tutte le posizioni possono essere chiuse.

Se non è stato raggiunto un profitto medio di +15, le posizioni saranno chiuse dal proprio SL o TP preimpostato. (questa è una specie di terza condizione per la chiusura delle posizioni, ma non c'è nessun problema, per questo l'ho omessa).

Ecco il codice completo per due condizioni:

//+------------------------------------------------------------------+
//|                                       Closing Two conditions.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.00"
/*
   barabashkakvn Trading engine 3.116
*/
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CTrade         m_trade;                      // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
//--- input parameters
input double   InpProfitTarget      = 15;       // Profit target, in deposit money (if Positions > 2)
input ulong    InpDeviation         = 10;       // Deviation, in points (1.00045-1.00055=10 points)
input ulong    InpMagic             = 200;      // Magic number
//---
bool     m_need_close_all           = false;    // close all positions
ulong    m_need_close_ticket        = ULONG_MAX;// close one position
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(m_symbol.Name());
   m_trade.SetDeviationInPoints(InpDeviation);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(m_need_close_all)
     {
      if(IsPositionExists())
        {
         CloseAllPositions();
         return;
        }
      else
         m_need_close_all=false;
     }
//---
   if(m_need_close_ticket!=ULONG_MAX)
     {
      //--- close one position
      if(m_position.SelectByTicket(m_need_close_ticket))
        {
         m_trade.PositionClose(m_need_close_ticket); // close a position
         return;
        }
      else
         m_need_close_ticket=ULONG_MAX;
     }
//--- calculate all positions
   int total=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)
            total++;

   if(total==2)
     {
      //--- conditon 1
      ulong tmp_ticket=ULONG_MAX;
      double tmp_profit=DBL_MIN;
      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)
              {
               double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
               if(profit>tmp_profit)
                 {
                  tmp_profit=profit;
                  tmp_ticket=m_position.Ticket();
                 }
              }
      //---
      if(tmp_ticket!=ULONG_MAX)
         m_need_close_ticket=tmp_ticket;
     }
   else
     {
      if(total>2)
        {
         //--- conditon 2
         double profit=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)
                  profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
         //---
         if(profit>=InpProfitTarget)
            m_need_close_all=true;
        }
     }
  }
//+------------------------------------------------------------------+
//| Is position exists                                               |
//+------------------------------------------------------------------+
bool IsPositionExists(void)
  {
   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)
            return(true);
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions(void)
  {
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of current positions
      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)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified m_symbol
  }
//+------------------------------------------------------------------+
 
Vladimir Karputov:

Ecco il codice completo per le due condizioni:

Grazie Vladimir, cercherò di capirlo.

Ho cercato di risolverlo a modo mio, capisco come si possono separare queste due condizioni.

Per esempio.

Dichiariamo tre variabili logiche.

Pos_1;

Pos_2_Clos_1;

Pos_2_Clos_All;

1. Controlla il numero di posizioni aperte.

Se abbiamo solo 1 posizione aperta SELL è impostato su :

Pos_1=vero ; Pos_2_Clos_1=falso; Pos_2_Clos_All=falso;

Se ci sono 2 posizioni aperte e l'importo del capitale è positivo (questo può avvenire solo quando scatta l'ordine SELL_STOP), assegna un valore logico a questo evento

Pos_1=falso ; Pos_2_Clos_1=vero; Pos_2_Clos_All=falso;

Se sono aperte 2 posizioni e l'importo del capitale è negativo (questo può avvenire solo quando scatta un ordine SELL_LIMIT), allora

Pos_1=falso ; Pos_2_Clos_1=falso; Pos_2_Clos_All=vero;

Questo sembra essere tutto... Puoi controllare le variabili logiche e assegnarle al tuo metodo di chiusura, ma non ha funzionato per me...

Sono ancora un pessimo programmatore, forse ho fatto un errore da qualche parte...

Grazie per l'aiuto)

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 

Vladimir Karputov:

Vladimir, ho un problema con questo: quando scatta l'ordine SELL_STOP, tutto va bene, solo una posizione con profitto maggiore viene chiusa,

Ma quando si attiva SELL_LIMIT, tutto viene chiuso in modo errato, non dalla somma di tutte le posizioni aperte ma sembra che la posizione con il profitto più alto venga chiusa.

Ho avuto un errore simile prima, ora inizio a pensare, forse è colpa mia, forse non calcolo e apro le posizioni correttamente.

Per favore esamina il mio codice pronto per il test e vedi se hai degli errori, ma forse ci sono anche delle incongruenze nel tuo codice, o forse non le ho spiegate correttamente... Qual è il profitto medio per me?

Ho iniziato ad analizzare l'algoritmo ora e mi sono reso conto che è un po' più complicato nelle sue conseguenze di quanto vi ho detto prima.

La terza condizione quando si chiude una posizione per il suo SL può causare errori nell'algoritmo delle prime due condizioni.

Descriverò ancora una volta l'algoritmo completo di chiusura delle posizioni solo per il caso SELL_LIMIT poiché il caso SEL_STOP viene eseguito correttamente. Lasciamo perdere per ora.

1. Inizialmente abbiamo una posizione aperta SELL che ha specificato SL ma è superiore a SELL_LIMIT, il che significa che SL non sarà attivato prima di SELL_LIMIT.

2. SELL_LIMIT è scattato e c'è una seconda posizione SELL con il proprio SL, che non potrà chiudere prima del prossimo SELL_LIMIT

Se l'ordine SELL_LIMIT è scattato, è stato piazzato un nuovo ordine SELL_LIMIT. (sempre)

4. Il numero di posizioni SELL_LIMIT aperte può essere1-3 o più, tutto dipende da quanto sono in piedi SL. Considera il caso se ce ne sono al massimo tre. (Posso limitarmi a SL)

Ora gli scenari di chiusura delle posizioni.

Se posizioni aperte. 2, solo due scenari sono possibili per chiudere una o tutte le posizioni

1. Per Equity, se è più di balance di 15(tutte le posizioni sono chiuse), (m_account.Equity()>= m_account.Balance()+15) intendevo chiudere diverse posizioni facendo la media.

2. Per proprio SL (una posizione è chiusa).

3. la posizione rimanente , ora deve essere liberata dalle condizioni di chiusura se erano impostate prima, perché non sappiamo quale condizione applicare ad essa.

Può ripetere lo scenario SELL_LIMIT, o può scendere a SEL_STOP e andare a un'altra condizione di chiusura.

4. Se c'erano tre posizioni, le chiudiamo anche (m_account.Equity()>= m_account.Balance()+15) o una di esse attiverà SL e rimarranno due posizioni.

Applica questa regola fino a quando rimane una posizione, per la quale non sono state definite condizioni di chiusura...

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Vladpedro:

Vladimir Karputov:

Vladimir, ho un problema con questo: quando il mio ordine SELL_STOP scatta, tutto va bene, solo una posizione con profitto maggiore viene chiusa,

Ma quando viene attivato SELL_LIMIT, l'ordine si chiude in modo errato, non per la somma di tutte le posizioni aperte ma sembra chiudere la posizione con il profitto più alto.

Ho avuto un errore simile prima, ora inizio a pensare, forse è colpa mia, forse non calcolo e apro le posizioni correttamente.

Per favore esamina il mio codice pronto per il test e vedi se hai degli errori, ma forse il tuo codice non soddisfa le condizioni. O forse non le ho spiegate correttamente... qual è il profitto medio per me.

In generale, non importa quale ordine pendente si innesca - infatti, ci ritroviamo con una posizione e poi calcoliamo il profitto della posizione.

 
Vladimir Karputov:

Non fa alcuna differenza quale ordine pendente è scattato - dopo tutto, otteniamo una posizione e poi contiamo il profitto della posizione

Non fa alcuna differenza. Ho il sospetto che ci sia una differenza perché quando ho impostato ordini e posizioni, ho assegnato dei "commenti" miei alle posizioni e miei agli ordini. Di conseguenza, quando un ordine si sposta in una posizione, eredita il commento dell'ordine.

Poi, quando abbiamo controllato le posizioni attraverso i commenti, c'era un casino... i commenti erano diversi. L'ho sistemato.

Non ho trovato nel vostro codice, o non capisco come vengono chiuse le posizioni per la condizione SELL_LIMIT innescata da Equity.

if(total==2)
   {
//-------------------------------------------------------- conditon 1
      ulong tmp_ticket=ULONG_MAX;
      double tmp_profit=DBL_MIN;
      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)
      {
      double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
      if(profit>tmp_profit)
      {
      tmp_profit=profit;
      tmp_ticket=m_position.Ticket();
      }
      }
      //---
      if(tmp_ticket!=ULONG_MAX)
      m_need_close_ticket=tmp_ticket;
      }
      else
      {
      if(total==2)
        {
//--------------------------------------------------------- conditon 2
        double profit=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)
        profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
//--------
       if(profit>=InpProfitTarget)
        m_need_close_all=true;
        }
        }

Sembra che abbiamo controllato se tutte le posizioni possono essere chiuse, e il flag è impostato per questo

ma inCloseAllPositions();

if(m_need_close_all)
   {
   if(IsPositionExists())
   {
   CloseAllPositions();
   return;
   }
   else
   m_need_close_all=false;
   }

c'è qualcosa che manca.

 if(m_account.Equity()>= m_account.Balance()+15)

Non c'è un controllo per la chiusura di tutte le posizioni per il caso - SELL_LIMIT è scattato.

Forse questo stessom_account.Equity()>= m_account.Balance()+15è implementato in qualche altro modo?

O forse è perché non ho spiegato la media nel modo sbagliato.