mql4 - 如何在一天的第一个小时后绘制一条连接每根蜡烛最高点的趋势线
问题描述
我想编写一个 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);
}
} }
解决方案
这是超级懒惰的,我没有时间提供上下文,但是您可以设置一个断点并在调试器中逐步执行此示例。
//+------------------------------------------------------------------+
//| 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;
}
//+------------------------------------------------------------------+
推荐阅读
- javascript - vue.js 如何将类绑定到插件组件生成的元素
- angular - 角度路由在 CDN 上不起作用
- python - AttributeError:“numpy.ndarray”对象没有属性“convert”和 IndexError 错误:列表索引超出范围
- bing - 必应搜索 -- ACL/安全过滤
- crate - Crate - 在 Crate 中提取的记录但未通过选择查询显示的记录
- python - 如何在 Python 中检测空间路径中的自相交?
- javascript - 使用 url 将视频上传到 vimeo
- javascript - 为什么我在 vue 中传递回调时没有错过上下文?
- java - 通过覆盖私有类变量作为重构之前的初始步骤来测试方法
- .net - .NET/PowerShell Core 中的 RSACryptoServiceProvider、SignData 和填充