расчет максимального безоткатного движения.

 

Не могу сообразить. Хочу написать скрипт, который рассчитывает максимальную величину движения цены без отката на n-пунктов(например 100) за определенный промежуток времени (к примеру за 2010 год).

Вроде задача простая, но что-то меня заклинило. Профи, помогите!

 
Чем?
 

extern int nn=60; // интервал

.

.

double ss,sr,smax,smin,xx;

.

.

.

.

if(nn>Bars) nn=Bars-1;

smax=iHigh(NULL,0,nn);

smin=iLow(NULL,0,nn);

for(int i=nn; i>=1; i--)

{

ss=ss+iClose(NULL,0,i);

N=N+1.0;

if( smax<iHigh(NULL,0,i) ) smax=iHigh(NULL,0,i);

if( smin>iLow(NULL,0,i) ) smin=iLow(NULL,0,i);

}

sr=ss/N; // среднее

xx= smax-smin; // размах

 

Захотелось помочь. Скрипт:

#property show_inputs

extern int MinPips = 100;
extern datetime StartTime = D'2010.01.01';
extern datetime EndTime = D'2011.01.01';

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime& StartTime, datetime& EndTime, int& Data[] )
{
  bool FlagUP = TRUE;
  int Pos = iBarShift(Symbol(), Period(), StartTime);
  int PosEnd = iBarShift(Symbol(), Period(), EndTime);
  int Max = High[Pos] / Point + 0.1;
  int Min = Low[Pos] / Point + 0.1;
  int Count = 0;
  int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
  ArrayResize(Data, MAX_POINTS);

  Pos--;
  
  while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1;
    PriceLow = Low[Pos] / Point + 0.1;   

    if (FlagUP)
    {
      if (PriceHigh > Max)
        Max = PriceHigh;
      else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
    else
    {
      if (PriceLow < Min)
        Min = PriceLow;
      else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
  ArrayResize(Data, Count);
    
  return(Count);
}

void start()
{
  int ZigZagData[];
  int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
  ArraySort(ZigZagData);
  
  Print("На интервале " + TimeToStr(StartTime) + " - " + TimeToStr(EndTime) +
        " максимальное безоткатное (> " + MinPips +
        " пунктов) движение " + ZigZagData[Amount - 1] + " пунктов.");
        
  return;
}
 
hrenfx:

Захотелось помочь. Скрипт:


Большое спасибо! Лихо работаете.
Причина обращения: