Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1282

 
Vladimir Karputov:

El problema está en el EA. Por cierto, las normas del alojamiento compartido prohíben las dlls.

Solía funcionar bien. Debería haberlo probado en el alojamiento gratuito. De todos modos le dio a methaquotes 15 libras ))))

Gracias por la respuesta.

 

El EA abre órdenes de mercado y luego las modifica, establece TP y SL. Comprobando en el probador. La primera orden se modifica utilizando los parámetros requeridos. La segunda orden se abre en la misma dirección que la primera, pero la primera orden se modifica en función de los parámetros de la segunda y ésta queda con SL y TP nulos. En este caso la condición es: si SL == 0 y TP == 0, la otra orden se modifica porque tiene parámetros distintos de cero. ¿Por qué? Cambiar la búsqueda de la primera a la última no cambia nada.

Una cosa más. En el probador, si se abren dos órdenes, el beneficio de la orden se muestra en la columna beneficio, es decir, el beneficio de la segunda orden se muestra en la primera orden abierta y viceversa. ¿Por qué?

Hay más. Tenemos que trazar una línea de tendencia siguiendo dos extremos. La línea está trazada pero es un trozo de barra a barra. No es una línea de tendencia, sino sólo un segmento, mientras que nos gustaría ver una línea.

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:

El EA abre órdenes de mercado y luego las modifica, establece TP y SL. Comprobando en el probador. La primera orden se modifica utilizando los parámetros requeridos. La segunda orden se abre en la misma dirección que la primera, pero la primera orden se modifica en función de los parámetros de la segunda y ésta queda con SL y TP nulos. En este caso la condición es: si SL == 0 y TP == 0, la otra orden se modifica porque tiene parámetros distintos de cero. ¿Por qué? Cambiar la búsqueda de la primera a la última no cambia nada.

Una cosa más. En el probador, si se abren dos órdenes, el beneficio de la orden se muestra en la columna beneficio, es decir, el beneficio de la segunda orden se muestra en la primera orden abierta y viceversa. ¿Por qué?

Hay más. Tenemos que trazar una línea de tendencia siguiendo dos extremos. La línea está trazada pero es un trozo de barra a barra. No es una línea de tendencia, sólo un segmento mientras que nos gustaría ver una línea.

1. No son órdenes, sino posiciones.

2. Formule su pregunta: hasta ahora he visto una narración, y no he visto una pregunta o un algoritmo de "cómo le gustaría que funcionara".

 
Vladimir Karputov:

1. No se trata de PEDIDOS, sino de PUESTOS

2. Formule su pregunta - hasta ahora he visto una narración, y no he visto la pregunta y el algoritmo "cómo quiere que funcione".

Sabes que son posiciones, ya que está en mql5. Y hay una posición en el código. La pregunta es por qué se modifica la primera posición y no la última, aunque esté especificada en la condición:

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

Está claro que las posiciones están ahí, ya que está en mql5. Y en el código es la posición. La pregunta es por qué se modifica la primera posición y no la última, aunque esté especificada en la condición:

La cuestión es dónde. Describe el algoritmo "Quiero que el algoritmo sea esto...".

 
Vladimir Karputov:

La pregunta es ¿dónde? Describe el algoritmo "Quiero que el algoritmo sea así...".

Cuando la línea de tendencia se rompe y la barra cierra por encima/por debajo de ella, abrimos una posición con SL y TP cero. Inmediatamente después de la apertura, se fijan los TP y SL necesarios (se modifica la posición). Porque no es la última posición la que se modifica, sino la anterior, mientras se viola la condición:

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

¿Está claro ahora? Aunque introduzcamos en la condición la hora de apertura de una posición, nada cambia. No hay límite en el número de puestos.

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

Cuando se rompe la línea de tendencia y la barra cierra por encima/por debajo de ella, se abre una posición con SL y TP cero. Inmediatamente después de la apertura, se fijan los TP y SL necesarios (se modifica la posición). Porque no es la última posición la que se modifica, sino la anterior, mientras se viola la condición:

¿Está claro ahora? Aunque introduzcamos en la condición la hora de apertura de una posición, nada cambia. No hay límite en el número de puestos.

¿Está seguro de que en el momento de la modificación ya existe una nueva posición? (El envío de una orden de negociación no garantiza que la posición exista).

Al introducir la condición (SL == 0,0 y TP == 0,0) imprime el ticket de posición.

 
Vladimir Karputov:

¿Está seguro de que el nuevo puesto ya está disponible en el momento de la modificación? (El envío de una orden de negociación no garantiza que exista una posición).

Cuando se introduce la condición (SL == 0,0 y TP == 0,0) se imprime el ticket de posición.

Sí, la segunda posición ya está ahí. Estoy leyendo el registro. El método de venta fue exitoso, código 10009. (Billete nº 3). Y luego sigue una modificación, sólo de la posición con el ticket #2, que también se ejecuta con éxito (modificación, aunque, subrayo, según las condiciones no debería ocurrir, ¡el SL ya no es 0!).

Ya escribí, probé tanto por hora de apertura, como por ticket, no hubo suerte, modifica la posición anterior. Por ejemplo:

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 segunda posición ya está ahí. Estoy leyendo el registro. El método de venta fue exitoso, código 10009. (Billete nº 3). Y luego sigue la modificación, sólo la posición con el billete #2, que también se hace con éxito.

Ya escribí, probé tanto por la hora de apertura como por el ticket, no hay manera, modifica la posición anterior. Por ejemplo:


Es decir: no compruebas el resultado de la posición y ni siquiera quieres imprimir el ticket. Si es así, adjunte el código completo (adjúntelo con el botón Adjuntar archivo)

 
Vladimir Karputov:

Es decir: no se comprueba el resultado de la posición y ni siquiera se quiere imprimir el ticket. En ese caso, adjunte el código completo (adjúntelo con el botón )

Ni siquiera quieres imprimir el billete: no lo entiendo. Aquí está el extracto del registro.

2021.02.01 12:54:55.338 2018.01.02 17:00:00 mercado vender 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 trato hecho [#2 vender 0.01 EURUSD a 1.20384]

2021.02.01 12:54:55.338 2018.01.02 17:00:00 orden realizada vender 0.01 a 1.20384 [#2 vender 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 [hecho a 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 Método Sell() completado con éxito. Código de retorno = 10009 (hecho a 1,20384)

2021.02.01 12:54:55.344 2018.01.02 17:00:00 posición modificada [#2 vender 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: modify position #2 EURUSD (sl: 1.20813, tp: 1.20013) [done]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 Método PositionModify() ejecutado con éxito. Código de retorno = 10009 (hecho).

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

2021.02.01 12:55:48.819 2018.01.03 09:00:00 mercado vender 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 trato hecho [#3 vender 0.01 EURUSD a 1.20442]

2021.02.01 12:55:48.819 2018.01.03 09:00:00 orden realizada vender 0.01 a 1.20442 [#3 vender 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 [hecho a 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 Método Sell() ejecutado con éxito. Código de retorno = 10009 (hecho a 1,20442)

====================================================================================================================== después de abrir con éxito la posición, la modificación, pero la orden anterior

2021.02.01 12:55:48.821 2018.01.03 09:00:00 posición modificada [#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: modify position #2 EURUSD (sl: 1.20663, tp: 1.20154) [done]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 Método PositionModify() ejecutado con éxito. Código de retorno = 10009 (hecho)


He publicado el código completo de modificación de posición en Sell, con opciones.

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