下面是Dynamic Trader里面DTosc的源码:
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#property copyright \"\"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_color1 Red
#property indicator_color2 LimeGreen
#property indicator_width1 1
#property indicator_style1 0
#property indicator_width2 1
#property indicator_style2 2
#property indicator_level1 20
#property indicator_level2 50
#property indicator_level3 80
//
//
//
//
//
extern int PeriodRSI =13;
extern int PeriodStoch= 8;
extern int PeriodSK = 5;
extern int PeriodSD = 3;
// 0 = SMA
// 1 - EMA
// 2 - SMMA
// 3 - LWMA
extern int MAMode=1;
//
//
//
//
//
double SK[];
double SD[];
double StoRSI[];
double RSI[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(4);
SetIndexBuffer(0,SK);
SetIndexBuffer(1,SD);
SetIndexBuffer(2,StoRSI);
SetIndexBuffer(3,RSI);
IndicatorShortName(\"DTOSC (\"+PeriodRSI+\",\"+PeriodStoch+\",\"+PeriodSK+\",\"+PeriodSD+\")\");
return(0);
}
int deinit() { return(0); }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int i,limit;
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
limit=Bars-counted_bars;
//
//
//
//
//
for(i=limit; i>=0; i--)
{
RSI = iRSI(NULL,0,PeriodRSI,PRICE_WEIGHTED,i);
double LLV = RSI[ArrayMinimum(RSI,PeriodStoch,i)];
double HHV = RSI[ArrayMaximum(RSI,PeriodStoch,i)];
if ((HHV-LLV)!=0)
StoRSI = 100.0*((RSI - LLV)/(HHV - LLV));
else StoRSI = 0;
}
for(i=limit; i>=0; i--) SK=iMAOnArray(StoRSI,0,PeriodSK,0,MAMode,i);
for(i=limit; i>=0; i--) SD=iMAOnArray( SK,0,PeriodSD,0,MAMode,i);
return(0);
} |