Скачать MetaTrader 5

Помогите пожалуйста с этим кодом

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Michael Sargsyan
129
Michael Sargsyan 2014.07.03 11:39 

Вот уже неделя мучаюсь исправить ошибку вроде все нормально. При отладке дает ошибка Array out of range

Посмотрите пожалуйста я строку отметил красным. Спасибо  

#define  defIndicatorName  "Hidden Gap Volume"
#define  defObjectPrefix   "HGV_"

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_minimum 0

//----------------   Inputs   --------------------
extern string  n = "      Input Values";
extern string  Note = "0 means Display all bars";
extern int     Display_Bars = 2000;
extern int     LookBack = 20;

extern string  a = "    Moving Avg ";
extern int     MA_Period = 20;

extern string  b = "    Standard Deviation ";
extern int     Std_Deviation_Period = 30;
extern double  StdDeviation_Factor = 2.0;

extern string  c = "    ";
extern string  cc = "    Display Properties";
extern string  ca = "      Mov Avg Line";
extern bool    Show_MALine = true;

extern string  cb = "   Std Deviation Line";
extern bool    Display_StdDevLine = true;

extern string  e = "    Chart Symbol & TF ";
extern bool    Display_ChartSymbol = true;
extern int     ChartLabel_Font= 10;
extern color   ChartLabel_Color = IndianRed;

extern string  d = "    Clock Display ";
extern bool    Display_Clock = true;
extern int     Clock_Font = 10;
extern color   Clock_color = Tomato;

extern string  f = "    Current Volume";
extern bool    Show_Vol = true;
extern int     Vol_Font = 10;
extern color   Vol_Color = Blue;

extern string  g = "    Current Moving Avg ";
extern bool    Show_MA = false;
extern int     MA_Font = 10;
extern color   MA_Color = Blue;

extern string  h = "    Current Deviation";
extern bool    Show_DEV = false;
extern int     DEV_Font = 10;
extern color   DEV_Color = Blue;
//-----------------------------------------

//------ Variables
int      NumberOfBars;
double   LowestVol;
string   objprefix;

//--------------  Output Buffer Arrays ------------------------
double   LessThanPrevBar[],GreaterThanPrevBar[],LowestVolBar[],ClimaxBar[],white[],LessThanPrev2Bars[];
double   ClimaxLessThanPrev[],ClimaxLessThanPrev2[];
//------ Moving Avg  &&    Standard Deviation
double   MA_Line[],StdDevLine[];
double   dblRange,dblLastRange;

double   MA_sum, MovingAvg;
double   Std_Deviation,StdDevMA_sum,StdDev_Mean, stdDevSum;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
      Print("Init() - Start Initialization");
      if(Display_Bars > 0)
         { NumberOfBars = Display_Bars;}
         else
            if(Display_Bars == 0 && MA_Period >=  Std_Deviation_Period)
               {NumberOfBars = Bars-(MA_Period+10);}
               else
                  {NumberOfBars = Bars-(NumberOfBars - Std_Deviation_Period+10);}
               
      InitializeBuffers(NumberOfBars+Std_Deviation_Period+MA_Period);   
      IndicatorShortName(defIndicatorName);
      objprefix = defObjectPrefix; //Prefix for this indicators objects
      
      //-----
      if(Display_Clock)  Do_Clock();    //start clock
      if(Display_ChartSymbol) {CreateChartLabel();}
      //MA_sum = InitializeMA(NumberOfBars,MA_Period );

//----
      return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
      Clear_Objects(StringLen(objprefix),objprefix);  //Delete created objects
      EmptyBuffers(NumberOfBars+Std_Deviation_Period+MA_Period); WindowRedraw();
//----
      return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int loop =0;
   int counted_bars=IndicatorCounted();
   if(Bars-counted_bars == Bars || Bars-counted_bars > 2)
      { MA_sum = InitializeMA(NumberOfBars,MA_Period );
         loop=NumberOfBars;
         Print("Calc From Start","  CountedBars = ",counted_bars,"  Bars-counted = ",Bars-counted_bars);}
      else
         {loop = Bars-counted_bars; }
   
   for(int i=loop; i>=0; i--)   
      {
         LessThanPrevBar[i] = 0; GreaterThanPrevBar[i] = 0; LowestVolBar[i] = 0; ClimaxBar[i] = 0; LessThanPrev2Bars[i] = 0;
         ClimaxLessThanPrev[i] = 0;ClimaxLessThanPrev2[i]=0;
         
         if(NewPeriod(i) )  {Do_Calculations(i); }
         Do_Labels(i);
         
         if(Volume[i]*(High[i]-Low[i]) >= dblLastRange && Volume[i] > Volume[i+1])
            {ClimaxBar[i] = Volume[i];continue; }
                
         if(Volume[i] > Std_Deviation)
            {
               if(Volume[i] < Volume[i+1] && Volume[i] < Volume[i+2])  
                  {if(Display_StdDevLine)
                     {ClimaxLessThanPrev[i] = Volume[i];continue;}
                    else
                      {ClimaxLessThanPrev2[i] = Volume[i];continue;}}   
               if(Volume[i] < Volume[i+1] )
                  {ClimaxLessThanPrev[i] = Volume[i];continue;} 
               if(Volume[i] > Volume[i+1] )
                  {ClimaxBar[i] = Volume[i];continue; }
            }
         LowestVol = Volume[iLowest(NULL,0,MODE_VOLUME,LookBack,i)];
         if(Volume[i] <= LowestVol ) {LowestVolBar[i] = NormalizeDouble(Volume[i],0); continue;}
            else
               if(Volume[i] < Volume[i+1] && Volume[i] < Volume[i+2] ) {LessThanPrev2Bars[i] = Volume[i]; continue;}  // <Prev 2
                  else
                     if(Volume[i] <= Volume[i+1]) {LessThanPrevBar[i] = Volume[i]; continue;}   // <= Prev

         if(Volume[i] > Volume[i+1] ) {GreaterThanPrevBar[i] = Volume[i];}  // >Prev
      }
//----
   return(0);
}
//--------------------------  Functions
void  Do_Labels(int icnt)
{
   Do_Clock();    //update clock ea tick
   Do_VolLabel(icnt);
   Do_MALabel(icnt);
   Do_DEVLabel(icnt);
}
//--------------------------------
void  Do_Calculations(int icnt)
{
   dblLastRange = CalcRange(icnt+1);

   MovingAvg = Calc_MA(icnt+1,MA_Period);
   if(Show_MALine)
      {MA_Line[icnt+1] = MovingAvg;MA_Line[icnt] = MA_Line[icnt+1];}
   
   Std_Deviation = MovingAvg + (CalcStdDev(icnt,Std_Deviation_Period)*StdDeviation_Factor);
   if(Display_StdDevLine)
      {StdDevLine[icnt+1] = Std_Deviation; StdDevLine[icnt] = StdDevLine[icnt+1];}
   
   
}
//-------------------------------------------               
double   CalcStdDev(int icnt,int StdDevPeriod)
{
   StdDevMA_sum = 0;
   //Create Moving Avg
   for(int i = (icnt+StdDevPeriod+1);i>icnt;i--)
      {  StdDevMA_sum += NormalizeDouble(Volume[i],0); }
   StdDev_Mean = NormalizeDouble(StdDevMA_sum/StdDevPeriod,0);   //-Mean Avg
   
   double stdDevSum = 0;
   for(i = (icnt+Std_Deviation_Period+1); i>icnt;i--)
      { stdDevSum += NormalizeDouble(MathPow(Volume[i]-StdDev_Mean,2.0),0); }
   return(NormalizeDouble(MathSqrt(stdDevSum/StdDevPeriod),0)) ; 
}
//-------------------------
double   CalcRange(int cnt)
{
   double hiRange = 0;
   for (int i=(cnt+LookBack); i > cnt; i--)
      {
         if(Volume[i]*(High[i]-Low[i])> hiRange  ) 
            { hiRange = (Volume[i]*(High[i]-Low[i])); }
        }
   return(hiRange);
}   
//-----------------
double   InitializeMA(int cnt,int MAPeriod)
{
   MA_sum=0;MovingAvg=0;
   Print("InitializeMA()  Start Bar = ",(cnt+MAPeriod+1));
   for (int i=(cnt+MAPeriod+1); i > cnt; i--)   {MA_sum  += Volume[i];}
   return(NormalizeDouble(MA_sum,0));
}
//------------------------------
double  Calc_MA(int cnt,int MAPeriod)
{
   MA_sum -= NormalizeDouble(Volume[cnt+MAPeriod+1],0);
   MA_sum += NormalizeDouble(Volume[cnt],0);
   return(NormalizeDouble(MA_sum/MAPeriod,0));
}
//----------------
bool NewPeriod(int cnt)
{
   static datetime dtTime = 0;
   if( Time[cnt] > dtTime)
      {dtTime = Time[cnt];return(true);}
   return(false);
}
//------------
bool Do_DEVLabel(int i)                        //CURR VOL xxxx - screen label
{
   //Current Bars Volume, changes with each tick
   if(!Show_DEV) return(true);
   if(ObjectFind(objprefix+"CurrDEV") != 0)                     //create vol object
      { string DEVLabel = StringConcatenate(objprefix,"CurrDEV");   
         ObjectCreate(DEVLabel,OBJ_LABEL,WindowFind(defIndicatorName),0,0,0,0);
            ObjectSet(DEVLabel,OBJPROP_CORNER,1);          //anchor left corner,will expand to the right
               ObjectSet(DEVLabel,OBJPROP_XDISTANCE,5);    //set position from left side of screen,leave room for large #'s
                  ObjectSet(DEVLabel,OBJPROP_YDISTANCE,30);}
   ObjectSetText(DEVLabel,"Dev  "+DoubleToStr(Std_Deviation,0),DEV_Font,"Arial",DEV_Color);
   return(true);
}
//------------------------
bool Do_MALabel(int i)                        //CURR VOL xxxx - screen label
{
   //Current Bars Volume, changes with each tick
   if(!Show_MA) return(true);
   if(ObjectFind(objprefix+"CurrMA") != 0)                     //create vol object
      { string MALabel = StringConcatenate(objprefix,"CurrMA");   
         ObjectCreate(MALabel,OBJ_LABEL,WindowFind(defIndicatorName),0,0,0,0);
            ObjectSet(MALabel,OBJPROP_CORNER,1);          //anchor left corner,will expand to the right
               ObjectSet(MALabel,OBJPROP_XDISTANCE,5);    //set position from left side of screen,leave room for large #'s
                  ObjectSet(MALabel,OBJPROP_YDISTANCE,15);}
   ObjectSetText(MALabel,"MA  "+DoubleToStr(MovingAvg,0),MA_Font,"Arial",MA_Color);
   return(true);
}
//------------------------
bool Do_VolLabel(int i)                        //CURR VOL xxxx - screen label
{
   //Current Bars Volume, changes with each tick
   if(!Show_Vol) return(true);
   if(ObjectFind(objprefix+"CurrVol") != 0)                     //create vol object
      { string currVolLabel = StringConcatenate(objprefix,"CurrVol");   
         ObjectCreate(currVolLabel,OBJ_LABEL,WindowFind(defIndicatorName),0,0,0,0);
            ObjectSet(currVolLabel,OBJPROP_CORNER,1);          //anchor left corner,will expand to the right
               ObjectSet(currVolLabel,OBJPROP_XDISTANCE,5);    //set position from left side of screen,leave room for large #'s
                  ObjectSet(currVolLabel,OBJPROP_YDISTANCE,1);}
   ObjectSetText(currVolLabel,"Vol.  "+DoubleToStr(Volume[i],0),Vol_Font,"Arial",Vol_Color);
   return(true);
}
//---------       Clock Routine     --------------------------------
void Do_Clock()                     //displays time left in bar, may be toggled on/off in settings
{
         datetime saveTime; string itime;
         
    if(!Display_Clock) return;                                  //clock display setting to false, return
    if(TimeCurrent() < saveTime+1)  return;                    //only calculate every second

    saveTime = TimeCurrent();                                  //save new time
//----
    if(ObjectFind(objprefix+"Clock") != 0)                     //create clock object
      {ObjectCreate(objprefix+"Clock", OBJ_LABEL, 0, 0, 0,0,0);
         ObjectSet(objprefix+"Clock",OBJPROP_CORNER,1);         
            ObjectSet(objprefix+"Clock",OBJPROP_XDISTANCE,5);     
               ObjectSet(objprefix+"Clock",OBJPROP_YDISTANCE,30); }
               
    ObjectSetText(objprefix+"Clock",TimeToStr((Time[0] + Period()*60)-TimeCurrent(),TIME_SECONDS),
                Clock_Font,"Verdana", Clock_color); 
    return;
}
//------------------------- 
void  CreateChartLabel()      //create label on init
{
   if(!Display_ChartSymbol) return;    //ChartLabel display set to false
   string   strChartLabel = StringConcatenate(objprefix,"ChartLabel"); 
   string   strTime = " ";
   switch(Period())
   {
      case  1:    strTime = "M1";   break;
      case  5:    strTime = "M5";   break;
      case  15:   strTime = "M15";  break;
      case  30:   strTime = "M30";  break;
      case  60:   strTime = "H1";   break;
      case  240:  strTime = "H4";   break;
      case  1440: strTime = "D1";   break;
      default:    strTime =  " ";
   }            
   ObjectCreate(strChartLabel,OBJ_LABEL,0,0,0,0,0);
   ObjectSet(strChartLabel,OBJPROP_CORNER,1);         //anchor left corner,will expand to the right
   ObjectSet(strChartLabel,OBJPROP_XDISTANCE,5);   //set position from left side of screen,leave room for large #'s
   ObjectSet(strChartLabel,OBJPROP_YDISTANCE,15);
   ObjectSetText(strChartLabel,StringConcatenate(Symbol(),"  ",strTime),ChartLabel_Font,"Arial",ChartLabel_Color);
   return(true);
}
//----------------------------------------------------
bool  Clear_Objects(int stringlength,string objprefix)
   {
      for(int i=ObjectsTotal();i >= 0;i--)
          {if(StringSubstr(ObjectName(i),0,stringlength)==objprefix) ObjectDelete(ObjectName(i));}
      return(true);
   }
//------------------------------------     
void  InitializeBuffers(int NmbrBars)
{
//---- indicators
      SetIndexBuffer(0,LowestVolBar);
      SetIndexStyle(0,DRAW_HISTOGRAM,DRAW_HISTOGRAM,3,Yellow);
      SetIndexDrawBegin(0,Bars-NmbrBars);
      SetIndexLabel(0,"Lowest Vol Bar");
      SetIndexEmptyValue(0,0.0) ;
      
      SetIndexBuffer(1,LessThanPrevBar);
      SetIndexStyle(1,DRAW_HISTOGRAM,DRAW_HISTOGRAM,3,Red);
      SetIndexLabel(1,"Vol < Prev Bar");
      SetIndexEmptyValue(1,0.0) ;
      
      SetIndexBuffer(2,LessThanPrev2Bars);
      SetIndexStyle(2,DRAW_HISTOGRAM,DRAW_HISTOGRAM,3,Pink);
      SetIndexLabel(2,"Vol < Prev 2 Bars");
      SetIndexEmptyValue(2,0.0) ;
      
      SetIndexBuffer(3,GreaterThanPrevBar);
      SetIndexStyle(3,DRAW_HISTOGRAM,DRAW_HISTOGRAM,3,RoyalBlue);
      SetIndexLabel(3,"Vol > Prev Bar");
      SetIndexEmptyValue(3,0.0) ;
      
      SetIndexBuffer(4,ClimaxBar);
      SetIndexStyle(4,DRAW_HISTOGRAM,DRAW_HISTOGRAM,3,DarkBlue);
      SetIndexLabel(4,"Climactic Bar");
      SetIndexEmptyValue(4,0.0) ;
      
      SetIndexBuffer(5,ClimaxLessThanPrev);
      SetIndexStyle(5,DRAW_HISTOGRAM,DRAW_HISTOGRAM,3,Crimson);
      SetIndexLabel(5,"Climactic < Prev ");
      SetIndexEmptyValue(5,0.0) ;

   //   if(Display_StdDevLine == true)
         {
            SetIndexBuffer(6,StdDevLine);
            SetIndexStyle(6,DRAW_LINE,STYLE_DOT,1,Green);
            SetIndexLabel(6,"Std Deviation("+DoubleToStr(StdDeviation_Factor,2)+")");
            SetIndexEmptyValue(6,0.0) ;
         }
   /*   else
         {
            SetIndexBuffer(6,ClimaxLessThanPrev2);
            SetIndexStyle(6,DRAW_HISTOGRAM,DRAW_HISTOGRAM,3,Magenta);
            SetIndexLabel(6,"Climactic < Prev 2");
            SetIndexEmptyValue(6,0.0) ;
         }*/
      SetIndexBuffer(7,MA_Line);
      SetIndexStyle(7,DRAW_LINE,STYLE_SOLID,1,DarkGreen);
      SetIndexLabel(7,"Average("+MA_Period+")");
      SetIndexEmptyValue(7,0.0) ;
      
      EmptyBuffers(NmbrBars);
      Print("Buffers Initialized Bars = ",NmbrBars);  
}
//-------------------------------
bool EmptyBuffers(int NmbrBars)
{     
      //----------   Make sure buffers are cleaned out on TF change
      int icnt= 0;
      for(icnt = NmbrBars; icnt >= 0; icnt--)
         {
            LessThanPrevBar[icnt] = 0; GreaterThanPrevBar[icnt] = 0; LowestVolBar[icnt] = 0; 
            ClimaxBar[icnt] = 0; LessThanPrev2Bars[icnt] = 0;ClimaxLessThanPrev[icnt]=0;//ClimaxLessThanPrev2[icnt]=0;
            MA_Line[icnt] = 0;StdDevLine[icnt]=0;
         }
      MA_sum=0;MovingAvg=0;  
      WindowRedraw();  
}
Vladimir Karputov
Модератор
49214
Vladimir Karputov 2014.07.03 11:44  

Вставляйте, пожалуйста, код правильно. Воспринимать правильно вставленный код намного приятнее: Правильно вставляем код на форуме 
Michael Sargsyan
129
Michael Sargsyan 2014.07.03 11:57  
barabashkakvn:

Вставляйте, пожалуйста, код правильно. Воспринимать правильно вставленный код намного приятнее: Правильно вставляем код на форуме 
Спасибо что откликнулись уже исправил просто первый раз я тут
Vladimir Karputov
Модератор
49214
Vladimir Karputov 2014.07.03 12:30  

Обновите свой терминал, если еще не обновили. Ошибки выхода за диапазон не увидел, но были ошибки объявлять имена переменных с уже объявленными именами.

Ошибки отмечены

//Error.
Файлы:
Michael Sargsyan
129
Michael Sargsyan 2014.07.03 12:57  
barabashkakvn:

Обновите свой терминал, если еще не обновили. Ошибки выхода за диапазон не увидел, но были ошибки объявлять имена переменных с уже объявленными именами.

Ошибки отмечены

Извините а у Вас работает ? у меня отладчик новый стоит а терминал не знаю 
Michael Sargsyan
129
Michael Sargsyan 2014.07.03 12:59  
miksargsyan:
Извините а у Вас работает ? у меня отладчик новый стоит а терминал не знаю 
Терминал 4 версии
Vladimir Karputov
Модератор
49214
Vladimir Karputov 2014.07.03 13:27  
miksargsyan:
Терминал 4 версии

 MetaTrader 4 build 660

Alexander Voronkov
19174
Alexander Voronkov 2014.08.19 13:22  

Помогите пожалуйста заставить работать скрипт "удаления полоски-заголовка (caption) окон графиков", для 670-го билда.

#import "user32.dll"
  int SetWindowLongA(int hWnd,int nIndex, int dwNewLong);
  int GetWindowLongA(int hWnd,int nIndex);
  int SetWindowPos(int hWnd, int hWndInsertAfter,int X, int Y, int cx, int cy, int uFlags);
  int GetParent(int hWnd);
#import

#define GWL_STYLE         -16 
#define WS_CAPTION        0x00C00000 
#define WS_BORDER         0x00800000
#define WS_SIZEBOX        0x00040000
#define WS_DLGFRAME       0x00400000
#define SWP_NOSIZE        0x0001
#define SWP_NOMOVE        0x0002
#define SWP_NOZORDER      0x0004
#define SWP_NOACTIVATE    0x0010
#define SWP_FRAMECHANGED  0x0020

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start() {
  int iChartParent=GetParent(WindowHandle(Symbol(),0));    
  int iNewStyle = GetWindowLongA(iChartParent, GWL_STYLE) & (~(WS_BORDER | WS_DLGFRAME | WS_SIZEBOX));    
  if (iChartParent>0 && iNewStyle>0) {
    SetWindowLongA(iChartParent, GWL_STYLE, iNewStyle);
    SetWindowPos(iChartParent,0, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE| SWP_FRAMECHANGED);
  }
  return(0);
}
Vladimir Karputov
Модератор
49214
Vladimir Karputov 2014.08.19 15:57  
Fillellin:

Помогите пожалуйста заставить работать скрипт "удаления полоски-заголовка (caption) окон графиков", для 670-го билда.

Посмотрите у меня скрипт Transparent. В нём используются Win API получения свойств окон и хендлов. 
Alexander Voronkov
19174
Alexander Voronkov 2014.08.19 16:04  
barabashkakvn:
Посмотрите у меня скрипт Transparent. В нём используются Win API получения свойств окон и хендлов. 
Спасибо!   Буду разбираться.
Alexander Voronkov
19174
Alexander Voronkov 2014.08.19 17:24  
barabashkakvn:
Посмотрите у меня скрипт Transparent. В нём используются Win API получения свойств окон и хендлов. 
Если вы про, то но тоже не хочет функционировать в 670-ом.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий