Модификация индикатора Параболик

Образцы, куски исходников, вопросы. Обсуждаем программирование.
Ответить
Сообщение
Автор
valeur
Сообщения: 8
Зарегистрирован: Сб апр 17, 2010 1:27 pm

Модификация индикатора Параболик

#1 Сообщение valeur » Вс фев 09, 2014 4:21 pm

Здравствуйте, хочу модифицировать индикатор из ФТ Параболик. В исходниках доступны 2 варианта кода на Паскале-один короткий, второй подлиннее (в самом тестере это видимо он очень тормозит). Поэтому буду работать с "коротким" вариантом. Сначала пробую компилировать код без изменений."Длинный" исходник компилируется без проблем и ошибок, а короткий исходник выдает ошибку:

Parabolic.dpr(81,3) Error: Illegal expression
Parabolic.dpr(81,6) Fatal: Syntax error, "THEN" expected but "identifier INDEX" found

Строки 80 и 81 содержат:
begin
if
В чем может быть проблема?
Если if убрать появляется другая ошибка - ругается на else который ниже

Код индикатора:

Код: Выделить всё

library Parabolic;
uses
  SysUtils, Classes, graphics, IndicatorInterfaceUnit;

var
  increment: double;
  max_value: double;

  SAR: TIndexBuffer;

//---------------------------------------------------------------------------
// Initialize
//---------------------------------------------------------------------------
procedure Init; stdcall;
begin
  // Define parameters
  IndicatorShortName('Parabolic');
  SetOutputWindow(ow_ChartWindow);

  // register external parameters
  AddSeparator('Common');
  RegOption('Increment', ot_Double, increment);
  SetOptionRange('Increment', 0.01, 1);
  increment := 0.02;

  RegOption('Max Value', ot_Double, max_value);
  SetOptionRange('Max Value', 0.1, 100);
  max_value := 0.2;

  // Create index buffer
  IndicatorBuffers(1);
  SAR := CreateIndexBuffer;
  SetIndexBuffer(0, SAR);
  SetIndexStyle(0, ds_Symbol, psSolid, 1, clBlue);
  SetIndexSymbol(0, 159, 0, 0);
end;

//---------------------------------------------------------------------------
// Deinitialization procedure
//---------------------------------------------------------------------------
procedure Done; stdcall;
begin
  // do nothing
end;

//---------------------------------------------------------------------------
// Calculate single bar
//---------------------------------------------------------------------------
procedure Calculate(index: integer); stdcall;
var
  i: integer;
  condition1, condition2: boolean;
  incr: double;

  function Highest(period: integer): double;
  var
    k: integer;
    max: double;
  begin
    max:=0;
    for k:=index to index+period-1 do
      if High(k)>max then max:=High(k);
    result:=max;
  end;

  function Lowest(period: integer): double;
  var
    k: integer;
    min: double;
  begin
    min:=25000;
    for k:=index to index+period-1 do
      if Low(k)<min then min:=Low(k);
    result:=min;
  end;

begin
  if

  if index = Bars - 1 then
    begin
      if High(Bars - 1) > Low(Bars - 1) then
        SAR[index] := Low(index);
      else
        SAR[index] := High(index);
      exit;
    end;

  if condition1 := (High(index+1) > SAR[index+2]);
  if condition2 := (Low(index+1) < SAR[index+2]);
  incr := increment;

  if ((High(index) > SAR[index+1]) and (High(index+1) < SAR[index+2])) then
    begin
      i:=1;
      while (High(index + i) < SAR[index + i + 1]) do
        begin
          inc(i);
          if i > 10 then break;
        end;
      SAR[index] := Lowest(i + 1);
      exit;
    end;

  if ((Low(index) < SAR[index+1]) and (Low(index+1) > SAR[index+2])) then
  begin
    i:=1;
    while (Low(index+i) > SAR[index+i+1]) do
    begin
      i:=i+1;
      if i>10 then break;
    end;
    SAR[index]:= Highest(i+1);
    exit;
  end;

  if condition1 then
    for i:= 1 to 150 do begin
      if (Low(index+i)<SAR[index+i+1]) then break;
      incr :=incr*2;
    end
  else if condition2 then
    for i:= 1 to 150 do begin
      if (High(index+i)>SAR[index+i+1]) then begin break; end;
      incr := incr*2;
    end;
     if incr>max_value then incr:=max_value;
     if condition1 then
     begin
       SAR[index]:= incr * (High (index + 1) - SAR [index + 1]) + SAR [index + 1];
     end;
     if condition2 then
     begin
       SAR[index]:= incr * (Low (index + 1) - SAR [index + 1]) + SAR [index + 1];
     end;
end;

exports

Init, Done, Calculate;

end.  

FX Helper
Сообщения: 567
Зарегистрирован: Пн апр 01, 2013 11:44 am

Re: Модификация индикатора Параболик

#2 Сообщение FX Helper » Вт фев 11, 2014 2:06 pm

Здравствуйте,

Перед else точка с запятой не ставится. Полагаю, данный блок кода должен выглядеть так:

begin

if index = Bars - 1 then
begin
if High(Bars - 1) > Low(Bars - 1) then
SAR[index] := Low(index)
else
SAR[index] := High(index);
exit;
end;

Ответить