boboinuk
02-15-2008, 03:47 AM
Hi all,
This post has been shared into two because it is too long for one post.
May be this will help: Dinapoli stochastic does not use EMA or SMA. It uses Modified Moving average which is calculated from this formula:
http://www.aspenres.com/Documents/help/userguide/help/images/aspen00000329.gif
Where:
n = number of bars
MAt = current moving average value
MAt-1 = previous moving average value
Pt = current price
For any one trying to code this, please be reminder that the first point is as good as a mere SMA while every other point is modified.
On the other hand, I have downloaded Thrunner's DEMA and can add it to a chart but I cannot see it via the editor. I had wanted to see the code to know if it is mathematically correct. I say so because it still does not accept decimal imputs which the DEMA ought to do.
Below, I have added the correct metatrader codes for both the DEMA and stochastic so anyone who can understand they can get the idea of what is needed.
Here is the correct DEMA code from metatrader:
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Silver
#property indicator_color2 Red
//---- indicator parameters
extern double FastEMA=8.3896;
extern double SlowEMA=17.5185;
extern double SignalEMA=9.0503;
//---- indicator buffers
double Macd_buffer[];
double Sign_buffer[];
double Fast_buffer[];
double Slow_buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- drawing settings
IndicatorBuffers(4);
SetIndexBuffer(0,Macd_buffer);
SetIndexBuffer(1,Sign_buffer);
SetIndexBuffer(2,Fast_buffer);
SetIndexBuffer(3,Slow_buffer);
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1);
//SetIndexDrawBegin(0,Bars-1);
//SetIndexDrawBegin(1,Bars-1);
//IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
//---- indicator buffers mapping
if(!SetIndexBuffer(0,Macd_buffer) && !SetIndexBuffer(1,Sign_buffer))
Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD(DEMA)DiNapoli("+FastEMA+","+SlowEMA+","+SignalEMA+")");
SetIndexLabel(0,"MACD(DEMA)");
SetIndexLabel(1,"Signal");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| MACD (DEMA) DiNapoli |
//+------------------------------------------------------------------+
int start()
{
for(int i=Bars; i>=0; i--)
{
Fast_buffer[i]=0.0;
Slow_buffer[i]=0.0;
Macd_buffer[i]=0.0;
Sign_buffer[i]=0.0;
if (i==Bars) {Fast_buffer[i]=Close[i];Slow_buffer[i]=Close[i];}
}
//---- macd counted in the 1-st buffer
for( i=Bars-1; i>=0; i--)
{
Fast_buffer[i]=Fast_buffer[i+1]+2.0/(1.0+FastEMA)*(Close[i]-Fast_buffer[i+1]);
Slow_buffer[i]=Slow_buffer[i+1]+2.0/(1.0+SlowEMA)*(Close[i]-Slow_buffer[i+1]);
Macd_buffer[i]=Fast_buffer[i]-Slow_buffer[i];
}
//---- signal line counted in the 2-nd buffer
for(i=Bars-1; i>=0; i--)
Sign_buffer[i]=Sign_buffer[i+1]+2.0/(1.0+SignalEMA)*(Macd_buffer[i]-Sign_buffer[i+1]);
//---- done
return(0);
}
The stochastic in metatrader code is:
//+------------------------------------------------------------------+
//| StochasticDiNapoli.mq4 |
//| Copyright © 2006, TrendLaboratory Ltd. |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//| E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, TrendLaboratory Ltd."
#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1 20
#property indicator_level2 80
#property indicator_level3 50
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Blue
//---- input parameters
extern int FastK=8;
extern int SlowK=3;
extern int SlowD=3;
//---- buffers
double StoBuffer[];
double SigBuffer[];
//double MdBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(0,StoBuffer);
SetIndexBuffer(1,SigBuffer);
//---- name for DataWindow and indicator subwindow label
short_name="Stochastic DiNapoli("+FastK+","+SlowK+","+SlowD+")";
IndicatorShortName(short_name);
SetIndexLabel(0,"Stoch");
SetIndexLabel(1,"Signal");
//----
SetIndexDrawBegin(0,FastK);
SetIndexDrawBegin(1,FastK);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Stochastic DiNapoli |
//+------------------------------------------------------------------+
int start()
{
int i,counted_bars=IndicatorCounted();
double high,low;
//----
if(Bars<=FastK) return(0);
//---- initial zero
if(counted_bars<1)
for(i=1;i<=FastK;i++)
{StoBuffer[Bars-i]=0.0;SigBuffer[Bars-i]=0.0;}
//----
i=Bars-FastK-1;
if(counted_bars>=FastK) i=Bars-counted_bars-1;
while(i>=0)
{
low=Low[Lowest(NULL,0,MODE_LOW,FastK,i)];
high=High[Highest(NULL,0,MODE_HIGH,FastK,i)];
double Fast=(Close[i]-low)/(high-low)*100;
StoBuffer[i]=StoBuffer[i+1]+(Fast-StoBuffer[i+1])/SlowK;
SigBuffer[i]=SigBuffer[i+1]+(StoBuffer[i]-SigBuffer[i+1])/SlowD;
i--;
}
return(0);
}
//+------------------------------------------------------------------+
Here is the metatrader dinapoli detrended oscillator for comparing to Thrunner's Ninjatrader version so as to help understand how to port the codes:
//+------------------------------------------------------------------+
//| DiNapoli Detrend Oscillator.mq4
//| Ramdass - Conversion only
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue
extern int x_prd=14;
extern int CountBars=300;
//---- buffers
double dpo[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(1);
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,dpo);
//----
return(0);
}
//+------------------------------------------------------------------+
//| DPO |
//+------------------------------------------------------------------+
int start()
{
if (CountBars>=Bars) CountBars=Bars;
SetIndexDrawBegin(0,Bars-CountBars+x_prd+1);
int i,counted_bars=IndicatorCounted();
double t_prd;
//----
if(Bars<=x_prd) return(0);
//---- initial zero
if(counted_bars<x_prd)
{
for(i=1;i<=x_prd;i++) dpo[CountBars-i]=0.0;
}
//----
i=CountBars-x_prd-1;
t_prd=x_prd/2+1;
while(i>=0)
{
dpo[i]=Close[i]-iMA(NULL,0,7,MODE_SMA,0,PRICE_CLOSE,i);
i--;
}
return(0);
}
//+------------------------------------------------------------------+
boboinuk
02-15-2008, 03:50 AM
THERE IS EVEN THE DINAPOLI FIBO:
//+------------------------------------------------------------------+
#property copyright "Rob"
#property link "http://www.viac.ru/"
#property indicator_chart_window
#property indicator_buffers 0
//---- input parameters
extern double PointA=0;
extern double PointB=0;
extern double PointC=0;
extern double PointF=0;
extern double PointF1_blue=0;
extern double PointF2_pink=0;
extern double PointF3_brown=0;
extern double PointF4_silver=0;
double COP=0,OP=0,XOP=0;
double Start=0,Stop=0,f1g=0,F1R=0,f2g=0,F2R=0,f3g=0,F3R=0 ,f4g=0,F4R=0;
int shift = 0,counted_bars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectDelete("COP Label");
ObjectDelete("COP Line");
ObjectDelete("OP Label");
ObjectDelete("OP Line");
ObjectDelete("XOP Label");
ObjectDelete("XOP Line");
ObjectDelete("Start Label");
ObjectDelete("Start Line");
ObjectDelete("Stop Label");
ObjectDelete("Stop Line");
ObjectDelete("f1g Label");
ObjectDelete("f1g Line");
ObjectDelete("F1R Label");
ObjectDelete("F1R Line");
ObjectDelete("f2g Label");
ObjectDelete("f2g Line");
ObjectDelete("F2R Label");
ObjectDelete("F2R Line");
ObjectDelete("f3g Label");
ObjectDelete("f3g Line");
ObjectDelete("F3R Label");
ObjectDelete("F3R Line");
ObjectDelete("f4g Label");
ObjectDelete("f4g Line");
ObjectDelete("F4R Label");
ObjectDelete("F4R Line");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted(),CountBars;
if (CountBars>=Bars) CountBars=Bars;
//SetIndexDrawBegin(0,Bars-CountBars);
//SetIndexDrawBegin(1,Bars-CountBars);
for (shift=1;shift<=0;shift--) {
}
//---- Calculate Lines
COP = (PointB-PointA)*0.618+PointC;
OP = PointB-PointA+PointC;
XOP = (PointB-PointA)*1.618+PointC;
f1g = PointF-(PointF-PointF1_blue)*0.382;
F1R = PointF-(PointF-PointF1_blue)*0.618;
f2g = PointF-(PointF-PointF2_pink)*0.382;
F2R = PointF-(PointF-PointF2_pink)*0.618;
f3g = PointF-(PointF-PointF3_brown)*0.382;
F3R = PointF-(PointF-PointF3_brown)*0.618;
f4g = PointF-(PointF-PointF4_silver)*0.382;
F4R = PointF-(PointF-PointF4_silver)*0.618;
//---- Set line labels on chart window
{
if(ObjectFind("COP Label") != 0)
{
ObjectCreate("COP Label", OBJ_TEXT, 0, Time[40], COP);
ObjectSetText("COP Label", "COP", 11, "Arial", Yellow);
}
else
{
ObjectMove("COP Label", 0, Time[40], COP);
}
if(ObjectFind("OP Label") != 0)
{
ObjectCreate("OP Label", OBJ_TEXT, 0, Time[40], OP);
ObjectSetText("OP Label", " OP", 11, "Arial", Yellow);
}
else
{
ObjectMove("OP Label", 0, Time[40], OP);
}
if(ObjectFind("XOP Label") != 0)
{
ObjectCreate("XOP Label", OBJ_TEXT, 0, Time[40], XOP);
ObjectSetText("XOP Label", "XOP", 11, "Arial", Gold);
}
else
{
ObjectMove("XOP Label", 0, Time[40], XOP);
}
//-------------------------------------------------------------------
if(ObjectFind("f1g Label") != 0)
{
ObjectCreate("f1g Label", OBJ_TEXT, 0, Time[45], f1g);
ObjectSetText("f1g Label", " f1g", 11, "Arial", DodgerBlue);
}
else
{
ObjectMove("f1g Label", 0, Time[45], f1g);
}
if(ObjectFind("F1R Label") != 0)
{
ObjectCreate("F1R Label", OBJ_TEXT, 0, Time[45], F1R);
ObjectSetText("F1R Label", " F1R", 11, "Arial", DodgerBlue);
}
else
{
ObjectMove("F1R Label", 0, Time[45], F1R);
}
//---------------------------------------------
if(ObjectFind("f2g Label") != 0)
{
ObjectCreate("f2g Label", OBJ_TEXT, 0, Time[50], f2g);
ObjectSetText("f2g Label", " f2g", 11, "Arial", DeepPink);
}
else
{
ObjectMove("f2g Label", 0, Time[50], f2g);
}
if(ObjectFind("F2R Label") != 0)
{
ObjectCreate("F2R Label", OBJ_TEXT, 0, Time[50], F2R);
ObjectSetText("F2R Label", " F2R", 11, "Arial", DeepPink);
}
else
{
ObjectMove("F2R Label", 0, Time[50], F2R);
}
//------------------------------------------------
if(ObjectFind("f3g Label") != 0)
{
ObjectCreate("f3g Label", OBJ_TEXT, 0, Time[55], f3g);
ObjectSetText("f3g Label", " f3g", 11, "Arial", Peru);
}
else
{
ObjectMove("f3g Label", 0, Time[55], f3g);
}
if(ObjectFind("F3R Label") != 0)
{
ObjectCreate("F3R Label", OBJ_TEXT, 0, Time[55], F3R);
ObjectSetText("F3R Label", " F3R", 11, "Arial", Peru);
}
else
{
ObjectMove("F3R Label", 0, Time[55], F3R);
}
//----------------------------------------------------------
if(ObjectFind("f4g Label") != 0)
{
ObjectCreate("f4g Label", OBJ_TEXT, 0, Time[60], f4g);
ObjectSetText("f4g Label", " f4g", 11, "Arial", Silver);
}
else
{
ObjectMove("f4g Label", 0, Time[60], f4g);
}
if(ObjectFind("F4R Label") != 0)
{
ObjectCreate("F4R Label", OBJ_TEXT, 0, Time[60], F4R);
ObjectSetText("F4R Label", " F4R", 11, "Arial", Silver);
}
else
{
ObjectMove("F4R Label", 0, Time[60], F4R);
}
//--- Draw lines on chart
if(ObjectFind("COP Line") != 0)
{
ObjectCreate("COP Line", OBJ_HLINE, 0, Time[40], COP);
ObjectSet("COP Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("COP Line", OBJPROP_COLOR, Yellow);
}
else
{
ObjectMove("COP Line", 0, Time[40], COP);
}
if(ObjectFind("OP Line") != 0)
{
ObjectCreate("OP Line", OBJ_HLINE, 0, Time[40], OP);
ObjectSet("OP Line", OBJPROP_STYLE, STYLE_DASH);
ObjectSet("OP Line", OBJPROP_COLOR, Gold);
}
else
{
ObjectMove("OP Line", 0, Time[40], OP);
}
if(ObjectFind("XOP Line") != 0)
{
ObjectCreate("XOP Line", OBJ_HLINE, 0, Time[40], XOP);
ObjectSet("XOP Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("XOP Line", OBJPROP_COLOR, Yellow);
}
else
{
ObjectMove("XOP Line", 0, Time[40], XOP);
}
//----------------------------------------------------------------
if(ObjectFind("f1g Line") != 0)
{
ObjectCreate("f1g Line", OBJ_HLINE, 0, Time[45], f1g);
ObjectSet("f1g Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("f1g Line", OBJPROP_COLOR, LawnGreen);
}
else
{
ObjectMove("f1g Line", 0, Time[45], f1g);
}
if(ObjectFind("F1R Line") != 0)
{
ObjectCreate("F1R Line", OBJ_HLINE, 0, Time[45], F1R);
ObjectSet("F1R Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("F1R Line", OBJPROP_COLOR, OrangeRed);
}
else
{
ObjectMove("F1R Line", 0, Time[45], F1R);
}
//----------------------------------------------
if(ObjectFind("f2g Line") != 0)
{
ObjectCreate("f2g Line", OBJ_HLINE, 0, Time[50], f2g);
ObjectSet("f2g Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("f2g Line", OBJPROP_COLOR, LawnGreen);
}
else
{
ObjectMove("f2g Line", 0, Time[50], f2g);
}
if(ObjectFind("F2R Line") != 0)
{
ObjectCreate("F2R Line", OBJ_HLINE, 0, Time[50], F2R);
ObjectSet("F2R Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("F2R Line", OBJPROP_COLOR, OrangeRed);
}
else
{
ObjectMove("F2R Line", 0, Time[50], F2R);
}
//-------------------------------------------------
if(ObjectFind("f3g Line") != 0)
{
ObjectCreate("f3g Line", OBJ_HLINE, 0, Time[55], f3g);
ObjectSet("f3g Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("f3g Line", OBJPROP_COLOR, LawnGreen);
}
else
{
ObjectMove("f3g Line", 0, Time[55], f3g);
}
if(ObjectFind("F3R Line") != 0)
{
ObjectCreate("F3R Line", OBJ_HLINE, 0, Time[55], F3R);
ObjectSet("F3R Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("F3R Line", OBJPROP_COLOR, OrangeRed);
}
else
{
ObjectMove("F3R Line", 0, Time[55], F3R);
}
//-----------------------------------------------------
if(ObjectFind("f4g Line") != 0)
{
ObjectCreate("f4g Line", OBJ_HLINE, 0, Time[60], f4g);
ObjectSet("f4g Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("f4g Line", OBJPROP_COLOR, LawnGreen);
}
else
{
ObjectMove("f4g Line", 0, Time[60], f4g);
}
if(ObjectFind("F4R Line") != 0)
{
ObjectCreate("F4R Line", OBJ_HLINE, 0, Time[60], F4R);
ObjectSet("F4R Line", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("F4R Line", OBJPROP_COLOR, OrangeRed);
}
else
{
ObjectMove("F4R Line", 0, Time[60], F4R);
}
//------------------------------------------------------
}
//---- End of Lines Draw
//---- End Of Program
return(0);
}
//+------------------------------------------------------------------+
I hope some one understands it all and has the time to help.