Вопрос по таймфреймам

 

Есть код индикатора signalTable.mq4. Взят отсюда: https://www.mql5.com/ru/articles/1503. За что автору спасибо.

Есть цель: 1. заставить этот индикатор работать на тестере в режиме визуализации.

2. в последствии написать эксперт с обращением к этому индикатору.


#property copyright "Antonuk Oleg"
#property link      "antonukoleg@gmail.com"

#property indicator_chart_window

extern int scaleX=20,
           scaleY=20,
           offsetX=35,
           offsetY=20,
           fontSize=20,
           corner=2,
           symbolCodeBuy=67, 
           symbolCodeSell=68, 
           symbolCodeNoSignal=73; 
           
extern color signalBuyColor=Lime,
             signalSellColor=Red,
             noSignalColor=Orange,
             textColor=Black;            
            
int period[]={1,5,15,30,60,240,1440,10080,43200};  
string periodString[]={"M1","M5","M15","M30","H1","H4","D1","W1","MN1"},
       // создаем еще один массив с названиями индикаторов
       signalNameString[]={"MA"};
//-----------------------------------------------------------------------
int init()
{
   // таблица сигналов
   for(int x=0;x<9;x++)
      for(int y=0;y<1;y++)
      {
         ObjectCreate("signal"+x+y,OBJ_LABEL,0,0,0,0,0);
         // изменяем угол привязки
         ObjectSet("signal"+x+y,OBJPROP_CORNER,corner);
         ObjectSet("signal"+x+y,OBJPROP_XDISTANCE,x*scaleX+offsetX);
         ObjectSet("signal"+x+y,OBJPROP_YDISTANCE,y*scaleY+20);
         ObjectSetText("signal"+x+y,CharToStr(symbolCodeNoSignal),
                       fontSize,"Wingdings",noSignalColor);
      }
  
  // названия таймфреймов    
  for(x=0;x<9;x++)
  {
      ObjectCreate("textPeriod"+x,OBJ_LABEL,0,0,0,0,0);   
      // изменяем угол привязки      
      ObjectSet("textPeriod"+x,OBJPROP_CORNER,corner);
      ObjectSet("textPeriod"+x,OBJPROP_XDISTANCE,x*scaleX+offsetX);
      ObjectSet("textPeriod"+x,OBJPROP_YDISTANCE,offsetY-10);
      ObjectSetText("textPeriod"+x,periodString[x],8,"Tahoma",textColor);
  }
  
  // названия индикаторов 
  for(y=0;y<3;y++)
  {
      ObjectCreate("textSignal"+y,OBJ_LABEL,0,0,0,0,0);   
      // изменяем угол привязки      
      ObjectSet("textSignal"+y,OBJPROP_CORNER,corner);
      ObjectSet("textSignal"+y,OBJPROP_XDISTANCE,offsetX-25);
      ObjectSet("textSignal"+y,OBJPROP_YDISTANCE,y*(scaleY)+offsetY+8);
      ObjectSetText("textSignal"+y,signalNameString[y],8,"Tahoma",textColor);      
  }
  return(0);
}
//----------------------------------------------------------------------------  
int start()
{
   for(int x=0;x<9;x++)
   {
      // сигнал на покупку
      if(iMA(Symbol(),period[x],13,0,0,0,0)>iMA(Symbol(),period[x],24,0,0,0,0))
         ObjectSetText("signal"+x+"0",CharToStr(symbolCodeBuy),fontSize,"Wingdings",signalBuyColor);
      // сигнал на продажу   
      else
         ObjectSetText("signal"+x+"0",CharToStr(symbolCodeSell),fontSize,"Wingdings",signalSellColor);   
   }

  
   return(0);
}
//----------------------------------------------------------------------------
int deinit()
{
   ObjectsDeleteAll();
   return(0);
}

Варианты вроде как у меня есть, а какой из них будет оптимальным(по ресурсам ПК) не знаю. За направление в какую сторону копать буду благодарен.

 

А чего тут сложного то? Сравнение двух мувингов с периодами 13 и 24 которое рассчитывается для каждого тамфрейма :). Вся работа заключена в одном единственном сравнении:

 // сигнал на покупку
      if(iMA(Symbol(),period[x],13,0,0,0,0)>iMA(Symbol(),period[x],24,0,0,0,0))
 // сигнал на продажу   
      else

Проще самому написать то что нужно чем сюда чтото долепливать...

 
ForexTools >>:

А чего тут сложного то? Сравнение двух мувингов с периодами 13 и 24 которое рассчитывается для каждого тамфрейма :). Вся работа заключена в одном единственном сравнении:

Проще самому написать то что нужно чем сюда чтото долепливать...




Если запустить эксперта в режиме визуалиации и кинуть индикатор на график, то индикатор не может получить данные со старшего таймфрейма.

То что он сравнивает два мувинга мне понятно и как он работает мне тоже понятно. Не понятно как заставить его работать на тестере так как я хочу.

Можно конечно из массива-таймсерии текущего графика создать пользовательские массивы с данными нужных тайфреймов, и обращаться уже непосредственно к ним но мне кажется это не самый оптимальный вариант и может даже не верный.

 
Murman писал(а) >>

Если запустить эксперта в режиме визуалиации и кинуть индикатор на график, то индикатор не может получить данные со старшего таймфрейма.

То что он сравнивает два мувинга мне понятно и как он работает мне тоже понятно. Не понятно как заставить его работать на тестере так как я хочу.

Надо делать внутри индикатора синхронизацию по времени, тогда проблем не должно быть. То есть обращение к другим тайфреймам (или инструментам) только через время текущего бара.

 
Vinin >>:

Надо делать внутри индикатора синхронизацию по времени, тогда проблем не должно быть. То есть обращение к другим тайфреймам (или инструментам) только через время текущего бара.

А ссылочки на код нет, где это реализовано. А то я если чесно я даже суть не уловил.

 

То есть смещение задавать не по номеру бара, а по времени? :)

 
Murman писал(а) >>

То есть смещение задавать не по номеру бара, а по времени? :)

Берешь время нужного бара, ищешь соответствующий бар на другом таймфрейме (инструменте). От него и делаешь расчеты.

Только может возникнуть вопрос по работе нулеовго бара.

 
Vinin >>:

Берешь время нужного бара, ищешь соответствующий бар на другом таймфрейме (инструменте). От него и делаешь расчеты.

Только может возникнуть вопрос по работе нулеовго бара.

Берешь время нужного бара - не проблема.

Ищешь соответствующий бар на другом таймфрейме - проблема, т.к не понятно как явно указать нужный ТФ.(может я где то, что то в функциях пропустил?) Чтобы найти соответствующий бар на другом таймфрейме надо искать через iTime, а iTime в тестере работать не будет.

Вот идикатор: если его установить в тестере на М1, то изменятся будут значения только М1.

#property indicator_chart_window

int start()
  {
   Comment(iTime(0,1,1),"   ",iTime(0,5,1),"   ",iTime(0,15,1),"   ",iTime(0,30,1));
   return(0);
  }
Получается замкнутый круг.
 

Есть функция https://docs.mql4.com/ru/search/iBarShift, Она поможет. А как и что реализовать, это уже сам. Иначе уже не твоя работа будет. Хотя если кто сделает за тебя, то лучше ли тебе станет. Не знаю. Я и так уже много сказал.

Но с объектами не лучший вариант - проверять в визуальном режиме. Надо индикатор делать для себя свой и без объектов. С ними проблем еще много будет.

 

Спасибо! Сейчас попрбовал, вроде вариант. Сегодня ночью буду думать.

 
Murman >>:


Спасибо! Сейчас попрбовал, вроде вариант. Сегодня ночью буду думать.

А результатты можно будет узнать?

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