诚信为本
量力而为
当前位置:ea编程网 EA知识 正文

在MetaTrader 4中创建和管理买入标志的方法

在MetaTrader 4 (MT4) 中,图形对象的使用对于技术分析和交易决策具有重要意义。本文将详细介绍如何通过MQL4编程在图表上创建和管理“买入”标志,提供相关的代码示例和编程技巧。

创建和管理买入标志

创建和管理“买入”标志图形对象的步骤

在MT4中,通过MQL4脚本绘制和操作“买入”标志图形对象需要以下几个步骤:

准备脚本

首先,创建一个新的MQL4脚本,并设置必要的脚本属性和输入参数:

#property strict 
#property description "Script draws \"Buy\" signs in the chart window." 
#property script_show_inputs 

input color InpColor=C'3,95,172'; // 标志颜色

创建“买入”标志图形对象

为了创建“买入”标志图形对象,我们需要定义一个函数,该函数将处理对象的创建和属性设置:

bool ArrowBuyCreate(const long chart_ID=0, const string name="ArrowBuy", const int sub_window=0, datetime time=0, double price=0, const color clr=C'3,95,172', 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_BUY, sub_window, time, price)) {
        Print(__FUNCTION__, ": failed to create \"Buy\" 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 ArrowBuyMove(const long chart_ID=0, const string name="ArrowBuy", 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 ArrowBuyDelete(const long chart_ID=0, const string name="ArrowBuy") {
    ResetLastError();  // 重置错误值
    if (!ObjectDelete(chart_ID, name)) {
        Print(__FUNCTION__, ": failed to delete \"Buy\" 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 (!ArrowBuyCreate(0, "ArrowBuy_" + (string)i, 0, date[i], low[i], InpColor)) 
            return;
        if (IsStopped()) 
            return;
        ChartRedraw();
        Sleep(50);
    }

    for (int i = 0; i < bars; i++) {
        if (!ArrowBuyMove(0, "ArrowBuy_" + (string)i, date[i], high[i])) 
            return;
        if (IsStopped()) 
            return;
        ChartRedraw();
        Sleep(50);
    }

    for (int i = 0; i < bars; i++) {
        if (!ArrowBuyDelete(0, "ArrowBuy_" + (string)i)) 
            return;
        ChartRedraw();
        Sleep(50);
    }
}

结语

通过以上代码示例和详细步骤,我们可以在MetaTrader 4中成功绘制和管理“买入”标志图形对象。这不仅增强了图表的可视化效果,还为交易者提供了更多的市场分析工具。通过深入理解和灵活运用这些MQL4编程技巧,交易者能够更好地定制自己的交易策略和图表分析工具,从而提高交易效果。

未经允许不得转载:ea编程网 » 在MetaTrader 4中创建和管理买入标志的方法