出色的教程,塞缪尔!非常感谢!..!
你好,塞缪尔、
想法不错,但我做不到。您能在这篇文章中提交这个例子吗?
最诚挚的问候、
如何在期货交易中制作任意数量的烛台刻度线
scalp-91 #:
如何在期货交易中制作任意数量的烛台刻度线
如何在期货交易中制作任意数量的烛台刻度线
Creación de indicadores de tick en MQL5
- www.mql5.com
En este artículo vamos a ver la creación de dos indicadores: el indicador de tick, que representa el gráfico de tick del precio, y el indicador de vela de tick, que representa las velas con el número de ticks especificados. Cada uno de los indicadores escribe los precios de llegada en un archivo y utiliza los datos guardados tras el reinicio del indicador (estos datos pueden ser usados también por los demás programas).
非常感谢
//+------------------------------------------------------------------+ //|彩色蜡烛。mq5 || //|Copyright 2020, Samuel Manoel de Souza | | 版权所有 //|https://www.mql5.com/pt/users/samuelmnl| |. //+------------------------------------------------------------------+ #property copyright "Copyright 2020, Samuel Manoel de Souza" #property link "https://www.mql5.com/pt/users/samuelmnl" #property version "1.00" #property indicator_chart_window #property indicator_buffers 12 #property indicator_plots 3 //--- plot bull #property indicator_label1 "bull" #property indicator_type1 DRAW_CANDLES #property indicator_color1 clrGreen,clrBlack,clrGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot bear #property indicator_label2 "bear" #property indicator_type2 DRAW_CANDLES #property indicator_color2 clrRed,clrBlack,clrRed #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- 绘图范围 #property indicator_label3 "wait" #property indicator_type3 DRAW_CANDLES #property indicator_color3 clrGold,clrBlack,clrGold #property indicator_style3 STYLE_SOLID #property indicator_width3 1 //--- 指示器缓冲区 double bullBuffer1[]; double bullBuffer2[]; double bullBuffer3[]; double bullBuffer4[]; double bearBuffer1[]; double bearBuffer2[]; double bearBuffer3[]; double bearBuffer4[]; double rangeBuffer1[]; double rangeBuffer2[]; double rangeBuffer3[]; double rangeBuffer4[]; input int inpShift = 0; //指示器移位 input int inpBlue = 10;//蓝移 input int inpRed = 20; //红班 //+------------------------------------------------------------------+ //| 自定义指示器初始化函数 //+------------------------------------------------------------------+ int OnInit() { if(inpBlue <= 0) { Alert("Blue Shift must be greater then 0!"); return INIT_PARAMETERS_INCORRECT; } if(inpRed <= inpBlue) { Alert("Red Shift must be greater then Blue Shift!"); return INIT_PARAMETERS_INCORRECT; } //--- 指示器缓冲区映射 SetIndexBuffer(0, bullBuffer1, INDICATOR_DATA); SetIndexBuffer(1, bullBuffer2, INDICATOR_DATA); SetIndexBuffer(2, bullBuffer3, INDICATOR_DATA); SetIndexBuffer(3, bullBuffer4, INDICATOR_DATA); SetIndexBuffer(4, bearBuffer1, INDICATOR_DATA); SetIndexBuffer(5, bearBuffer2, INDICATOR_DATA); SetIndexBuffer(6, bearBuffer3, INDICATOR_DATA); SetIndexBuffer(7, bearBuffer4, INDICATOR_DATA); SetIndexBuffer(8, rangeBuffer1, INDICATOR_DATA); SetIndexBuffer(9, rangeBuffer2, INDICATOR_DATA); SetIndexBuffer(10, rangeBuffer3, INDICATOR_DATA); SetIndexBuffer(11, rangeBuffer4, INDICATOR_DATA); //--设置哪个值会使条形图不可见 PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0); PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0); //-- 为每个条形图设置移位值 PlotIndexSetInteger(0, PLOT_SHIFT, inpShift); PlotIndexSetInteger(1, PLOT_SHIFT, inpShift); PlotIndexSetInteger(2, PLOT_SHIFT, inpShift); //--设置必须从何处绘制条形图 PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, inpRed - 1); PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, inpRed - 1); PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, inpRed - 1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 自定义指标迭代函数| //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- //--如果没有足够的条形图,则不计算 if(rates_total < inpRed) { return rates_total; } //--确定计算的起点 int limit; if(prev_calculated < inpRed) limit = inpRed; else limit = prev_calculated - 1; //-- 主要计算循环 for(int i = limit; i < rates_total; i++) { int shift = BarIndex2shift(i); double open = iOpen(_Symbol, _Period, shift); double high = iHigh(_Symbol, _Period, shift); double low = iLow(_Symbol, _Period, shift); double close = iClose(_Symbol, _Period, shift); double red = price[i - (inpRed)]; //获取红线值 double blue = price[i - inpBlue]; //获取蓝线值 double yellow = price[i]; //获取黄线值 //该过滤器有三个标记 //0=卖出,1=等待,1=买入 // 如果 2 条线高于红色线,我们可以买入 // 如果 2 条线低于红色线,我们可以卖出 int direction = 0; direction += (yellow > red) ? 1 : 0; // 如果黄色高于红色,则加 1 red = blue; blue = yellow; direction += (blue > red) ? 1 : 0; // 如果蓝色高于红色,则加 1 . //默认栏不可见 bullBuffer1[i] = 0; bullBuffer2[i] = 0; bullBuffer3[i] = 0; bullBuffer4[i] = 0; bearBuffer1[i] = 0; bearBuffer2[i] = 0; bearBuffer3[i] = 0; bearBuffer4[i] = 0; rangeBuffer1[i] = 0; rangeBuffer2[i] = 0; rangeBuffer3[i] = 0; rangeBuffer4[i] = 0; //我们将根据方向标志为每个条形图赋值 switch(direction) { case 0: // 是熊市 { bearBuffer1[i] = open; bearBuffer2[i] = high; bearBuffer3[i] = low; bearBuffer4[i] = close; break; } case 1: // 是牛市 { rangeBuffer1[i] = open; rangeBuffer2[i] = high; rangeBuffer3[i] = low; rangeBuffer4[i] = close; break; } case 2: // 是范围市场 { bullBuffer1[i] = open; bullBuffer2[i] = high; bullBuffer3[i] = low; bullBuffer4[i] = close; break; } } } //--- 为下一次调用返回 prev_calculated 的值 return(rates_total); } int BarIndex2shift(int bar) {return Bars(_Symbol, _Period) - bar - 1;} //+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //|彩色蜡烛。mq5 || //| Copyright 2020, Samuel Manoel de Souza | | All rights reserved. //|https://www.mql5.com/zh/users/samuelmnl| //+------------------------------------------------------------------+ #property copyright "Copyright 2020, Samuel Manoel de Souza" #property link "https://www.mql5.com/zh/users/samuelmnl" #property version "1.00" #property indicator_chart_window #property indicator_buffers 12 #property indicator_plots 3 //--- plot bull #property indicator_label1 "bull" #property indicator_type1 DRAW_CANDLES #property indicator_color1 clrGreen,clrBlack,clrGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot bear #property indicator_label2 "bear" #property indicator_type2 DRAW_CANDLES #property indicator_color2 clrRed,clrBlack,clrRed #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- 绘图范围 #property indicator_label3 "wait" #property indicator_type3 DRAW_CANDLES #property indicator_color3 clrGold,clrBlack,clrGold #property indicator_style3 STYLE_SOLID #property indicator_width3 1 //--- 指示器缓冲区 double bullBuffer1[]; double bullBuffer2[]; double bullBuffer3[]; double bullBuffer4[]; double bearBuffer1[]; double bearBuffer2[]; double bearBuffer3[]; double bearBuffer4[]; double rangeBuffer1[]; double rangeBuffer2[]; double rangeBuffer3[]; double rangeBuffer4[]; input int inpShift = 0; //指示器移位 input int inpBlue = 10;//蓝移 input int inpRed = 20; //红班 //+------------------------------------------------------------------+ //| 自定义指示器初始化函数 //+------------------------------------------------------------------+ int OnInit() { if(inpBlue <= 0) { Alert("Blue Shift must be greater then 0!"); return INIT_PARAMETERS_INCORRECT; } if(inpRed <= inpBlue) { Alert("Red Shift must be greater then Blue Shift!"); return INIT_PARAMETERS_INCORRECT; } //--- 指示器缓冲区映射 SetIndexBuffer(0, bullBuffer1, INDICATOR_DATA); SetIndexBuffer(1, bullBuffer2, INDICATOR_DATA); SetIndexBuffer(2, bullBuffer3, INDICATOR_DATA); SetIndexBuffer(3, bullBuffer4, INDICATOR_DATA); SetIndexBuffer(4, bearBuffer1, INDICATOR_DATA); SetIndexBuffer(5, bearBuffer2, INDICATOR_DATA); SetIndexBuffer(6, bearBuffer3, INDICATOR_DATA); SetIndexBuffer(7, bearBuffer4, INDICATOR_DATA); SetIndexBuffer(8, rangeBuffer1, INDICATOR_DATA); SetIndexBuffer(9, rangeBuffer2, INDICATOR_DATA); SetIndexBuffer(10, rangeBuffer3, INDICATOR_DATA); SetIndexBuffer(11, rangeBuffer4, INDICATOR_DATA); //--设置哪个值会使条形图不可见 PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0); PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0); PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0); //-- 为每个条形图设置移位值 PlotIndexSetInteger(0, PLOT_SHIFT, inpShift); PlotIndexSetInteger(1, PLOT_SHIFT, inpShift); PlotIndexSetInteger(2, PLOT_SHIFT, inpShift); //--设置必须从何处绘制条形图 PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, inpRed - 1); PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, inpRed - 1); PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, inpRed - 1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 自定义指标迭代函数 //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- //--如果没有足够的条形图,则不计算 if(rates_total < inpRed) { return rates_total; } //--确定计算的起点 int limit; if(prev_calculated < inpRed) limit = inpRed; else limit = prev_calculated - 1; //-- 主要计算循环 for(int i = limit; i < rates_total; i++) { int shift = BarIndex2shift(i); double open = iOpen(_Symbol, _Period, shift); double high = iHigh(_Symbol, _Period, shift); double low = iLow(_Symbol, _Period, shift); double close = iClose(_Symbol, _Period, shift); double red = price[i - (inpRed)]; //获取红线值 double blue = price[i - inpBlue]; //获取蓝线值 double yellow = price[i]; //获取黄线值 //该过滤器有三个标记 //0=卖出,1=等待,1=买入 // 如果 2 条线高于红色线,我们可以买入 // 如果 2 条线低于红色线,我们可以卖出 int direction = 0; direction += (yellow > red) ? 1 : 0; // 如果黄色高于红色,则加 1 red = blue; blue = yellow; direction += (blue > red) ? 1 : 0; // 如果蓝色高于红色,则加 1 . //默认栏不可见 bullBuffer1[i] = 0; bullBuffer2[i] = 0; bullBuffer3[i] = 0; bullBuffer4[i] = 0; bearBuffer1[i] = 0; bearBuffer2[i] = 0; bearBuffer3[i] = 0; bearBuffer4[i] = 0; rangeBuffer1[i] = 0; rangeBuffer2[i] = 0; rangeBuffer3[i] = 0; rangeBuffer4[i] = 0; //我们将根据方向标志为每个条形图赋值 switch(direction) { case 0: // 是熊市 { bearBuffer1[i] = open; bearBuffer2[i] = high; bearBuffer3[i] = low; bearBuffer4[i] = close; break; } case 1: // 是牛市 { rangeBuffer1[i] = open; rangeBuffer2[i] = high; rangeBuffer3[i] = low; rangeBuffer4[i] = close; break; } case 2: // 是范围市场 { bullBuffer1[i] = open; bullBuffer2[i] = high; bullBuffer3[i] = low; bullBuffer4[i] = close; break; } } } //--- 为下一次调用返回 prev_calculated 的值 return(rates_total); } int BarIndex2shift(int bar) {return Bars(_Symbol, _Period) - bar - 1;} //+------------------------------------------------------------------+
PanteraNoire 策略测试?
没有。
您需要使用 iCustom。您可以查看指标中的缓冲区数字,了解颜色和数值。
新文章 探索创建多彩烛条的选项已发布:
在本文中,我将探讨创建烛条自定义指标的可能性,并指出它们的优缺点。
后一种方法的巨大优势在于,尽管所需的缓冲区数量显著增加了,但我们将拥有更丰富信息的用户界面。 不过,我们不仅可以依据上色规则为我们提供有关业务规则的信息,而且还能提供看涨蜡烛和看跌蜡烛之间的区别,进一步拓展了这一优势。 这可以通过处理之前看到的蜡烛的边缘颜色和填充物来做到。
如此,我们达成了本文的目标,即演示如何根据一些业务规则创建上色规则,并将其应用于有填充和无填充的蜡烛图表。 我们的最终工作成果如下图所示。
作者:Samuel Manoel De Souza