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 44

 

Portanto, esperemos que a forma final da função.

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 :

Portanto, esperemos que a forma final da função.

Dr.Vasgenich :

Portanto, esperemos que a forma final da função.

Acho que Tim = Time[0] seria melhor colocado depois do loop ...porque pedir Time[0] é feito em todas as barras visíveis - não é racional.
 
Boeing747 :
Acho que Tim = Time[0] seria melhor colocado depois do loop ...porque pedir Time[0] é feito em todo o número de barras visíveis - não é racional.
Obrigado pela correção. O número de erros cresce exponencialmente à noite))))
 
dr.Vasgenich :
Obrigado pela correção. O número de erros cresce exponencialmente à noite))))
exponencialmente )). no entanto, eu também deveria ir para a cama. se você precisar de alguma coisa, me avise)))
 
Boa tarde. Você sabe se é possível alterar os parâmetros indicadores em mql4?
A idéia é simples: o indicador ZigZag está instalado no gráfico. O roteiro deve ser escrito e a tecla de atalho deve ser afixada a ele. Ao pressioná-lo, os parâmetros em ziguezague serão alterados no gráfico.
 

Continuando o tópico atual de encontrar um filtro de alta volatilidade. Aqui está o código de um filtro existente da 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;
   }

Aqui está a própria função:

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);
}

Assim, a função verifica os valores das duas barras anteriores e, se forem muito grandes, retorna VERDADEIRO. A questão é como melhorá-la: fazer esta função procurar velas grandes em mais velas. Por exemplo, 24.

 
satorifx :
Boa tarde. Você sabe se é possível alterar os parâmetros indicadores em mql4?
A idéia é simples: o indicador ZigZag está instalado no gráfico. O roteiro deve ser escrito e a tecla de atalho deve ser anexada a ele. Assim que eu pressioná-lo, os parâmetros ZigZag mudarão no gráfico.
Existe essa possibilidade.
 

Fiz um Expert Advisor caseiro para testar o comércio, mas não consigo descobrir uma coisa...

A baía/venda é aberta usando o máximo e mínimo MAs

// Condição para abrir posição de compra
if(MA_L1<MA_L0&&Ask<=MA_L0&MA_0>MA_1&&HA_up>HA_dw)

// Condição para abrir uma posição de VENDA
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);
  }
Pergunta: Se a posição na vela atual não estiver fechada (as condições não chegaram), como fechá-la na próxima vela, quando ela corresponder a MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 );

Temos uma condição de fechamento: cruzar o alto ou o baixo da vela atual, mas precisamos da posição para fechar na próxima vela depois que ela for aberta.

Podemos escrever se ( NormalizeDouble ( MathAbs (MA_0-Ask), Dígitos )< Ponto ), mas como preencher a condição da segunda vela aberta.


Se você puder responder com código, o exemplo é mais claro.
 
Zhunko :
Existe essa possibilidade.

Obrigado pela resposta incrivelmente detalhada.

Você realmente precisa ser um espertalhão para entender que se uma nova pessoa chega ao fórum com uma pergunta, ela precisa de uma solução específica ou um link para algo semelhante, não uma desculpa idiota de que "tudo é possível"?

 
satorifx :

Obrigado pela resposta incrivelmente detalhada.

Você realmente precisa ser um espertalhão para entender que se uma nova pessoa chega ao fórum com uma pergunta, ela precisa de uma solução específica ou um link para algo semelhante, não uma desculpa idiota de que "tudo é possível"?

As pessoas que estão tentando fazer algo por conta própria conseguem ajuda aqui. Eles o guiam na direção certa, explicam, etc. ...

Você fez uma pergunta e obteve uma resposta. Você mesmo já tentou começar a escrever alguma coisa?

Ao fazer uma pergunta em um determinado formato, primeiro pense que tipo de resposta você chegará ao formato da pergunta...

Razão: