Проблема с кодом.

 

Всем здравствуйте!

Пишу советник  с базовыми знаниями. Пытаюсь преодолевать препятствия своими силами, но не всегда это получается. Столкнулся с новой проблемой. Моя стратегия использует данные с графиков MN, D1 и H4. Когда проверяю отладчиком, все работает, но стоит загрузить советник на график H4 - тишина! Удаляю, открываю окно графика MN, загружаю сову заново, перехожу на H4, работает. Понимаю, что нужна какая то связка графиков разных периодов, но как это сделать, не знаю.

 
BROXIV:

Всем здравствуйте!

Пишу советник  с базовыми знаниями. Пытаюсь преодолевать препятствия своими силами, но не всегда это получается. Столкнулся с новой проблемой. Моя стратегия использует данные с графиков MN, D1 и H4. Когда проверяю отладчиком, все работает, но стоит загрузить советник на график H4 - тишина! Удаляю, открываю окно графика MN, загружаю сову заново, перехожу на H4, работает. Понимаю, что нужна какая то связка графиков разных периодов, но как это сделать, не знаю.

прикрепите код чтобы люди могли помочь... а то так будет вилами по воде)

 
Yevhenii Levchenko:

прикрепите код чтобы люди могли помочь... а то так будет вилами по воде)

//+------------------------------------------------------------------+
//|                                                  Pharos_Test.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Pharos  = 1222.10; // уровень, задаваемый пользователем

int cnt   = 3;
int Bar_cnt_H4 = 200;
int Bar_cnt_MONTH = 100;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  double UP,DOWN;
  datetime Start_Point = iTime(NULL,PERIOD_H4,1);
  datetime End_Point   = iTime(NULL,PERIOD_H4,0);
 

           if(iLow(NULL,PERIOD_D1,0)>Pharos)
               {
                  UP=UP_level_rising_trend(Day_Pharos_rising_trend());
                  DOWN=DOWN_level_rising_trend(Day_Pharos_rising_trend());
                  SetTLine(clrKhaki,0,"UP_rising",Start_Point,UP,End_Point,UP,true,0,1);
                  SetTLine(clrKhaki,0,"DOWN_rising",Start_Point,DOWN,End_Point,DOWN,true,0,1);
         Comment(UP,"\n",
                 DOWN);
      }else return;
     
  
  }
//+------------------------------------------------------------------+
//------- функция определения дневного маяка при восходящем тренде----
double Day_Pharos_rising_trend()
{

   int index = 0;
   int k = 0;
   int Index_min_Pharos;  
   
   double low_day;
   double Level_200 = 0; 
   double Pharos_Day_min = 0;  
   
   double Arr_Pharos[];   
   
   
   for(int i=1; i<Bar_cnt_MONTH; i++)
            {    
                 index=iLowest(NULL,PERIOD_MN1,MODE_LOW,cnt,i);
                 low_day=iLow(NULL,PERIOD_D1,0);
                                         
                 
                 if(Low[index]<Pharos)             
                    {
                        if(Low[index]==Low[i+1])
                           {
                             Level_200=Pharos+(Pharos-Low[index]);
                             
                                 if(Level_200<low_day)
                                 { 
                                 ArrayResize(Arr_Pharos,k+1);                                
                                 Arr_Pharos[k]=Level_200;                                                                 
                                 k++;
                                 }                                                   
                           }      
                                                                          
                    }             
             }
             Index_min_Pharos=ArrayMaximum(Arr_Pharos,WHOLE_ARRAY,0); 
             Pharos_Day_min = Arr_Pharos[Index_min_Pharos];
             
             return(Pharos_Day_min);
}
//+------------------------------------------------------------------+
//------- функция определения дневного маяка при нисходящем тренде----

double Day_Pharos_degressive_trnd()
{

   int index = 0;
   int k = 0;
   int Index_max_Pharos;   
   
   double high_day;
   double Level_200 = 0; 
   double Pharos_Day_max = 0;  
   
   double Arr_Pharos[];   
   
   
            for(int i=1; i<Bar_cnt_MONTH; i++)
            {    
                 index=iHighest(NULL,PERIOD_MN1,MODE_HIGH,cnt,i);
                 high_day=iHigh(NULL,PERIOD_D1,0);
                                         
                 
                 if(High[index]>Pharos)             
                    {
                        if(High[index]==High[i+1])
                           {
                             Level_200=Pharos-(High[index]-Pharos);
                             
                                 if(Level_200>high_day)
                                 { 
                                 ArrayResize(Arr_Pharos,k+1);                                
                                 Arr_Pharos[k]=Level_200;                                                                 
                                 k++;
                                 }                                                   
                           }      
                                                                          
                    }             
             }
             Index_max_Pharos=ArrayMinimum(Arr_Pharos,WHOLE_ARRAY,0); 
             Pharos_Day_max = Arr_Pharos[Index_max_Pharos];
             
             return(Pharos_Day_max);
}
//+------------------------------------------------------------------+
//------- функция определения верхнего уровня относительно цены закрытия H4----тренд восходящий

double UP_level_rising_trend(double DayMinPharos)
{
   int index_H4_high = 0;
   int k = 0;
   int Index_UP_Pharos_H4;
   
   double close_H4 =0;
   double Level_50 =0;
   double Pharos_H4_UP = 0;
   
   double Arr_Pharos[];

             for(int i=1; i<Bar_cnt_H4; i++)
             {
             index_H4_high=iHighest(NULL,PERIOD_H4,MODE_HIGH,cnt,i);
             close_H4=iClose(NULL,PERIOD_H4,1);             
             
             if(High[index_H4_high]==High[i+1])
               {
                  Level_50=High[index_H4_high]-((High[index_H4_high]-DayMinPharos)/2);
                  
                     if(Level_50>close_H4)
                     {                        
                        ArrayResize(Arr_Pharos,k+1);                                
                        Arr_Pharos[k]=Level_50;                                                                 
                        k++;  
                     }
               }
               
               
             }
             Index_UP_Pharos_H4=ArrayMinimum(Arr_Pharos,WHOLE_ARRAY,0); 
             Pharos_H4_UP = Arr_Pharos[Index_UP_Pharos_H4];
             
             return(Pharos_H4_UP);
}  

//+------------------------------------------------------------------+
//------- функция определения нижнего уровня относительно цены закрытия H4----тренд восходящий

double DOWN_level_rising_trend(double DayMinPharos)
{
   int index_H4_high = 0;
   int k = 0;
   int Index_UP_Pharos_H4;
   
   double close_H4 =0;
   double Level_50 =0;
   double Pharos_H4_UP = 0;
   
   double Arr_Pharos[];

             for(int i=1; i<Bar_cnt_H4; i++)
             {
             index_H4_high=iHighest(NULL,PERIOD_H4,MODE_HIGH,cnt,i);
             close_H4=iClose(NULL,PERIOD_H4,1);             
             
             if(High[index_H4_high]==High[i+1])
               {
                  Level_50=High[index_H4_high]-((High[index_H4_high]-DayMinPharos)/2);
                  
                     if(Level_50<close_H4)
                     {                        
                        ArrayResize(Arr_Pharos,k+1);                                
                        Arr_Pharos[k]=Level_50;                                                                 
                        k++;  
                     }
               }
               
               
             }
             Index_UP_Pharos_H4=ArrayMaximum(Arr_Pharos,WHOLE_ARRAY,0); 
             Pharos_H4_UP = Arr_Pharos[Index_UP_Pharos_H4];
             
             return(Pharos_H4_UP);
} 

//+------------------------------------------------------------------+
//------- функция определения нижнего уровня относительно цены закрытия H4----тренд нисходящий

double DOWN_level_degressive_trend(double DayMaxPharos)
{
   int index_H4_low = 0;
   int k = 0;
   int Index_DOWN_Pharos_H4;
   
   double close_H4 =0;
   double Level_50 =0;
   double Pharos_H4_DOWN = 0;
   
   double Arr_Pharos[];

             for(int i=1; i<Bar_cnt_H4; i++)
             {
             index_H4_low=iLowest(NULL,PERIOD_H4,MODE_LOW,cnt,i);
             close_H4=iClose(NULL,PERIOD_H4,1);             
             
             if(Low[index_H4_low]==Low[i+1])
               {
                  Level_50=DayMaxPharos-((DayMaxPharos-Low[index_H4_low])/2);
                  
                     if(Level_50<close_H4)
                     {                        
                        ArrayResize(Arr_Pharos,k+1);                                
                        Arr_Pharos[k]=Level_50;                                                                 
                        k++;  
                     }
               }
               
               
             }
             Index_DOWN_Pharos_H4=ArrayMinimum(Arr_Pharos,WHOLE_ARRAY,0); 
             Pharos_H4_DOWN = Arr_Pharos[Index_DOWN_Pharos_H4];
             
             return(Pharos_H4_DOWN);
}

//+------------------------------------------------------------------+
//------- функция определения верхнего уровня относительно цены закрытия H4----тренд нисходящий

double UP_level_degressive_trend(double DayMaxPharos)
{
   int index_H4_low = 0;
   int k = 0;
   int Index_UP_Pharos_H4;
   
   double close_H4 =0;
   double Level_50 =0;
   double Pharos_H4_UP = 0;
   
   double Arr_Pharos[];

             for(int i=1; i<Bar_cnt_H4; i++)
             {
             index_H4_low=iLowest(NULL,PERIOD_H4,MODE_LOW,cnt,i);
             close_H4=iClose(NULL,PERIOD_H4,1);             
             
             if(Low[index_H4_low]==Low[i+1])
               {
                  Level_50=DayMaxPharos-((DayMaxPharos-Low[index_H4_low])/2);
                  
                     if(Level_50>close_H4)
                     {                        
                        ArrayResize(Arr_Pharos,k+1);                                
                        Arr_Pharos[k]=Level_50;                                                                 
                        k++;  
                     }
               }
               
               
             }
             Index_UP_Pharos_H4=ArrayMinimum(Arr_Pharos,WHOLE_ARRAY,0); 
             Pharos_H4_UP = Arr_Pharos[Index_UP_Pharos_H4];
             
             return(Pharos_H4_UP);
} 

//+------------------------------------------------------------------+
//------- функция рисования линий

void SetTLine (color cl,         // Цвет линии
               int wnd,          // Номер окна, куда будет выведена линия
               string nm="",     // Имя линии
               datetime t1=0,    // Первая координата ВРЕМЯ
               double p1=0,      // Первая координата ЦЕНА
               datetime t2=0,    // Вторая координата ВРЕМЯ
               double p2=0,      // Вторая координата ЦЕНА
               bool ry=False,    // true = луч, false = не луч
               int st=0,         // Стиль линии
               int wd=1)         // Толщина линии
{
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, wnd, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}               

Он пока в сыром виде.

 
BROXIV:

Он пока в сыром виде.

Пожалуйста, вставляйте код не форматированием текста, а вставкой кода через Alt+S редактора сообщений:


(Ваш код я уже вставил правильно)

 

Что-то не так с функцией  ArrayMaximum, а так же с массивами:


 
Yevhenii Levchenko:
Разрешение торговли в свойствах советника стоит? И в терминале тоже?

Да.

 
А вообще, способен ли советник брать данные с графика другого периода, работая не в нем? 
 
BROXIV:

Да.

Изменил сообщение, там ошибки с массивами...
BROXIV:
А вообще, способен ли советник брать данные с графика другого периода, работая не в нем? 
Может
 
Будем разбираться. Спасибо!
 
Еще вопрос. Могу я использовать одинаковое имя массива внутри разных функций, если оно не объявлено в глобальном режиме, а лишь внутри функций?
 
BROXIV:
Еще вопрос. Могу я использовать одинаковое имя массива внутри разных функций, если оно не объявлено в глобальном режиме, а лишь внутри функций?
да, можно