Analizar las barras hacia atrás en EA - página 2

 
FMIC:

No hay OnStart() en los EA's pero entiendo lo que quieres decir. Sin embargo, el OP incluso en respuesta a sus comentarios dijo y cito:

Sí, me refería a OnTick(). Sigues dándole demasiada importancia a "mientras se ejecuta el EA". No significa necesariamente, o incluso lo más plausible, "mientras el EA está ejecutando su OnTick()", en lugar de "mientras el EA está unido a un gráfico, es decir, durante toda su vida".

Necesitamos más información de paranoyakX.

 
jjc:

Sí, me refería a OnTick(). Sigues dándole demasiada importancia a "mientras se ejecuta el EA". No significa necesariamente, o incluso lo más plausible, "mientras el EA está ejecutando su OnTick()", en lugar de "mientras el EA está unido a un gráfico, es decir, durante toda su vida".

Necesitamos más información de paranoyakX.

Hola chicos,

permítanme aclarar esto. Mi código está buscando un patrón muy básico en las barras anteriores y decidirá si se abrirá una orden, pero la apertura de una nueva orden se comprobará sólo cuando aparezca una nueva barra. lo que quiero decir es que estoy esperando el cierre de la última barra, a continuación, comprobar el patrón, si está bien voy a abrir la orden.

De alguna manera, si tengo que volver a ejecutar el EA, quiero encontrar esta información básica de nuevo (barra de inicio y fin del patrón, precios más altos, más bajos, etc) y llenar mis variables globales de nuevo, es por eso que necesito esto. Usaré la información de inicio y fin para decidir cuando cerrar mi orden. así que es suficiente si una nueva barra no aparece en OnInit, mientras el EA se ejecuta, no es un problema.

 
jjc:

Sí, me refería a OnTick(). Sigues dando demasiada importancia a "mientras se ejecuta el EA". No significa necesariamente, o incluso lo más plausible, "mientras el EA está ejecutando su OnTick()", en lugar de "mientras el EA está unido a un gráfico, es decir, durante toda su vida".

Necesitamos más información de paranoyakX.

Sí, tienes razón. Por la última información del OP, definitivamente está ejecutando todo en el OnInit() y no en el OnTick(). Asumí incorrectamente que el OP estaba haciendo las cosas un poco más correctamente. Nunca se me ocurrió que toda su lógica estaba en el OnInit( ).
 
paranoyakX:

Hola chicos,

déjenme aclarar esto. Mi código está buscando un patrón muy básico en las barras anteriores y decidirá si se abrirá una orden, pero la apertura de una nueva orden se comprobará sólo cuando aparezca una nueva barra. lo que quiero decir es que estoy esperando el cierre de la última barra, a continuación, comprobar el patrón si está bien voy a abrir la orden. por lo que la apertura de una orden está sucediendo en la apertura de la nueva barra. como @jjc dijo, estoy manteniendo la información básica del patrón en las variables globales, como cuando mi patrón comenzó y terminó, lo que el valor más alto y más bajo es, etc.

De alguna manera, si tengo que volver a ejecutar el EA, quiero encontrar esta información básica de nuevo (barra de inicio y fin del patrón, precios más altos, más bajos, etc) y llenar mis variables globales de nuevo, es por eso que necesito esto. Utilizaré la información de inicio y fin para decidir cuándo cerrar mi orden. así que es suficiente si una nueva barra no aparece en OnInit, mientras el EA se ejecuta, no es un problema.

NO deberías estar haciendo todo eso en el OnInit (). Deberías estar haciendo toda esa lógica (incluyendo la recuperación) en el OnTick(). Esto es importante. Hacerlo en OnInit( ) le causará más problemas que no ha previsto y dejará su EA en un estado de "inicialización" mientras está haciendo toda esa lógica. Así que, ¡hazlo bien! Haga sólo su inicialización (como variables, comprobaciones de parámetros externos, etc.) en OnInit( ) y todo lo demás en OnTick().
 
FMIC:
Usted NO debería estar haciendo todo eso en el OnInit (). Usted debe estar haciendo toda esa lógica (incluyendo la recuperación) en el OnTick(). Esto es importante. Hacerlo en OnInit( ) te causará más problemas que no has previsto y dejará tu EA en un estado de "inicialización" mientras haces toda esa lógica. Así que, ¡hazlo bien! Haga sólo su inicialización (como variables, comprobaciones de parámetros externos, etc.) en OnInit( ) y todo lo demás en OnTick().

¡No no no! No he podido explicarme, lo siento, estoy ejecutando todo en el OnTick. pero simplemente he comprobado si este tick pertenece a una nueva barra y hago mi plantilla. Lo que ejecuto en OnInit es, volver a encontrar las órdenes y el patrón que calculé antes, recalcularlo. He dicho que esto se ejecuta en OnInit, encontrar mi patrón que actualmente abierto orden es pertenecer a.

Espero poder explicarlo.

 
paranoyakX:

¡No no no! No he podido explicarme, lo siento, estoy ejecutando todo en el OnTick. pero simplemente he comprobado si este tick pertenece a una nueva barra y hago mi plantilla. Lo que ejecuto en OnInit es, volver a encontrar las órdenes y el patrón que calculé antes, recalcularlo. He dicho que esto se ejecuta en OnInit, encontrar mi patrón que actualmente abierto orden es pertenecer a.

Espero poder explicarme.

Sí, lo he entendido en tu post. Lo que estoy diciendo es que NO hagas eso en el OnInit(). Deberías encontrar tus órdenes y patrones y todo ese cálculo en el OnTick().

Solo define una variable estática local en OnTick() y haz todo tu chequeo y definición de patrones, y luego pon la variable a false.

void OnTick()
{
   static bool FirstOnTick = true;

   if( FirstOnTick )
   {
      // Check Orders, Patterns, whatever

      FirstOnTick = false;
   }

   // Here you do your normal OnTick handling
}
 
FMIC:

Sí, lo he entendido en tu post. Lo que estoy diciendo es que NO hagas eso en el OnInit(). Deberías encontrar tus órdenes y patrones y todo ese cálculo en el OnTick().

Solo define una variable estática local en OnTick() y haz todo tu chequeo y definición de patrones, y luego pon la variable a false.

Lo siento entonces, te entendí mal antes. ¿Por qué no hago eso en OnInit? ¿No es más conveniente? Cuando hago eso, por cada tick después del primero, estaré ejecutando una sentencia if que no será verdadera cada vez. Pensé que la carga innecesaria en el código.

¿No es la razón de ser de OnInit, para inicializar algo como mis variables globales?

 
paranoyakX:

Espero poder explicarlo.

Creo que necesitamos ver algo de código para estar seguros de lo que estás hablando. Por ejemplo, no está claro si estás buscando el patrón histórico que generó una operación abierta existente porque (a) eso te dice cómo gestionar la operación abierta, dónde/cuándo cerrarla, etc., o (b) sólo para dibujar algunos marcadores en el gráfico explicándote por qué se abrió la operación existente.

En general, estoy de acuerdo con FMIC en que se debe tratar de hacer todo lo posible en OnTick(), y mantener el menor estado posible en las variables globales.

 
paranoyakX:

Lo siento entonces, te entendí mal antes. ¿Por qué no hago ese OnInit? ¿No es más conveniente? Cuando hago eso, por cada tick después del primero, estaré ejecutando una sentencia if que no será verdadera cada vez. Pensé que la carga innecesaria en el código.

¿No es la razón de ser de OnInit, para inicializar algo como mis variables globales?

No, no es correcto hacer eso en el OnInit () porque estarás retrasando la ejecución de la inicialización y no, las variables estáticas mantendrán su estado por lo que sólo estarás haciendo las comprobaciones "una vez", no en cada OnTick(). El "if( FirstOnTick )" es muy rápido y tiene muy poca carga, especialmente en comparación con el resto de tu código que se ejecuta en el OnTick().
 

gracias por el consejo, aquí está una versión muy simple de mi código, esto no es mi código real, pero espero que esto sea más claro.

como he dicho esto no es el código real, encontrar el patrón etc es sólo un ejemplo. la razón por la que abrí este hilo es la función DetectExistingPattern()

//+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100;


int OnInit()
  {
//---
   DetectExistingPattern();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar=0;
double HighestValue, LowestValue;

void OnTick()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

    if (LastBar == Bars) return;
    LastBar = Bars;

    if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
  for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
    if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true;
  };
  return false;

};


bool CheckTrendPattern(){
 
  for(int i=10; i>=1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[10];
  LowestValue  = Low[1];
  
  return true;
};



void PlaceOrders(){  
    int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
  // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
  // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
  // I will find opened order and find the previos pattern that cause me to open that order.
};