[MT4指标]ClearMethod信号
主图指标
mt4指标类型:趋势指标
是否能用在mt4手机版上:否
是否含有未来函数:无
// This indicator is based on the article: Getting Clear With Short-Term Swings by Ron Black
//
// http://www.traders.com/Documentation/FEEDbk_docs/2010/09/Black.html
// http://www.traders.com/Documentation/FEEDbk_docs/2010/09/TradersTips.html
//
// Clear signal: breaking Clear Line
// Move signal: Clear Line moves again after flat
// Alert: after a closed bar signal (at the first tick of next bar)
// Copy the ClearMethod.mq4 file to the Indicator directory, it will be used by iCustom()
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red
int MaxHistoryBarsToCount = 5000;
extern bool IsDrawClearSignals = true;
extern bool IsDrawMoveSignals = true;
bool IsDrawAsPullbackSignals = false; // true: for pullback trading (Important! This is an extremely dangerous trading style!)
extern bool IsAlertClearUpSignals = true;
extern bool IsAlertClearDownSignals = true;
extern bool IsAlertMoveUpSignals = true;
extern bool IsAlertMoveDownSignals = true;
double SignalClearUpBuffer;
double SignalClearDownBuffer;
double SignalMoveUpBuffer;
double SignalMoveDownBuffer;
bool IsClearUpSignal = false;
bool IsClearDownSignal = false;
bool IsMoveUpSignal = false;
bool IsMoveDownSignal = false;
datetime AlertsCheckedLastTime = 0;
int init() {
SetIndexBuffer(0, SignalClearUpBuffer);
SetIndexBuffer(1, SignalClearDownBuffer);
SetIndexBuffer(2, SignalMoveUpBuffer);
SetIndexBuffer(3, SignalMoveDownBuffer);
if (IsDrawClearSignals) {
SetIndexStyle(0, DRAW_ARROW, EMPTY, 1, Green);
SetIndexArrow(0, 251);
SetIndexStyle(1, DRAW_ARROW, EMPTY, 1, Red);
SetIndexArrow(1, 251);
if (IsDrawAsPullbackSignals) {
SetIndexStyle(0, DRAW_ARROW, EMPTY, EMPTY, Red);
SetIndexStyle(1, DRAW_ARROW, EMPTY, EMPTY, Green);
}
} else {
SetIndexStyle(0, DRAW_NONE);
SetIndexStyle(1, DRAW_NONE);
}
if (IsDrawMoveSignals) {
SetIndexStyle(2, DRAW_ARROW, EMPTY, 1, Green);
SetIndexArrow(2, 200);
SetIndexStyle(3, DRAW_ARROW, EMPTY, 1, Red);
SetIndexArrow(3, 202);
if (IsDrawAsPullbackSignals) {
SetIndexStyle(2, DRAW_ARROW, EMPTY, EMPTY, Red);
SetIndexStyle(3, DRAW_ARROW, EMPTY, EMPTY, Green);
}
} else {
SetIndexStyle(2, DRAW_NONE);
SetIndexStyle(3, DRAW_NONE);
}
SetIndexEmptyValue(0, 0.0);
SetIndexEmptyValue(1, 0.0);
SetIndexEmptyValue(2, 0.0);
SetIndexEmptyValue(3, 0.0);
return(0);
}
int start() {
int countedBars = IndicatorCounted();
int emptyLength = MathMin(Bars, 50);
int countFrom = MathMin(Bars - MathMax(countedBars, emptyLength) - 1, MaxHistoryBarsToCount);
checkAlerts();
switchOffPrevTickSignals();
if (countFrom >= 0 && countFrom < Bars) {
if (countedBars < 1) {
fillFirstValuesWithEmpty(emptyLength);
}
countIndicator(countFrom);
}
return(0);
}
void countIndicator(int countFrom) {
int i;
bool isUpSwing;
bool isUpSwingPrevBar;
bool isUpSwingPrevPrevBar;
bool isFlat;
bool isFlatPrevBar;
for (i = countFrom; i >= 0; i--) {
isUpSwing = (iCustom(NULL, 0, "ClearMethod", 0, i) > 0);
isUpSwingPrevBar = (iCustom(NULL, 0, "ClearMethod", 0, i + 1) > 0);
isUpSwingPrevPrevBar = (iCustom(NULL, 0, "ClearMethod", 0, i + 2) > 0);
isFlat = true;
if (isUpSwing && isUpSwingPrevBar) {
isFlat = (MathAbs(iCustom(NULL, 0, "ClearMethod", 1, i) - iCustom(NULL, 0, "ClearMethod", 1, i + 1)) < Point / 10000.0);
} else if (!isUpSwing && !isUpSwingPrevBar) {
isFlat = (MathAbs(iCustom(NULL, 0, "ClearMethod", 2, i) - iCustom(NULL, 0, "ClearMethod", 2, i + 1)) < Point / 10000.0);
}
isFlatPrevBar = false;
if (isUpSwing && isUpSwingPrevBar) {
isFlatPrevBar = (MathAbs(iCustom(NULL, 0, "ClearMethod", 1, i + 1) - iCustom(NULL, 0, "ClearMethod", 1, i + 2)) < Point / 10000.0);
} else if (!isUpSwing && !isUpSwingPrevBar) {
isFlatPrevBar = (MathAbs(iCustom(NULL, 0, "ClearMethod", 2, i + 1) - iCustom(NULL, 0, "ClearMethod", 2, i + 2)) < Point / 10000.0);
}
IsClearUpSignal = (isUpSwing && !isUpSwingPrevBar);
IsClearDownSignal = (!isUpSwing && isUpSwingPrevBar);
IsMoveUpSignal = (isUpSwing && !isFlat && isFlatPrevBar);
IsMoveDownSignal = (!isUpSwing && !isFlat && isFlatPrevBar);
if (IsClearUpSignal) {
SignalClearUpBuffer = Low - getArrowShiftingPixelsInPoints(i);
if (IsDrawAsPullbackSignals) {
SignalClearUpBuffer = High + getArrowShiftingPixelsInPoints(i) * 0.7;
}
} else {
SignalClearUpBuffer = 0.0;
}
if (IsClearDownSignal) {
SignalClearDownBuffer = High + getArrowShiftingPixelsInPoints(i);
if (IsDrawAsPullbackSignals) {
SignalClearDownBuffer = Low - getArrowShiftingPixelsInPoints(i) * 0.7;
}
} else {
SignalClearDownBuffer = 0.0;
}
if (IsMoveUpSignal) {
SignalMoveUpBuffer = Low - getArrowShiftingPixelsInPoints(i);
if (IsDrawAsPullbackSignals) {
SignalMoveUpBuffer = High + getArrowShiftingPixelsInPoints(i) * 0.7;
}
} else {
SignalMoveUpBuffer = 0.0;
}
if (IsMoveDownSignal) {
SignalMoveDownBuffer = High + getArrowShiftingPixelsInPoints(i);
if (IsDrawAsPullbackSignals) {
SignalMoveDownBuffer = Low - getArrowShiftingPixelsInPoints(i) * 0.7;
}
} else {
SignalMoveDownBuffer = 0.0;
}
}
return;
}
void checkAlerts() {
if (AlertsCheckedLastTime == Time[1]) {
if (IsClearUpSignal && IsAlertClearUpSignals) {
Alert("Clear Method (" + Symbol() + ", " + getPeriodsText() + ") - Clear Up signal.");
}
if (IsClearDownSignal && IsAlertClearDownSignals) {
Alert("Clear Method (" + Symbol() + ", " + getPeriodsText() + ") - Clear Down signal.");
}
if (IsMoveUpSignal && IsAlertMoveUpSignals) {
Alert("Clear Method (" + Symbol() + ", " + getPeriodsText() + ") - Move Up signal.");
}
if (IsMoveDownSignal && IsAlertMoveDownSignals) {
Alert("Clear Method (" + Symbol() + ", " + getPeriodsText() + ") - Move Down signal.");
}
}
AlertsCheckedLastTime = Time[0];
return;
}
void switchOffPrevTickSignals() {
IsClearUpSignal = false;
IsClearDownSignal = false;
IsMoveUpSignal = false;
IsMoveDownSignal = false;
return;
}
double getArrowShiftingPixelsInPoints(int barIndex) {
int i;
double sum = 0.0;
for (i = barIndex; i < barIndex + 50; i++) {
sum += High - Low;
}
return(sum / 100.0);
}
string getPeriodsText() {
string periodsText = "";
int periodsInMinutes = Period();
if (periodsInMinutes == PERIOD_M1) {
periodsText = "M1";
} else if (periodsInMinutes == PERIOD_M5) {
periodsText = "M5";
} else if (periodsInMinutes == PERIOD_M15) {
periodsText = "M15";
} else if (periodsInMinutes == PERIOD_M30) {
periodsText = "M30";
} else if (periodsInMinutes == PERIOD_H1) {
periodsText = "H1";
} else if (periodsInMinutes == PERIOD_H4) {
periodsText = "H4";
} else if (periodsInMinutes == PERIOD_D1) {
periodsText = "D1";
} else if (periodsInMinutes == PERIOD_W1) {
periodsText = "W1";
} else if (periodsInMinutes == PERIOD_MN1) {
periodsText = "MN1";
}
return(periodsText);
}
void fillFirstValuesWithEmpty(int emptyLength) {
int i;
int index;
for (i = 0; i < emptyLength; i++) {
index = Bars - i - 1;
SignalClearUpBuffer[index] = 0.0;
SignalClearDownBuffer[index] = 0.0;
SignalMoveUpBuffer[index] = 0.0;
SignalMoveDownBuffer[index] = 0.0;
}
return;
}
ClearMethodSignals.jpg
