Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 44

 

Итак, надеюсь конечный вид функции.

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 :

Итак, надеюсь конечный вид функции.

dr.Vasgenich :

Итак, надеюсь конечный вид функции.

мне кажется tim = Time[0] лучше бы поставить после цикла ..а то запрос Time[0] ведется на всем количестве видимых баров - это не рационально.
 
Boeing747 :
мне кажется tim = Time[0] лучше бы поставить после цикла ..а то запрос Time[0] ведется на всем количестве видимых баров - это не рационально.
Спасибо, что поправили. Ночью количество ошибок растет с геометрической прогрессией))))
 
dr.Vasgenich :
Спасибо, что поправили. Ночью количество ошибок растет с геометрической прогрессией))))
в геометрической прогрессии )). однако мне тоже пора баиньки. если что пишите))
 
Добрый день. Подскажите, есть ли возможность в mql4 менять на лету параметры индикатора?
Задумка простая: на график установлен индикатор ZigZag. Написать скрипт, повесить на него горячую клавишу, по нажатию на которую будут меняться параметры зигзага на графике.
 

Продолжая актуальную тему по поиску фильтра высокой волатильности. Приведу код имеющегося фильтра из 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;
   }

Вот сама функция:

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

Таким образом функция проверяет значения двух предыдущих баров и если они слишком большие то функция возвращает TRUE. Вопрос, как ее красиво доработать, чтобы функция искала большие свечи на большем количестве свечей. Например 24.

 
satorifx :
Добрый день. Подскажите, есть ли возможность в mql4 менять на лету параметры индикатора?
Задумка простая: на график установлен индикатор ZigZag. Написать скрипт, повесить на него горячую клавишу, по нажатию на которую будут меняться параметры зигзага на графике.
Есть такая возможность.
 

Составил самопальный советник для тестирования торговли, но ни как не могу докумекать до одной вещи...

открытие Bay/sell происходит по максимальным и минимальным МА

// Условие открытие позиции BUY
if(MA_L1<MA_L0&&Ask<=MA_L0&&MA_0>MA_1&&HA_up>HA_dw)

// Условие открытие позиции SELL
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);
  }
Вопрос: позиция на текущей свече не закрылась (условия не наступили), как сделать чтобы сразу на следующей свече она закрылась при совпадении с MA_0= iMA ( 0, 0, 3, 0, MODE_EMA, PRICE_MEDIAN, 0 );

Есть условие закрытие : пересечение максимума либо минимума на текущей свече, но нужно еще чтобы на следующей свече после открытия позиции позиция могла закрыться.

можно прописать if ( NormalizeDouble ( MathAbs (MA_0-Ask), Digits )< Point ), но как соблюсти условие второй открытой свечи.


Если можно ответьте с кодом, с примером понятнее.
 
Zhunko :
Есть такая возможность.

Спасибо за невероятно подробный ответ.

Неужели надо быть семь пядей во лбу, чтобы понять, если на форум с вопросом пришел новый человек, то ему нужно конкретное решение или ссылка на что-то похожее, а не тупая отмазка, что "все возможно"?

 
satorifx :

Спасибо за невероятно подробный ответ.

Неужели надо быть семь пядей во лбу, чтобы понять, если на форум с вопросом пришел новый человек, то ему нужно конкретное решение или ссылка на что-то похожее, а не тупая отмазка, что "все возможно"?

Тут помогают тем, кто сам пытается что-то делать. Направляют в нужную сторону, объясняют и т.д. ...

Вы задали вопрос - вам ответили. А вы попытались сами хоть что-нибудь начать писать?

Задавая вопрос в определённом формате, сначала подумайте, а какой ответ вы получите на формат вопроса...

Причина обращения: