Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1282

 
Vladimir Karputov:

Il problema è con l'EA. A proposito, le regole dell'hosting condiviso vietano le DLL.

Prima funzionava benissimo. Avrei dovuto provarlo su un hosting gratuito. Comunque ha dato a methaquotes 15 sterline )))

Grazie per la risposta!

 

L'EA apre ordini a mercato e poi li modifica, imposta TP e SL. Controllo del tester. Il primo ordine viene modificato utilizzando i parametri richiesti. Il secondo ordine viene aperto nella stessa direzione del primo, ma il primo ordine viene modificato secondo i parametri del secondo e il secondo rimane con SL e TP nulli. In questo caso la condizione è: se SL == 0 e TP == 0, l'altro ordine è modificato perché ha parametri non nulli. Perché? Cambiare la ricerca dalla prima all'ultima non cambia nulla.

Un'altra cosa. Nel tester, se vengono aperti due ordini, il profitto dell'ordine viene mostrato nella colonna profitto, cioè il profitto del secondo ordine viene mostrato nel primo ordine aperto e viceversa. Perché?

C'è di più. Dobbiamo tracciare una linea di tendenza che segua due estremi. La linea è tracciata ma è uno stub da barra a barra. Non è una linea di tendenza ma solo un segmento mentre noi vorremmo vedere una linea.

void PositionModifiSell()
{
   int    i;
   double sl    = 0; 
   double tp    = 0;  
   int    total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);                
                                    
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:

L'EA apre ordini a mercato e poi li modifica, imposta TP e SL. Controllo del tester. Il primo ordine viene modificato utilizzando i parametri richiesti. Il secondo ordine viene aperto nella stessa direzione del primo, ma il primo ordine viene modificato secondo i parametri del secondo e il secondo rimane con SL e TP nulli. In questo caso la condizione è: se SL == 0 e TP == 0, l'altro ordine è modificato perché ha parametri non nulli. Perché? Cambiare la ricerca dalla prima all'ultima non cambia nulla.

Un'altra cosa. Nel tester, la colonna del profitto mostra gli ordini con due ordini aperti ma viceversa: il profitto del secondo ordine è mostrato nel primo ordine aperto e viceversa. Perché?

C'è di più. Dobbiamo tracciare una linea di tendenza che segua due estremi. La linea è tracciata ma è uno stub da barra a barra. Non è una linea di tendenza, solo un segmento mentre noi vorremmo vedere una linea.

1. Non ordini, ma posizioni.

2. Formulate la vostra domanda - finora ho visto una narrazione, e non ho visto una domanda o un algoritmo per "come si vorrebbe che funzionasse".

 
Vladimir Karputov:

1. Non ORDINATORI, ma POSIZIONI

2. Formulate la vostra domanda - finora ho visto una narrazione, e non ho visto la domanda e l'algoritmo "come volete che funzioni".

Sai che sono posizioni, dato che sono in mql5. E c'è una posizione nel codice. La domanda è perché viene modificata la prima posizione e non l'ultima, anche se è specificato nella condizione:

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
 
Youri Lazurenko:

È chiaro che le posizioni ci sono, dato che è in mql5. E nel codice è la posizione. La domanda è perché viene modificata la prima posizione e non l'ultima, anche se è specificato nella condizione:

La domanda è dove. Descrivere l'algoritmo "Voglio che l'algoritmo sia questo ...".

 
Vladimir Karputov:

La domanda è: dove? Descrivere l'algoritmo "Voglio che l'algoritmo sia così...".

Quando la linea di tendenza viene rotta e la barra chiude sopra/sotto di essa, apriamo una posizione con SL e TP pari a zero. Immediatamente dopo l'apertura, i necessari TP e SL sono impostati (la posizione è modificata). Perché non è l'ultima posizione che viene modificata, ma quella precedente, mentre si viola la condizione:

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)

È chiaro ora? Anche se introduciamo il tempo di apertura di una posizione nella condizione, non cambia nulla. Non c'è limite al numero di posizioni.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Quando la linea di tendenza viene rotta e la barra chiude sopra/sotto di essa, viene aperta una posizione con SL e TP pari a zero. Immediatamente dopo l'apertura, i necessari TP e SL sono impostati (la posizione è modificata). Perché non è l'ultima posizione che viene modificata, ma quella precedente, mentre si viola la condizione:

È chiaro ora? Anche se introduciamo il tempo di apertura di una posizione nella condizione, non cambia nulla. Non c'è limite al numero di posizioni.

Siete sicuri che al momento della modifica esiste già una nuova posizione? (L'invio di un ordine di compravendita non è una garanzia che la posizione esista).

Quando si inserisce la condizione (SL == 0.0 e TP == 0.0) stampare il biglietto di posizione.

 
Vladimir Karputov:

Sei sicuro che la nuova posizione sia già disponibile al momento della modifica? (L'invio di un ordine di compravendita non garantisce l'esistenza di una posizione).

Quando inserite la condizione (SL == 0.0 e TP == 0.0) stampate il biglietto di posizione.

Sì, la seconda posizione è già presente. Sto leggendo il registro. Il metodo Sell ha avuto successo, codice 10009. (Biglietto #3). E poi segue una modifica, solo della posizione con il biglietto #2, che viene anche eseguita con successo (modifica, anche se, sottolineo, secondo le condizioni non dovrebbe accadere, SL non è più 0!)

Già scritto, provato sia per tempo di apertura, che per biglietto, nessuna fortuna, modifica la posizione precedente. Per esempio:

void PositionModifiSell()
{
   int      i;
   datetime Time;
   double   sl    = 0; 
   double   tp    = 0;  
   datetime time  = 0;
   int      total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Time = m_position.Time();
               
               if(Time > time)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  time = Time;
               }
            }
         }
      }
   }
}
//------------ или
void PositionModifiSell()
{
   int      i;
   ulong  Ticket;
   double sl     = 0; 
   double tp     = 0;  
   ulong  ticket = 0;
   int    total  = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {
               Tiсket = m_position.Ticket();
               
               if(ticket != Ticket)
               {
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                  
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  
                  if(!m_trade.PositionModify(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кодa: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  ticket = Ticket;
               }
            }
         }
      }
   }
}
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Sì, la seconda posizione è già presente. Sto leggendo il registro. Il metodo Sell ha avuto successo, codice 10009. (Biglietto #3). E poi segue la modifica, solo la posizione con il biglietto #2, che è anche fatta con successo.

Già scritto, provato sia per tempo di apertura che per biglietto, niente da fare, modifica la posizione precedente. Per esempio:


Cioè: non si controlla il risultato della posizione e non si vuole nemmeno stampare il biglietto. Se questo è il caso, allega il codice completo (allega usando il pulsante Allega file)

 
Vladimir Karputov:

Cioè: non si controlla il risultato della posizione e non si vuole nemmeno stampare il biglietto. In questo caso, allega il codice completo (allegalo usando il pulsante )

Non vuoi nemmeno stampare il biglietto - non capisco. Ecco l'estratto del registro.

2021.02.01 12:54:55.338 2018.01.02 17:00:00 mercato vendere 0,01 EURUSD (1,20384 / 1,20402)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 deal #2 sell 0.01 EURUSD at 1.20384 done (based on order #2)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 affare fatto [#2 vendere 0,01 EURUSD a 1,20384]

2021.02.01 12:54:55.338 2018.01.02 17:00:00 ordine eseguito vendere 0,01 a 1,20384 [#2 vendere 0,01 EURUSD a 1,20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 CTrade::OrderSend: market sell 0.01 EURUSD [done at 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 metodo Sell() completato con successo. Codice di ritorno = 10009 (fatto a 1,20384)

2021.02.01 12:54:55.344 2018.01.02 17:00:00 posizione modificata [#2 sell 0.01 EURUSD 1.20384 sl: 1.20813 tp: 1.20013]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 CTrade::OrderSend: modifica posizione #2 EURUSD (sl: 1,20813, tp: 1,20013) [done]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 Metodo PositionModify() eseguito con successo. Codice di ritorno = 10009 (fatto).

============================================================================================================== разделил, появление второй позиции

2021.02.01 12:55:48.819 2018.01.03 09:00:00 mercato vendere 0,01 EURUSD (1,20442 / 1,20460)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 deal #3 sell 0.01 EURUSD at 1.20442 done (based on order #3)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 affare fatto [#3 vendere 0,01 EURUSD a 1.20442]

2021.02.01 12:55:48.819 2018.01.03 09:00:00 ordine eseguito vendere 0,01 a 1,20442 [#3 vendere 0,01 EURUSD a 1,20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 CTrade::OrderSend: market sell 0.01 EURUSD [fatto a 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 metodo Sell() completato con successo. Codice di ritorno = 10009 (fatto a 1,20442)

====================================================================================================================== dopo aver aperto con successo la posizione, la modifica, ma l'ordine precedente

2021.02.01 12:55:48.821 2018.01.03 09:00:00 posizione modificata [#2 sell 0.01 EURUSD 1.20384 sl: 1.20663 tp: 1.20154]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 CTrade::OrderSend: modifica posizione #2 EURUSD (sl: 1,20663, tp: 1,20154) [done]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 Metodo PositionModify() eseguito con successo. Codice di ritorno = 10009 (fatto)


Ho pubblicato il codice completo di modifica della posizione su Sell, con le opzioni.

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