首页 > 解决方案 > 如何在一天的第一个小时后绘制一条连接每根蜡烛最高点的趋势线

问题描述

我想编写一个 EA,它使用趋势线(在一天的第一个小时之后)连接每根蜡烛的最高点。我看到了趋势线的文档

这就是我所做的:

ObjectCreate(chart_ID,name,OBJ_TREND,sub_window,time1,price1,time2,price2)

ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
ObjectSetInteger(chart_ID,name,OBJPROP_RAY,false); 

我知道我想遍历每根蜡烛的最高值并得到它的时间,但我不知道如何去做。如何才能做到这一点?

这张图片显示了我正在尝试做的事情

在此处输入图像描述

更新

我试过了,但它没有显示该行。另外,我如何专门限制趋势线以加入当天第一个小时后出现的蜡烛?

void CalculateTrendLine()  {
   for(int i=0;i<30;i++){

   if (iTime(_Symbol,60,i) > 1) {
   ObjectCreate(0,"TLine"+i,OBJ_TREND,0, iTime(_Symbol,0,i), iHigh(_Symbol,0,i), iTime(_Symbol,0,i+1), iHigh(_Symbol,0,i+1));


   printf("trend start", iHigh( _Symbol,0,i));
  printf("trend end", iHigh( _Symbol,0,i+1));

  ObjectSetInteger(0,"TLine"+i,OBJPROP_COLOR,clrMagenta);
  ObjectSetInteger(0,"TLine"+i,OBJPROP_STYLE,STYLE_SOLID);
  ObjectSetInteger(0,"TLine"+i,OBJPROP_RAY,false); 

   }

} }

标签: mql4metatrader4

解决方案


这是超级懒惰的,我没有时间提供上下文,但是您可以设置一个断点并在调试器中逐步执行此示例。

//+------------------------------------------------------------------+
//|                                                         Tops.mq4 |
//|                                                      nicholishen |
//|                         https://www.forexfactory.com/nicholishen |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link      "https://www.forexfactory.com/nicholishen"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include <arrays/list.mqh>
#include <chartobjects/chartobjectslines.mqh>

class Line : public CChartObjectTrend
{
   static int  m_instances;
   int         m_instance;
 public:
   Line(datetime t1, double p1, datetime t2, double p2){ 
      m_instance = ++m_instances; 
      this.Create(0, "Line_"+string(m_instance), 0, t1, p1, t2, p2);
      this.Color(clrMagenta);
      this.RayRight(false);
   }
};
int Line::m_instances = 0;

CList list;
//+------------------------------------------------------------------+
int OnInit(){return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
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[])
{
   if(list.Total() > 0)
      return(rates_total);
   for(int i=0; i<10; i++) {
      list.Add(new Line(time[i+1], high[i+1], time[i], high[i]));
   }
   return rates_total;
}
//+------------------------------------------------------------------+

推荐阅读