Miscellaneous
0
Views
0
Downloads
0
Favorites
Barros Swing
//+------------------------------------------------------------------+
//| Barros Swing.mq4 |
//| Copyright ? 2009, Walter Choy |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright ? 2009, Walter Choy"
#property link ""
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 OrangeRed
#property indicator_color2 MediumPurple
#property indicator_color3 Red
#property indicator_color4 Black
#property indicator_color5 Black
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 4
//---- input parameters
extern int period = 18;
extern bool show_d1_swing = false;
extern string XABC_setting = "<<-- XABC Settings -->>";
extern bool XABC_enabled = true;
extern datetime XABC_spec_time = 0; //D'2008.12.1 00:00';
extern string XABC_font = "Arial";
extern int XABC_font_size = 16;
extern color XABC_font_color = White;
extern color XABC_ME_line_color = Yellow;
//---- constants
#define LINE_DIRECT_UP 1
#define LINE_DIRECT_DN -1
#define LINE_NO_DIRECT -2
#define XABC_A 0
#define XABC_A_BAR 1
#define XABC_B 2
#define XABC_B_BAR 3
#define XABC_C 4
#define XABC_C_BAR 5
#define XABC_UPPER_ME 6
#define XABC_LOWER_ME 7
#define XABC_PBZ 8
#define XABC_PSZ 9
#define XABC_SWING_COUNT 10
//---- buffers
double d1_swing[];
double dn_swing[];
double XABC[];
double imean[];
double signals[];
double d1_line_direct[];
double dn_line_direct[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(7);
if (show_d1_swing)
SetIndexStyle(0,DRAW_SECTION);
else
SetIndexStyle(0,DRAW_NONE);
SetIndexBuffer(0,d1_swing);
SetIndexEmptyValue(0, 0);
SetIndexLabel(0, "1-period Swing");
SetIndexStyle(1,DRAW_SECTION);
SetIndexBuffer(1,dn_swing);
SetIndexEmptyValue(1, 0);
SetIndexLabel(1, period + "-period Swing");
SetIndexStyle(2,DRAW_SECTION);
SetIndexBuffer(2,XABC);
SetIndexEmptyValue(2, 0);
SetIndexLabel(2, "XABC");
SetIndexStyle(3,DRAW_NONE);
SetIndexBuffer(3,imean);
SetIndexLabel(3, "Impluse mean");
SetIndexStyle(4, DRAW_NONE);
SetIndexBuffer(4, signals);
SetIndexLabel(4, "Signals");
SetIndexBuffer(5,d1_line_direct);
SetIndexBuffer(6,dn_line_direct);
IndicatorDigits(Digits);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
clear_label();
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
double shd_h, shd_l;
double direct;
static double impulse_mean, impulse_count, last_val_1, last_val_2, last_val_3;
double val_0, val_1, val_2, val_3;
int i, j, n;
//----
n = Bars - counted_bars - 1;
i = n;
while (i>=0){
if (i == Bars - 1){
shd_h = High[i] - High[i-1];
shd_l = Low[i]- Low[i-1];
if (shd_h > shd_l){
d1_swing[i] = High[i];
d1_line_direct[i] = LINE_DIRECT_UP;
} else {
d1_swing[i] = Low[i];
d1_line_direct[i] = LINE_DIRECT_DN;
}
} else {
direct = d1_direct(i);
switch (direct){
case LINE_DIRECT_UP:
d1_swing[i] = High[i];
d1_line_direct[i] = LINE_DIRECT_UP;
if (d1_line_direct[i+1] == LINE_DIRECT_UP) d1_swing[i+1] = 0;
if (d1_line_direct[i+1] == LINE_NO_DIRECT){
j = i+1;
while(d1_line_direct[j] == LINE_NO_DIRECT && j <= Bars) j++;
if(d1_line_direct[j] == LINE_DIRECT_UP){
if(High[j] < High[i]){
d1_swing[j] = 0;
} else {
d1_swing[i] = 0;
d1_line_direct[i] = LINE_NO_DIRECT;
}
}
}
break;
case LINE_DIRECT_DN:
d1_swing[i] = Low[i];
d1_line_direct[i] = LINE_DIRECT_DN;
if (d1_line_direct[i+1] == LINE_DIRECT_DN) d1_swing[i+1] = 0;
if (d1_line_direct[i+1] == LINE_NO_DIRECT){
j = i+1;
while(d1_line_direct[j] == LINE_NO_DIRECT && j <= Bars) j++;
if(d1_line_direct[j] == LINE_DIRECT_DN){
if(Low[j] > Low[i]){
d1_swing[j] = 0;
} else {
d1_swing[i] = 0;
d1_line_direct[i] = LINE_NO_DIRECT;
}
}
}
break;
case LINE_NO_DIRECT:
d1_swing[i] = 0;
d1_line_direct[i] = LINE_NO_DIRECT;
break;
}
}
i--;
}
i = n;
while (i>=0){
if (i == Bars - 1){
shd_h = High[i] - High[i-1];
shd_l = Low[i]- Low[i-1];
if (shd_h > shd_l){
dn_swing[i] = High[i];
dn_line_direct[i] = LINE_DIRECT_UP;
} else {
dn_swing[i] = Low[i];
dn_line_direct[i] = LINE_DIRECT_DN;
}
} else {
direct = dn_direct(i, period);
switch (direct){
case LINE_DIRECT_UP:
dn_swing[i] = High[i];
dn_line_direct[i] = LINE_DIRECT_UP;
if (dn_line_direct[i+1] == LINE_DIRECT_UP) dn_swing[i+1] = 0;
if (dn_line_direct[i+1] == LINE_NO_DIRECT){
j = i+1;
while(dn_line_direct[j] == LINE_NO_DIRECT && j <= Bars) j++;
if(dn_line_direct[j] == LINE_DIRECT_UP){
if(High[j] < High[i]){
dn_swing[j] = 0;
} else {
dn_swing[i] = 0;
dn_line_direct[i] = LINE_NO_DIRECT;
}
}
}
break;
case LINE_DIRECT_DN:
dn_swing[i] = Low[i];
dn_line_direct[i] = LINE_DIRECT_DN;
if (dn_line_direct[i+1] == LINE_DIRECT_DN) dn_swing[i+1] = 0;
if (dn_line_direct[i+1] == LINE_NO_DIRECT){
j = i+1;
while(dn_line_direct[j] == LINE_NO_DIRECT && j <= Bars) j++;
if(dn_line_direct[j] == LINE_DIRECT_DN){
if(Low[j] > Low[i]){
dn_swing[j] = 0;
} else {
dn_swing[i] = 0;
dn_line_direct[i] = LINE_NO_DIRECT;
}
}
}
break;
case LINE_NO_DIRECT:
dn_swing[i] = 0;
dn_line_direct[i] = LINE_NO_DIRECT;
break;
}
}
// Calculate impulse means
val_0 = 0; val_1 = 0; val_2 = 0; val_3 = 0; j = i;
while(val_3 == 0 && j <= Bars){
if (dn_swing[j] > 0){
if (val_0 == 0){
val_0 = dn_swing[j];
} else {
if (val_1 == 0){
val_1 = dn_swing[j];
} else {
if (val_2 == 0){
val_2 = dn_swing[j];
} else {
val_3 = dn_swing[j];
}
}
}
}
j++;
}
bool isimpulse = false;
if (val_2 > val_1){
if (val_3 > val_1) isimpulse = true;
} else {
if (val_3 < val_1) isimpulse = true;
}
if ((last_val_1 != val_1 && last_val_2 != val_2 && last_val_3 != val_3) ||
(last_val_1 == 0 && last_val_2 == 0 && last_val_3 == 0)){
last_val_1 = val_1; last_val_2 = val_2; last_val_3 = val_3;
if(val_1 > 0 && val_2 > 0 && val_3 > 0 && isimpulse){
if(impulse_mean > 0){
if(MathAbs(val_1 - val_2) <= (impulse_mean * 5.0)){
impulse_mean = impulse_mean * impulse_count + MathAbs(val_1 - val_2);
impulse_count++;
impulse_mean /= impulse_count;
}
} else {
impulse_mean = MathAbs(val_1 - val_2);
impulse_count = 1;
}
}
}
GlobalVariableSet(period+"d_Impluse_Mean", impulse_mean);
GlobalVariableSet(period+"d_Impluse_Count", impulse_count);
imean[i] = impulse_mean;
i--;
}
if (XABC_enabled) identify_XABC();
//----
return(0);
}
//+------------------------------------------------------------------+
int d1_direct(int idx){
double shd_h, shd_l;
shd_h = High[idx] - High[idx+1];
shd_l = Low[idx+1] - Low[idx];
if (shd_h > shd_l && shd_h > 0)
return (LINE_DIRECT_UP);
if (shd_h < shd_l && shd_l > 0)
return (LINE_DIRECT_DN);
return (LINE_NO_DIRECT);
}
int dn_direct(int idx, int n){
double shd_h, shd_l, nHigh, nLow, ten_pc;
double val_1, val_2;
int i, j;
nHigh = High[idx+1]; nLow = Low[idx+1];
for (i=1; i<=n; i++){
nHigh = MathMax(nHigh, High[idx+i]);
nLow = MathMin(nLow, Low[idx+i]);
}
j = idx+1; val_1 = 0; val_2 = 0;
while(val_2 == 0 && j <= Bars){
if (d1_swing[j] > 0){
if (val_1 <= 0){
val_1 = d1_swing[j];
} else {
val_2 = d1_swing[j];
}
}
j++;
}
ten_pc = 0;
if(val_1 > 0 && val_2 > 0) ten_pc = MathAbs(val_1 - val_2) * 10 / 100;
nHigh += ten_pc; nLow -= ten_pc;
shd_h = High[idx] - nHigh;
shd_l = nLow - Low[idx];
if (shd_h > shd_l && shd_h > 0)
return (LINE_DIRECT_UP);
if (shd_h < shd_l && shd_l > 0)
return (LINE_DIRECT_DN);
return (LINE_NO_DIRECT);
}
int num_label = 0;
int total_swing_pt = 0;
datetime sDateTime[];
double swing_point[];
int total_XABC_swing_pt = 0;
datetime XABC_DateTime[];
double XABC_swing_point[];
void identify_XABC(){
clear_label();
clear_swing_pts();
if(XABC_spec_time > 0)
catch_swing_pt_ex();
else
catch_swing_pt();
catch_XABC();
show_XABC();
}
void catch_XABC(){
double X_pt, A_pt, B_pt, ME, XA_10pc, AB_20pc, A_Max, A_Min, B_Max, B_Min, imp_mean;
datetime X_dt, A_dt, B_dt, sp_dt;
int i, j, A_pos, B_pos;
bool is_A_Vtop, is_B_Vtop;
clear_XABC_swing_pts();
if (XABC_spec_time > 0){
sp_dt = XABC_spec_time;
imp_mean = imean[iBarShift(NULL, 0, sp_dt)];
} else {
sp_dt = TimeCurrent();
imp_mean = imean[0];
}
X_pt = swing_point[total_swing_pt - 1];
X_dt = sDateTime[total_swing_pt - 1];
A_pt = swing_point[total_swing_pt - 2];
A_dt = sDateTime[total_swing_pt - 2];
A_pos = 2;
B_pt = swing_point[total_swing_pt - 3];
B_dt = sDateTime[total_swing_pt - 3];
B_pos = 3;
XA_10pc = MathAbs(A_pt - X_pt) * 10 / 100;
AB_20pc = MathAbs(B_pt - A_pt) * 20 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (A_pt > X_pt) is_A_Vtop = true; else is_A_Vtop = false;
if (B_pt > A_pt) is_B_Vtop = true; else is_B_Vtop = false;
A_Max = A_pt; A_Min = A_pt;
for(i=4; i<total_swing_pt-1; i+=2){
if (is_A_Vtop){
A_Max = MathMax(A_Max, swing_point[total_swing_pt - i]);
if (swing_point[total_swing_pt - i] >= A_pt && swing_point[total_swing_pt - i] <= A_pt + ME
&& swing_point[total_swing_pt - i] >= A_Max && sDateTime[total_swing_pt - i] < sp_dt){
A_pt = swing_point[total_swing_pt - i];
A_dt = sDateTime[total_swing_pt - i];
for (j=i-1; j>=0; j-=2){
if(MathAbs(swing_point[total_swing_pt - j] - A_pt) >= imp_mean){
X_pt = swing_point[total_swing_pt - j];
X_dt = sDateTime[total_swing_pt - j];
break;
}
}
XA_10pc = MathAbs(A_pt - X_pt) * 10 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (A_pt > X_pt) is_A_Vtop = true; else is_A_Vtop = false;
A_pos = i;
}
if (swing_point[total_swing_pt - i - 1] < A_pt && swing_point[total_swing_pt - i] > A_pt + ME
&& swing_point[total_swing_pt - i] >= A_Max && sDateTime[total_swing_pt - i] < sp_dt){
A_pt = swing_point[total_swing_pt - i];
A_dt = sDateTime[total_swing_pt - i];
for (j=i-1; j>=0; j-=2){
if(MathAbs(swing_point[total_swing_pt - j] - A_pt) >= imp_mean){
X_pt = swing_point[total_swing_pt - j];
X_dt = sDateTime[total_swing_pt - j];
break;
}
}
XA_10pc = MathAbs(A_pt - X_pt) * 10 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (A_pt > X_pt) is_A_Vtop = true; else is_A_Vtop = false;
A_pos = i;
}
} else {
A_Min = MathMin(A_Min, swing_point[total_swing_pt - i]);
if (swing_point[total_swing_pt - i] <= A_pt && swing_point[total_swing_pt - i] >= A_pt - ME
&& swing_point[total_swing_pt - i] <= A_Min && sDateTime[total_swing_pt - i] < sp_dt){
A_pt = swing_point[total_swing_pt - i];
A_dt = sDateTime[total_swing_pt - i];
for (j=i-1; j>=0; j-=2){
if(MathAbs(swing_point[total_swing_pt - j] - A_pt) >= imp_mean){
X_pt = swing_point[total_swing_pt - j];
X_dt = sDateTime[total_swing_pt - j];
break;
}
}
XA_10pc = MathAbs(A_pt - X_pt) * 10 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (A_pt > X_pt) is_A_Vtop = true; else is_A_Vtop = false;
A_pos = i;
}
if (swing_point[total_swing_pt - i - 1] > A_pt && swing_point[total_swing_pt - i] < A_pt - ME
&& swing_point[total_swing_pt - i] <= A_Min && sDateTime[total_swing_pt - i] < sp_dt){
A_pt = swing_point[total_swing_pt - i];
A_dt = sDateTime[total_swing_pt - i];
for (j=i-1; j>=0; j-=2){
if(MathAbs(swing_point[total_swing_pt - j] - A_pt) >= imp_mean){
X_pt = swing_point[total_swing_pt - j];
X_dt = sDateTime[total_swing_pt - j];
break;
}
}
XA_10pc = MathAbs(A_pt - X_pt) * 10 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (A_pt > X_pt) is_A_Vtop = true; else is_A_Vtop = false;
A_pos = i;
}
}
}
add_XABC_swing_pt(X_pt, X_dt);
add_XABC_swing_pt(A_pt, A_dt);
if(A_pos != 2){
B_pt = swing_point[total_swing_pt - (A_pos + 1)];
B_dt = sDateTime[total_swing_pt - (A_pos + 1)];
B_pos = (A_pos + 1);
AB_20pc = MathAbs(B_pt - A_pt) * 20 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (B_pt > A_pt) is_B_Vtop = true; else is_B_Vtop = false;
}
B_Max = B_pt; B_Min = B_pt;
for(i=B_pos+2; i<total_swing_pt; i+=2){
if (is_B_Vtop){
B_Max = MathMax(B_Max, swing_point[total_swing_pt - i]);
if (swing_point[total_swing_pt - i] >= B_pt && swing_point[total_swing_pt - i] <= B_pt + ME
&& swing_point[total_swing_pt - i] >= B_Max && sDateTime[total_swing_pt - i] < sp_dt){
B_pt = swing_point[total_swing_pt - i];
B_dt = sDateTime[total_swing_pt - i];
B_pos = i;
AB_20pc = MathAbs(B_pt - A_pt) * 20 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (B_pt > A_pt) is_B_Vtop = true; else is_B_Vtop = false;
}
if (swing_point[total_swing_pt - i - 1] < B_pt && swing_point[total_swing_pt - i] > B_pt + ME
&& swing_point[total_swing_pt - i] >= B_Max && sDateTime[total_swing_pt - i] < sp_dt){
B_pt = swing_point[total_swing_pt - i];
B_dt = sDateTime[total_swing_pt - i];
B_pos = i;
AB_20pc = MathAbs(B_pt - A_pt) * 20 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (B_pt > A_pt) is_B_Vtop = true; else is_B_Vtop = false;
}
} else {
B_Min = MathMin(B_Min, swing_point[total_swing_pt - i]);
if (swing_point[total_swing_pt - i] <= B_pt && swing_point[total_swing_pt - i] >= B_pt - ME
&& swing_point[total_swing_pt - i] <= B_Min && sDateTime[total_swing_pt - i] < sp_dt){
B_pt = swing_point[total_swing_pt - i];
B_dt = sDateTime[total_swing_pt - i];
B_pos = i;
AB_20pc = MathAbs(B_pt - A_pt) * 20 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (B_pt > A_pt) is_B_Vtop = true; else is_B_Vtop = false;
}
if (swing_point[total_swing_pt - i - 1] > B_pt && swing_point[total_swing_pt - i] < B_pt - ME
&& swing_point[total_swing_pt - i] <= B_Min && sDateTime[total_swing_pt - i] < sp_dt){
B_pt = swing_point[total_swing_pt - i];
B_dt = sDateTime[total_swing_pt - i];
B_pos = i;
AB_20pc = MathAbs(B_pt - A_pt) * 20 / 100;
ME = MathMax(XA_10pc, AB_20pc);
if (B_pt > A_pt) is_B_Vtop = true; else is_B_Vtop = false;
}
}
}
add_XABC_swing_pt(B_pt, B_dt);
for(i=B_pos+1; i<=total_swing_pt; i++)
add_XABC_swing_pt(swing_point[total_swing_pt-i], sDateTime[total_swing_pt-i]);
}
string get_XABC_label(int num){
int i, j, n, m, r;
string str;
string labels_1[] = {"X", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
"M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
string labels[] = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",
"M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
str = "";
if (num < 27){
str = labels_1[num];
} else {
n = num-1;
while (n > 0){
m = n;
n = m / 26;
r = m % 26;
if (n == 0)
str = labels[r-1] + str;
else
str = labels[r] + str;
}
}
return (str);
}
void show_XABC(){
string strlabel;
double sp, pos, X_pt, A_pt, B_pt, C_pt, ME, XA_10pc, AB_20pc, ABdiv8;
datetime A_dt, B_dt, C_dt;
int A_bar, B_bar, C_bar;
int i, n, align;
ArrayInitialize(XABC, 0);
clear_XABC_signals();
for(i=0; i<total_XABC_swing_pt; i++){
strlabel = "XABC_label_" + i;
if (i == total_XABC_swing_pt-1){
if (XABC_swing_point[i] > XABC_swing_point[i - 1])
sp = imean[0] * 20 / 100;
else
sp = -(imean[0] * 10 / 100);
} else {
if (XABC_swing_point[i] > XABC_swing_point[i + 1])
sp = imean[0] * 20 / 100;
else
sp = -(imean[0] * 10 / 100);
}
pos = XABC_swing_point[i] + sp;
ObjectCreate(strlabel, OBJ_TEXT, 0, XABC_DateTime[i], pos);
ObjectSetText(strlabel, get_XABC_label(i), XABC_font_size, XABC_font, XABC_font_color);
num_label++;
n = iBarShift(NULL, 0, XABC_DateTime[i]);
XABC[n] = XABC_swing_point[i];
}
X_pt = XABC_swing_point[0];
A_pt = XABC_swing_point[1];
A_dt = XABC_DateTime[1];
B_pt = XABC_swing_point[2];
B_dt = XABC_DateTime[2];
C_pt = XABC_swing_point[3];
C_dt = XABC_DateTime[3];
A_bar = iBarShift(NULL, 0, A_dt);
B_bar = iBarShift(NULL, 0, B_dt);
C_bar = iBarShift(NULL, 0, C_dt);
XA_10pc = MathAbs(A_pt - X_pt) * 10 / 100;
AB_20pc = MathAbs(B_pt - A_pt) * 20 / 100;
ABdiv8 = MathAbs(A_pt - B_pt) / 8;
align = WindowBarsPerChart() * 10 / 100;
if (X_pt < A_pt){
ME = MathMax(XA_10pc, AB_20pc);
ObjectCreate("XABC_PSZ", OBJ_TREND, 0, A_dt, A_pt-ABdiv8, Time[0], A_pt-ABdiv8);
ObjectCreate("XABC_PSZ_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, A_pt-ABdiv8);
ObjectCreate("XABC_PBZ", OBJ_TREND, 0, B_dt, B_pt+ABdiv8, Time[0], B_pt+ABdiv8);
ObjectCreate("XABC_PBZ_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, B_pt+ABdiv8);
ObjectSetText("XABC_PSZ_Label", "Primary Sell Zone @"+DoubleToStr(A_pt-ABdiv8, Digits), 8, XABC_font ,XABC_ME_line_color);
ObjectSetText("XABC_PBZ_Label", "Primary Buy Zone @"+DoubleToStr(B_pt+ABdiv8, Digits), 8, XABC_font ,XABC_ME_line_color);
pop_XABC_signals(X_pt, A_pt, A_bar, B_pt, B_bar, C_pt, C_bar, A_pt+ME, B_pt-ME, B_pt+ABdiv8, A_pt-ABdiv8, total_XABC_swing_pt);
} else {
ME = -MathMax(XA_10pc, AB_20pc);
ObjectCreate("XABC_PBZ", OBJ_TREND, 0, A_dt, A_pt+ABdiv8, Time[0], A_pt+ABdiv8);
ObjectCreate("XABC_PBZ_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, A_pt+ABdiv8);
ObjectCreate("XABC_PSZ", OBJ_TREND, 0, B_dt, B_pt-ABdiv8, Time[0], B_pt-ABdiv8);
ObjectCreate("XABC_PSZ_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, B_pt-ABdiv8);
ObjectSetText("XABC_PSZ_Label", "Primary Sell Zone @"+DoubleToStr(B_pt-ABdiv8, Digits), 8, XABC_font ,XABC_ME_line_color);
ObjectSetText("XABC_PBZ_Label", "Primary Buy Zone @"+DoubleToStr(A_pt+ABdiv8, Digits), 8, XABC_font ,XABC_ME_line_color);
pop_XABC_signals(X_pt, A_pt, A_bar, B_pt, B_bar, C_pt, C_bar, B_pt-ME, A_pt+ME, A_pt+ABdiv8, B_pt-ABdiv8, total_XABC_swing_pt);
}
ObjectCreate("XABC_A", OBJ_TREND, 0, A_dt, A_pt, Time[0], A_pt);
ObjectCreate("XABC_A_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, A_pt);
ObjectSetText("XABC_A_Label", "A Boundary @"+DoubleToStr(A_pt, Digits), 8, XABC_font ,XABC_ME_line_color);
ObjectCreate("XABC_A_ME", OBJ_TREND, 0, A_dt, A_pt+ME, Time[0], A_pt+ME);
ObjectCreate("XABC_A_ME_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, A_pt+ME);
ObjectSetText("XABC_A_ME_Label", "Maximum Extension @"+DoubleToStr(A_pt+ME, Digits), 8, XABC_font ,XABC_ME_line_color);
ObjectCreate("XABC_B", OBJ_TREND, 0, B_dt, B_pt, Time[0], B_pt);
ObjectCreate("XABC_B_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, B_pt);
ObjectSetText("XABC_B_Label", "B Boundary @"+DoubleToStr(B_pt, Digits), 8, XABC_font ,XABC_ME_line_color);
ObjectCreate("XABC_B_ME", OBJ_TREND, 0, B_dt, B_pt-ME, Time[0], B_pt-ME);
ObjectCreate("XABC_B_ME_Label", OBJ_TEXT, 0, Time[0]+Period()*60*align, B_pt-ME);
ObjectSetText("XABC_B_ME_Label", "Maximum Extension @"+DoubleToStr(B_pt-ME, Digits), 8, XABC_font ,XABC_ME_line_color);
ObjectSet("XABC_PSZ", OBJPROP_COLOR, XABC_ME_line_color);
ObjectSet("XABC_PBZ", OBJPROP_COLOR, XABC_ME_line_color);
ObjectSet("XABC_A", OBJPROP_COLOR, XABC_ME_line_color);
ObjectSet("XABC_B", OBJPROP_COLOR, XABC_ME_line_color);
ObjectSet("XABC_A_ME", OBJPROP_COLOR, XABC_ME_line_color);
ObjectSet("XABC_B_ME", OBJPROP_COLOR, XABC_ME_line_color);
ObjectSet("XABC_PSZ", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("XABC_PBZ", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("XABC_A", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("XABC_B", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("XABC_A_ME", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("XABC_B_ME", OBJPROP_STYLE, STYLE_DOT);
}
void pop_XABC_signals(double X_pt, double A_pt, int A_pt_bar, double B_pt, int B_pt_bar, double C_pt, int C_pt_bar,
double upper_me, double lower_me, double pbz, double psz, int count){
double XA_height, AB_height;
XA_height = MathAbs(X_pt - A_pt);
AB_height = MathAbs(A_pt - B_pt);
if (AB_height > XA_height){
signals[XABC_A] = 0;
signals[XABC_B] = 0;
signals[XABC_C] = 0;
signals[XABC_A_BAR] = 0;
signals[XABC_B_BAR] = 0;
signals[XABC_C_BAR] = 0;
signals[XABC_UPPER_ME] = 0;
signals[XABC_LOWER_ME] = 0;
signals[XABC_PBZ] = 0;
signals[XABC_PSZ] = 0;
signals[XABC_SWING_COUNT] = 0;
} else {
signals[XABC_A] = A_pt;
signals[XABC_B] = B_pt;
signals[XABC_C] = C_pt;
signals[XABC_A_BAR] = A_pt_bar;
signals[XABC_B_BAR] = B_pt_bar;
signals[XABC_C_BAR] = C_pt_bar;
signals[XABC_UPPER_ME] = upper_me;
signals[XABC_LOWER_ME] = lower_me;
signals[XABC_PBZ] = pbz;
signals[XABC_PSZ] = psz;
signals[XABC_SWING_COUNT] = count;
}
}
void clear_XABC_signals(){
signals[XABC_A] = 0;
signals[XABC_B] = 0;
signals[XABC_C] = 0;
signals[XABC_A_BAR] = 0;
signals[XABC_B_BAR] = 0;
signals[XABC_C_BAR] = 0;
signals[XABC_UPPER_ME] = 0;
signals[XABC_LOWER_ME] = 0;
signals[XABC_PBZ] = 0;
signals[XABC_PSZ] = 0;
signals[XABC_SWING_COUNT] = 0;
}
void catch_swing_pt(){
double imp_mean, sw_pt_1, sw_pt_2;
int count, i;
imp_mean = imean[0];
count = 0; sw_pt_1 = 0; sw_pt_2 = 0; i = 0;
while((count <= 3 || MathAbs(sw_pt_1 - sw_pt_2) < imp_mean) && i <= Bars){
if(dn_swing[i] > 0){
if (sw_pt_1 == 0){
sw_pt_1 = dn_swing[i];
sw_pt_2 = dn_swing[i];
add_swing_pt(sw_pt_1, Time[i]);
count++;
} else {
sw_pt_2 = sw_pt_1;
sw_pt_1 = dn_swing[i];
add_swing_pt(sw_pt_1, Time[i]);
count++;
}
}
i++;
}
}
void catch_swing_pt_ex(){
double imp_mean, sw_pt_1, sw_pt_2;
int i, spt, count;
datetime pt_1_dt, pt_2_dt, pt_b_dt;
bool imp_mean_hit;
spt = iBarShift(NULL, 0, XABC_spec_time);
imp_mean = imean[spt];
count = 0; sw_pt_1 = 0; sw_pt_2 = 0; i = 0; imp_mean_hit = false;
while(!imp_mean_hit && i <= Bars){
if(dn_swing[i] > 0){
if (sw_pt_1 == 0){
sw_pt_1 = dn_swing[i];
sw_pt_2 = dn_swing[i];
pt_1_dt = Time[i];
pt_2_dt = Time[i];
add_swing_pt(sw_pt_1, pt_1_dt);
if (i > spt) count++;
} else {
sw_pt_2 = sw_pt_1;
pt_2_dt = pt_1_dt;
sw_pt_1 = dn_swing[i];
pt_1_dt = Time[i];
add_swing_pt(sw_pt_1, pt_1_dt);
if (i > spt) count++;
}
}
if (MathAbs(sw_pt_1 - sw_pt_2) >= imp_mean && pt_2_dt < XABC_spec_time) imp_mean_hit = true; // count > 3
i++;
}
}
void clear_label(){
string strlabel;
for (int i=0; i<=num_label; i++){
strlabel = "XABC_label_" + i;
ObjectDelete(strlabel);
}
ObjectDelete("XABC_A");
ObjectDelete("XABC_A_ME");
ObjectDelete("XABC_B");
ObjectDelete("XABC_B_ME");
ObjectDelete("XABC_PBZ");
ObjectDelete("XABC_PSZ");
ObjectDelete("XABC_A_Label");
ObjectDelete("XABC_B_Label");
ObjectDelete("XABC_A_ME_Label");
ObjectDelete("XABC_B_ME_Label");
ObjectDelete("XABC_PBZ_Label");
ObjectDelete("XABC_PSZ_Label");
}
int add_swing_pt(double pt, datetime dt){
int rst;
total_swing_pt++;
rst = ArrayResize(sDateTime, total_swing_pt);
if (rst == -1) return (-1);
rst = ArrayResize(swing_point, total_swing_pt);
if (rst == -1) return (-1);
sDateTime[total_swing_pt - 1] = dt;
swing_point[total_swing_pt - 1] = pt;
return (0);
}
int clear_swing_pts(){
int rst;
total_swing_pt = 0;
rst = ArrayResize(sDateTime, 0);
if (rst == -1) return (-1);
rst = ArrayResize(swing_point, 0);
if (rst == -1) return (-1);
return (0);
}
int add_XABC_swing_pt(double pt, datetime dt){
int rst;
total_XABC_swing_pt++;
rst = ArrayResize(XABC_DateTime, total_XABC_swing_pt);
if (rst == -1) return (-1);
rst = ArrayResize(XABC_swing_point, total_XABC_swing_pt);
if (rst == -1) return (-1);
XABC_DateTime[total_XABC_swing_pt - 1] = dt;
XABC_swing_point[total_XABC_swing_pt - 1] = pt;
return (0);
}
int clear_XABC_swing_pts(){
int rst;
total_XABC_swing_pt = 0;
rst = ArrayResize(XABC_DateTime, 0);
if (rst == -1) return (-1);
rst = ArrayResize(XABC_swing_point, 0);
if (rst == -1) return (-1);
return (0);
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---