Подскажите пжлст, как в советнике использовать iMA с разных тайм фреймов ?

 

Нужно в советнике использовать iMA от нескольких таймфреймов, но, iMA с таймфреймом отличающегося от текущего возвращает 0 значения:

Вывод в журнал начений трех iMA:

2016.02.19 15:13:25.561 2015.02.17 04:00  Robot-3.4 GBPUSD,H4: Есть открытый ордер !***Type:1 Orderstotal:1***Ticket:12Moving 1:1.5377Moving 2:1.5404Moving 3:0.0
2016.02.19 15:13:25.497 2015.02.17 00:00  Robot-3.4 GBPUSD,H4: Есть открытый ордер !***Type:1 Orderstotal:1***Ticket:12Moving 1:1.5381Moving 2:1.5401Moving 3:0.0
2016.02.19 15:13:25.433 2015.02.16 20:00  Robot-3.4 GBPUSD,H4: Есть открытый ордер !***Type:1 Orderstotal:1***Ticket:12Moving 1:1.5386Moving 2:1.5395Moving 3:0.0
2016.02.19 15:13:25.369 2015.02.16 16:00  Robot-3.4 GBPUSD,H4: Функция OrderSendOpenShort успешно выполнена# 12
2016.02.19 15:13:25.369 2015.02.16 16:00  Robot-3.4 GBPUSD,H4: open #12 sell 0.01 GBPUSD at 1.53734 sl: 1.54534 tp: 1.52934 ok


Moving1 равен 0.0 !!!


Код:


//+------------------------------------------------------------------+
//|                                                     RoboV3.2.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  //----1
 
  
  double LOT=0.01;
     
  int MAPER=10;
  int MASHIFT=2;
  
  double Spread= NormalizeDouble(0.0001,Digits);
  
  int i;
  
  
  
  double MA[];
  ArrayResize(MA,MAPER,10);
  ArrayInitialize(MA,EMPTY_VALUE); 
  
    
  
  string MYSYMBOL=_Symbol;
  double ICLOSE=iOpen(MYSYMBOL,PERIOD_H1,0);
  
    
  double Free=AccountFreeMargin();
  double One_Lot =MarketInfo(MYSYMBOL,MODE_MARGININIT);
  double Min_Lot =MarketInfo(MYSYMBOL,MODE_MINLOT);
  
  double ma1=NormalizeDouble((iMA(NULL,0,MAPER,0,MODE_EMA,PRICE_OPEN,0)),4);
  double ma2=NormalizeDouble((iMA(NULL,0,MAPER,4,MODE_SMA,PRICE_OPEN,0)),4);
  
   
for (i = 0;i<(MAPER-1); i++)
{
 MA[i]= iMA(MYSYMBOL,PERIOD_M15,MAPER,0,MODE_EMA,PRICE_OPEN,i);
}
 
  
  //----1
  
  //----2

if (OrdersTotal()>0)  

 {

for(int j=0;j<OrdersTotal();j++)
     {
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==true)
      {Print ("Есть открытый ордер !***","Type:", OrderType()," Orderstotal:",OrdersTotal(),"***","Ticket:",OrderTicket(), "Moving 1:",ma1,"Moving 2:",ma2, "Moving 3:",MA[0]);
      
       }
       else Print ("Ошибка выделения ордера Type:",OrderType()," Orderstotal:",OrdersTotal(),"Ticket",OrderTicket(),"Error:", GetLastError() );
//      if(OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
        Print ("Есть открытый лонг !***");
         if((Open[0]<ma1) && Open[1] > ma1 )
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           else 
           Print("Order LONG Закрылся !!! ");
           }
           
           
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if((ma1<Open[0]) && ma1 > Open[1] )
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
           
              Print("OrderClose error ",GetLastError());
              else 
           Print("Order SELL Закрылся !!! ");
           }
           
         break;
        }
     }
  }
  
   //----2
  
 
 //----3
    
  if (OrdersTotal()<1)
  {
  
  if ((MA[0]<Open[0]) && MA[0] > Open[1] ) // Событие для покупки
  
   {
    Print("Сигнал на лонг сработал");
    int ticket1 = OrderSend(MYSYMBOL,OP_BUY,LOT,Ask,Spread,Ask-0.008,Ask+0.008,"My order",16384,0,clrRed); 
           
           if(ticket1 <0)        
          
           { 
         Print("OrderSendOpenLong завершилась с ошибкой #",ticket1,GetLastError()); 
           } 
          else 
           Print("Функция OrderSendOpenLong успешно выполнена #",ticket1); 
   }
  
 if ((Open[0]<ma1) && Open[1] > ma1 ) // Событие для продажи
    
    {
    Print("Сигнал на шорт сработал");
    int ticket2=OrderSend(MYSYMBOL,OP_SELL,LOT,Bid,Spread,Bid+0.008,Bid-0.008,"My order",16384,0,clrBlue); 
           
           if(ticket2 <0)        
           { 
         Print("OrderSendOpenShort завершилась с ошибкой # ",ticket2,GetLastError()); 
           } 
          else 
           Print("Функция OrderSendOpenShort успешно выполнена# ",ticket2);
           
           
    
    
 }

 }




  
 
 //----3
 
 

}
     
//+------------------------------------------------------------------+


Подскажите, как использовать в советнике индикаторы с таймфреймов не соответсвующих текущему ?


Всем откликнувшимся спасибо за помощь.

 
iMA(NULL,0
Вместо 0 нужный период
PERIOD_M5...
 

Не считается вот эта МАшка (Moving3) :


MA[i]= iMA(MYSYMBOL,PERIOD_M15,MAPER,0,MODE_EMA,PRICE_OPEN,i);


а вот эти:

double ma1=NormalizeDouble((iMA(NULL,0,MAPER,0,MODE_EMA,PRICE_OPEN,0)),4);
  double ma2=NormalizeDouble((iMA(NULL,0,MAPER,4,MODE_SMA,PRICE_OPEN,0)),4);


Считаются нормально и они на таймфремей H1 !!!


Выдача значений МАшек в журнал:


2016.02.19 15:13:25.433 2015.02.16 20:00  Robot-3.4 GBPUSD,H4: Есть открытый ордер !***Type:1 Orderstotal:1***Ticket:12Moving 1:1.5386Moving 2:1.5395Moving 3:0.0


"0" - означает текущий таймфрейм.


?????

 
К меньшему таймфрему в тестере не получается обращаться. 
 
Dmitry Fedoseev:
К меньшему таймфрему в тестере не получается обращаться. 

Спасибо. Проверил - работает.


Не подскажете, по мувингам "сдвинутым назад" (т.е. сдвиг = "-2"), при вычислении, так-же выдаются нулевые значения, в советнике.


Можно ли обращатся к мувингам "сдвинутым назад" ?

 
Дмитрий:

Спасибо. Проверил - работает.


Не подскажете, по мувингам "сдвинутым назад" (т.е. сдвиг = "-2"), при вычислении, так-же выдаются нулевые значения, в советнике.


Можно ли обращатся к мувингам "сдвинутым назад" ?

На истории можно обращаться. А вообще нет, потому-что это будущее, а оно неизвестно, тестер не дает обмануть себя. 
 
Dmitry Fedoseev:
На истории можно обращаться. А вообще нет, потому-что это будущее, а оно неизвестно, тестер не дает обмануть себя. 
На истории получается тоже самое что и при использовании в индикаторе таймфрейма меньшего чем таймфрейм советника. Сдвиг "назад во врмени" это не будующее )) И если "говорить о будующем" то MQL5 "его нормально видит". ;)
 
На самом деле реальная проблема, скажем, для меня. -как задать ШАГ таймфреймов разных индикаторов. Т.е. оптимизировать только один индикатор, а ТФ других задавать как функцию от первого. 
Причина обращения: