Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 440

 
STARIJ:

у меня работает  - следит за перемещением мыши


Я про суроллинг.) 
 

Всем доброго времени суток. Возникла необходимость анализировать информацию со старшего таймфрейма.

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

extern ENUM_TIMEFRAMES TimeFrameRZ = PERIOD_M15; //Период разворотной зоны
extern ENUM_TIMEFRAMES TimeFrameIn = PERIOD_M5; //Период точки входа
extern int ATR_period = 14;
extern int UpLineSell = 7;
extern int DownLineSell = 7;
extern int UpLineBuy = 7;
extern int DownLineBuy = 7;

//      Параметры разворотных свечей
extern string Comment2 = "---------------------------------Параметры разворотных свечей------------------------------------------";
extern int Volotilnost = 20; // Диапазон цен для трех разворотных свечей (в пунктах)
extern int MaxLineSell = 3;
extern int MaxLineBuy = 3;

bool SellPattern = false;
bool BuyPattern = false;
bool New_Bar = false;

double UpLine_Sell = 0;
double DownLine_Sell = 0;
double UpLine_Buy = 0;
double DownLine_Buy = 0;

int i = 0, j = 0;
int ULs = 0;
int DLs = 0;
int ULb = 0;
int DLb = 0;

double MassZone[2][10];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits ==5 )
  {
  Volotilnost *=10;
  UpLineSell *= 10;
  DownLineSell *= 10;
  UpLineBuy*= 10;
  DownLineBuy*= 10;
  }

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
 
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
RazvorotZona();
 
 if(SellPattern == true)
   {

   
     if(ObjectCreate(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJ_HLINE,0,TimeCurrent(),UpLine_Sell))
        {
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_COLOR,clrOrange);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
                  
      if(ObjectCreate(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJ_HLINE,0,TimeCurrent(),DownLine_Sell))
        {
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_COLOR,clrMagenta);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
        ULs++;
        DLs++;
        if(DLs >= MaxLineSell && ULs >= MaxLineSell)
          {
          ObjectDelete(ChartID(),"UpLine_Sell"+IntegerToString(ULs - MaxLineSell));
          ObjectDelete(ChartID(),"DownLine_Sell"+IntegerToString(DLs - MaxLineSell));
          }
   }
   
 if(BuyPattern == true)
   {
   if(ObjectCreate(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJ_HLINE,0,TimeCurrent(),UpLine_Buy))
        {
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_COLOR,clrDeepSkyBlue);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
                   
      if(ObjectCreate(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJ_HLINE,0,TimeCurrent(),DownLine_Buy))
        {
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_COLOR,clrBrown);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
        ULb++;
        DLb++;
        if(ULb >= MaxLineBuy && DLb >= MaxLineBuy)
          {
          ObjectDelete(ChartID(),"UpLine_Buy"+IntegerToString(ULb - MaxLineBuy));
          ObjectDelete(ChartID(),"DownLine_Buy"+IntegerToString(DLb - MaxLineBuy));
          }
   }
}
//+------------------------------------------------------------------+
//    Функция определения нового бара                                |
//+------------------------------------------------------------------+
void Find_New_Bar()
{ 
   datetime TimeBar0 = iTime(Symbol(),TimeFrameRZ,0);
   static datetime New_Time=0;                     // Время текущего бара
   New_Bar=false;                                 // Нового бара нет 
   if(New_Time != TimeBar0)                       // Сравниваем время 
   { 
      New_Time = TimeBar0;                        // Теперь время такое 
      New_Bar = true;                             // Поймался новый бар 
   } 
}
//+------------------------------------------------------------------+
//    Функция определения разворотной зоны                           |
//+------------------------------------------------------------------+
void RazvorotZona()
{
Find_New_Bar();

   double Open3= NormalizeDouble (iOpen(Symbol(), TimeFrameRZ,4),Digits);
   double Close3 = NormalizeDouble (iClose(Symbol(), TimeFrameRZ,4),Digits);
   double High3 = NormalizeDouble (iHigh(Symbol(), TimeFrameRZ,4),Digits);
   double Low3 = NormalizeDouble (iLow(Symbol(), TimeFrameRZ,4),Digits);
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед перевернутым Молотом
   double ATR = iATR(Symbol(),TimeFrameRZ,ATR_period,1);
   
   SellPattern = false;
   BuyPattern = false;
   
   int bar1 = 1;
   int bar2 = 3;
   double Max, Min;
   

   Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
   Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];

   if(NormalizeDouble((Max - Min) / Point, Digits) < Volotilnost && 
      MathAbs(Close3-Open3) > 1.5*ATR)
      {
      if((Close3 > Open3) && New_Bar == true)
        {
        UpLine_Sell = Max;
        DownLine_Sell = Min;
        SellPattern = true;
        Print ("Идентифицирован паттерн");
        Print ("Максимальная цена "+DoubleToStr(Max));
        Print ("Минимальная цена "+DoubleToStr(Min));
        }
        else {SellPattern = false;}
        
      if((Close3 < Open3) && New_Bar == true)
        {
        UpLine_Buy = Max;
        DownLine_Buy = Min;
        BuyPattern = true;
        Print ("Идентифицирован паттерн");
        }
        else {BuyPattern = false;}
      }
}

Но, при таком подходе идет анализ баров с текущего рабочего таймфрейма М5. Нужно, что бы параметры bar1 и bar2 брались с М15

Как это реализовать?

 

У меня ощущения, что проблема где-то здесь

Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
   Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];

Кто, что скажет?

 
voron_026:

У меня ощущения, что проблема где-то здесь

Кто, что скажет?

Ну да, укажите нужный таймфрейм

 
STARIJ:

Ну да, укажите нужный таймфрейм

Так указал, же...

TimeFrameRZ = PERIOD_M15
Это внешняя переменная
 
double array[10];
array[0]=0.1;

Объявляю массив и заполняю элементы.

Почему на второй строке получаю ошибку declaration without type?

 
Juer:

Объявляю массив и заполняю элементы.

Почему на второй строке получаю ошибку declaration without type?

Пропишите код в функции void OnTick() И все заработает.

Или array[0]=0.1пропишите в void OnTick()

 
Juer:

Объявляю массив и заполняю элементы.

Почему на второй строке получаю ошибку declaration without type?

Объявляете массив в области глобальных переменных?

Тогда объявляйте его сразу со значениями (раз вы их сами в коде заполняете - значит они у вас предопределены), например:

double array[10]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0};

... либо заполняйте массив значениями в OnInit() или в той функции, где он будет заполняться.

 
Подскажите как вывести в советник значения индикатора ZigZag? Другие выводятся написав iMA, iStochastic, iWPR ... , а зигзаг вручную вычислять, как?
 
ZZuretc:
Подскажите как вывести в советник значения индикатора ZigZag? Другие выводятся написав iMA, iStochastic, iWPR ... , а зигзаг вручную вычислять, как?

Решили использовать? Значения индикатора ЗигЗаг везде равны нулю. Только в вершинах значение зигзага равно цене в вершине.

Надо просматривать бары в цикле. Смотрите пример

Файлы:
Zig2fl.mq4  4 kb
Причина обращения: