//+------------------------------------------------------------------+ //| 3_bar_swing.mq4 | //| Zen_Leow | //| | //+------------------------------------------------------------------+ #property copyright "Zen_Leow" #property link "" #property indicator_chart_window // The number of buffers for calculation, up to 8 #property indicator_buffers 2 // The color for displaying arrows #property indicator_color1 Green // Long signal #property indicator_color2 Red // Short signal // Width of the arrows #property indicator_width1 1 // Long signal arrow #property indicator_width2 1 // Short signal arrow extern int ArrowDistance = 3; // Buffers for the calculations double Up_Arrow_Buffer[]; // Long buffer for display double Down_Arrow_Buffer[]; // Short buffer for display //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { // SetIndexStyle - sets the new type, style, width and color for a given indicator line // SetIndexBuffer - binds the array variable declared at a global level to the custom indicator pre-defined buffer // SetIndexArrow - sets an arrow symbol for indicators line of the DRAW_ARROW type. SetIndexStyle(0, DRAW_ARROW); SetIndexBuffer(0, Up_Arrow_Buffer); SetIndexArrow(0, 233); // Up arrow SetIndexStyle(1, DRAW_ARROW); SetIndexBuffer(1, Down_Arrow_Buffer); SetIndexArrow(1, 234); // Down arrow //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int i; // Bar index int Counted_bars; // Number of counted bars //-------------------------------------------------------------------- Counted_bars=IndicatorCounted(); // Number of counted bars i=Bars-Counted_bars-1; // Index of the first uncounted if (i == 0) { i = 2; // the newest signal bar is suppose to be at index 2 } while(i>1) // Loop for uncounted bars { if (isUpSwingBar(i)) { Up_Arrow_Buffer[i] = Low[i] - (ArrowDistance * Point); Down_Arrow_Buffer[i] = EMPTY_VALUE; } else if (isDownSwingBar(i)) { Down_Arrow_Buffer[i] = High[i] + (ArrowDistance * Point); Up_Arrow_Buffer[i] = EMPTY_VALUE; } else { Up_Arrow_Buffer[i] = EMPTY_VALUE; Down_Arrow_Buffer[i] = EMPTY_VALUE; } i--; } //---- return(0); } bool isUpSwingBar(int i) { if (Low[i] < Low[i+1] && Low[i] < Low[i-1] && High[i] < High[i+1] && High[i] < High[i-1]) { return (true); } return (false); } bool isDownSwingBar(int i) { if (Low[i] > Low[i+1] && Low[i] > Low[i-1] && High[i] > High[i+1] && High[i] > High[i-1]) { return (true); } return (false); } //+------------------------------------------------------------------+