Скачать MetaTrader 5

Реализация дистанции между двумя линиями iMA

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай, как установить MetaTrader на Linux
RuslanLim
23
RuslanLim 2015.03.01 20:31 

Суть: нужен пример или несколько примеров MQL4 или MQL5, для реализации расчета расстояния (дистанции) между двумя скользящими линиями индикатора Moving Average.

Допустим две скользящие на графике одна с периодом  10 и вторая 200 и обе с простым усреднением SMA - Simple без сдвигов, применение к Close. Нужно рассчитать в пунктах расстояние линии с периодом  10 от линии с периодом 200.

Fannasankh
120
Fannasankh 2015.03.01 21:51  
Получай значение в точке для одной, потом для другой и вычитай одно из другого.
RuslanLim
23
RuslanLim 2015.03.01 22:22  
Fannasankh:
Получай значение в точке для одной, потом для другой и вычитай одно из другого.
по подробней и по наглядный опишите как это реализовать у меня маленький опыт и самостоятельно это не получается сделать.
Andrei Fandeev
18214
Andrei Fandeev 2015.03.01 23:05  

Дистанция между 2мя МА - это значение индикатора MACD

https://docs.mql4.com/ru/indicators/imacd   - для 4ки

https://www.mql5.com/ru/docs/indicators/imacd   - для 5ки

Dmitry Fedoseev
42923
Dmitry Fedoseev 2015.03.02 01:39  

Для MТ4 или MТ5? Большая разница.

У MACD не все типы МА регулируются. 

Artyom Trishkin
Модератор
75869
Artyom Trishkin 2015.03.02 03:10  
RuslanLim:

Суть: нужен пример или несколько примеров MQL4 или MQL5, для реализации расчета расстояния (дистанции) между двумя скользящими линиями индикатора Moving Average.

Допустим две скользящие на графике одна с периодом  10 и вторая 200 и обе с простым усреднением SMA - Simple без сдвигов, применение к Close. Нужно рассчитать в пунктах расстояние линии с периодом  10 от линии с периодом 200.

MQL4

//+------------------------------------------------------------------+
int GetDistanceBetweenMAinPoints(string sy,              // символ МА
                                 int timeframe,          // таймфрейм МА
                                 
                                 int period_ma1,         // период МА 1
                                 int shift_ma1,          // смещение МА 1
                                 int method_ma1,         // метод расчёта МА 1
                                 int appled_price_ma1,   // цена расчёта МА 1

                                 int period_ma2,         // период МА 2
                                 int shift_ma2,          // смещение МА 2 
                                 int method_ma2,         // метод расчёта МА 2 
                                 int appled_price_ma2,   // цена расчёта МА 2
                                 int shift               // бар, на котором рассчитать дистанцию
                                 ) {
   double pt=SymbolInfoDouble(sy,SYMBOL_POINT);
   double ma1=iMA(sy,timeframe,period_ma1,shift_ma1,method_ma1,appled_price_ma1,shift);
   double ma2=iMA(sy,timeframe,period_ma2,shift_ma2,method_ma2,appled_price_ma2,shift);
   return(int((ma1-ma2)/pt));
   }
//+------------------------------------------------------------------+

А в общем по вашему вопросу так:

int distance=int((iMA(Symbol(),Period(),10,0,MODE_SMA,PRICE_CLOSE,0)-iMA(Symbol(),Period(),200,0,MODE_SMA,PRICE_CLOSE,0))/Point());

получим дистанцию в пунктах между двумя МАшками с вашими параметрами на текущем графике, на текущем таймфрейме, на текущем баре

RuslanLim
23
RuslanLim 2015.03.02 12:11  

Спасибо всем за помощь задача решена 

 

         <...>

               double RedLine  = iMA(Symbol(), 0, RedPeriud,  0, MODE_SMA, PRICE_CLOSE, 2);

               double BlueLine = iMA(Symbol(), 0, BluePeriud, 0, MODE_SMA, PRICE_CLOSE, 2);

               

               //double Delta=(RedLine - BlueLine)/Point;

 

               if(Digits==3 || Digits==5) {Delta1=(RedLine - BlueLine)/ 10 /Point;

                                           Delta2=(BlueLine - RedLine)/ 10 /Point;}

               else if(Digits==2 || Digits==4) {Delta1=(RedLine - BlueLine)/Point;

                                                Delta2=(BlueLine - RedLine)/Point;}

        <...> 
Alexander Voronkov
18980
Alexander Voronkov 2015.03.03 07:06  
RuslanLim:

Спасибо всем за помощь задача решена 

 

               if( _Digits == 3 || _Digits == 5 ) Delta = MathAbs(( RedLine - BlueLine ) / 10 / Point );

               else if( _Digits == 2 || _Digits == 4 ) Delta = MathAbs(( RedLine - BlueLine ) / Point );
Dmitriy Skub
11636
Dmitriy Skub 2015.03.03 07:39  
А если Digits будет равно 1 или 0 или 6, например?))
RuslanLim
23
RuslanLim 2015.03.05 22:05  
Dima_S:
А если Digits будет равно 1 или 0 или 6, например?))
if( _Digits == 3 || _Digits == 5 )... и else if( _Digits == 2 || _Digits == 4)...

эти конструкции для цен с пятью и тремя знаками или двумя и четырьмя знаками после запятой к примеру, может быть цена на золото 1225,999 а может быть токая же цена но у другого брокера 1225,99 или на пример у пары EUR-USD 1,10250 или 1,1025 от сюда и следует ответ - Digits 1 или 0 или 6 не может быть так как стандартом идут именно 3 или 5 и 2 или 4 так как бы будет правильней.

Stefan Stoyanov
16175
Stefan Stoyanov 2015.03.21 11:45  

А кто то так не   пробовал

    double Poin  
    if(Digits<=0) Poin=1; 
    if(Digits<=1 && Digits>0 ) Poin=0.1; 
    if(Digits<=2 && Digits>1 )  Poin=0.01; 
    if(Digits<=3 && Digits>2 )  Poin=0.001;
    if(Digits<=4 && Digits>3 ) Poin=0.0001; 
    if(Digits<=5 && Digits>4 ) Poin=0.0001;
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий