Análise de barras ao contrário na EA - página 2

 
FMIC:

Não há OnStart() nas EA's, mas entendi o que você quis dizer. Entretanto, o OP mesmo em resposta aos seus comentários disse e cito:

Sim, eu quis dizer OnTick(). Você ainda está atribuindo demasiada importância ao "enquanto a EA estiver funcionando". Isso não significa necessariamente, ou mesmo o mais plausível, "enquanto a EA estiver executando seu OnTick()", ao invés de "enquanto a EA estiver anexada a um gráfico, ou seja, durante toda sua vida útil".

Precisamos de mais informações do paranoyakX.

 
jjc:

Sim, eu quis dizer OnTick(). Você ainda está atribuindo demasiada importância ao "enquanto a EA estiver funcionando". Isso não significa necessariamente, ou mesmo o mais plausível, "enquanto a EA estiver executando seu OnTick()", em vez de "enquanto a EA estiver anexada a um gráfico, ou seja, durante toda sua vida útil".

Precisamos de mais informações do paranoyakX.

Oi, pessoal,

deixe-me esclarecer isto. Meu código está procurando um padrão muito básico nas barras anteriores e decidirei se um pedido será aberto, mas a abertura de um novo pedido será verificada somente quando uma nova barra surgir. o que eu quero dizer é que estou esperando a última barra fechar, então verifique o padrão se está tudo bem, eu abrirei o pedido. então a abertura de um pedido está acontecendo na abertura de uma nova barra. como @jjc disse, estou mantendo informações básicas do padrão em variáveis globais, como quando meu padrão começou e terminou, qual é o valor mais alto e mais baixo, etc.

De alguma forma, se eu tiver que executar EA novamente, quero encontrar essas informações básicas novamente (barra de início e fim de padrão, preço mais alto, mais baixo etc.) e preencher minhas variáveis globais novamente, é por isso que eu preciso disso. Vou usar as informações de início e fim para decidir quando fechar meu pedido. portanto, é suficiente se uma nova barra não surgir no OnInit, enquanto a EA estiver funcionando, não é um problema.

 
jjc:

Sim, eu quis dizer OnTick(). Você ainda está atribuindo demasiada importância ao "enquanto a EA estiver funcionando". Isso não significa necessariamente, ou mesmo o mais plausível, "enquanto a EA estiver executando seu OnTick()", ao invés de "enquanto a EA estiver anexada a um gráfico, ou seja, durante toda sua vida útil".

Precisamos de mais informações do paranoyakX.

Sim! Você está certo! A partir das últimas informações do OP, ele definitivamente está executando tudo no OnInit() e não no OnTick(). Eu assumi incorretamente que o OP estava fazendo as coisas um pouco mais corretamente. Nunca me ocorreu que toda sua lógica estivesse no OnInit().
 
paranoyakX:

Oi, pessoal,

deixe-me esclarecer isto. Meu código está procurando um padrão muito básico nas barras anteriores e decidirei se um pedido será aberto, mas a abertura de um novo pedido será verificada somente quando uma nova barra surgir. o que eu quero dizer é que estou esperando a última barra fechar, então verifique o padrão se está tudo bem, eu abrirei o pedido. então a abertura de um pedido está acontecendo na abertura de uma nova barra. como @jjc disse, estou mantendo informações básicas do padrão em variáveis globais, como quando meu padrão começou e terminou, qual é o valor mais alto e mais baixo, etc.

De alguma forma, se eu tiver que executar EA novamente, quero encontrar essas informações básicas novamente (barra de início e fim de padrão, preço mais alto, mais baixo etc.) e preencher minhas variáveis globais novamente, é por isso que eu preciso disso. Vou usar as informações de início e fim para decidir quando fechar meu pedido. portanto, é suficiente se uma nova barra não surgir no OnInit, enquanto a EA estiver funcionando, não é um problema.

Você NÃO deveria estar fazendo tudo isso no OnInit(). Você deveria estar fazendo toda essa lógica (incluindo a recuperação) no OnTick(). Isto é importante! Fazê-lo no OnInit() lhe causará mais problemas que você não previu e deixará sua EA em um estado de "inicialização" enquanto você estiver fazendo toda essa lógica. Portanto, faça-o corretamente! Faça apenas sua inicialização (tais como variáveis, verificações de parâmetros externos, etc.) no OnInit() e tudo mais no OnTick().
 
FMIC:
Você NÃO deveria estar fazendo tudo isso no OnInit(). Você deveria estar fazendo toda essa lógica (incluindo a recuperação) no OnTick(). Isto é importante! Fazê-lo no OnInit() lhe causará mais problemas que você não previu e deixará sua EA em um estado de "inicialização" enquanto você estiver fazendo toda essa lógica. Portanto, faça-o corretamente! Faça apenas sua inicialização (tais como variáveis, verificações de parâmetros externos, etc.) no OnInit() e tudo mais no OnTick().

Não, não, não! Eu não consegui explicar o quanto lamento, estou administrando tudo no OnTick. mas simplesmente verifiquei se este carrapato pertence a um novo bar e faço meu pessoal. O que eu corro no OnInit é, reencontrar as ordens e o padrão que eu calculei antes, recalculá-lo. Eu disse que isto está rodando no OnInit, encontrei meu padrão a que a ordem atualmente aberta pertence.

Espero poder explicar.

 
paranoyakX:

Não, não, não! Eu não consegui explicar o quanto lamento, estou administrando tudo no OnTick. mas simplesmente verifiquei se este carrapato pertence a um novo bar e faço meu pessoal. O que eu corro no OnInit é, reencontrar as ordens e o padrão que eu calculei antes, recalculá-lo. Eu disse que isto está rodando no OnInit, encontrei meu padrão a que a ordem atualmente aberta pertence.

Espero poder explicar.

Sim, eu entendi isso em seu posto! O que estou dizendo é NÃO FAÇA isso no OnInit(). Você deve encontrar suas ordens e padrões e todo esse cálculo no OnTick().

Basta definir uma variável estática local no OnTick() e fazer toda a sua verificação e definição de padrões, e então definir a variável como falsa.

void OnTick()
{
   static bool FirstOnTick = true;

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

      FirstOnTick = false;
   }

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

Sim, eu entendi isso em seu posto! O que eu estou dizendo é NÃO fazer isso no OnInit(). Você deve encontrar suas ordens e padrões e todo esse cálculo no OnTick().

Basta definir uma variável estática local no OnTick() e fazer toda a sua verificação e definição de padrões, e então definir a variável como falsa.

Desculpe então, eu o entendi mal antes. Por que eu não faço isso no OnInit ? Não é mais conveniente? Quando eu faço isso, para cada tick depois do primeiro, eu estarei correndo e se a declaração não for verdadeira todas. Pensei que o código era carregado desnecessariamente.

não é a razão pela qual o OnInit existe, para inicializar algo como minhas variáveis globais ?

 
paranoyakX:

Espero poder explicar.

Creio que precisamos ver algum código para ter certeza do que você está falando. Por exemplo, não está claro se você está procurando o padrão histórico que gerou um comércio aberto existente porque (a) que lhe diz como administrar o comércio aberto, onde/quando fechá-lo etc, ou (b) apenas para desenhar alguns marcadores no gráfico explicando a você mesmo porque o comércio existente foi aberto.

Eu geralmente concordo com a FMIC que você deve tentar fazer o máximo possível em OnTick(), e manter o menor estado possível em variáveis globais.

 
paranoyakX:

Desculpe então, eu o entendi mal antes. Por que eu não faço isso no OnInit ? Não é mais conveniente? Quando eu faço isso, para cada tique depois do primeiro, eu estarei correndo e se a declaração não for verdadeira a cada tique, eu estarei correndo. Pensei que o código era carregado desnecessariamente.

não é a razão pela qual o OnInit existe, para inicializar algo como minhas variáveis globais ?

Não, não é correto fazer isso no OnInit( ) porque você estará atrasando a execução da Inicialização e não, as variáveis estáticas manterão seu estado, portanto você só estará fazendo as verificações "uma vez", não em cada OnTick(). O "if( FirstOnTick )" é muito rápido e tem muito pouca carga, especialmente em comparação com todo seu outro código que está rodando no OnTick().
 

obrigado pelo conselho, aqui está uma versão muito simples do meu código, este não é meu código real, mas espero que isto seja mais claro.

como eu disse que este não é o código real, encontrar padrão etc. é apenas um exemplo. a razão pela qual abri este tópico é a função 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.
};