library SwingIndicator; uses sysutils, graphics, windows, StrUtils, math, IndicatorInterfaceUnit; var F_Period, N_Period, H_Period, MaxBars, Period1, Period2, Period3:integer; Symbol_1_Kod, Symbol_2_Kod, Symbol_3_Kod:integer; Dev_1, Dev_2, Dev_3:integer; Step_1, Step_2, Step_3:integer; FP_BuferUp, FP_BuferDn: TIndexBuffer; NP_BuferUp, NP_BuferDn: TIndexBuffer; HP_BuferUp, HP_BuferDn: TIndexBuffer; lasthighpos,lastlowpos:integer; lasthigh,lastlow:double; procedure Init; stdcall; begin IndicatorShortName('3 Level ZZ Semafor'); SetOutputWindow(ow_ChartWindow); AddSeparator('Common'); RegOption('MaxBars', ot_Integer, MaxBars); SetOptionRange('Period1', 1, 300); MaxBars := 120; RegOption('Period1', ot_Integer, Period1); SetOptionRange('Period1', 0, MaxInt); Period1 := 5; RegOption('Period2', ot_Integer, Period2); SetOptionRange('Period2', 0, MaxInt); Period2 := 13; RegOption('Period3', ot_Integer, Period3); SetOptionRange('Period3', 0, MaxInt); Period3 := 34; RegOption('Dev_1', ot_Integer, Dev_1); Dev_1 := 1; RegOption('Dev_2', ot_Integer, Dev_2); Dev_2 := 8; RegOption('Dev_3', ot_Integer, Dev_3); Dev_3 := 13; RegOption('Step_1', ot_Integer, Step_1); Step_1 := 3; RegOption('Step_2', ot_Integer, Step_2); Step_2 := 5; RegOption('Step_3', ot_Integer, Step_3); Step_3 := 8; Symbol_1_Kod := 140; Symbol_2_Kod := 141; Symbol_3_Kod := 142; FP_BuferUp := CreateIndexBuffer; FP_BuferDn := CreateIndexBuffer; NP_BuferUp := CreateIndexBuffer; NP_BuferDn := CreateIndexBuffer; HP_BuferUp := CreateIndexBuffer; HP_BuferDn := CreateIndexBuffer; IndicatorBuffers(6); SetIndexBuffer(0, FP_BuferUp); SetIndexStyle(0, ds_Symbol, psSolid, 1, RGB(210, 105, 30)); //Chocolate SetIndexSymbol(0, Symbol_1_Kod, 0, -10); SetIndexLabel(0, 'FP_BuferUp'); SetIndexBuffer(1, FP_BuferDn); SetIndexStyle(1, ds_Symbol, psSolid, 1, RGB(210, 105, 30)); //Chocolate SetIndexSymbol(1, Symbol_1_Kod, 0, 10); SetIndexLabel(1, 'FP_BuferDn'); SetIndexBuffer(2, NP_BuferUp); SetIndexStyle(2, ds_Symbol, psSolid, 2, RGB(199, 21, 133)); //MediumVioletRed SetIndexSymbol(2, Symbol_2_Kod, 0, -10); SetIndexLabel(2, 'NP_BuferUp'); SetIndexBuffer(3, NP_BuferDn); SetIndexStyle(3, ds_Symbol, psSolid, 2, RGB(199, 21, 133)); //MediumVioletRed SetIndexSymbol(3, Symbol_2_Kod, 0, 10); SetIndexLabel(3, 'NP_BuferDn'); SetIndexBuffer(4, HP_BuferUp); SetIndexStyle(4, ds_Symbol, psSolid, 3, clYellow); SetIndexSymbol(4, Symbol_3_Kod, 0, -10); SetIndexLabel(4, 'HP_BuferUp'); SetIndexBuffer(5, HP_BuferDn); SetIndexStyle(5, ds_Symbol, psSolid, 3, clYellow); SetIndexSymbol(5, Symbol_3_Kod, 0, 10); SetIndexLabel(5, 'HP_BuferDn'); end; procedure Done; stdcall; begin end; procedure CountZZ(index:integer; ExtMapBuffer:TindexBuffer; ExtMapBuffer2:TindexBuffer; ExtDepth:integer; ExtDeviation:integer; ExtBackstep:integer); var shift, back, ToBars:integer; val,res:double; curlow,curhigh:double; begin ToBars:=Bars-1; if MaxBars>0 then ToBars:=MaxBars; for shift:=ToBars downto index do begin val:=Low(iLowest(Symbol,TimeFrame,MODE_LOW,ExtDepth,shift)); if(val=lastlow) then val:=0 else begin lastlow:=val; if((Low(shift)-val)>(ExtDeviation*Point)) then val:=0 else begin for back:=1 to ExtBackstep do begin res:=ExtMapBuffer[shift+back]; if((res<>0) and (res>val)) then ExtMapBuffer[shift+back]:=0; end; end; end; ExtMapBuffer[shift]:=val; //--- high val:=High(iHighest(Symbol,TimeFrame,MODE_HIGH,ExtDepth,shift)); // iVal:=iHighest(Symbol,TimeFrame,MODE_HIGH,ExtDepth,shift); // val:=High(iVal); if (val=lasthigh) then val:=0 else begin lasthigh:=val; if((val-High(shift))>(ExtDeviation*Point)) then val:=0 else begin for back:=1 to ExtBackstep do begin res:=ExtMapBuffer2[shift+back]; if((res<>0) and (res0) then begin if(lasthigh>0) then begin if(lasthigh0) then begin if(lastlow>0) then begin if(lastlow>curlow) then ExtMapBuffer[lastlowpos]:=0 else ExtMapBuffer[shift]:=0; end; //--- if((curlow=Bars-ExtDepth) then ExtMapBuffer[shift]:=0 else begin res:=ExtMapBuffer2[shift]; if(res<>0) then ExtMapBuffer2[shift]:=res; end; end; ExtMapBuffer[MaxBars]:=0; ExtMapBuffer2[MaxBars]:=0; end; procedure Calculate(index: integer); stdcall; var shift, ToBars:integer; begin if Bars - Index < Max(Max(Period1, Period2), Period3)+1 then exit; if index<>0 then exit; if (Period1>0) then F_Period:=Period1*TimeFrame else F_Period:=TimeFrame; if (Period2>0) then N_Period:=Period2*TimeFrame else N_Period:=TimeFrame; if (Period3>0) then H_Period:=Period3*TimeFrame else H_Period:=TimeFrame; if (Period1>0) then CountZZ(index, FP_BuferUp,FP_BuferDn,Period1,Dev_1,Step_1); if (Period2>0) then CountZZ(index, NP_BuferUp,NP_BuferDn,Period2,Dev_2,Step_2); if (Period3>0) then CountZZ(index, HP_BuferUp,HP_BuferDn,Period3,Dev_3,Step_3); ToBars:=Bars-1; if MaxBars>0 then ToBars:=MaxBars; for shift:=ToBars downto index do begin if (NP_BuferUp[shift]>0) then FP_BuferUp[shift]:=0; if (HP_BuferUp[shift]>0) then NP_BuferUp[shift]:=0; if (NP_BuferDn[shift]>0) then FP_BuferDn[shift]:=0; if (HP_BuferDn[shift]>0) then NP_BuferDn[shift]:=0; end; end; exports Init, Done, Calculate; begin end.