Mql5 ATR跟踪停止实现

Mql5 ATR跟踪停止实现,mql5,Mql5,我试图在MQL5中实现ATR跟踪停止指示器。编译器不会抛出任何错误,但不会在图表上绘制任何内容,指示器值也不会更改 停止损耗=ATR x倍增器 // ATR railing stop #property indicator_chart_window #property indicator_buffers 3 #property indicator_plots 1 // plot ATR stop #property indicator_type1 DRAW_LINE #property in

我试图在MQL5中实现ATR跟踪停止指示器。编译器不会抛出任何错误,但不会在图表上绘制任何内容,指示器值也不会更改

停止损耗=ATR x倍增器

// ATR railing stop

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 1

// plot ATR stop
#property indicator_type1 DRAW_LINE
#property indicator_color1 Blue
#property indicator_style1 STYLE_SOLID
#property indicator_label1 "ATR stop"

// input parameters for ATR stop
input int ATR_period = 14; // ATR length / period
input int ATR_stop_multiplier = 2; // ATR stop multiplier

// indicator buffers
double ATRstopBuffer[];
double ATRBuffer[];
double StopLossBuffer[];


// initializacion function
int OnInit()
{
    SetIndexBuffer(0, ATRstopBuffer, INDICATOR_DATA);
    SetIndexBuffer(1, ATRBuffer, INDICATOR_CALCULATIONS);
    SetIndexBuffer(2, StopLossBuffer, INDICATOR_CALCULATIONS);
    hATR = iATR(_Symbol,_Period, ATR_period);
    return(INIT_SUCCEEDED);
}

// iteration function
int OnCalculate(
                const int rates_total,
                const int prev_calculated,
                const int begin,
                const double& price[])
{
    if(rates_total < ATR_period) return(0);
    if(prev_calculated == 0)
    {
        ATRstopBuffer[0] = 0.0;
        StopLossBuffer[0] = 0.0;
    }
    int start;
    if(prev_calculated == 0) start = 1;
    else start = prev_calculated - 1;


    for(int i = start; i < rates_total; i++)
    {
        ATRBuffer[i] = iATR(NULL, 0, ATR_period);
        StopLossBuffer[i] = ATRBuffer[i] * ATR_stop_multiplier;
    }

    if(prev_calculated == 0) start = ATR_period + 1;
    for(int i = ATR_period - 1; i < rates_total; i++)
    {
        // if trend is up plot max(previous stop, current stop)
        if(price[i] >= ATRstopBuffer[i - 1] && price[i - 1] >= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = MathMax(ATRstopBuffer[i - 1], (price[i] - StopLossBuffer[i]));

        // if trend is down plot min(previous stop, current stop)
        if(price[i] <= ATRstopBuffer[i - 1] && price[i - 1] <= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = MathMin(ATRstopBuffer[i - 1], (price[i] + StopLossBuffer[i]));

        // if trend change up plot current stop
        if(price[i] >= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = price[i] - StopLossBuffer[i];

        // if trend change down plot current stop
        if(price[i] <= ATRstopBuffer[i - 1]) ATRstopBuffer[i] = price[i] + StopLossBuffer[i];

    }
    return(rates_total);
}


//ATR栏杆挡块
#属性指示器\u图表\u窗口
#属性指示符\u缓冲区3
#属性指标图1
//绘图ATR停止
#属性指示器类型1绘制线
#属性指示器_颜色1蓝色
#属性指示器\u样式1样式\u实体
#属性指示器_标签1“ATR停止”
//ATR停止的输入参数
输入int ATR_周期=14;//ATR长度/周期
输入int ATR\u stop\u乘数=2;//ATR停止倍增器
//指示器缓冲器
双缓冲区[];
双缓冲区[];
双止动器缓冲器[];
//初始化函数
int OnInit()
{
SetIndexBuffer(0,ATRstopBuffer,指示符数据);
SetIndexBuffer(1,ATRBuffer,指标计算);
SetIndexBuffer(2,停止损失缓冲,指示器计算);
hATR=iATR(符号、周期、ATR周期);
返回(初始化成功);
}
//迭代函数
整数不计算(
总成本,
上一次计算的常数,
const int begin,
常数加倍和价格[])
{
if(总比率=ATRstopBuffer[i-1]&price[i-1]>=ATRstopBuffer[i-1]),ATRstopBuffer[i]=MathMax(ATRstopBuffer[i-1],(price[i]-StopLossBuffer[i]);
//如果趋势为下降,则绘制最小值(上一个停止,当前停止)

如果(价格[i]指标无法完成交易或删除订单,您需要一位专家顾问来执行任何交易actions@DanielKniaz我知道这一点!我想构建一个指示符,以便以后使用iCustom()从EA调用它@DanielKniaz或者你认为直接跳转到EA并在那里进行计算更好?当然这取决于你,但是如果你不打算尝试许多不同的选项和参数,那么直接在EA中进行计算似乎更好。你最初的问题是如何移动SL,对吗?答案是:不可能,只有EA/script可以做到。@Dan好的,我会尝试直接在EA中实现它,但如果可能的话,我想先让它作为一个指标来工作。你能指出我做错了什么吗?编译器不会抛出错误。