Вопрос по iMA

 

Добрый день! Почему в mt5 не работает сравнение MA? Ошибку не выдает.

Вот пример:

if(iMA(NULL,0,5,0,MODE_SMMA,PRICE_MEDIAN)>iMA(NULL,0,10,0,MODE_SMMA,PRICE_MEDIAN)) {

}

 
это для MT4, в МТ5 по другому
 
labvic:

Добрый день! Почему в mt5 не работает сравнение MA? Ошибку не выдает.

Вот пример:

if(iMA(NULL,0,5,0,MODE_SMMA,PRICE_MEDIAN)>iMA(NULL,0,10,0,MODE_SMMA,PRICE_MEDIAN)) {

}

Смотрите справку iMA:

Шаг первый: в OnInit создаётся ХЕНДЛ ИНДИКАТОРА

Шаг второй: в OnTick по ХЕНДЛУ обращаемся к нужному буферу и бару при помощи CopyBuffer. Результат записываем в переменную. Вот ЭТУ ПЕРЕМЕННУЮ и нужно сравнивать.


Пример из КодоБазы: Intersection 2 iMA.

Шаг первый:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
...
//--- create handle of the indicator iMA
   handle_iMA_Fast=iMA(m_symbol.Name(),Period(),FastPer,0,MODE_EMA,PRICE_CLOSE);
//--- if the handle is not created 
   if(handle_iMA_Fast==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iMA (Fast) indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }
//--- create handle of the indicator iMA
   handle_iMA_Slow=iMA(m_symbol.Name(),Period(),SlowPer,0,MODE_EMA,PRICE_CLOSE);
//--- if the handle is not created 
   if(handle_iMA_Slow==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iMA (Slow) indicator for the symbol %s/%s, error code %d",
                  m_symbol.Name(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }


Шаг второй:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
...

   double MAFast1=iMAGet(handle_iMA_Fast,1);//2

   double MAFast3=iMAGet(handle_iMA_Fast,3);//0
   double MASlow1=iMAGet(handle_iMA_Slow,1);//2

   double MASlow3=iMAGet(handle_iMA_Slow,3);//0
 
Пример работы с индикатором iADX (Average Directional Movement Index, ADX)
 

Получается так:

double handle_iMA_5;
double handle_iMA_10;

int OnInit()
  {
   handle_iMA_5=iMA(NULL,0,5,0,MODE_SMMA,PRICE_MEDIAN);
   if(handle_iMA_5==INVALID_HANDLE)
     {
      return(INIT_FAILED);
     }
   handle_iMA_10=iMA(NULL,0,0,0,MODE_SMMA,PRICE_MEDIAN);
   if(handle_iMA_10==INVALID_HANDLE)
     {
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
   double MA5= CopyBuffer(handle_iMA_5,0, 0, 0, 0);
   double MA10= CopyBuffer(handle_iMA_10,0, 0, 0, 0); 
   if(MA5 > MA10)  {  }
   }


Пишет ошибку 'CopyBuffer' - no one of the overloads can be applied to the function call


 
labvic:

Получается так:

double handle_iMA_5;

double handle_iMA_10;

int OnInit()

  {

   handle_iMA_5=iMA(NULL,0,5,0,MODE_SMMA,PRICE_MEDIAN);

   if(handle_iMA_5==INVALID_HANDLE)

     {

      return(INIT_FAILED);

     }

   handle_iMA_10=iMA(NULL,0,0,0,MODE_SMMA,PRICE_MEDIAN);

   if(handle_iMA_10==INVALID_HANDLE)

     {

      return(INIT_FAILED);

     }

   return(INIT_SUCCEEDED);

  }


void OnTick()

  {

   double MA5= CopyBuffer(handle_iMA_5,0, 0, 0, 0);

   double MA10= CopyBuffer(handle_iMA_10,0, 0, 0, 0); 

   if(MA5 > MA10)  {  }


   }


Пишет ошибку 'CopyBuffer' - no one of the overloads can be applied to the function call


int handle_iMA_5;

double MA5[1];

//========================

 handle_iMA_5=iMA(NULL,0,5,0,MODE_SMMA,PRICE_MEDIAN);

CopyBuffer(handle_iMA_5, 0, 0, 1, MA5);

//////////

https://www.mql5.com/ru/docs/series/copybuffer

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара). При копировании заранее неизвестного количества данных в качестве массива-приемника buffer[] желательно...
 
labvic:

Получается так:


Пишет ошибку 'CopyBuffer' - no one of the overloads can be applied to the function call


1. Вам уже НЕСКОЛЬКО раз говорили на этом форуме - вставлять код нужно правильно!

2. Читаем справку CopyBuffer

Обращение по начальной позиции и количеству требуемых элементов

int  CopyBuffer( 
   int       indicator_handle,     // handle индикатора 
   int       buffer_num,           // номер буфера индикатора 
   int       start_pos,            // откуда начнем  
   int       count,                // сколько копируем 
   double    buffer[]              // массив, куда будут скопированы данные 
   );

копировать нужно хотя-бы один элемент, копировать нужно в МАССИВ.


Таким образом код будет такой:

void OnTick()
  {
   double MA5[1]; // массив в который будет скопировано одно значение
   CopyBuffer(handle_iMA_5,0, 0, 1, MA5);

   double MA10[1];  // массив в который будет скопировано одно значение
   CopyBuffer(handle_iMA_10,0, 0, 1, MA10); 

   if(MA5[0] > MA10[0])  {  }
   }
 
Спасибо, работает
 
labvic:
Спасибо, работает

Пожалуйста. Кстати, я добавил Очень простой пример работы с iADX (Average Directional Movement Index, ADX)

 
Можно еще один вопрос? Хочу открыть ордер на покупку
input int Magic=100;
void OnTick() {
     MqlTradeRequest request={0};
     request.action=TRADE_ACTION_DEAL; 
     request.magic=Magic; 
     request.symbol=_Symbol; 
     request.volume=AccountInfoDouble(ACCOUNT_BALANCE)/Lots;      // здесь ошибка
     request.sl=NormalizeDouble(SymbolInfoDouble("EURUSD",SYMBOL_BID)-100*_Point,8);   
     request.tp=NormalizeDouble(SymbolInfoDouble("EURUSD",SYMBOL_BID)+100000*_Point,8); 
     request.deviation=1;
     request.type=ORDER_TYPE_BUY;
     request.type_filling=ORDER_FILLING_FOK;
     request.price=SymbolInfoDouble("EURUSD",SYMBOL_ASK); 
     MqlTradeResult result={0};
     OrderSend(request,result);
}

Пишет ошибку: failed market buy ___ EURUSD sl: ____ tp: ____ [Invalid volume] (недопустимый объем)

Баланс для примера взят 100.

Перепробовал все типы type_fillin, не помогает. Пробовал через переменную, тоже самое.


 
labvic:
Можно еще один вопрос? Хочу открыть ордер на покупку

Пишет ошибку: failed market buy ___ EURUSD sl: ____ tp: ____ [Invalid volume] (недопустимый объем)

Баланс для примера взят 100.

Перепробовал все типы type_fillin, не помогает. Пробовал через переменную, тоже самое.


В Вашем пример применение NormalizeDouble - выполнено в неправильный способ.

Пример правильного метода (учитывающего квантование) смотрите в торговом классе CSymbolInfo::NormalizePrice ( [date folder]\MQL5\Include\Trade\SymbolInfo.mqh )

//+------------------------------------------------------------------+
//| Normalize price                                                  |
//+------------------------------------------------------------------+
double CSymbolInfo::NormalizePrice(const double price) const
  {
   if(m_tick_size!=0)
      return(NormalizeDouble(MathRound(price/m_tick_size)*m_tick_size,m_digits));
//---
   return(NormalizeDouble(price,m_digits));
  }
Причина обращения: