MetaTrader 4 build 183 - страница 5

 
написал индикатор:
//+------------------------------------------------------------------+
//|                                                  GANN_rvm_v3.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Black
#property indicator_color3 DeepSkyBlue
#property indicator_color4 Black
#property indicator_color5 Yellow
#property indicator_color6 DarkKhaki
#property indicator_color7 AntiqueWhite
#property indicator_color8 NavajoWhite
//---- input parameters
extern int  NextTF=15;
extern int  BLin_Range=5;
extern int  HLNext_Range=3;
extern bool HLNext_UseFullTF=false;
//---- buffers
double HLNextUp_sl[];
double HLNextDn_sl[];
double HLNextUp[];
double HLNextDn[];
double BLev[];
double BStep[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
double MyArr[][10];

//----
bool initfl=0;  //флаг инициализации
int  ArrIdx;    //последний индекс массива
int  lb,lbars;  //индекс последнего расчитанного бара и количество расчитанных баров
int  idFile,dig;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,STYLE_DOT);
   SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
   SetIndexStyle(2,DRAW_LINE,STYLE_SOLID);
   SetIndexStyle(3,DRAW_LINE,STYLE_SOLID);
   SetIndexStyle(4,DRAW_LINE,STYLE_SOLID);
   SetIndexStyle(5,DRAW_LINE,STYLE_SOLID);
   SetIndexStyle(6,DRAW_LINE);
   SetIndexStyle(7,DRAW_LINE);
   SetIndexBuffer(0,HLNextUp_sl);
   SetIndexBuffer(1,HLNextDn_sl);
   SetIndexBuffer(2,HLNextUp);
   SetIndexBuffer(3,HLNextDn);
   SetIndexBuffer(4,BLev);
   SetIndexBuffer(5,BStep);
   SetIndexBuffer(6,ExtMapBuffer7);
   SetIndexBuffer(7,ExtMapBuffer8);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
   SetIndexEmptyValue(3,0.0);
   SetIndexEmptyValue(4,0.0);
   SetIndexEmptyValue(5,0.0);
   SetIndexLabel(0,"Sell Stop (M"+NextTF+","+HLNext_Range+")");
   SetIndexLabel(1,"Buy Stop (M"+NextTF+","+HLNext_Range+")");
   SetIndexLabel(2,"Sell Stop (M"+NextTF+","+HLNext_Range+")");
   SetIndexLabel(3,"Buy Stop (M"+NextTF+","+HLNext_Range+")");
   SetIndexLabel(4,"Balans Point (M"+NextTF+","+BLin_Range+")");
   SetIndexLabel(5,"Balans Step (M"+NextTF+","+BLin_Range+")");
//----
   FileDelete("tmp.csv");
   idFile=FileOpen("tmp.csv",FILE_CSV|FILE_READ|FILE_WRITE,";");
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted();
   int limit,cb,i;
//---- 
   //начальная инициализация индикатоа
   if( initfl!=1 )
   {
      myInit();
      if( initfl!=1 ) return(-1);
   }
   //определение интервала расчета и отрисовки индикатора
   if( counted_bars<0 )
   {
      return(-1);
   }
   else
   {
      if( Bars-1-counted_bars<=0 )
      {
         limit=0;
      }
      else
      {
         limit=Bars-1-counted_bars;
      }
   }
   //цикл по барам
   for( cb=limit;cb>=0;cb--)
   {
      if( cb!=Bars-1 )
      {
         if( cb==Bars-1-lb && lbars==Bars )
         {
            //действия если это не новый бар
            //if( cb==0 ) FileWrite(idFile,"    2.Бар не новый ");
            ACET(cb);
         }
         else
         {
            //действия если этот бар не соответствует началу бара старшего т-ф
            if( BBarBegin(cb,NextTF)!=1 )
            {
               if( cb==0 ) FileWrite(idFile,"--- 1.Новый бар "+cb,(Bars-1-cb)+" "+TimeToStr(Time[cb]));
               ACEB(cb);
            }
            else
            {
               if( cb==0 ) FileWrite(idFile,"*** 0.Новый бар старшего т-ф "+cb,(Bars-1-cb)+" "+TimeToStr(Time[cb]));
               ACEBB(cb);
            }
         }
      }
      else
      {
         ACF(cb);
      }
      //if( cb==0 ) FileWrite(idFile,MyArr[ArrIdx][0],MyArr[ArrIdx][1],MyArr[ArrIdx][2],MyArr[ArrIdx][3],MyArr[ArrIdx][4],MyArr[ArrIdx][5],MyArr[ArrIdx][6],MyArr[ArrIdx][7],MyArr[ArrIdx][8],MyArr[ArrIdx][9]);
      //отрисовываем основные линии High Low Next Activator
      if( HLNext_UseFullTF!=1 )
      {
         if( Close[cb]>MyArr[ArrIdx-1][8] )
         {
            HLNextUp[cb]=0;
            HLNextDn[cb]=MyArr[ArrIdx-1][9];
         }
         else
         {
            if( Close[cb]<MyArr[ArrIdx-1][9] )
            {
               HLNextUp[cb]=MyArr[ArrIdx-1][8];
               HLNextDn[cb]=0;
            }
            else
            {
               if( HLNextUp[cb+1]>0 )
               {
                  HLNextUp[cb]=MyArr[ArrIdx-1][8];
                  HLNextDn[cb]=0;
               }
               else
               {
                  HLNextUp[cb]=0;
                  HLNextDn[cb]=MyArr[ArrIdx-1][9];
               }
            }
         }
      }
      else
      {
         if( MyArr[ArrIdx-1][5]>MyArr[ArrIdx-2][8] )
         {
            HLNextUp[cb]=0;
            HLNextDn[cb]=MyArr[ArrIdx-1][9];
         }
         else
         {
            if( MyArr[ArrIdx-1][5]<MyArr[ArrIdx-2][9] )
            {
               HLNextUp[cb]=MyArr[ArrIdx-1][8];
               HLNextDn[cb]=0;
            }
            else
            {
               if( HLNextUp[cb+1]>0 )
               {
                  HLNextUp[cb]=MyArr[ArrIdx-1][8];
                  HLNextDn[cb]=0;
               }
               else
               {
                  HLNextUp[cb]=0;
                  HLNextDn[cb]=MyArr[ArrIdx-1][9];
               }
            }
         }
      }
      //отрисовываем балансовые линии и вспомогательные для High Low Next Activator
      for( i=Bars-1-MyArr[ArrIdx][0];i>=Bars-1-MyArr[ArrIdx][1];i-- )
      {
         BLev[i]       =MyArr[ArrIdx][6];
         BStep[i]      =MyArr[ArrIdx][7];
         HLNextUp_sl[i]=MyArr[ArrIdx][8];
         HLNextDn_sl[i]=MyArr[ArrIdx][9];
      }
      lb=Bars-1-cb;
      lbars=Bars;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   FileClose(idFile);
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
// Функция начальной инициализации индикатора                        |
//+------------------------------------------------------------------+
void myInit()
  {
  int ArrSize,Displacement,arcount,i;
//---- 
   //определяем количество баров младшего т-ф содержащихся в баре старшего т-ф
   if( NextTF<10080)
   {
      Displacement=NextTF/Period();
   }
   else
   {
      if( NextTF==10080 )
      {
         Displacement=7200/Period();
      }
      else
      {
         if( NextTF==43200 )
         {
            Displacement=31680/Period();
         }
      }
   }
//---------
   SetIndexShift(0,Displacement);
   SetIndexShift(1,Displacement);
   SetIndexShift(4,Displacement);
   SetIndexShift(5,Displacement);
   SetIndexDrawBegin(0,Displacement*HLNext_Range);
   SetIndexDrawBegin(1,Displacement*HLNext_Range);
   SetIndexDrawBegin(2,Displacement*HLNext_Range);
   SetIndexDrawBegin(3,Displacement*HLNext_Range);
   SetIndexDrawBegin(5,Displacement*BLin_Range);
   SetIndexDrawBegin(6,Displacement*BLin_Range);
//---------
   //если неверно указаны параметры BLin_Range,HLNext_Range
   if( BLin_Range<1 || HLNext_Range<1 )
   {
      Alert("Неверно указаны параметры иникатора!");
      return(-1);
   }
   //если на графике недостаточно данных
   if( Bars<MathMax(BLin_Range,HLNext_Range)*Displacement )
   {
      Alert("На графике недостаточно данных");
      return(-1);
   }

   //если неверно указан параметр NextTF
   if( NextTF<=Period() )
   {
      Alert("Неверно указан параметр NextTF !/n Значение должно быть больше /n текущего т-ф в минутах");
      return(-1);
   }

   //количество знаков до которых будут округляться расчеты
   dig=Digits;
   //определяем необходимый размер массива и его последний индекс
   if( BLin_Range>HLNext_Range )
   {
      ArrSize=BLin_Range;
   }
   else
   {
      ArrSize=HLNext_Range;
   }
   ArrIdx=ArrSize-1;

   //100 попыток на изменение размера массива
   for( i=0;i<100;i++)
   {
      arcount=ArrayResize(MyArr,ArrSize);
      if( arcount>0 )
      {
         break;
      }
   }

   initfl=1;
//----
   return(0);
  }
//+------------------------------------------------------------------+

//+--------------------------------------------------------------------+
//| Функция возвращает истину, если бар является началом бара старшего |
//| т-ф                                                                |
//+--------------------------------------------------------------------+
bool BBarBegin(int bar, int TF)
  {
//---- 
   bool bbegin=0;
   if(TF!=10080)
   {
      bbegin=MathFloor(Time[bar]/TF/60)-MathFloor(Time[bar+1]/TF/60);
   }
   else
   {
      bbegin=MathFloor((Time[bar]+259200)/TF/60)-MathFloor((Time[bar+1]+259200)/TF/60);
   }
//----
   return(bbegin);
  }
//+--------------------------------------------------------------------+

//+--------------------------------------------------------------------+
//| Функция заполняет массив данных если это не новый бар              |
//+--------------------------------------------------------------------+
void ACET(int bi)
  {
//----
   int i;
   double sBPoints,sHigh,sLow;
   //записываем значения параметров бара старшего т-ф
   if( High[bi]>MyArr[ArrIdx][3] ) MyArr[ArrIdx][3]=High[bi];
   if( Low[bi] <MyArr[ArrIdx][4] ) MyArr[ArrIdx][4]=Low[bi];
   MyArr[ArrIdx][5]=Close[bi];
   //точка баланса
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   //ступень баланса
   for( i=ArrIdx;i>=ArrIdx+1-BLin_Range;i-- )
   {
      sBPoints+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBPoints/BLin_Range,dig);
   //уровни BuyStop SellStop
   for( i=ArrIdx;i>=ArrIdx+1-HLNext_Range;i-- )
   {
      sHigh+=MyArr[i][3];
      sLow +=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sHigh/HLNext_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sLow/HLNext_Range,dig);
//----
   return(0);
  }
//+--------------------------------------------------------------------+

//+--------------------------------------------------------------------+
//| Функция заполняет массив данных если этот бар не является началом  |
//| бара старшего т-ф                                                  | 
//+--------------------------------------------------------------------+
void ACEB(int bi)
  {
//----
   //изменяем индекс бара завершающего бар старшего т-ф
   MyArr[ArrIdx][1]=Bars-1-bi;
   ACET(bi);
//----
   return(0);
  }
//+--------------------------------------------------------------------+

//+--------------------------------------------------------------------------+
//| Функция заполняет массив данных если этот бар - начало бара старшего т-ф |
//+--------------------------------------------------------------------------+
void ACEBB(int bi)
  {
//----
   int i;
   double sBPoints,sHigh,sLow;
   //сдвиг по стеку данных в массиве
   for( i=0;i<ArrIdx;i++ )
   {
      MyArr[i][0]=MyArr[i+1][0];
      MyArr[i][1]=MyArr[i+1][1];
      MyArr[i][2]=MyArr[i+1][2];
      MyArr[i][3]=MyArr[i+1][3];
      MyArr[i][4]=MyArr[i+1][4];
      MyArr[i][5]=MyArr[i+1][5];
      MyArr[i][6]=MyArr[i+1][6];
      MyArr[i][7]=MyArr[i+1][7];
      MyArr[i][8]=MyArr[i+1][8];
      MyArr[i][9]=MyArr[i+1][9];
      if( bi==0 ) FileWrite(idFile,"   инд. № "+i,MyArr[i][0],MyArr[i][1],MyArr[i][2],MyArr[i][3],MyArr[i][4],MyArr[i][5],MyArr[i][6],MyArr[i][7],MyArr[i][8],MyArr[i][9]);
   }
   //заполняем массив
   MyArr[ArrIdx][0]=Bars-1-bi;
   MyArr[ArrIdx][1]=Bars-1-bi;
   MyArr[ArrIdx][2]=Open[bi];
   MyArr[ArrIdx][3]=High[bi];
   MyArr[ArrIdx][4]=Low[bi];
   MyArr[ArrIdx][5]=Close[bi];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   for( i=ArrIdx;i>=ArrIdx+1-BLin_Range;i-- )
   {
      sBPoints+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBPoints/BLin_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLNext_Range;i-- )
   {
      sHigh+=MyArr[i][3];
      sLow +=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sHigh/HLNext_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sLow/HLNext_Range,dig);
   if( bi==0 ) FileWrite(idFile,"   инд. № "+ArrIdx,MyArr[ArrIdx][0],MyArr[ArrIdx][1],MyArr[ArrIdx][2],MyArr[ArrIdx][3],MyArr[ArrIdx][4],MyArr[ArrIdx][5],MyArr[ArrIdx][6],MyArr[ArrIdx][7],MyArr[ArrIdx][8],MyArr[ArrIdx][9]);
//----
   return(0);
  }
//+--------------------------------------------------------------------+

//+--------------------------------------------------------------------+
//| Функция вносит первую запись в массив                              |
//+--------------------------------------------------------------------+
void ACF(int bi)
  {
//----
   int i;
   double sBPoints,sHigh,sLow;
   //записываем значения параметров бара старшего т-ф
   MyArr[ArrIdx][0]=Bars-1-bi;
   MyArr[ArrIdx][1]=Bars-1-bi;
   MyArr[ArrIdx][2]=Open[bi];
   MyArr[ArrIdx][3]=High[bi];
   MyArr[ArrIdx][4]=Low[bi];
   MyArr[ArrIdx][5]=Close[bi];
   MyArr[ArrIdx][6]=NormalizeDouble((MyArr[ArrIdx][3]+MyArr[ArrIdx][4]+MyArr[ArrIdx][5])/3,dig);
   for( i=ArrIdx;i>=ArrIdx+1-BLin_Range;i-- )
   {
      sBPoints+=MyArr[i][6];
   }
   MyArr[ArrIdx][7]=NormalizeDouble(sBPoints/BLin_Range,dig);
   for( i=ArrIdx;i>=ArrIdx+1-HLNext_Range;i-- )
   {
      sHigh+=MyArr[i][3];
      sLow +=MyArr[i][4];
   }
   MyArr[ArrIdx][8]=NormalizeDouble(sHigh/HLNext_Range,dig);
   MyArr[ArrIdx][9]=NormalizeDouble(sLow/HLNext_Range,dig);
//----
   return(0);
  }
//+--------------------------------------------------------------------+


при "появлении" нового бара старшего т-ф вызывается функция ACEBB() которая осуществляет "сдвиг по стеку" в массиве данных, запись с индексом 0 заменяется на запись с индексом 1 и т.д. почему-то в реал-тайм этот сдвиг осуществляется некорректно, вот вывод в файл

--- 1.Новый бар 0;349984 2005.10.17 14:20
--- 1.Новый бар 0;349985 2005.10.17 14:25
*** 0.Новый бар старшего т-ф 0;349986 2005.10.17 14:30
   инд. № 0;349974;349976;1.7579;1.7586;1.7576;1.7578;1.758;1.7582;1.7592;1.7575
   инд. № 1;349977;349979;1.7579;1.7579;1.7557;1.757;1.7569;1.758;1.7586;1.7568
   инд. № 2;349980;349982;1.7569;1.758;1.7558;1.756;1.7566;1.7577;1.7582;1.7564
   инд. № 3;349983;349985;1.7561;1.7565;1.755;1.755;1.7555;1.757;1.7575;1.7555
   инд. № 4;349986;349986;1.7551;1.7551;1.7551;1.7551;1.7551;1.7564;1.7565;1.7553
--- 1.Новый бар 0;349987 2005.10.17 14:35
--- 1.Новый бар 0;349988 2005.10.17 14:40
*** 0.Новый бар старшего т-ф 0;349989 2005.10.17 14:45
   инд. № 0;349980;349982;1.7569;1.758;1.7558;1.756;1.7566;1.7577;1.7582;1.7564
   инд. № 1;349983;349985;1.7561;1.7565;1.755;1.755;1.7555;1.757;1.7575;1.7555
   инд. № 2;349986;349986;1.7551;1.7553;1.7542;1.7546;1.7547;1.7563;1.7566;1.755
   инд. № 3;349986;349988;1.7551;1.7559;1.7542;1.7555;1.7552;1.7558;1.7559;1.7545
   инд. № 4;349989;349989;1.7557;1.7557;1.7557;1.7557;1.7557;1.7555;1.7556;1.7547
--- 1.Новый бар 0;349990 2005.10.17 14:50
--- 1.Новый бар 0;349991 2005.10.17 14:55
*** 0.Новый бар старшего т-ф 0;349992 2005.10.17 15:00
   инд. № 0;349986;349986;1.7551;1.7553;1.7542;1.7546;1.7547;1.7563;1.7566;1.755
   инд. № 1;349986;349988;1.7551;1.7559;1.7542;1.7555;1.7552;1.7558;1.7559;1.7545
   инд. № 2;349989;349989;1.7557;1.7557;1.7549;1.7552;1.7553;1.7555;1.7556;1.7544
   инд. № 3;349989;349991;1.7557;1.7565;1.7549;1.7565;1.756;1.7553;1.756;1.7547
   инд. № 4;349992;349992;1.7564;1.7564;1.7564;1.7564;1.7564;1.7555;1.7562;1.7554
--- 1.Новый бар 0;349993 2005.10.17 15:05
--- 1.Новый бар 0;349994 2005.10.17 15:10
*** 0.Новый бар старшего т-ф 0;349995 2005.10.17 15:15
   инд. № 0;349989;349989;1.7557;1.7557;1.7549;1.7552;1.7553;1.7555;1.7556;1.7544
   инд. № 1;349989;349991;1.7557;1.7565;1.7549;1.7565;1.756;1.7553;1.756;1.7547
   инд. № 2;349992;349992;1.7564;1.7572;1.7562;1.7563;1.7566;1.7556;1.7565;1.7553
   инд. № 3;349992;349994;1.7564;1.7572;1.7551;1.7559;1.7561;1.7558;1.757;1.7554
   инд. № 4;349995;349995;1.7557;1.7557;1.7557;1.7557;1.7557;1.7559;1.7567;1.7557
--- 1.Новый бар 0;349996 2005.10.17 15:20
--- 1.Новый бар 0;349997 2005.10.17 15:25
*** 0.Новый бар старшего т-ф 0;349998 2005.10.17 15:30
   инд. № 0;349992;349992;1.7564;1.7572;1.7562;1.7563;1.7566;1.7556;1.7565;1.7553
   инд. № 1;349992;349994;1.7564;1.7572;1.7551;1.7559;1.7561;1.7558;1.757;1.7554
   инд. № 2;349995;349995;1.7557;1.7565;1.7557;1.7561;1.7561;1.756;1.757;1.7557
   инд. № 3;349995;349997;1.7557;1.7568;1.7557;1.7562;1.7562;1.7562;1.7568;1.7555
   инд. № 4;349998;349998;1.7564;1.7564;1.7564;1.7564;1.7564;1.7563;1.7566;1.7559
--- 1.Новый бар 0;349999 2005.10.17 15:35
--- 1.Новый бар 0;350000 2005.10.17 15:40
*** 0.Новый бар старшего т-ф 0;350001 2005.10.17 15:45
   инд. № 0;349995;349995;1.7557;1.7565;1.7557;1.7561;1.7561;1.756;1.757;1.7557
   инд. № 1;349995;349997;1.7557;1.7568;1.7557;1.7562;1.7562;1.7562;1.7568;1.7555
   инд. № 2;349998;349998;1.7564;1.7565;1.7559;1.7563;1.7562;1.7562;1.7566;1.7558
   инд. № 3;349998;350000;1.7564;1.7574;1.7557;1.7573;1.7568;1.7563;1.7569;1.7558
   инд. № 4;350001;350001;1.7574;1.7574;1.7574;1.7574;1.7574;1.7565;1.7571;1.7563


Уже на втором сдвиге наблюдается что данные для записи с индексом 0 были взяты не из записи с индексом 1, а из записи с индексом 2, нигде больше работа с индексами меньше последнего работа не ведется, только с последним, при присоединении индикатора на график, он на протяжении всей истории отрисовывается правильно, а вот в реал-тайм начинает "гнать", может уже чего не замечаю?

 
Немного путанно написал. Скажу ,что я наблюдал, может поможет (в рифму :) )

У меня был такая непонятка, я ожидал, что при поступлении нового бара в цикле (for cnt=limit;cnt>=0;cnt--) Я ожидал, что при новом баре отсчет будет идти от cnt=1, ан не тут то было, оказалось, что немного криво limit посчитан.
 
У меня такой заморочки не должно быть все просто :
...
   //сдвиг по стеку данных в массиве
   for( i=0;i<ArrIdx;i++ )
   {
      MyArr[i][0]=MyArr[i+1][0];
      MyArr[i][1]=MyArr[i+1][1];
      MyArr[i][2]=MyArr[i+1][2];
      MyArr[i][3]=MyArr[i+1][3];
      MyArr[i][4]=MyArr[i+1][4];
      MyArr[i][5]=MyArr[i+1][5];
      MyArr[i][6]=MyArr[i+1][6];
      MyArr[i][7]=MyArr[i+1][7];
      MyArr[i][8]=MyArr[i+1][8];
      MyArr[i][9]=MyArr[i+1][9];
      if( bi==0 ) FileWrite(idFile,"   инд. № "+i,MyArr[i][0],MyArr[i][1],MyArr[i][2],MyArr[i][3],MyArr[i][4],MyArr[i][5],MyArr[i][6],MyArr[i][7],MyArr[i][8],MyArr[i][9]);
   }
...
//----
   return(0);
  }

индекс записи берется верный, но там уже почему-то все сдвинуто? вызов сдвига проходит единожды, иначе было бы видно в выводе в файл???

 
MetaTrader 4 билд 183.
16. Добавлены новые режимы в функцию MarketInfo(). Подробная информация во встроенной помощи MetaEditor;


Попробовал новые режимы, но не пойму почему TICKVALUE и TICKSIZE возвращают 0.
Test EURUSD,H1: LOTSIZE=100000.00000000 TICKVALUE=0.00000000 TICKSIZE=0.00000000
Test EURUSD,H1: Symbol EURUSD: Point=0.0001, Spread=3.0000, StopLevel=3.0000, Digits=4



 
с временем на сервере все в порядке? у меня почему-то на М5 отрисовывается свеча 17:05 хотя текущее время по Москве 17:00 (предварительно специально синхронизировал с time.windows.com) время поста тоже неверно на 5 минут вперед

выяснил, просто провел синхронизацию с другим источником
 
наверняка полное значение переменно Ma_Niz = 1.15202500, попробуй выведи в файл или алерт вторая часть вряд ли в этом "виновата", а вообще для таких операций лучше предварительно нормализовать цену до количества знаков в инструменте, и код читабильнее и проблем не будет.


Нормализовать я так понимаю с помощью Point, других инструментов я не знаю... Если они есть, то подскажит пожалуйста.
 
Смотри справку:
double NormalizeDouble( double value, int digits)


Округление числа с плавающей запятой до указанной точности.

Параметры

value - Величина с плавающей точкой.
digits - Формат точности, число цифр после десятичной точки (0-8).

Пример

double var1=0.123456789;
Print(NormalizeDouble(var1,5));
// вывод: 0.12346

 
Нормализовать я так понимаю с помощью Point, других инструментов я не знаю... Если они есть, то подскажит пожалуйста.

MarketInfo( Symbol(), MODE_DIGITS );
 
почему-то в реал-тайм этот сдвиг осуществляется некорректно
похоже в терминале что-то глючит, сделал вывод в файл появление нового бара, появление нового бара старшего т-ф, изменение нулевой записи массива с "пометкой" наступления условий (появление бара старшего т-ф) для перезаписи (только в функции ACEBB присваиваются данные в нулевую запись массива), и на каждый цикл проверку изменения 0 записи без пометки, в результате выявился непредусмотренный кодом сдвиг данных в массиве. На М5 со старшим т-ф = М15 он сдвигал данные при начале М15 и после первого бара внутри М15, вот вывод в файл
                             инд.тек.
                             бара
                             отн./абс.      дата время
*** 0.Новый бар старшего т-ф 0;350351 2005.10.18 21:15
   санкция
ежетиковая проверка 0 элемент в 0 записи изменен 350339.00000000;350341;1.7499;1.75;1.749;1.7492;1.7494;1.7501;1.7507;1.7496
--- 1.Новый бар 0;350352 2005.10.18 21:20
ежетиковая проверка 0 элемент в 0 записи изменен 350342.00000000;350344;1.749;1.7496;1.7477;1.7492;1.7488;1.7499;1.7502;1.7487
--- 1.Новый бар 0;350353 2005.10.18 21:25
*** 0.Новый бар старшего т-ф 0;350354 2005.10.18 21:30
   санкция
ежетиковая проверка 0 элемент в 0 записи изменен 350345.00000000;350347;1.7491;1.7498;1.749;1.7494;1.7494;1.7497;1.7498;1.7486



если нашли ошибку кивните головой пожалуйста :)

 
Попробовал новые режимы, но не пойму почему TICKVALUE и TICKSIZE возвращают 0.

Эти параметры актуальны для фьючерсных контрактов, а для остальных инструментов не используются. Хотя TICKSIZE надо бы вместо 0 все равно показывать как 1/pow(10,digits) , например 0.0001 , а в TICKVALUE автоматически выдавать стоимость тика/пипса.
Постараемся в следующем билде реализовать.
Причина обращения: