Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 533

 
      // AO
      if(ao) {
         CopyTime(symbol_name[st],ao_time_frame,1,1,time_buf);
         if(symbol_ao_timebar[st]!=time_buf[0]) {
            symbol_ao_timebar[st]=time_buf[0];
            double ao_buf[];
            CopyBuffer(symbol_ao_handle[st],0,enter_bar,2,ao_buf);
            if(ao_buf[1]>ao_buf[0]&&ao_buf[0]<0) symbol_ao_signal[st]=0;
            if(ao_buf[1]<ao_buf[0]&&ao_buf[0]>0) symbol_ao_signal[st]=1;
            }
         }else symbol_ao_signal[st]=2;
      
      // AC
      if(ac) {
         CopyTime(symbol_name[st],ac_time_frame,1,1,time_buf);
         if(symbol_ac_timebar[st]!=time_buf[0]) {
            symbol_ac_timebar[st]=time_buf[0];
            double ac_buf[];
            CopyBuffer(symbol_ac_handle[st],0,enter_bar,2,ac_buf);
            if(ac_buf[1]>ac_buf[0]&&ac_buf[0]<0) symbol_ac_signal[st]=0;
            if(ac_buf[1]<ac_buf[0]&&ac_buf[0]>0) symbol_ac_signal[st]=1;
            }      
         }else symbol_ac_signal[st]=2;
Всем привет. Вот вопрос. Есть кусок кода. Который говорит. Точнее должен говорить, что нужно покупать или продавать но только тогда когда индикатор AO и AC в одной плоскости. Покупка ниже нуля а продажа выше нуля.
Так ли это? Гуру помогите плиз.
Вопрос то в принципе в чем. Это нормальный код или херня на постном масле?
      
 
MASTERXAYS:
Всем привет. Вот вопрос. Есть кусок кода. Который говорит. Точнее должен говорить, что нужно покупать или продавать но только тогда когда индикатор AO и AC в одной плоскости. Покупка ниже нуля а продажа выше нуля.
Так ли это? Гуру помогите плиз.
Вопрос то в принципе в чем. Это нормальный код или херня на постном масле?
      

Я бы назвал сам подход "херня на постном масле"

Вы видели когда нибудь, чтоб цена шла именно за индикатором? Так-же стоит учесть, что это индикаторы Б.Вильямса, а он как известно - на форексе не торговал, да и сама суть уже давно устарела.

 
-Aleks-:
А как, я извиняюсь, произвести это обнуление?
Точно так же, как и обнуление простых типов. Присваиванием им значения 0. Как только нужным полям присвоили значения 0 - используете обратную операцию StructToTime().
 
MASTERXAYS:
Всем привет. Вот вопрос. Есть кусок кода. Который говорит. Точнее должен говорить, что нужно покупать или продавать но только тогда когда индикатор AO и AC в одной плоскости. Покупка ниже нуля а продажа выше нуля.
Так ли это? Гуру помогите плиз.
Вопрос то в принципе в чем. Это нормальный код или херня на постном масле?
      

Почитайте мою статью  там описаны коды построения сигналов. Но лично я пишу функции сигналов в таком ключе.

