字体:  

求助斑竹:kdj指标加报警后显示有问题

wu123688 发表于: 2008-9-12 13:58 来源: 我要外汇

做了一个KDJ指标,没有加报警的时候,能正常显示。加了报警、箭头指示后,调出指标时,会出现图1的情况。但把它编译一遍后又正常了。每次启动时的情况也是一样的
指标源码如下:
//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                      Copyright ?2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_sep***te_window
#property indicator_minimum -20
#property indicator_maximum 120
#property indicator_buffers 8
#property indicator_color1 Yellow
#property indicator_color2 Lime
#property indicator_color3 Magenta
#property indicator_color4 Red
#property indicator_color5 Lime

//---- input p***meters
extern int KPeriod=55;
extern int DPeriod=13;
extern int Slowing=9;
//---- buffers
double Buffer[];
double MainBuffer[];
double SignalBuffer[];
double JBuffer[];
double UpBuffer[];
double DoBuffer[];
double HighesBuffer[];
double LowesBuffer[];


//----
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(8);
   SetIndexBuffer(0, MainBuffer);
   SetIndexBuffer(1, SignalBuffer);  
   SetIndexBuffer(2, JBuffer);
   SetIndexBuffer(5, HighesBuffer);
   SetIndexBuffer(6, LowesBuffer);
   SetIndexBuffer(7, Buffer);
   SetIndexBuffer(3, UpBuffer);
   SetIndexBuffer(4, DoBuffer);
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(3,233);
   SetIndexArrow(4,234);
   

//---- name for DataWindow and indicator subwindow label
   short_name="KDJ1("+KPeriod+","+DPeriod+","+Slowing+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"K");
   SetIndexLabel(1,"D");
   SetIndexLabel(2,"J");
   SetIndexLabel(3,"BUY_SIGNAL");
   SetIndexLabel(4,"SELL-SIGNAL");

//----
   draw_begin1=KPeriod+Slowing;
   draw_begin2=draw_begin1+DPeriod;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Stochastic oscillator                                            |
//+------------------------------------------------------------------+
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++) MainBuffer[Bars-i]=0;
      for(i=1;i<=draw_begin2;i++) SignalBuffer[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=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=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;
      sumlow=Close-LowesBuffer;
      sumhigh=HighesBuffer-LowesBuffer;
      if(sumhigh==0.0) Buffer=100.0;
      else Buffer=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++)
        {
      MainBuffer=iMAOnArray(Buffer,Bars,DPeriod,0,MODE_SMMA,i);

      SignalBuffer=iMAOnArray(MainBuffer,Bars,Slowing,0,MODE_SMMA,i);
      
      JBuffer=3*MainBuffer-2*SignalBuffer;
        int m=96; int n=2.5; int m1=120; int n1=-20;
      UpBuffer=EMPTY_VALUE;
      DoBuffer=EMPTY_VALUE;

      if (JBuffer>m)  UpBuffer=m1;
      if (JBuffer<n)    DoBuffer=n1;
      if (JBuffer>m) Alert("J高");
      if (JBuffer<n) Alert("J低");
   }
     
   
      
      
//----
   return(0);
  }
//+------------------------------------------------------------------+

最新回复

xfxyldj at 2008-9-12 14:13:40
不明白你的问题。
wu123688 at 2008-9-12 14:42:59
就是加载指标的时候会出现图1 的情况,必须在线编译指标一遍后才能恢复到图2 的情况
wu123688 at 2008-9-12 14:43:52
怎么没见到附件的图???
wu123688 at 2008-9-12 14:44:41
再传


kdj.gif


kdj1.gif

xfxyldj at 2008-9-12 20:51:15
if (JBuffer>m)  UpBuffer=m1;
if (JBuffer<n)    DoBuffer=n1;

这两行改成
if (JBuffer>m)  UpBuffer=JBuffer;
if (JBuffer<n)    DoBuffer=JBuffer;
你试试看。
whgs at 2008-9-13 08:55:55
whgs at 2008-9-13 08:56:28
KDJ