Toujours sans prétention, un indicateurs basé sur le Stochastic et son signal.
L'histogramme représente la différence entre le stochastic long (par défaut une période de 233) et son signal.
Les signaux d'achat/vente sont issus du croisement de ces deux courbes filtré par une MM, le signal d'achat n'est valide que si le cours clôture au dessus de la MM et vice-versa.
Les signaux ainsi obtenus sont assez intéressants.
L'histogramme représente la différence entre le stochastic long (par défaut une période de 233) et son signal.
Les signaux d'achat/vente sont issus du croisement de ces deux courbes filtré par une MM, le signal d'achat n'est valide que si le cours clôture au dessus de la MM et vice-versa.
Les signaux ainsi obtenus sont assez intéressants.
Code
//+------------------------------------------------------------------+
//| stochDif.mq4 |
//| Tous droits réservés, Nicolas Tuffier (2011) |
//| http://www.furyweb.fr/forex/ |
//+------------------------------------------------------------------+
#property copyright "Tous droits réservés, Nicolas Tuffier (2011)"
#property link "http://www.furyweb.fr/forex/"
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 Red
#property indicator_color2 Maroon
#property indicator_color3 Lime
#property indicator_color4 Green
#property indicator_color5 Gold
#property indicator_color6 Aqua
#property indicator_color7 Red
#property indicator_color8 Lime
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3
#property indicator_width6 2
#property indicator_width7 1
#property indicator_width8 1
#property indicator_maximum 25
#property indicator_minimum -25
//---- input parameters
extern int pK = 233;
extern int pD = 20;
extern int slow = 20;
extern int MAmethod = MODE_LWMA;
extern int trendPeriod = 89;
extern bool drawStrength = false;
extern double filter = 0.1;
//---- buffers
double sellIncBuf[]; // sell increasing
double sellDecBuf[]; // sell decreasing
double buyIncBuf[]; // buy increasing
double buyDecBuf[]; // buy decreasing
double globalBuf[]; // global
double strengthBuf[]; // strength
double sellSigBuf[]; // sell signal
double buySigBuf[]; // buy signal
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexBuffer(0,sellIncBuf);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexBuffer(1,sellDecBuf);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexBuffer(2,buyIncBuf);
SetIndexStyle(3,DRAW_HISTOGRAM);
SetIndexBuffer(3,buyDecBuf);
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,globalBuf);
SetIndexStyle(5,DRAW_LINE);
SetIndexBuffer(5,strengthBuf);
SetIndexStyle(6, DRAW_ARROW);
SetIndexArrow(6, 242);
SetIndexBuffer(6, sellSigBuf);
SetIndexStyle(7, DRAW_ARROW);
SetIndexArrow(7, 241);
SetIndexBuffer(7, buySigBuf);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int limit, counted_bars=IndicatorCounted();
double b4ma, nowma;
//---- check for possible errors
if(counted_bars < 0)
return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0)
counted_bars--;
//---- the first bar must be skipped
if(counted_bars == 0)
counted_bars++;
limit = Bars - counted_bars;
//----
for (int i = limit; i >= 0; i--) {
sellIncBuf[i] = EMPTY_VALUE;
sellDecBuf[i] = EMPTY_VALUE;
buyIncBuf[i] = EMPTY_VALUE;
buyDecBuf[i] = EMPTY_VALUE;
globalBuf[i] = iStochastic(NULL, 0, pK, pD, slow, MAmethod, 1, MODE_MAIN, i) - iStochastic(NULL, 0, pK, pD, slow, MAmethod, 1, MODE_SIGNAL, i);
if (drawStrength) {
if (globalBuf[i+2] != 0 && globalBuf[i+1] != 0)
strengthBuf[i] = MathAbs((globalBuf[i+1] - globalBuf[i]) / (globalBuf[i+2] - globalBuf[i+1]));
} else
strengthBuf[i] = EMPTY_VALUE;
if (globalBuf[i] < 0)
if (globalBuf[i] < globalBuf[i+1])
sellIncBuf[i] = globalBuf[i];
else
sellDecBuf[i] = globalBuf[i];
else
if (globalBuf[i] > globalBuf[i+1])
buyIncBuf[i] = globalBuf[i];
else
buyDecBuf[i] = globalBuf[i];
sellSigBuf[i] = EMPTY_VALUE;
buySigBuf[i] = EMPTY_VALUE;
if (iMA(NULL, 0, trendPeriod, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(NULL, 0, trendPeriod, 0, MODE_EMA, PRICE_CLOSE, i + 1)) {
// up trend
if (sellDecBuf[i+1] != EMPTY_VALUE && buyIncBuf[i] != EMPTY_VALUE && MathAbs(globalBuf[i]) > filter)
buySigBuf[i]=globalBuf[i] * 1.5 + 3;
} else {
// down trend
if (sellIncBuf[i] != EMPTY_VALUE && buyDecBuf[i+1] != EMPTY_VALUE && MathAbs(globalBuf[i]) > filter)
sellSigBuf[i]=globalBuf[i] * 1.5 - 3;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+