Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1351

 
MakarFX:

mql4 también es posible aquí

No creo que sea eso. El Asesor Experto crea un objeto gráfico en forma de línea de tendencia:

   if(PriceDemUp2() != 0 && PriceDemUp1() != 0)
      CreateLine(trendUp, TimeDemUp2(), PriceDemUp2(), TimeDemUp1(), PriceDemUp1(), TrendUpColor);
   if(PriceDemDw2() != 0 && PriceDemDw1() != 0)
      CreateLine(trendDw, TimeDemDw2(), PriceDemDw2(), TimeDemDw1(), PriceDemDw1(), TrendDwColor);

Pero después de reiniciar el terminal, sólo están disponibles los parámetros del primer punto. Los parámetros del punto anterior sólo aparecerán después de que se forme el nuevo punto. Creo que empiezo a entender: necesito encontrar no sólo el último punto calculado por el indicador sino también el anterior. ¿Cómo puedo saltar el último (primer) punto y calcular el siguiente? El primer punto lo encuentro así:

int BarPointDemUp()
{
   int i;
   
   for(i = 0; i < 70; i++)
   {   
      if(iCustom(NULL, 0, "DeMark Point", LevelDP, 0, i) != 0)
         return(i);
   }
   return(-1);   
}
//////////////////////////////////////
int BarPointDemDw()
{
   int i;
   
   for(i = 0; i < 70; i++)
   {   
      if(iCustom(NULL, 0, "DeMark Point", LevelDP, 1, i) != 0)
         return(i);
   }
   return(-1);
 
Youri Lazurenko:

No me parece que ese sea el caso. El EA crea un objeto gráfico en forma de línea de tendencia:

Pero después de reiniciar el terminal sólo están disponibles los parámetros del primer punto. Los parámetros del punto anterior sólo aparecerán después de la formación de un nuevo punto. Creo que empiezo a entender: necesito encontrar no sólo el último punto calculado por el indicador sino también el anterior. ¿Cómo puedo saltar el último (primer) punto y calcular el siguiente? El primer punto lo encuentro así:

Pon un contador.

int BarPointDemUp()
{
   int i;
   int c=0;
   for(i = 0; i < 70; i++)
   {   
      if(iCustom(NULL, 0, "DeMark Point", LevelDP, 0, i) != 0)
       c++;
        if(c==2)  return(i);
   }
   return(-1);   
}

En general, se crea una matriz y se llena, luego se toma el punto requerido de la matriz

 
Vitaly Muzichenko:

Establecer un contador

Y en general, hacer un array y llenarlo, luego tomar el punto deseado del array.

Gracias. Me parece que el contador que has proporcionado es justo lo que necesitamos y, sobre todo, sencillo.

Mientras se actualizaba el sitio, probé la variante que sugieres. Todo funciona. Muchas gracias. Así de simple, y yo empezaba a meterme en el ajo. Además, se han simplificado las funciones de precio y tiempo anteriores.

 
MakarFX:

Subrayé lo que estaba mal

el resaltado amarillo es innecesario y puede ser eliminado.

La función resaltada en verde debe estar fuera de OnStart(),

donde quiera definir una nueva barra, utilice el resalte marrón.

Gracias)

 

Buenos días a todosJ Por favor, ayúdame a encontrar un código de trabajo de trailing stop en parabólica. Quiero preguntar cómo debería añadirse esta función a mi Asesor Experto, para que siga el rastro cuando el precio suba una determinada cantidad de puntos. Agradeceré de antemano, y pediré a las personas experimentadas y conocedoras que no pasen de largo - el Grial tengo que terminarlo de alguna manera ;-)

 
DanilaMactep:

Buenos días a todosJ Por favor, ayúdame a encontrar un código de trabajo de trailing stop en parabólica. Quiero preguntar cómo debería añadirse esta función a mi Asesor Experto, para que siga el rastro cuando el precio suba una determinada cantidad de puntos. Muchas gracias de antemano, y por favor, no pasen por personas experimentadas y conocedoras - debería añadir de alguna manera el Grial ;-)

así

//+------------------------------------------------------------------+
   int    Tral = 50;
   double Sar  = iCustom(_Symbol,Period(),"Parabolic",0.02,0.2,0);
//+------------------------------------------------------------------+
   for(int pos=0;pos<OrdersTotal();pos++)
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==_Symbol)
        {
         if(OrderType()==OP_SELL)
           {
            if(OrderOpenPrice()>Ask+Tral*Point&&OrderStopLoss()!= Sar)
            if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Sar,Digits),OrderTakeProfit(),0,clrNONE))
            {Print("Order SELL Modify")}
           }
         if(OrderType()==OP_BUY)
           {
            if(OrderOpenPrice()<Bid-Tral*Point&&OrderStopLoss()!= Sar)
            if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Sar,Digits),OrderTakeProfit(),0,clrNONE))
            {Print("Order BUY Modify")}
           }
        }
 

Me pueden decir cómo actualizar el día del mes para reflejar el nuevo día del año.


   datetime time_current=TimeCurrent();
   MqlDateTime time_structure;
   TimeToStruct(time_current,time_structure);
   int curr_day_year=time_structure.day_of_year;
   int start_day=(curr_day_year-m_days_back)>0?curr_day_year-m_days_back:0;
   time_structure.day_of_year=start_day;
   time_structure.hour=0;
   time_structure.min=0;
   time_structure.sec=0;
   datetime start_time=StructToTime(time_structure);

Entonces, pensé que el start_time sería con el día del año cambiado. Pero está la vieja fecha...

Hmm... probablemente sea más fácil quitarle segundos...

 
leonerd:

No puedo pensar ahora, te daré un ejemplo, tal vez te hagas una idea

//получаем номер недели в году
int GetWeekNumber(datetime eTime)
   {
   MqlDateTime eDate;
   //получаем дату начала года
   TimeToStruct(eTime,eDate);
   eDate.mon=1;
   eDate.day=1;
   eDate.hour=0;
   eDate.min=0;
   eDate.sec=0;
   datetime StartTime=StructToTime(eDate);
   //возвращаем дату назад в структуру, чтобы определить день недели начала года
   TimeToStruct(StartTime,eDate);
   return(int((eTime-StartTime+86400*eDate.day_of_week)/604800));
   }

una idea https://www.mql5.com/ru/users/integer

Dmitry Fedoseev
Dmitry Fedoseev
  • www.mql5.com
Профиль трейдера
 
MakarFX:

así

Makar, muchas gracias por el código - he reescrito el código pasando variables externas a icastom en lugar de valores fijos. Por favor, aclare, ¿es intTral = 50; es la distancia a la que se mantendrá la red de arrastre o es la distancia en pips tras la cual se activará la red de arr astre?

 
DanilaMactep:

Makar, muchas gracias por el código - he reescrito el código pasando variables externas a icastom en lugar de valores fijos. Por favor, aclare, es intTral = 50; ¿es la distancia de ganancia en pips después de la cual se enciende la red de arrastre ?

es la distancia de ganancia en pips después de la cual se enciende la red de arrastre