Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 471

 
Vadim Novikov:

¡Buenas tardes a todos los que se preocupan!


Soy un usuario avanzado. Pero no escribo tan a menudo. Por eso. No puedo seguir el ritmo de algunas innovaciones. Y a veces se me olvidan las cosas.


Por favor, ayúdame con una pregunta. No puedo recordar una cosa.


Esta es la situación. He definido variables externas. He definido muchas de ellas. 20 variables.Se muestran en el menú de entrada del programa, cuando se adjunta este programa a la carta.


Esta es la pregunta, no me acuerdo, ¿cómo separo los bloques de estas variables con comentarios? En el menú de entrada, por ejemplo:


Este es un bloque sobre el cambio de las variables MA (comentario)

Periodo MA

Método de ajuste MA

Precio MA

Este es un bloque sobre el cambio de las variables del MACD (comentario)

..........................

...........................

...........................

Este es un bloque para cambiar las variables de BB (comentario)

.........................

..............................

...........................


Parece que antes introducía esos comentarios con la función de comentario de código.Es decir, escribí // o /* */. Pero ahora algo no funciona.

   extern string     a1             = "Это  блок  по  изменению   переменных   MA (комментарий)";
   ..............
   ..............
   ..............
   extern string     a2             = "Это  блок  по  изменению  переменных   MACD (комментарий)";

Así

 
OrderStopLoss() da salida a dos decimales, ¿puedo forzar que dé salida a tres decimales?
 
Alekseu Fedotov:

Así.

¡¡¡Gracias, eso me recuerda!!!

 
Igor Golieniev:

Pruébalo así:

Print("SL: ", DoubleToString(OrderStopLoss(), Digits()));

Esto es para mostrar todos los dígitos significativos de la cotización. Si se necesita algún otro número de dígitos, sustituya Digits() por un número específico.

 
Buenas noches, algún consejo por favor. En la función OnInit crea dos líneas horizontales, en OnTick dos funciones, una envía una notificación push y de correo si Bid > primera línea, la segunda si Bid < segunda línea. Bid=line no lo hizo, para evitar lagunas. Por supuesto, también me he enfrentado al hecho de que si la condición se cumple, la notificación llega con cada tick, lo cual es malo. ¿Cómo resolver este problema? Puede establecer el tiempo de espera o el número de notificaciones en la configuración de Alertas estándar.
 
Ihor Herasko:

Pruébalo así:

Esto es para mostrar todos los dígitos significativos de la cotización. Si necesita cualquier otro número de dígitos, sustituya Digits() por un número específico.

Ahora imprime correctamente 15,155, sin embargo - stoploss inválido para la función OrderModify

Este problema es sólo con Silver en OrderModify

void Trailing()
  {
   if(Digits==3 || Digits==5)
     {
      TrailingStep *= 10;
      TrailingOpen *= 10;
      TrailingStop *= 10;
     }
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid>OrderOpenPrice()+TrailingOpen*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),0,0))
                        Print("Oshibka =", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Ask<OrderOpenPrice()-TrailingOpen*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*Point,Digits),0,0))
                        Print("Oshibka", DoubleToString(OrderStopLoss(), Digits()));
                    }
                 }
              }
           }
        }
     }
  }
 
Igor Golieniev:

Ahora sale correctamente en Print 15,155 , sin embargo - stoploss inválido para la función OrderModify

Este problema es sólo con Silver en OrderModify

En este código se observan dos errores:

  1. Falta de comprobación del tamaño mínimo de parada permitido (se llama Nivel de Parada).
  2. Comparación incorrecta de números reales.

Para resolver el primer problema necesitamos obtener el nivel de parada actual:

double fStopLevel = SymbolInfoInteger(Symbol(), SYMBOL_TRADE_STOPS_LEVEL) * Point();

Si fStopLevel resulta ser cero y el tipo de cuenta no es ECN, entonces fStopLevel debe ser forzado a ser igual a tres spreads.

Antes de fijar los stops (tanto el Stop Loss como el Take Profit) compruebe que el nuevo nivel está a la altura o por encima del nivel de Stop del precio de cierre de la orden. Para comprobar el stop de una orden de compra se hace lo siguiente:

if (Bid - fNewSL - fStopLevel < -Point() / 10)
{
  // Такой стоп ставить нельзя. Ближайший возможный уровень: Bid - fStopLevel
}

Para una parada de orden de venta:

if (fNewSL - Ask - fStopLevel < -Point() / 10)
{
   // Stop Loss на цене fNewSL ставить нельзя. Ближайший возможный уровень: Ask + fStopLevel
}


La solución al segundo problema: Comparar los valores reales con cierta exactitud, ya que la igualdad de los números reales no se puede conseguir siempre y en todas partes. Ya he dado un ejemplo de comparación arriba en el código de la validación del nivel de parada.

 
Ihor Herasko:

Hay dos errores en este código que llaman la atención:

  1. Falta de comprobación del tamaño mínimo de parada permitido (llamado Nivel de parada).
  2. Comparación incorrecta de números reales.

Para resolver el primer problema necesitamos obtener el nivel de parada actual:

Si fStopLevel resulta ser cero y el tipo de cuenta no es ECN, entonces fStopLevel debe ser forzado a ser igual a tres spreads.

Antes de fijar los stops (tanto el Stop Loss como el Take Profit) compruebe que el nuevo nivel está a la altura o por encima del nivel de Stop del precio de cierre de la orden. Para comprobar el stop de una orden de compra se hace lo siguiente:

Para un tope de orden de venta:


La solución al segundo problema: Comparar los valores reales con cierta precisión, ya que la igualdad de los números reales no se puede conseguir siempre y en todas partes. Ya di un ejemplo de comparación arriba en el código de la validación del nivel de parada.

Gracias.

Sin embargo, la cuestión no está cerrada. OrderModify comienza a activarse inmediatamente cuando se abre una orden. ¿Dónde está el error? (Repito - en todas las monedas/futuros funciona, en la plata no)

 
Igor Golieniev:

Gracias.

Sin embargo, la cuestión no está cerrada. OrderModify comienza a activarse inmediatamente cuando se abre una orden. ¿Dónde está el error? (Repito - en todas las monedas/futuros funciona, en la plata no)

1. Directiva

#property strict

¿estás usando?

2) ¿Sucede esto con Vender y Comprar, o sólo con Vender?

3. ¿se fija el Stop loss en la apertura de la posición o debe fijarlo el trader si es posible?

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

Gracias.

Sin embargo, la cuestión no está cerrada. OrderModify comienza a funcionar inmediatamente cuando se abre una orden. ¿Dónde está el error? (Repito - funciona en todas las monedas/futuros, no funciona en la plata)

Muestre el fragmento de registro (si está en línea, la pestaña Expertos) donde puede ver la apertura y las modificaciones de la orden de mercado e indicar qué valores de TrailingStop y TrailingStep se utilizaron.

Razón de la queja: