查看完整版本: slowkd

渔弋 2008-2-19 21:05

slowkd

//+------------------------------------------------------------------+
//|                                                        KDJ.mq4 |
//|                       Copyright ?2005, MetaQuotes Software Corp. |
//|                                        [url]http://www.metaquotes.net[/url] |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Black
#property  indicator_color2  Silver
#property  indicator_color3  Yellow
#property  indicator_color4  Magenta

//---- input parameters
extern int       KPeriod=9;
extern int       DPeriod=3;
extern int       JPeriod=3;

double     ind_buffer1[];
double     ind_buffer2[];
double     ind_buffer3[];
double     ind_buffer4[];
double HighesBuffer[];
double LowesBuffer[];

int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(6);
   SetIndexBuffer(0, ind_buffer1);
   SetIndexBuffer(1, ind_buffer2);
   SetIndexBuffer(2, ind_buffer3);
   SetIndexBuffer(3, ind_buffer4);
   SetIndexBuffer(4, HighesBuffer);
   SetIndexBuffer(5, LowesBuffer);
   

//---- indicator lines
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, ind_buffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2, ind_buffer3);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3, ind_buffer4);

//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("KDJ("+KPeriod+","+DPeriod+","+JPeriod+")");
   SetIndexLabel(0,NULL);
   SetIndexLabel(1,"K");
   SetIndexLabel(2,"D");
   SetIndexLabel(3,"J");
//----
   draw_begin1=KPeriod+JPeriod;
   draw_begin2=draw_begin1+DPeriod;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k;
   int    counted_bars=IndicatorCounted();
   double price;
//----
   if(Bars<=draw_begin2) return(0);
//---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin1;i++) ind_buffer1[Bars-i]=0;
      for(i=1;i<=draw_begin2;i++) ind_buffer2[Bars-i]=0;
     }
//---- minimums counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double min=1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=Low[k];
         if(min>price) min=price;
         k--;
        }
      LowesBuffer[i]=min;
      i--;
     }
//---- maximums counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double max=-1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=High[k];
         if(max<price) max=price;
         k--;
        }
      HighesBuffer[i]=max;
      i--;
     }
//---- %K line
   i=Bars-draw_begin1;
   if(counted_bars>draw_begin1) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i+JPeriod-1);k>=i;k--)
        {
         sumlow+=Close[k]-LowesBuffer[k];
         sumhigh+=HighesBuffer[k]-LowesBuffer[k];
        }
      if(sumhigh==0.0) ind_buffer1[i]=100.0;
      else ind_buffer1[i]=sumlow/sumhigh*100;
      i--;
     }
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
//---- signal line is simple movimg average
   for(i=0; i<limit; i++)
      ind_buffer2[i]=iMAOnArray(ind_buffer1,Bars,DPeriod,0,MODE_SMA,i);
   for(i=0; i<limit; i++)
      ind_buffer3[i]=iMAOnArray(ind_buffer2,Bars,JPeriod,0,MODE_SMA,i);
   for(i=0; i<limit; i++)
      ind_buffer4[i]=3*ind_buffer2[i]-2*ind_buffer3[i];

//----
   return(0);
  }
//+------------------------------------------------------------------+

[[i] 本帖最后由 渔弋 于 2008-2-20 23:34 编辑 [/i]]

xfxyldj 2008-2-20 11:23

回复 1楼 的帖子

请帖个文件。
这个代码拷贝了还有修改。
谢谢

渔弋 2008-2-20 11:52

不好意思,这是从别的地方抄来的,不过可以用,和股票软件上的kd还是略有差别。

matt 2008-2-20 13:30

能不能制成文件,方便放入文件夹中:yct63 :yct63

渔弋 2008-2-20 15:22

kdj

有附件了还得输标题,有点麻烦

渔弋 2008-2-20 23:35

仔细看了一下,是经过平滑的慢速kd。

yuzhiyi987 2008-3-18 18:22

什么是平滑的慢速KD?不明白
页: [1]
查看完整版本: slowkd