Как определить, когда линия тренда пересекает кривую MA - PullRequest
0 голосов
/ 26 апреля 2020

Линия тренда пересекает кривую скользящей средней (желтая) в фиолетовой точке, указывающей на сигнал на покупку. Я хотел знать, существует ли способ программно обнаружить пересечение линии тренда с кривой скользящего среднего для размещения сигнала на покупку или продажу. enter image description here

Я знаю, как нарисовать линию тренда, но не знаю, как прочитать значения, которые меня интересуют на этой линии тренда. Любая идея будет приветствоваться.

1 Ответ

0 голосов
/ 26 апреля 2020

Во-первых, получите время и данные о точках линии тренда (здесь: они в структуре). Далее найдите склон. Наконец, вы можете вычислить значение линии тренда в любой момент времени. В приведенном ниже примере все перенесено в структуру. Имейте в виду, что если у вас есть несколько таких линий на графике, вам нужно l oop над всеми из них, чтобы найти последнюю (если, конечно, вам нужна последняя).

struct TrendLine{
   datetime m_startDt;
   double   m_start;
   datetime m_endDt;
   double   m_end;
   double   m_slope; // slope, price per bar

   void     Init(const string objName) {
      m_startDt=(datetime)ObjectGetInteger(0,objName,OBJPROP_TIME1);
      m_start  = ObjectGetDouble(0,objName,OBJPROP_PRICE1);
      m_endDt  =(datetime)ObjectGetInteger(0,objName,OBJPROP_TIME2);
      m_end    = ObjectGetDouble(0,objName,OBJPROP_PRICE2);
   }
   void     computeSlope() {
      const int distanceInBars=iBarShift(_Symbol,0,m_startDt)-iBarShift(_Symbol,0,m_endDt);
      m_slope = (m_end-m_start)/distanceInBars;
   }

   double  getTrendLineValueByTime(const datetime time) {
      if(m_slope==0.)
         computeSlope();
      const int distanceInBarsFromEnd=iBarShift(_Symbol,0,time)-iBarShift(_Symbol,0, m_endDt);
      const double result=m_end-slope*distanceInBarsFromEnd;
      return result;
   }
};

, поэтому вы будете использовать его следующим образом:

void OnTick() {
   TrendLine trendLine;
   string objName;
   for(int i=ObjectsTotal()-1;i>=0;i--) {
      objName=ObjectName(i);
      if(ObjectType(objName)!=OBJ_TREND) continue;
      trendLine.Init(objName);
   }
   datetime t = iTime(_Symbol,0,1);// let's suppose we need TL value for last bar
   double tlValue = trendLine.getTrendLineValueByTime(t);
   Print(__LINE__," ",__FILE__," trend line at time = ",t," = ",DoubleToString(tlValue,8));
}
...