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

 

Así que, espero que la forma final de la función.

double ATR_Max() {
int i;
double m;
datetime tim;
iATR_H1_PER = 15;// период
if ( tim != Time[0] ) {  
while( i < WindowBarsPerChart() ) {
double a = iATR( NULL, 0, iATR_H1_PER, i );
   if ( m < a ) {
   m = a;
   }
   i++;
   tim = Time[0];
  }
}
Alert( " Максимальное значение ATR для видимого количества баров равно - ", m );
return(m);
} 
 
dr.Vasgenich :

Así que, espero que la forma final de la función.

Dr.Vasgenich :

Así que, espero que la forma final de la función.

Creo que tim = Time[0] estaría mejor colocado después del bucle ...porque preguntar a Time[0] se hace en todas las barras visibles - no es racional.
 
Boeing747 :
Creo que tim = Time[0] estaría mejor colocado después del bucle ...porque preguntar a Time[0] se hace en todo el número de barras visibles - no es racional.
Gracias por la corrección. El número de errores crece exponencialmente en la noche))))
 
dr.Vasgenich :
Gracias por la corrección. El número de errores crece exponencialmente en la noche))))
exponencialmente )). sin embargo, yo también debo ir a la cama. si necesitas algo, házmelo saber))
 
Buenas tardes. ¿Sabes si es posible cambiar los parámetros del indicador sobre la marcha en mql4?
La idea es sencilla: el indicador ZigZag se instala en el gráfico. Hay que escribir el script y adjuntarle la tecla de acceso rápido, que al pulsarla cambiará los parámetros del zigzag en el gráfico.
 

Continuando con el tema actual de encontrar un filtro de alta volatilidad. Este es el código de un filtro existente de WSR

extern string ____ = "Фильтр волатильности";
extern bool VolatilityFilter              = FALSE;
extern int VolaFilter                     = 25; //--- (15 1 30)
double pp;
double pd;

int init()

   if (Digits < 4) {
      pp = 0.01;
      pd = 2;
   } else {
      pp = 0.0001;
      pd = 4;
   }

Esta es la función propiamente dicha:

bool CheckVolatility() {
   double HeightFilter_a = NormalizeDouble(VolaFilter * pp, pd);
   bool restrict = false;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M5, 1) - iLow(NULL, PERIOD_M5, 1), pd) > HeightFilter_a) restrict = true;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M5, 2) - iLow(NULL, PERIOD_M5, 2), pd) > HeightFilter_a) restrict = true;
   return (restrict);
}

Así, la función comprueba los valores de las dos barras anteriores y si son demasiado grandes, devuelve TRUE. La cuestión es cómo mejorarla bien y hacer que busque grandes velas en más velas. Por ejemplo, 24.

 
satorifx :
Buenas tardes. ¿Sabes si es posible cambiar los parámetros del indicador sobre la marcha en mql4?
La idea es sencilla: el indicador ZigZag se instala en el gráfico. Hay que escribir el script y adjuntarle la tecla de acceso rápido. En cuanto la pulse, los parámetros de ZigZag cambiarán en el gráfico.
Existe esa posibilidad.
 

Hice un Asesor Experto casero para probar el comercio, pero no puedo averiguar una cosa...

La bahía/venta se abre usando las MAs máximas y mínimas

// Condición para abrir la posición de COMPRA
if(MA_L1<MA_L0&&Ask<=MA_L0&MA_0>MA_1&&HA_up>HA_dw)

// Condición para abrir una posición de VENTA
if(MA_H1>MA_H0&&Bid>=MA_H0&MA_0<MA_1&HA_up<HA_dw)

#include <b-Lots.mqh>
extern double TrailingStop = 30;
extern double Sploss = 15;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double HA_up,HA_dw;
   double MA_H0,MA_H1,MA_L0,MA_L1,MA_0,MA_1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   MA_H0=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,0);
   MA_H1=iMA(0,0,3,0,MODE_SMA,PRICE_HIGH,1);
   MA_0=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,0);
   MA_1=iMA(0,0,3,0,MODE_EMA,PRICE_MEDIAN,1);
   MA_L0=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,0);
   MA_L1=iMA(0,0,3,0,MODE_SMA,PRICE_LOW,1);
   HA_up=iCustom(0,0,"Heiken Ashi",3,0);
   HA_dw=iCustom(0,0,"Heiken Ashi",2,0);

//задали все данные 

   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(MA_L1<MA_L0&&Ask<=MA_L0&&MA_0>MA_1&&HA_up>HA_dw)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Bid-Sploss*Point,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(MA_H1>MA_H0&&Bid>=MA_H0&&MA_0<MA_1&&HA_up<HA_dw)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Ask+Sploss*Point,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
           if(NormalizeDouble (MathAbs(MA_H0-Bid),Digits)<Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            // трейлинг-стоп для длинной позиции
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
           if(NormalizeDouble (MathAbs(MA_L0-Ask),Digits)<Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            // трейлинг-стоп для короткой позиции
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Pregunta: La posición en la vela actual no está cerrada (las condiciones no han llegado). Cómo cerrarla en la siguiente vela, cuando coincide con MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 );

Tenemos una condición para cerrarla: cruzar el máximo o el mínimo de la vela actual, pero necesitamos que la posición se cierre en la siguiente vela después de abrirla.

Podemos escribir if ( NormalizeDouble ( MathAbs (MA_0-Ask), Digits )< Point ), pero cómo cumplir la condición de la segunda vela abierta.


Si puedes responder con código, el ejemplo es más claro.
 
Zhunko :
Existe esa posibilidad.

Gracias por la respuesta increíblemente detallada.

¿De verdad hay que ser un listillo para entender que si una persona nueva llega al foro con una pregunta, necesita una solución concreta o un enlace a algo similar, no una excusa tonta de que "todo es posible"?

 
satorifx :

Gracias por la respuesta increíblemente detallada.

¿Realmente hay que ser un listillo para entender que si una persona nueva llega al foro con una pregunta, necesita una solución concreta o un enlace a algo similar, no una excusa tonta de que "todo es posible"?

Las personas que intentan hacer algo por su cuenta reciben ayuda aquí. Te guían en la dirección correcta, te explican, etc. ...

Hiciste una pregunta y obtuviste una respuesta. ¿Ha intentado empezar a escribir algo usted mismo?

Cuando hagas una pregunta con un formato determinado, piensa primero en el tipo de respuesta que obtendrás al formato de la pregunta...