Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 175

 

El EA sale en 33 barras después de una operación:

static datetime t;

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

En el real y en el probador salió en 43 barras. He intentado establecer los parámetros de salida en la quinta barra, todo es normal. En su opinión, ¿cuál puede ser el problema?

 
Forexman77:

El EA sale en 33 barras después de una operación:

En el real y en el probador salió en 43 barras. He intentado establecer los parámetros de salida en la quinta barra, todo es normal. En su opinión, ¿cuál puede ser el problema?


¿Quizás si (condición) se ejecutó varias veces (una vez más a las 10 barras, por ejemplo) y esta ejecución retrasó el tiempo de vida?

 
ALXIMIKS:


Tal vez si (condición) se ejecutó varias veces (una vez más a las 10 barras por ejemplo) ? y esta ejecución retrasó el tiempo de vida

Una operación: entrada 15:37, salida 16:19. Salir en la barra 41, para ser más correctos.
 
Forexman77:
Una operación: entrada 15:37, salida 16:19. Salir a las 41 barras, para ser más correctos.


Y si lo sustituimos por iBarShift me pregunto si el error se mantendrá ??? ¿Tal vez faltan barras en la historia (seguramente no hay agujeros?)?

Una vez cumplida la condición, entre en las barras abiertas, vea cuántas de ellas se han abierto realmente, porque referirse a la hora no es muy correcto.

 
ALXIMIKS:


Si lo sustituimos por iBarShift me pregunto si el error se mantendrá. ¿Tal vez haya barras de salto en la historia (seguramente no hay agujeros?)?

Después de que se cumpla la condición, introduzca un recuento de barras abiertas y vea cuántas barras están realmente abiertas, porque referirse al tiempo no parece correcto

¿El código debería ser así?

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 bloqueará el Asesor Experto.

 

Hola, pueden ayudarme a que la alerta pase una vez por barra en cada línea, no sólo en la primera,

He limitado el número de alertas por tiempo, pero no entiendo cómo hacer un buffer para una 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:

El EA sale en 33 barras después de una operación:

En el real y en el probador salió en 43 barras. He intentado establecer los parámetros de salida en la quinta barra, todo es normal. ¿Cuál cree que puede ser el problema?


Empecemos con la cabeza despejada.

El tiempo de la bandera Opn_B = true no significa nada, porque la orden puede no abrirse en el mismo segundo.

Puede utilizar la hora de apertura de la orden OrderOpenTime, o puede asignar a la variable t el valor de la hora después de la apertura exitosa.

Siguiente: ha utilizado

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

1) ¿Necesita iLow, o sería mejor utilizar sólo Low, si utiliza la misma moneda y el mismo marco temporal?

2) Los valores de Symbol() y Period() es mejor ponerlos en variables cuando se usan repetidamente. Todo afecta al rendimiento: acostúmbrate a ello.

El gráfico de minutos - si durante un minuto no hubo un solo tick - no se dibuja una nueva barra (puede ser un truco).

¿Y qué pasa con 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;              
          }

Lo más adecuado por el momento parece ser

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

Hola, pueden ayudarme a que la alerta pase una vez por barra en cada línea, no sólo en la primera,

He limitado el número de alertas por tiempo, pero no entiendo cómo hacer un buffer para una barra

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

¿Merece la pena revalorizar las variables en cada momento?

¿Afecta la cadena tf = Period() al rendimiento para 1000000 ejecuciones del bucle o es más correcto int tf = Period()? Yo mismo no lo sé.

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

¿Esta condición es correcta? ¿Y si el bucle tiene 4 picos?

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

Aquí tenemos una cuestión más. Es decir, si la condición para la primera línea se mantiene, será obviamente falsa para la segunda y la alerta no aparecerá,

Ni siquiera aparecerá en el siguiente tick, porque la hora de apertura de la vela cambiará sólo con la llegada de una nueva.

 
ALXIMIKS:


La opción más adecuada en este momento parece ser


Lo siento, pero intentar calcular el número de barras por tiempo es un enfoque muy inadecuado.
 
ALXIMIKS:

¿Merece la pena recodificar las variables en cada momento?

¿Afecta la cadena tf = Period() al rendimiento en 1000000 ejecuciones del bucle, o es más correcto int tf = Period()? Yo mismo no lo sé.

¿Esta condición es correcta? ¿Y si el bucle tiene 4 picos?

Aquí tenemos una cuestión más. Es decir, si la condición para la primera línea se mantiene, será obviamente falsa para la segunda y la alerta no aparecerá,

Ni siquiera aparecerá en el siguiente tick, porque la hora de apertura de la vela sólo cambiará con la llegada de una nueva.


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. Eliminado

2. estoy de acuerdo si la brecha no es una señal (debe ser) no hay señal -> no hay precio -> no hay comercio

3. esto es lo que dije arriba, pero qué hacer

PD: gracias por la respuesta

Razón de la queja: