趋势线在紫色点处穿过移动平均线(黄色),表示买入信号。我想知道是否有一种方法可以通过编程来检测趋势线与移动平均线的交叉点,从而发出买入或卖出信号。
我知道如何绘制趋势线,但我不知道如何读懂这条趋势线上我感兴趣的值。任何想法都是受欢迎的。
发布于 2020-04-26 19:08:01
首先,获取趋势线上的点的时间和数据(这里:它们在结构中)。接下来,找到坡度。最后,您可以计算任何时间点的趋势线值。在下面的示例中,all被移到struct中。请记住,如果图表上有几条这样的线,您必须遍历所有这些线才能找到最后一条线(当然,如果您需要最后一条线)。
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));
}
https://stackoverflow.com/questions/61433197
复制相似问题