Discusión sobre el artículo "Creación de un Expert Advisor que opera con varios instrumentos" - página 5

 
Interesting:
Por Tnew[1] Rango de array inválido - parece ser un desbordamiento de rango. No olvides que la numeración de los elementos del array comienza con el principio del rango del array.

no access to edit message from 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Replace:8.¿Por qué Exp_TEMA.mq5, al hacer pruebas, abre operaciones dentro de una barra? by

8.¿Por qué Exp_TEMA.mq5, al realizar pruebas, abre múltiples operaciones en una barra?

 
ias:
no se puede editar el mensaje desde 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Los mensajes sólo se pueden editar dentro de los 3 días siguientes a su publicación.

[Eliminado]  

ias:

8.¿Por qué Exp_TEMA.mq5, al realizar pruebas, abre múltiples operaciones en una barra?

Sería lógico suponer que no hay ninguna comprobación de la presencia de posiciones abiertas anteriormente y establecer orders....
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

Interesante:
Sería lógico suponer que no se comprueban las posiciones abiertas anteriormente y se establecen órdenes pendientes....

Las órdenes pendientes no se utilizan en Exp_TEMA.mq5. Se comprueban las posiciones abiertas previamente:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

Tal vez algo está mal, en:

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ Declaración de variables para almacenar tamaños de matrices de variables
   static int Size_ = 0;
   
   //----+ Redimensionamiento de las matrices de variables
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ): ¡¡¡Error!!! Error al cambiar el tamaño de las matrices de variables!!!"); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ): Código de error ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

o en:

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ Comprobación de la prohibición de comercio
   if (!Trade)return(true);
   
   //----+ Declarar una variable para almacenar el tamaño total de las matrices de variables
   static int Size_ = 0;
   
   //----+ Declaración de una matriz para almacenar los indicadores como variable estática
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ Inicialización 
   if (Number + 1 > Size_) // Entrada en el bloque de inicialización sólo en el primer arranque
    {
     Size_ = Number + 1; // La entrada al bloque está cerrada para este número
     
     //---- Redimensionamiento de matrices de variables
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- Determinación del número mínimo de barras suficientes para el cálculo 
     MinBars[Number] = 3 * period;
     
     //---- Puesta a cero preliminar de las celdas de la matriz
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- Utilizar la matriz como una serie temporal
     ArraySetAsSeries(TEMA, true);
     
     //----+ Obtención del indicador
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ Comprobación de la suficiencia del número de barras para el cálculo 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ Recepción de señales de negociación 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // Entrada al bloque en cambio de barra o copia de datos fallida
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ Utilizando los tiradores del indicador, copie los valores de los indicadores
                   // búferes en una matriz estática especialmente preparada
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // como no se reciben los datos, debe devolver 
                                 ¡// en este bloque de recibir señales de trading en el siguiente tick!
       return(false); // salir de la función TradeSignalCounter() sin recibir señales de operación
      }
      
     //---- Todas las operaciones de copia de la memoria intermedia del indicador se han completado correctamente
     Recount[Number] = false; // es posible no volver a este bloque hasta el siguiente cambio de compás
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- Definición de las señales de entrada
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- Definición de las señales de salida
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

Múltiples operaciones en una barra al probar Exp_TEMA.mq5 en EURUSD, período D1

[Eliminado]  
ias, que es mejor ir al autor del artículo....
 
ias:

¿Por qué Exp_TEMA.mq5, al hacer pruebas, abre operaciones dentro de la barra? en

¿Por qué Exp_TEMA.mq5, cuando se prueba, abre múltiples operaciones en una barra?

El punto es que en el contexto de este artículo, la tarea era implementar un simple Asesor Experto multidivisa sin saturar la idea principal con detalles menores que interfieren con la comprensión de la esencia. Y cada uno tiene su propia manera de llenar los detalles. En su situación, todo se resuelve de forma elemental. Las variables de las señales de negociación se hacen como entrada para las funciones de negociación y están vinculadas por el enlace, y estas variables se restablecen después de la transacción dentro de las funciones de negociación.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
La cuestión es que en el contexto de este artículo, el objetivo era implementar un simple Asesor Experto multidivisa sin saturar la idea principal con detalles menores que interfieren con la comprensión de la esencia. Y cada uno tiene su propia manera de llenar los detalles. En su situación, todo se resuelve de forma elemental. Las variables de las señales de negociación se hacen como entrada para las funciones de negociación y están vinculadas por el enlace, y estas variables se restablecen después de que una operación se ejecuta dentro de las funciones de negociación.
Por favor, muéstreme cómo hacerlo en el ejemplo de su Asesor Experto Exp_TEMA.mq5.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

En mi opinión, aprender y comprender un lenguaje de programación consiste en que un individuo resuelva pequeñas tareas de reordenación del código para sus propias necesidades. Si no, ¿para qué se necesita este sitio y los artículos de programación? ¿Para demostrar las habilidades de los autores de los artículos? Aquellos que no quieren entender por sí mismos pueden utilizar el recurso https://www.mql5.com/ru/job
Por ejemplo, en MQL4 he implementado este enfoque en su forma más simple como este https://www.mql5.com/es/articles/1516. Para MQL5, nada cambia y todo se hace de la misma manera.

.

 
GODZILLA:

Tengo un gran respeto por el autor del artículo "Creación de un Asesor Experto que opera en diferentes instrumentos".
1.El código del Asesor Experto Exp_TEMA.mq5 presentado en el artículo abre múltiples operaciones en una barra durante las pruebas,
como se informó anteriormente en este tema. Este hecho confirma la presencia de un código incorrecto o un error en el Asesor Experto, que muchos visitantes del sitio están interesados en eliminar.
2. La respuesta de Roche en el tema "Asesores Expertos:Multidifusión": "Además, la función de determinar una nueva barra se puede implementar sin utilizar la función de copia de tiempo".La respuesta de Roche en el tema "Asesores Expertos:Multidifusión": "Además, la función de determinar una nueva barra se puede implementar sin utilizar la función de copia de tiempo" - también confirma la posibilidad de una escritura más racional de la función IsNewBar() en el Asesor Experto.
Me gustaría ver cómo el autor eliminará profesionalmente estos defectos, ya que todo el mundo puede cometer errores, y sólo los profesionales pueden corregirlos correctamente.
 
ias:

Si observa detenidamente los sistemas de trading presentados en el artículo, podrá concluir que se trata de sistemas de vuelco. Stoploss en tales sistemas juega un papel secundario y se coloca a una distancia muy decente de la entrada, contada en varias velas por lo menos. La profesionalidad en la presentación del material consiste en desplegar el tema de la forma más sencilla posible sin abarrotarlo con artificios adicionales, y no en base al público que no quiere pensar por sí mismo. Cualquier libro de texto siempre tiene defectos respecto al ideal. Y esto se considera aceptable y normal. En el futuro habrá tal orden de presentación detallada de este detalle de la construcción de sistemas de comercio, habrá una revisión detallada de la aplicación, que tampoco es tan simple.
En cuanto a la copia de tiempo, puedo decir con toda seguridad, yo mismo no vi ninguna diferencia significativa de una escritura más racional de la función IsNewBar() en el Asesor Experto, ¡aunque lo medí! Incluso escribí un artículo sobre este tema. Sería comprensible entonces si hubo un deterioro significativo del trabajo del código.
Y si quisiera, yo, por ejemplo, puedo hacer pedazos cualquier artículo de este sitio sin ningún problema. Pero aprecio la información ante todo porque está disponible, no porque corresponda a mis ideas sobre lo ideal.
Así que no voy a eliminar defectos descabellados y, al mismo tiempo, desordenar considerablemente el código, que no es tan sencillo como parece, por razones bastante comprensibles y bastante profesionales.