ENUM_ORDER_TYPE GetSignal(int i,ENUM_TIMEFRAMES tf)
  {
   double bbup[1];
   double bbdw[1];
   double rsi[1];
   double macd[2];
   double stoh[2];
   double Close[2];

   if(IND01[i]==INVALID_HANDLE || IND01[i]==0){IND01[i]=iBands(m_symbol,tf,BB_period,0,2,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND02[i]==INVALID_HANDLE || IND02[i]==0){IND02[i]=iRSI(m_symbol,tf,RSI_period,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND03[i]==INVALID_HANDLE || IND03[i]==0){IND03[i]=iMACD(m_symbol,tf,MACD_fast_ema_period,MACD_slow_ema_period,9,PRICE_CLOSE);return(WRONG_VALUE);}
   if(IND04[i]==INVALID_HANDLE || IND04[i]==0){IND04[i]=iStochastic(m_symbol,tf,ST_Kperiod,ST_Dperiod,ST_slowing,MODE_SMA,STO_LOWHIGH);return(WRONG_VALUE);}

   if(CopyBuffer(IND01[i],1,0,1,bbup)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND01[i],2,0,1,bbdw)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND02[i],0,0,1,rsi)<1) return(WRONG_VALUE);
   if(CopyBuffer(IND03[i],0,0,2,macd)<2) return(WRONG_VALUE);
   if(CopyBuffer(IND04[i],0,0,2,stoh)<2) return(WRONG_VALUE);
   if(CopyClose(m_symbol,tf,0,2,Close)<2) return(WRONG_VALUE);

   if(Close[0]<bbdw[0]&& Close[1]>bbdw[0]&&  stoh[1]>stoh[0]&&  stoh[0]<20  &&  rsi[0]<30  &&  macd[1]<macd[0]) return(ORDER_TYPE_BUY);
   if(Close[0]>bbup[0]&& Close[1]<bbup[0]&&  stoh[1]<stoh[0]&&  stoh[0]>80  &&  rsi[0]>70  &&  macd[1]>macd[0]) return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Aleksey Lebedev:

Будет 1, оба времени сначала округляются до целого дня, после вычитаются.

С чего Вы взяли, что в выражении все цифры округляются? Там же нет округления. Вот переменной присвоиться округленное число - согласен.

Да и если бы округляли я показал пример - текущий бар сего дня, а расчетный вчерашний - ТФ 1 час - их разность будет равна нулю при любых округлениях... ну может если всегда принудительно округлять в большую сторону...

 

Alexey Kozitsyn:
Точно так же, как и обнуление простых типов. Присваиванием им значения 0. Как только нужным полям присвоили значения 0 - используете обратную операцию StructToTime().

Спасибо - попробую ещё раз осмыслить - в хэлпе примеры не удачные...

 
-Aleks-:

С чего Вы взяли, что в выражении все цифры округляются? Там же нет округления. Вот переменной присвоиться округленное число - согласен.

Да и если бы округляли я показал пример - текущий бар сего дня, а расчетный вчерашний - ТФ 1 час - их разность будет равна нулю при любых округлениях... ну может если всегда принудительно округлять в большую сторону...

При делении целых чисел(int,long,datetime и т.п.) результат целое число, т.е. остаток отбрасывается. 00:00 сегодня и 23:59:59 вчера, разность будет равна 1дню.

 

Подскажите пожалуйста, MQL4...
Никак не могу сообразить, индикатор работает на M5, как в его коде обратиться к High или Low предыдущего бара на H1 ?        
Типа iHigh(NULL,PERIOD_H1, i) ... Смысл в том, чтобы определить(поставить на графике М5 стрелку вверх/вниз), пробила ли текущая свеча М5 цену High предыдущего часа.    


 
В коде индикатора MQL4 замена строки
for(i=pos; i<rates_total; i++) 
строкой
for(i=pos; i<rates_total-1; i++) 
приводит к тому, что индикатор не считается на текущем (незавершенном) баре - под этим баром просто нет линии индикатора.
В MQL5 при такой замене на текущем баре у меня выводятся какие-то странные значения индикатора, иногда просто 0.0000
Что можно с эти сделать ?
 
MikeZv:

Подскажите пожалуйста, MQL4...
Никак не могу сообразить, индикатор работает на M5, как в его коде обратиться к High или Low предыдущего бара на H1 ?        
Типа iHigh(NULL,PERIOD_H1, i) ... Смысл в том, чтобы определить(поставить на графике М5 стрелку вверх/вниз), пробила ли текущая свеча М5 цену High предыдущего часа.    


 

MikeZv:
В коде индикатора MQL4 замена строки
строкой
приводит к тому, что индикатор не считается на текущем (незавершенном) баре - под этим баром просто нет линии индикатора.
В MQL5 при такой замене на текущем баре у меня выводятся какие-то странные значения индикатора, иногда просто 0.0000.
Что можно с эти сделать ?

Мало ли как Вы там крутите индикаторные буфера - здесь только Джуна поможет.

Добавлено:

на время отладки ставьте проверку - какое значение содержится в массиве-таймсерии time[i] - так Вы поймёт с какого конца Вы начинаете обсчёт баров и где у Вас "нулевой" бар.

 
Karputov Vladimir

Мало ли как Вы там крутите индикаторные буфера - здесь только Джуна поможет.
... с  какого конца Вы начинаете обсчёт баров и где у Вас "нулевой" бар.

Владимир, спасибо за ответ на первый вопрос, я пропустил эти функции...

Один и тот же индикатор ставлю в МТ4 и в МТ5 (код конечно адаптирован для каждой платформы).
До нулевого бара у них значения совпадают, так что видимо с одного конца ... :)
А при отключении расчета на текущем баре в МТ4 под текущим баром ничего не рисуется, в МТ5 - неправильные значения.

 

Файлы:
mvt_Vlt.mq4  5 kb
mvt_Vlt.mq5  5 kb
Причина обращения: