Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 175

 

A EA sai em 33 bares após uma troca:

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (Time[33]>t) 
          {                                      
          Cls_B=true;              
          }

No real e no testador, ele saiu em 43 barras. Tentei definir os parâmetros de saída na quinta barra, tudo é normal. Na sua opinião, qual pode ser o problema?

 
Forexman77:

A EA sai em 33 bares após uma troca:

No real e no testador, ele saiu em 43 barras. Tentei definir os parâmetros de saída na quinta barra, tudo é normal. Na sua opinião, qual pode ser o problema?


Talvez se (condição) fosse executada várias vezes (mais uma vez a 10 bares, por exemplo) e esta execução atrasasse a vida útil?

 
ALXIMIKS:


Talvez se (condição) fosse executada várias vezes (mais uma vez a 10 barras, por exemplo) ? e esta execução atrasasse o tempo de vida

Uma profissão: entrada 15:37, saída 16:19. Saída na barra 41, para ser mais correto.
 
Forexman77:
Uma profissão: entrada 15:37, saída 16:19. Saída a 41 barras, para ser mais correto.


E se o substituirmos por iBarShift, eu me pergunto se o erro permanecerá ??? Talvez barras em falta na história (certamente não há buracos?) ?

Depois que a condição for preenchida, entre nas barras abertas, veja quantas delas realmente se abriram, pois a referência ao horário não é muito correta.

 
ALXIMIKS:


Se o substituirmos por iBarShift, eu me pergunto se o erro permanecerá? Talvez haja barras de saltar na história (certamente não há buracos?) ?

Depois que a condição for preenchida, entre em uma contagem de barras abertas e veja quantas barras estão realmente abertas, porque a referência ao tempo não parece correta

O código deveria ser assim?

static datetime t;
datetime s=Time[33]>t;

if (условие)
    {
      Opn_B = true; 
      t=Time[0];
      int shif= iBarShift(Symbol(),PERIOD_M1,t,false);
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),PERIOD_M1,s,false)) 
    {                                      
     Cls_B=true;              
    }

Este tipo de código irá bloquear o Expert Advisor.

 

Olá, você pode me ajudar a fazer o alerta passar uma vez por barra em cada linha, e não apenas na primeira,

Limitei o número de alertas por tempo, mas não entendo como fazer um buffer para uma barra

 datetime LastAlertTime = 0;
int start()
  {

  string namesymb=Symbol();
  string tf=Period();

       for(int i = ObjectsTotal()-1; i >= 0; i--)
      {
         string name = ObjectName(i);
         
         if(ObjectType(name) == OBJ_TREND)
         {
            double value = ObjectGetValueByShift(name, 0);                    
             if(Bid <= value + Point && Bid >= value - Point)          
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(namesymb,"  M",tf,"   ",name);
             }
                Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",tf,"   ",name); 
            } 
         }      
}
 
Forexman77:

A EA sai em 33 bares após uma troca:

No real e no testador, ele saiu em 43 barras. Tentei definir os parâmetros de saída na quinta barra, tudo é normal. Qual você acha que pode ser o problema?


Vamos começar com a cabeça fria.

A hora da bandeira Opn_B = true não significa nada, porque a ordem pode não abrir no mesmo segundo.

Você pode usar o tempo de abertura do pedido OrderOpenTime, ou pode atribuir à variável t o valor do tempo após a abertura bem sucedida.

A seguir: você já usou

minimum = iLow(Symbol(),Period(),0);

1) Você precisa de iLow, ou seria melhor usar apenas Low, se você usar a mesma moeda e o mesmo cronograma?

2) Os valores de Símbolo() e Período() são melhores para serem colocados em variáveis quando usados repetidamente. Tudo afeta o desempenho - habitue-se a ele.

A tabela de minutos - se por um minuto não houve um único tique - uma nova barra não é desenhada (pode ser um truque).

E quanto ao iBarShift?

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),1,t,false)>33) 
          {                                      
          Cls_B=true;              
          }

O mais adequado no momento parece ser

if ((TimeCurrent-t)/60)>33) Cls_B=true;
 
oleksaz:

Olá, você pode me ajudar a fazer o alerta passar uma vez por barra em cada linha, e não apenas na primeira,

Limitei o número de alertas por tempo, mas não entendo como proteger uma barra

string namesymb=Symbol();
string tf=Period();

Vale a pena re-valorizar as variáveis a cada tick?

A string tf = Period() afeta o desempenho em execuções de loop 1000000 ou é int tf = Period() mais correto? Eu não me conheço.

 if(Bid <= value + Point && Bid >= value - Point)  

Esta condição é correta? E se o loop tiver 4 picos?

if (LastAlertTime < Time[0])
LastAlertTime = Time[0];
          

Aqui temos mais um problema. Ou seja, se a condição para a primeira linha se mantiver, será obviamente falsa para a segunda e o alerta não surgirá,

Ela nem mesmo aparecerá no próximo tique, porque o tempo de abertura da vela só mudará com a chegada de uma nova.

 
ALXIMIKS:


A opção mais apropriada no momento parece ser


Desculpe, mas tentar calcular o número de barras por tempo é uma abordagem muito inadequada.
 
ALXIMIKS:

Vale a pena recodificar as variáveis a cada tick?

A string tf = Period() afeta o desempenho em execuções de loop 1000000, ou a int tf = Period() é mais correta? Eu não me conheço.

Esta condição é correta? E se o loop tiver 4 picos?

Aqui temos mais um problema. Isto é, se a condição para a primeira linha se mantiver, será obviamente falsa para a segunda e o alerta não surgirá,

Ela nem mesmo aparecerá no próximo tique, porque o tempo de abertura da vela só mudará com a chegada de uma nova.


int start()
  {
string scrdate,nametf;

        if (Period()==PERIOD_M1)  nametf="9_M1";
        if (Period()==PERIOD_M5)  nametf="8_M5";
        if (Period()==PERIOD_M15) nametf="7_M15";
        if (Period()==PERIOD_M30) nametf="6_M30";
        if (Period()==PERIOD_H1)  nametf="5_H1";
        if (Period()==PERIOD_H4)  nametf="4_H4";
        if (Period()==PERIOD_D1)  nametf="3_D1";
        if (Period()==PERIOD_W1)  nametf="2_W1";
        if (Period()==PERIOD_MN1) nametf="1_Monthly";
/////////////////  
       for(int i = ObjectsTotal()-1; i >= 0; i--)//мониторим все объекты
      {
         string name = ObjectName(i);//имя объектов берем из i переменной
         
         scrdate=StringConcatenate(Symbol()," ",TimeToStr(TimeCurrent(), TIME_DATE),"_",Hour(),".",Minute()," ",nametf," ",".jpg");//,name

         if(ObjectType(name) == OBJ_TREND)//отбираем тип по имени 
         {
            double value = ObjectGetValueByShift(name, 0);//функция для объектов
            
            Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",Period(),"   ",name);           
            
             if(Bid <= value + Point && Bid >= value - Point)
             
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(Symbol(),"  M",Period(),"   ",name);
               /////////////////////////////////////////////////
               WindowScreenShot(scrdate,1920,1200,0,-1,-1);
               ////////////////////////////////////////////////////////
             }               
            }
         }
}
   return(0);
  }

1. removido

2. eu concordo se a lacuna não for um sinal (deve ser) sem sinal -> sem preço -> sem comércio

3. Isto é o que eu disse acima, mas o que fazer

PS obrigado pela resposta