Добрый день! Почему в 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
Получается так:
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
Получается так:
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](https://c.mql5.com/36/16/dokumentaciya-po-mql5-dostup-k.png)
- www.mql5.com
Получается так:
Пишет ошибку '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]) { } }
Спасибо, работает
Пожалуйста. Кстати, я добавил Очень простой пример работы с 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, не помогает. Пробовал через переменную, тоже самое.
Можно еще один вопрос? Хочу открыть ордер на покупку.
Пишет ошибку: 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)); }
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день! Почему в mt5 не работает сравнение MA? Ошибку не выдает.
Вот пример:
if(iMA(NULL,0,5,0,MODE_SMMA,PRICE_MEDIAN)>iMA(NULL,0,10,0,MODE_SMMA,PRICE_MEDIAN)) {
}