斐波那契之字折线 - MetaTrader 5脚本




#财产指标缓冲区 2 #财产指标图 1 输入 双倍的回撤=23.6;//回撤金额 输入 双倍的minSizeInAtrUnits=0.0;//以 atr 为单位的波浪最小尺寸 输入 整数滚动AtrPeriod=14;//滚动atr周期 输入 颜色颜色=clr道奇蓝;//波浪颜色 输入 整数宽度=3;//波宽 输入 ENUM_LINE_STYLE风格=样式_实体;//波浪风格 //+------------------------------------------------------------------+ //|自定义指标初始化函数 | //+------------------------------------------------------------------+ //--- 上升波和下降波 双倍的upWaves[],dwWaves[];
这上波数组将存储高点和dw波数组将存储最低值
系统变量:
我们需要知道最后的波浪类型、开始位置、结束位置、从开始到结束的距离(以柱为单位)。
然后我们需要局部高点和局部低点变量以及距每个点的柱形距离。
//--- 跟踪之字形 //--- 我们拥有的波浪类型 [0] 无 [1] 向上 [2] 向下 整数波类型=0; //--- 波浪的价格(起始价格) 双倍的波开始价格=0.0; //--- 波浪的价格(结束价格) 双倍的波结束价格=0.0; //--- 距起始价的距离(以柱为单位) 整数波起始距离=0; //--- 距最终价格的距离(以柱为单位) 整数波结束距离=0; //--- 高价跟踪 双倍的高内存=0.0; 整数距离高=0; //--- 低价跟踪 双倍的低内存=0.0; 整数距低点的距离=0; //--- 滚动atr 双倍的滚动属性=0.0; 整数滚动Atrs=0;
最后计算了滚动atr单位和多少
然后我们创建一个系统重置函数:
无效重置系统(){
数组填充(upWaves,0,数组大小(upWaves),0.0);
数组填充(dwWaves,0,数组大小(dwWaves),0.0);
波类型=0;
波开始价格=0.0;
波结束价格=0.0;
波起始距离=0;
波结束距离=0;
高内存=0.0;
低内存=0.0;
距离高=0;
距低点的距离=0;
滚动属性=0.0;
滚动Atrs=0;
} 标准的东西,用零填充数组并重置系统变量。
在初始化时,我们设置缓冲区、绘图,然后第一次调用重置:
设置索引缓冲区(0,上波,INDICATOR_DATA); 设置索引缓冲区(1,dwWaves,INDICATOR_DATA); 绘图索引设置双精度(0,PLOT_EMPTY_VALUE,0.0); 绘图索引集整数(0,绘图类型,DRAW_ZIGZAG); 绘图索引集整数(0,绘图线颜色,0,颜色); 绘图索引集整数(0,绘图线宽度,宽度); 绘图索引集整数(0,PLOT_LINE_STYLE,风格); 重置系统();
那么让我们直接开始计算吧。
我们需要处理的第一件事是滚动 atr。
在我们收集到比 atr 期间更多的条之前,我们不会做任何其他事情。
管理滚动 atr 的部分如下:
//--- 管理 atr 滚动Atrs++; 如果(rollingAtrs>rollingAtrPeriod){ 双倍的new_portion=((高[i]-低[i])/_观点)/((双倍的)rollingAtrPeriod); //--- 我们删除旧部分并添加新部分 滚动Atr=(滚动Atr)-(滚动Atr/((双倍的)rollingAtrPeriod))+new_portion; } 别的 如果(rollingAtrs<=rollingAtrPeriod){ rollAtr+=(高[i]-低[i])/_观点; 如果(rollingAtrs==rollingAtrPeriod){ 滚动Atr/=((双倍的)rollingAtrs); //--- 启动高点和低点内存以及系统 high_mem=高[i]; low_mem=低[i]; 距离高=0; 距低点的距离=0; } }
太棒了,现在还有另一个问题。
这个之字形的基础是回调。
但要发生回调,必须至少有一波。
但第一波会折返什么呢? xD
为此,我们将执行以下操作:
这样我们就不会出现回调作为初始波浪,但是,我们必须以某种方式开始序列。
请注意,我们也可以选择仅针对第一波采用经典的分形方法,然后继续进行回撤。
只要我们没有波浪,这就是我们所做的:
//--- 如果我们还没有波浪类型 别的{ //--- 如果我们突破了高点而不是低点 如果(高[i]>高_mem&&低[i]>=低_mem){ 双倍的new_wave_size_in_atr_units=((high[i]-low_mem)/_观点)/rollingAtr; //--- 如果新的波浪大小有效 如果(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- 开始新的上升波 波类型=1; //--- 起始价格是最低内存 wave_start_price=low_mem; wave_start_distance=distance_from_low; //--- 最终价格是新高 wave_end_price=最高价[i]; 波结束距离=0; //--- 绘制波浪 dwWaves[i-wave_start_distance]=low_mem; upWaves[i]=high[i]; //--- 改变高位 high_mem=高[i]; 距离高=0; //--- 改变最低值 low_mem=低[i]; 距低点的距离=0; } } //--- 如果我们突破低点而不是高点 别的 如果(低[i]双倍的new_wave_size_in_atr_units=((high_mem-low[i])/_观点)/rollingAtr; //--- 如果新的波浪大小有效 如果(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- 开始新的下行波 波类型=-1; //--- 起始价格是最高内存 wave_start_price=high_mem; wave_start_distance=距高点的距离; //--- 最终价格是新低 wave_end_price=低[i]; 波结束距离=0; //--- 绘制波浪 upWaves[i-wave_start_distance]=high_mem; dwWaves[i]=低[i]; //--- 改变高位 high_mem=高[i]; 距离高=0; //--- 改变最低值 low_mem=低[i]; 距低点的距离=0; } } //--- 如果我们都破坏了 别的 如果(低[i] high_mem){ //--- 改变它们 high_mem=高[i]; low_mem=低[i]; 距离高=0; 距低点的距离=0; } }
伟大的 。现在是最后一块。
这是上述的相关代码:
//--- 如果我们有上升波 如果(波类型==1){ //--- 如果波浪向上扩展 如果(最高[i]>wave_end_price){ //--- 从数组位置删除前一个最终价格(0.0=空) upWaves[i-wave_end_distance]=0.0; //--- 将其放在新位置 upWaves[i]=high[i]; wave_end_price=最高价[i]; 波结束距离=0; //--- 改变高位 high_mem=高[i]; 距离高=0; //--- 改变最低值 low_mem=低[i]; 距低点的距离=0; } //--- 检查回撤 如果(low[i]0){ low_mem=低[i]; 距低点的距离=0; 双倍的size_of_wave=(wave_end_price-wave_start_price)/_观点; 双倍的size_of_retracement=(wave_end_price-low_mem)/_观点; 如果(波的大小>0.0){ 双倍的回撤=(回撤大小/波浪大小)*100.0; 双倍的new_wave_size_in_atr_units=((wave_end_price-low_mem)/_观点)/rollingAtr; //--- 如果新的波浪大小有效 如果(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- 如果回撤显着,则启动下行波 如果(回撤>=回撤){ //--- 开始新的下行波 波类型=-1; //--- 起始价格是最高内存 wave_start_price=high[i-distance_from_high]; wave_start_distance=距高点的距离; //--- 最终价格是新低 wave_end_price=低[i]; 波结束距离=0; //--- 绘制波浪 upWaves[i-wave_start_distance]=high_mem; dwWaves[i]=低[i]; //--- 改变高位 high_mem=高[i]; 距离高=0; //--- 改变最低值 low_mem=低[i]; 距低点的距离=0; } } } } }
当波浪向下时,我们会做相反的事情。
我们完成了,我们的回撤之字形已准备就绪。
这是之字形23.6%回撤和0.0 atr 单位中波浪的最小大小
这是相同的锯齿形3 最小波浪大小(atr 单位)
附件下载
📎 fibozigzag.mq5 (13.54 KB)
Source: MQL5 #56619
