初学者的问题 MQL5 MT5 MetaTrader 5 - 页 481

 
你好!

有没有人有一个代码例子,可以在指标图上画一些图标,如箭头,当线条交叉时,如果有两条,或当 "0 "线被越过时,或任何其他标准?最好是在自动缩放指示窗口的顶部和底部
 
Sergei Vladimirov:
按 "加载"。只有最后的2048条是自动加载的,其余的必须要踢掉。
这是在 "装载 "之后出现的情况......。
 
Mike:
这就是在 "负载 "之后出现的情况......。
强行删除历史档案文件夹并运行终端--然后加载所有的引言。
 
Leo59:
你好!

也许有人有一个示例代码,可以在越过线时(如果有两条),或越过 "0 "线时,或任何其他标准,画出一些图标,例如指标图上的箭头?最好是在自动缩放指示窗口的顶部和底部

这是我的一只火鸡,也许会有帮助。该代码适用于MT4,就像现在这样。它也适用于日志。

void PlotArrowUP(int i)
{
    string sup = "\xE9"; //233
    datetime dt = iTime(NULL, 0, i); 
    double dprice = (WindowPriceMax()-WindowPriceMin())/(100.0/ArrowOffsetInPercentOfScreen); //настроить масштаб под свои нужды
    ObjectCreate("arr1"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]-dprice);   
    ObjectSetText("arr1"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowUp);
    ArrowIdx++;
    if(EnableLogFile)
    {
        string dts = TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        FileWrite(LogFile1, dts, "  call PlotArrowUp(i) i=", i, "  FastBuffer[i]=", FastBuffer[i]);
    }
}

void PlotArrowDown(int i)
{
    string sup = "\xEA"; //234
    datetime dt = iTime(NULL, 0, i); 
    double dprice = (WindowPriceMax()-WindowPriceMin())/(100.0/ArrowOffsetInPercentOfScreen);
    dprice*= 2.0;
    ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]+dprice);   
    ObjectSetText("arr0"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowDown);
    ArrowIdx++;
    if(EnableLogFile)
    {
        string dts = TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        FileWrite(LogFile1, dts, "  call PlotArrowDown(i) i=", i, "  FastBuffer[i]=", FastBuffer[i]);
    }
}
 
阿列克谢-沃尔昌斯基

Вот из моего индюка, может, поможет. Код для МТ4, выкладываю, как есть. Там еще работа с логами.

感谢Alexey的反馈!

在你的例子中,它是通过对象。我想知道是否有可能通过数组来实现,这样当我改变比例时,它们总是在窗口的上下边界
 
Leo59:
阿列克谢-沃尔昌斯基
感谢Alexey的反馈!

在你的例子中,它是通过对象。我想知道是否有可能通过数组来做,这样当我改变比例时,它们总是在窗口的顶部和底部

我不明白关于数组的问题。见评论,我添加了

ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]+dprice);
// "arr0"+ArrowIdx - формируем уникальное имя стрелки
// FastBuffer[i]+dprice - тут формируется цена, на которой будет рисоваться стрелка
   
ObjectSetText("arr0"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowDown);
ArrowIdx++; // для каждой стрелки нужно уникальное имя

此外,如果你需要在上边框上作画,请做以下工作

ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, ChartGetDouble(0,CHART_PRICE_MAX,0); 

阅读编辑器的帮助;这里有详细的描述和例子

MQL4 参考 / 标准常数、枚举和结构 / 图表常数 / 使用图表的例子

 
Alexey Volchanskiy:

我不明白关于数组的问题。见评论,我添加了

此外,如果你需要在上边框上作画,请做以下工作

阅读编辑器的帮助;这里有详细的描述和例子

MQL4 参考 / 标准常数、枚举和结构 / 图表常数 / 使用图表的例子

变化

WindowPriceMax() и WindowPriceMin()

对象应在离窗口边界一定的距离上被强制重绘

 
Leo59:

随着变化

对象将不得不被迫在离窗口边界一定距离的地方重新绘制。

旧的物品将留在它们的位置上--以旧的价格。如果你需要将它们移动到边界,你将不得不手动重新绘制它们。我并不完全了解你的问题。

你可以使用OnChartEvent 来跟踪窗口变化。

 
Alexey Volchanskiy:

旧的物品将留在它们的位置上--以旧的价格。如果你要把它们移到边界上,你就得用手重新画。我只是不完全了解你的任务。

你可以使用OnChartEvent来跟踪窗口变化。

乍一看,这似乎是一个简单的任务。但是!....
在指标窗口中有一条任何震荡器的线,它以不同的振幅相对 "0 "移动。
实际的问题是。
- 在从下到上的 "0 "交叉处,在指示器窗口的底部边界画一个箭头。
- 在 "0 "处从上往下交叉,在指示器窗口的上边界 附近画一个箭头。
- 在指标窗口中的振荡器图表的自我缩放中,箭头应自动保持在指标窗口的边界上。
即,在历史上前后滚动图表或改变其水平比例,箭头始终保持在指标窗口的边界上。
 
Leo59:
乍一看,这个任务似乎就像三个戈比一样简单。但是!....
在指标窗口中有一条任何振荡器的线,它以不同的振幅相对 "0 "旋转。
实际的问题是。
- 在从下到上的 "0 "交叉处,在指示器窗口的底部边界画一个箭头。
- 在 "0 "处从上往下交叉,在指示器窗口的上边界 附近画一个箭头。
- 在指标窗口中的振荡器图表的自我缩放中,箭头应自动保持在指标窗口的边界上。
即,在历史上前后滚动图表或改变其水平比例,箭头始终保持在指标窗口的边界上。

这个任务是也很简单。

当窗口被改变或滚动时,OnChartEvent 被调用,它传递一个没有参数的事件

CHARTEVENT_CHART_CHANGE图表变化事件

如果这个事件发生了,我们就确定左边和右边的可见栏,并在这些范围内找到指标窗口中的所有箭头。如果发现,我们就把它移到必要的边界。在创建箭头时,给它们命名,如UpArrow*****和DownArrow*****,以避免与分析有关的麻烦。然后为了以防万一,调用ChartRedraw。

原因: