在MetaTrader 4 (MT4) 中,使用图形对象来增强技术分析的效果是非常重要的。本文将详细介绍如何通过MQL4编程在图表上创建和管理“卖出”标志,并提供相关的代码示例和编程技巧。
创建和管理“卖出”标志图形对象的步骤
在MT4中,通过MQL4脚本绘制和操作“卖出”标志图形对象需要以下几个步骤:
准备脚本
首先,创建一个新的MQL4脚本,并设置必要的脚本属性和输入参数:
#property strict
#property description "Script draws \"Sell\" signs in the chart window."
#property script_show_inputs
input color InpColor=C'225,68,29'; // 标志颜色
创建“卖出”标志图形对象
为了创建“卖出”标志图形对象,我们需要定义一个函数,该函数将处理对象的创建和属性设置:
bool ArrowSellCreate(const long chart_ID=0, const string name="ArrowSell", const int sub_window=0, datetime time=0, double price=0, const color clr=C'225,68,29', const ENUM_LINE_STYLE style=STYLE_SOLID, const int width=1, const bool back=false, const bool selection=false, const bool hidden=true, const long z_order=0) {
ChangeArrowEmptyPoint(time, price); // 设置锚点坐标
ResetLastError(); // 重置错误值
if (!ObjectCreate(chart_ID, name, OBJ_ARROW_SELL, sub_window, time, price)) {
Print(__FUNCTION__, ": failed to create \"Sell\" sign! Error code = ", GetLastError());
return false;
}
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_BACK, back); // 设置背景标志
ObjectSetInteger(chart_ID, name, OBJPROP_SELECTABLE, selection); // 设置可移动
ObjectSetInteger(chart_ID, name, OBJPROP_SELECTED, selection); // 设置选中状态
ObjectSetInteger(chart_ID, name, OBJPROP_HIDDEN, hidden); // 设置隐藏状态
ObjectSetInteger(chart_ID, name, OBJPROP_ZORDER, z_order); // 设置鼠标点击优先级
return true;
}
移动“卖出”标志图形对象
接下来,定义一个函数来移动“卖出”标志图形对象的锚点位置:
bool ArrowSellMove(const long chart_ID=0, const string name="ArrowSell", datetime time=0, double price=0) {
if (!time)
time = TimeCurrent();
if (!price)
price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
ResetLastError(); // 重置错误值
if (!ObjectMove(chart_ID, name, 0, time, price)) {
Print(__FUNCTION__, ": failed to move the anchor point! Error code = ", GetLastError());
return false;
}
return true;
}
删除和修改“卖出”标志图形对象
如果需要删除图形对象,可以使用以下函数:
bool ArrowSellDelete(const long chart_ID=0, const string name="ArrowSell") {
ResetLastError(); // 重置错误值
if (!ObjectDelete(chart_ID, name)) {
Print(__FUNCTION__, ": failed to delete \"Sell\" sign! Error code = ", GetLastError());
return false;
}
return true;
}
检查锚点值并设置默认值
为了确保锚点时间和价格有默认值,我们定义以下函数:
void ChangeArrowEmptyPoint(datetime &time, double &price) {
if (!time)
time = TimeCurrent();
if (!price)
price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
}
脚本启动函数
在脚本启动时,我们需要验证输入参数的有效性,并创建“卖出”标志图形对象:
void OnStart() {
datetime date[]; // 存储可见柱的日期数组
double low[]; // 存储可见柱的最低价格数组
double high[]; // 存储可见柱的最高价格数组
int bars = (int)ChartGetInteger(0, CHART_VISIBLE_BARS); // 获取图表窗口中的可见柱数
ArrayResize(date, bars);
ArrayResize(low, bars);
ArrayResize(high, bars);
ResetLastError();
if (CopyTime(Symbol(), Period(), 0, bars, date) == -1) {
Print("Failed to copy time values! Error code = ", GetLastError());
return;
}
if (CopyLow(Symbol(), Period(), 0, bars, low) == -1) {
Print("Failed to copy the values of Low prices! Error code = ", GetLastError());
return;
}
if (CopyHigh(Symbol(), Period(), 0, bars, high) == -1) {
Print("Failed to copy the values of High prices! Error code = ", GetLastError());
return;
}
for (int i = 0; i < bars; i++) {
if (!ArrowSellCreate(0, "ArrowSell_" + (string)i, 0, date[i], high[i], InpColor))
return;
if (IsStopped())
return;
ChartRedraw();
Sleep(50);
}
for (int i = 0; i < bars; i++) {
if (!ArrowSellMove(0, "ArrowSell_" + (string)i, date[i], low[i]))
return;
if (IsStopped())
return;
ChartRedraw();
Sleep(50);
}
for (int i = 0; i < bars; i++) {
if (!ArrowSellDelete(0, "ArrowSell_" + (string)i))
return;
ChartRedraw();
Sleep(50);
}
}
结语
通过以上代码示例和详细步骤,我们可以在MetaTrader 4中成功绘制和管理“卖出”标志图形对象。这不仅增强了图表的可视化效果,还为交易者提供了更多的市场分析工具。通过深入理解和灵活运用这些MQL4编程技巧,交易者能够更好地定制自己的交易策略和图表分析工具,从而提高交易效果。