趋势线在紫点处横穿移动平均曲线(黄色),表示买入信号。 我想知道是否存在以编程方式检测趋势线与移动平均曲线的交点以发出买入或卖出信号的方法。
我知道如何绘制趋势线,但是我不知道如何读取该趋势线上我感兴趣的值。任何想法都将受到欢迎。
答案 0 :(得分:0)
首先,获取趋势线的点的时间和数据(在这里:它们在结构中)。 接下来,找到坡度。 最后,您可以在任何时间点计算趋势线值。 在下面的示例示例中,所有内容都移入了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));
}