Продолжим писать класс статистического анализа индикатора (repeat, until).
Сегодня мы продолжим писать класс для анализа индикатора momentum, который начали на прошлом уроке Мы уже создали базовые классы. Теперь создадим основные, рабочие классы. Начнем с TPASSStatAnalizMomentum:
TPASSStatAnalizMomentum=class(TPASSStatAnalizTemplate) function FindSignal:boolean; override; function FindSignalRotate:boolean; override; procedure Test; end; |
function TPASSStatAnalizMomentum.FindSignal:boolean; var LastCandleIndex:integer; s:string; begin Result:=false; LastCandleIndex:=1; repeat if FIndicator.GetResultByFieldName('Value')=0 then LastCandleIndex:=2 else LastCandleIndex:=1; if (FIndicator.GetResultByFieldName('Value')>=0) and (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)<0) then begin FSignalType:=enBuy; Result:=true; exit; end; if (FIndicator.GetResultByFieldName('Value')<0) and (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)>=0) then begin FSignalType:=enSell; Result:=true; exit; end; until not FIndicator.Next; end; function TPASSStatAnalizMomentum.FindSignalRotate:boolean; var LastSignalType:TPASSSignalsTypes; toNext:boolean; begin LastSignalType:=FSignalType; toNext:=true; if not(FIndicator.PriceSource.NextItem) then begin Result:=false; exit; end; repeat if not FindSignal then begin Result:=false; exit; end; if (LastSignalType=enBuy) and (FSignalType=enSell) then begin Result:=true; exit; end; if (LastSignalType=enSell) and (FSignalType=enBuy) then begin Result:=true; exit; end; until toNext; Result:=false; end; |
Шаг 1. Проверяем условия сигнала на покупку
if (FIndicator.GetResultByFieldName('Value')>=0) and (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)<0) then |
FSignalType:=enBuy; Result:=true; exit; |
if (FIndicator.GetResultByFieldName('Value')<0) and (FIndicator.GetResultByFieldNameAndIndex('Value',FIndicator.PriceSource.CurrentItemIndex-LastCandleIndex)>=0) then |
FSignalType:=enSell; Result:=true; exit; |
Как мы ищем обратный сигнал? Сперва запоминаем тип последнего сигнала и проверяем, не последняя ли у нас котировка:
LastSignalType:=FSignalType; toNext:=true; if not(FIndicator.PriceSource.NextItem) then |
repeat if not FindSignal then begin Result:=false; exit; end; |
if (LastSignalType=enBuy) and (FSignalType=enSell) then begin Result:=true; exit; end; if (LastSignalType=enSell) and (FSignalType=enBuy) then begin Result:=true; exit; end; |
until toNext; |
TPASSStatStoreDataList=class(TPASSStatStoreDataTemplate) protected FList:TStrings; FCounter:integer; public constructor Create(AList:TStrings); procedure AddData(AParameters:TPASSParameters); override; end; |
constructor TPASSStatStoreDataList.Create(AList:TStrings); begin inherited Create; FList:=AList; FCounter:=0; end; procedure TPASSStatStoreDataList.AddData(AParameters:TPASSParameters); var s:string; i,cn:integer; begin s:=''; cn:=AParameters.Count-1; for i:=0 to cn do s:=s+AParameters[i].Name+'='+AParameters.AsStringByNum(i)+';'; FList.Add(s); FCounter:=FCounter+1; end; |
procedure TPASSStatAnalizMomentum.Test;
begin
FIndicator.PriceSource.CurrentItemIndex:=FIndicator.GetParameterByName('DT')+3;
inherited Test;
end;
Иисточник: http://easyprog.ru/index.php?option=com_content&task=view&id=155&Itemid=44