Скачать MetaTrader 5

ПОМОГИТЕ !!!! переделать индиктор с MT4 под MT5.(бесплатно) - страница 5

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey
62
Andrey  

Здравствуйте, пытаюсь переделать индикатор с mql4 в mql5. По сути мне лишь нужно, что бы срабатывало звуковое уведомление в MFI при появление красного бара. Как этот звуковой код теперь присобачить к новому mfi?

Пример старого рабочего варианта прикрепил:

Файлы:
Vitaly Muzichenko
7929
Vitaly Muzichenko  

Подскажите, как правильно, это расчёт Heiken Ashi

 

 

Это вырезка со стандартного

for(i=pos/*pos=1*/; i<rates_total ;i++)
  {
   haOpen=(ExtOpenBuffer0[i-1]+ExtCloseBuffer0[i-1])/2; // <<<
   haClose=(Open[i]+High[i]+Low[i]+Close[i])/4;
   haHigh=MathMax(High[i],MathMax(haOpen,haClose));
   haLow=MathMin(Low[i],MathMin(haOpen,haClose));

 

Возникает вопрос: если Open нужно искать по предыдущему бару, то почему в коде ищется по следующему?

Наверное правильно так, или Я что-то не так понимаю:

haOpen=(ExtOpenBuffer0[i+1]+ExtCloseBuffer0[i+1])/2;
Спасибо!
Alexey Viktorov
20907
Alexey Viktorov  
Vitaly Muzichenko:

Подскажите, как правильно, это расчёт Heiken Ashi

 

 

Это вырезка со стандартного

for(i=pos/*pos=1*/; i<rates_total ;i++)
  {
   haOpen=(ExtOpenBuffer0[i-1]+ExtCloseBuffer0[i-1])/2; // <<<
   haClose=(Open[i]+High[i]+Low[i]+Close[i])/4;
   haHigh=MathMax(High[i],MathMax(haOpen,haClose));
   haLow=MathMin(Low[i],MathMin(haOpen,haClose));

 

Возникает вопрос: если Open нужно искать по предыдущему бару, то почему в коде ищется по следующему?

Наверное правильно так, или Я что-то не так понимаю:

haOpen=(ExtOpenBuffer0[i+1]+ExtCloseBuffer0[i+1])/2;
Спасибо!
В mql5 сделано направление индексации баров по умолчанию. Поэтому [i-1] будет как раз первым баром справа.
Vladimir Karputov
Модератор
85732
Vladimir Karputov  
Vitaly Muzichenko:

Подскажите, как правильно, это расчёт Heiken Ashi

 

 

Это вырезка со стандартного

for(i=pos/*pos=1*/; i<rates_total ;i++)
  {
   haOpen=(ExtOpenBuffer0[i-1]+ExtCloseBuffer0[i-1])/2; // <<<
   haClose=(Open[i]+High[i]+Low[i]+Close[i])/4;
   haHigh=MathMax(High[i],MathMax(haOpen,haClose));
   haLow=MathMin(Low[i],MathMin(haOpen,haClose));

 

Возникает вопрос: если Open нужно искать по предыдущему бару, то почему в коде ищется по следующему?

Наверное правильно так, или Я что-то не так понимаю:

haOpen=(ExtOpenBuffer0[i+1]+ExtCloseBuffer0[i+1])/2;
Спасибо!

Чтобы точно видеть, какой индекс имеет самый правый и самый левый бар на графике используйте такой простой приём:

В любом индикаторе, в редакторе MetaEditor ставите точку останова на первой операции внутри OnCakculate() (шаг 1):

проверка индексации 

 запускаете отладку на исторических данных. Как только запустится отладка на Вашей точке останова отладка станет на паузу. После этого добавьте в наблюдение две выражения: "time[rates_total-1]" и "time[0]" (шаги 2 и 3). Теперь сразу видно, что в данной ситуации (здесь массив time[] имеет направление индексации по-умолчанию, ArrayAsSeries не применялось) элемент time[rates_total-1] будет самым правым баром на графике (шаг 4).

Надеюсь такой простой и наглядный способ поможет быстро проверять направление индексации в индикаторах.

Vitaly Muzichenko
7929
Vitaly Muzichenko  
Alexey Viktorov:
В mql5 сделано направление индексации баров по умолчанию. Поэтому [i-1] будет как раз первым баром справа.

Примерно понимаю, поэтому об использовании ArraySetAsSeries не забываю.

Вопрос состоит в том, что в коде как в mql4, так и mql5 применяется одинаковый расчёт "i-1", почему вычитание, если формула гласит о предыдущем баре, а не о будущем?

 

Vladimir Karputov:

Чтобы точно видеть, какой индекс имеет самый правый и самый левый бар на графике используйте такой простой приём:

В любом индикаторе, в редакторе MetaEditor ставите точку останова на первой операции внутри OnCakculate() (шаг 1):

 запускаете отладку на исторических данных. Как только запустится отладка на Вашей точке останова отладка станет на паузу. После этого добавьте в наблюдение две выражения: "time[rates_total-1]" и "time[0]" (шаги 2 и 3). Теперь сразу видно, что в данной ситуации (здесь массив time[] имеет направление индексации по-умолчанию, ArrayAsSeries не применялось) элемент time[rates_total-1] будет самым правым баром на графике (шаг 4).

Надеюсь такой простой и наглядный способ поможет быстро проверять направление индексации в индикаторах.

Спасибо, не знал этого. 

Есть какие-то предположения о правильности расчёта? 

xak512
9
xak512  
Здравствуйте.
Нужно сделать алерт на индикатор CCI ARROWS.
Нужно что бы сигналил сразу, после появления стрелки.
MT5
Mihail Marchukajtes
4859
Mihail Marchukajtes  

Всем пирвет!!! Начал переделывать индикатор пот МТ5 но вод сасада, не могу понять с функцией iTime, что то не получается, может ктонибудь допилить индикатор до рабочего состояния?????

Индикатор читает файл который располагается в папке MQL5\Files\evolution-dvoid\

П‌осле скачивания переименовать в .csv

‌Заранее благодарен.

Файлы:
Olexiy Polyakov
4119
Olexiy Polyakov  

Всем доброго времени суток, я не программист, однако один из моих знакомых утверждает, что в коде индикатора Индекс Облегчения Рынка Била Вильямса (Market Facilitation Index, BW MFI) расчеты производятся не строго по классической формуле: BW MFI = (HIGH - LOW) / VOLUME , а дополнительно используется еще какая-то корректировка данных. Что по сути является ошибкой и соответственно индикатор отображает неверные данные!

Подскажите как исправить данную ошибку в индикаторе (убрать дополнительную корректировку данных) и получить 
индикатор работающий строго по формуле: BW MFI = (HIGH - LOW) / VOLUME ?????


//+------------------------------------------------------------------+

//|                                      MarketFacilitationIndex.mq5 |

//|                        Copyright 2009, MetaQuotes Software Corp. |

//|                                              http://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "2009, MetaQuotes Software Corp."

#property link      "http://www.mql5.com"

//--- indicator settings

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_plots   1

#property indicator_type1   DRAW_COLOR_HISTOGRAM

#property indicator_color1  Lime,SaddleBrown,Blue,Pink

#property indicator_width1  2

//--- input parameter

input ENUM_APPLIED_VOLUME InpVolumeType=VOLUME_TICK; // Volumes

//---- buffers

double                    ExtMFIBuffer[];

double                    ExtColorBuffer[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

void OnInit()

  {

//---- indicators

   SetIndexBuffer(0,ExtMFIBuffer,INDICATOR_DATA);

   SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX);

//--- name for DataWindow

   IndicatorSetString(INDICATOR_SHORTNAME,"BWMFI");

//--- set accuracy

   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

//----

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void CalculateMFI(const int start,const int rates_total,

                  const double &high[],

                  const double &low[],

                  const long &volume[])

  {

   int  i=start;

   bool mfi_up=true,vol_up=true;

//--- calculate first values of mfi_up and vol_up

   if(i>0)

     {

      int n=i;

      while(n>0)

        {

         if(ExtMFIBuffer[n]>ExtMFIBuffer[n-1]) { mfi_up=true;  break; }

         if(ExtMFIBuffer[n]<ExtMFIBuffer[n-1]) { mfi_up=false; break; }

         //--- if mfi values are equal continue

         n--;

        }

      n=i;

      while(n>0)

        {

         if(volume[n]>volume[n-1]) { vol_up=true;  break; }

         if(volume[n]<volume[n-1]) { vol_up=false; break; }

         //--- if real volumes are equal continue

         n--;

        }

     }

//---

   while(i<rates_total && !IsStopped())

     {

      if(volume[i]==0)

        {

         if(i>0) ExtMFIBuffer[i]=ExtMFIBuffer[i-1];

         else    ExtMFIBuffer[i]=0;

        }

      else ExtMFIBuffer[i]=(high[i]-low[i])/_Point/volume[i];

      //--- calculate changes

      if(i>0)

        {

         if(ExtMFIBuffer[i]>ExtMFIBuffer[i-1]) mfi_up=true;

         if(ExtMFIBuffer[i]<ExtMFIBuffer[i-1]) mfi_up=false;

         if(volume[i]>volume[i-1])             vol_up=true;

         if(volume[i]<volume[i-1])             vol_up=false;

        }

      //--- set colors

      if(mfi_up && vol_up)   ExtColorBuffer[i]=0.0;

      if(!mfi_up && !vol_up) ExtColorBuffer[i]=1.0;

      if(mfi_up && !vol_up)  ExtColorBuffer[i]=2.0;

      if(!mfi_up && vol_up)  ExtColorBuffer[i]=3.0;

      i++;

     }

  }

//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int OnCalculate(const int rates_total,

                const int prev_calculated,

                const datetime &time[],

                const double &open[],

                const double &high[],

                const double &low[],

                const double &close[],

                const long &tick_volume[],

                const long &volume[],

                const int &spread[])

  {

//---

   int start=0;

//---

   if(start<prev_calculated) start=prev_calculated-1;

//--- calculate with tick or real volumes

   if(InpVolumeType==VOLUME_TICK)

      CalculateMFI(start,rates_total,high,low,tick_volume);

   else

      CalculateMFI(start,rates_total,high,low,volume);

//--- normalize last mfi value

   if(rates_total>1)

     {

      datetime ctm=TimeTradeServer(),lasttm=time[rates_total-1],nexttm=lasttm+datetime(PeriodSeconds());

      if(ctm<nexttm && ctm>=lasttm && nexttm!=lasttm)

        {

         double correction_koef=double(1+ctm-lasttm)/double(nexttm-lasttm);

         ExtMFIBuffer[rates_total-1]*=correction_koef;

        }

     }

//---

   return(rates_total);

  }

//+------------------------------------------------------------------+

Olexiy Polyakov
4119
Olexiy Polyakov  

Подскажите что это за код и как из этого сделать индикатор для MT5 ???


//This is a volume based indicator. Make shure to use proper volume input.


//Squat bars are a battle of the bulls and the bears, with lots of buying and selling but little price movement.
//A squat bar will be one of the top three OR bottom three bars 85% of the time at the end of a trend.
//While all trends end with a squat, all squats are NOT the end of a trend.

study("Williams Squat Bars", shorttitle="Squat Bars", overlay=true)
r_hl=roc((high-low)/volume,1)
r_v=roc(volume,1)
squat_f=(r_hl < 0) and (r_v > 0)
barcolor(squat_f ? blue : na) 
Alekseu Fedotov
1177
Alekseu Fedotov  
Olexiy Polyakov:

Подскажите что это за код и как из этого сделать индикатор для MT5 ???


//This is a volume based indicator. Make shure to use proper volume input.


//Squat bars are a battle of the bulls and the bears, with lots of buying and selling but little price movement.
//A squat bar will be one of the top three OR bottom three bars 85% of the time at the end of a trend.
//While all trends end with a squat, all squats are NOT the end of a trend.

study("Williams Squat Bars", shorttitle="Squat Bars", overlay=true)
r_hl=roc((high-low)/volume,1)
r_v=roc(volume,1)
squat_f=(r_hl < 0) and (r_v > 0)
barcolor(squat_f ? blue : na) 

BW MFI    Приседающий бар , 3 буфер ( если память не изменяет)
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий