Sei sulla pagina 1di 19

Indicators

TechnicalIndicatorsareusedtoaidinmanualtradingaswellasbeincludedinautomatedstrategiesby
indicatingtrendsandprovidingsignalsforpotentialchangesintrend.Therehavebeenanumberof
indicatorsdevelopedovertimebyvariousstatisticiansandtradersalike.Manyofthemostpopularindicators
areincludedintheplatformasbuildinindicators.CustomindicatorsmaybecreatedusingthecAlgoeditor.
TheseindicatorscanbeviewedinthecTraderaswellasthecAlgoplatforms.Moreover,youmaydownload
customindicatorsbuildbyotherusersfromcTDNIndicators.

TheNewIndicatorTemplate

ClickontheIndicatorstab
Clickthenewbuttonfromthesidepanel.

Theeditorwillbeloadedwiththetemplateforanewindicator:
?
1

//ThesenamespacesarerequiredforacAlgoindicator.

//TheycontainbasicclassesoftheC#language,andthecAlgoAPI.

//Thelastnamespaceisrequiredforreferencingbuildin

//indicatorssuchasSimpleMovingAverage,BollingerBands,etc.

usingSystem

usingcAlgo.API

usingcAlgo.API.Internals

usingcAlgo.API.Indicators

10
11 //DefineindicatorswithinthecAlgo.Indicatorsnamespace
12 namespacecAlgo.Indicators
13 {
14 //TheIndicatorclassdeclarationmustbeprecededbytheindicator
15 attribute,
16 //[Indicator()],anditshouldbeapublic
17 //Indicatorderivedclass
18
19 [Indicator(IsOverlay=false,TimeZone=TimeZones.UTC)]
20 publicclassNewIndicator:Indicator
21 {
22 //Theparameterattributeisnecessaryiftheprogramwill
23 containuserinput.

24 [Parameter(DefaultValue=0.0)]
25 publicdoubleParameter{getset}
26
27 //TheOutputattributeisusedtodisplaytheOutputof
28 //anIndicatorseriesonthechart.
29 [Output("Main")]
30 publicIndicatorDataSeriesResult{getset}
31 //TheInitializemethodiscalleduponloadingofanindicator.
32 //Itistypicallyusedtoinitializevariablesandseriessuchas
33 nestedindicators.
34 protectedoverridevoidInitialize()
35 {
36 //Initializeandcreatenestedindicators
37 }
38
39 //Thecalculatemethodcannotbeommited.
40 //Itisthemainmethodofanindicator.
41 //Itiscalledoneachhistoricalbardefinedbytheindexand
42 inrealtimeoneachincomingtick.
43 publicoverridevoidCalculate(intindex)

44 {
//Calculatevalueatspecifiedindex
//Result[index]=...
}
}

Initialize
Theinitializemethodisusedtoinitializevariablesmainlysuchasindicators,dataseries,lists,etc.In
general,anyvariablesthatneedtobecalculatedonlyonceonstartupshouldbeintheinitializemethodin
ordernottoconsumeunnecessaryresources.

Calculate
Thecalculatemethodisthemainmethodoftheindicator.Itiscalledforeachhistoricbarstartingfromthe
beginningoftheseriesuptothecurrentbarandthenoneachincomingtick.Inthecaseofmultisymbol/
multitimeframeimplementation,itwillbecalledoneachtickofeachsymbolthatisusedintheindicator.
Itistypicallyusedforthecalculationofanindicatorbasedonaformula.Inthiscase,itisthedifferenceof
theHighandtheLowpricesofeachbar.Theindexparameter,representseachbar,rangingfrom0upto
thecurrent(last)bar.So,ateachbartheCalculatemethodwillbecalledandtheResultwillbeassigned
withthedifferencebetweentheHighandtheLowofthatbar.

ASimpleIndicator
TheHighMinusLowIndicatorcalculatesthedifferencebetweenthecurrentbarsHighandLowpricesand
displaysthisinanoutputserieswhichisdrawnonthechartasalineconnectingthevaluesateachbar.
?
1

usingSystem

usingcAlgo.API

namespacecAlgo.Indicators

[Indicator("HighMinusLow",IsOverlay=false,ScalePrecision=5)]

publicclassHighMinusLow:Indicator

[Output("Main",Color=Colors.Orange)]

10 publicIndicatorDataSeriesResult{getset}
11
12 publicoverridevoidCalculate(intindex)
13 {
14 Result[index]=MarketSeries.High[index]
15 MarketSeries.Low[index]
16 }
17 }
}
TheIndicatorAttributeisappliedtotheclasstoindicatecertaincharacteristicssuchas:

theindicatorsname:"HighMinusLow"
ifitwillbeoverlayedonthechartoronaseparatepanel:IsOverlay=false
thescaleprecissiononthechart:ScalePrecision=5
SeeIndictorAttributeforacompletelist.

TheIndicatorAttributeisrequiredevenifthepropertiesinparenthesisareomitted,e.g.:[Indicator()].As
mentionedintheprevioussectiontheindicatormustbeanIndicatorderivedclass:
publicclassMyIndicator:Indicator
TheOutputAttributeisappliedtomarkanIndicatorDataSeriesasoutputtothechart.Thepropertythatismarked
withtheoutputattributeshouldbepublicsothatitcanbereferencedfromotherclasses.AswiththeIndicator
attribute,theOutputattributeallowstospecifycharacteristicssuchas:

thenamegiventotheoutput:"Main"

thecolor:Color=Colors.Orange
SeeOutputAttributeforacompletelist.
Thenamewillbedisplayedinthesmallpanelthatisdisplayedwhenyouaddaninstance.Fromthispanel
youcanchangetheothercharacteristicsoftheoutput,suchasthecolorandlinetype.

IndicatorDataSeriesisalistofdoublesthatcanbeindexedlikeanarray.Hence,thevalueateachindexin
thelistResultisassignedintheCalculatemethodasfollows:
?
1

publicoverridevoidCalculate(intindex)

Result[index]=MarketSeries.High[index]

MarketSeries.Low[index]
}

TofindthetotalnumberofelementsinaseriesusetheCountproperty:MarketSeries.High.Count.

Asyoumighthavenoticed,
MarketSeries.HighandMarketSeries.Lowarealsoindexedinthesamefashion.Theyareoftype
DataSerieswhichisalsoalistofdoublesbutthistypeisreadonly(valuescanberetrievedbutnot
assigned).
TheMarketSeriesinterfacecontainsthefollowingseries:Open,High,Low,Close,Median,Typicaland
WeightedpriceseriesaswellasTickVolume,OpenTime,SymbolCodeandTimeFrameoftherelevant
instance.Inotherwords,itwillretrievetheabovevaluesofwhicheversymbolandtimeframeyouchoose

whenyoucreateanewinstance.IfyoutypeMarketSeriesfollowedbyaperiod(dot),theintellisensewill
populatethislist.

IndicatorswithParameters
Mostofthetimeindicatorscanvaryaccordingtouserinput.TheSimpleMovingAverageisdesignedto
acceptasinputparametersthepricesourceandtheperiodforthecalculation.Inputmustbeprecededby
theParameterattributelikeshowninthecodebelowtheSourceandthePeriodspropertiesare
precededbytheParameterattribute.
?
1

publicclassSimpleMovingAverage:Indicator

[Parameter]

publicDataSeriesSource{getset}

[Parameter(DefaultValue=14)]

publicintPeriods{getset}

[Output("Main",Color=Colors.Turquoise)]

10 publicIndicatorDataSeriesResult{getset}
11
12 publicoverridevoidCalculate(intindex)
13 {
14 doublesum=0
15
16 for(vari=indexPeriods+1i<=indexi++)
17 {
18 sum+=Source[i]
19 }
20 Result[index]=sum/Periods
21 }
22 }
LiketheIndicatorandOutputattributesdiscussedearlier,theParameterattributecandefinecertain
characteristicstotheinput:
?

[Parameter("MAPeriods",DefaultValue=14,MinValue=1,MaxValue=20)]

Thenamethatisdisplayedintheinputpanelofaninstance.

Thedefaultvalueofaninputwhichistheinitialvaluebeforeitcanbechangedbytheuser.

Theminimumandmaximumvaluesincaseofnumbers.

SeeParameterattribute.

Currently,thesupportedtypesforinputare:DataSeries,int,double,string,bool,MovingAverageTypeand
TimeFrame.
IftheinputisapricesourcesuchasOpen,High,Low,Close,thenmakethepropertyaDataSeries.
IftheinputisapricesourcesuchasOpen,High,Low,Close,thenmakethepropertyaDataSeriestype:
?
1

[Parameter("Price")]

publicDataSeriesSource{getset}

ThedefaultforDataSeriestypecannotbeset,theClosewillbethedefaultvalue.
Iftheinputneedstobeanumberthenint(integer)ordouble(decimal)canbeused:
?
1

[Parameter("MAPeriods",DefaultValue=14,MinValue=1,MaxValue=20)]

publicintPeriods{getset}

Declareaboolforayes/notypeinput.ThevalueYescorrespondstotrueandNotofalse:
?
1

[Parameter("Message",DefaultValue=true)]

publicboolDisplayChartMessage{getset}

TheabovewilldisplayaYes/NoInputoption.

NestedIndicators
Incertainoccasionsitisnecessarytousenestedindicators.Thatisthevalueofoneindicatordependson
thevalueofotherindicators.SuchisthecasewiththeSampeDeMarkerindicatorfoundintheplatform.
?
1

publicclassSampleDeMarker:Indicator

[Parameter(DefaultValue=14)]

publicintPeriods{getset}

[Output("DMark",Color=Colors.Turquoise)]

publicIndicatorDataSeriesDMark{getset}

privateIndicatorDataSeriesdeMin

10 privateIndicatorDataSeriesdeMax
11 privateMovingAveragedeMinMA
12 privateMovingAveragedeMaxMA
13
14 protectedoverridevoidInitialize()
15 {
16 deMin=CreateDataSeries()
17 deMax=CreateDataSeries()
18 deMinMA=Indicators.MovingAverage(deMin,Periods,
19 MovingAverageType.Simple)
20 deMaxMA=Indicators.MovingAverage(deMax,Periods,
21 MovingAverageType.Simple)
22 }
23
24 publicoverridevoidCalculate(intindex)
25 {
26 deMin[index]=Math.Max(MarketSeries.Low[index1]
27 MarketSeries.Low[index],0)
28 deMax[index]=Math.Max(MarketSeries.High[index]

29 MarketSeries.High[index1],0)
30
31 varmin=deMinMA.Result[index]
32 varmax=deMaxMA.Result[index]
33
34 DMark[index]=max/(min+max)
}
}
IntheexampleabovedeMinMAanddeMaxMAareindicatorswhichareusedforthecalculationofthe
demarkindicator.NestedindicatorsneedtobedefinedintheInitialize()method.ForexampledeMinMAis
definedasthesimplemovingaverageoftheseriesdeMin.
?
1

deMinMA=Indicators.MovingAverage(deMin,Periods,
MovingAverageType.Simple)

deMininturnisdefinedinthecalculatemethodasthemaxofthelasttwoLowpricevalues.
?
1

deMin[index]=Math.Max(MarketSeries.Low[index1]
MarketSeries.Low[index],0)

TheintellisensewillpopulatethelistofallbuildinindicatorsonceyoutypeIndicatorsfollowedbyaperiod

(dot).

Theintellisensealsoshowsthelistoftheinputparameterstothereferencedindicatoroncetheindicatorhas
beenselectedfromthelist.

ReferencingCustomIndicators
AcustomindicatorisanyindicatoryoucreateincAlgo.Thesamplesintheplatformarecustomindicators.
Inordertoreferencecustomindicatoryouneed
topressManageReferencesbuttononthetopleftcornerofthetexteditor.


InIndicatorspageofReferenceManageryouneedtocheckindicatorswhichyouwanttobereferencedand
pressApply.

ReferencedcustomindicatorsmustbedefinedintheInitializemethodjustlikenestedbuildinindicatorsbut
thesyntaxisslightlydifferent.Thenameofthecustomindicatormustbeenclosedinanglebrackets
followingtheGetIndicatordirective.Theparametersofthereferencedindicatorfollowenclosedin
parenthesisjustlikewithbuildinindicators.
1

sma=Indicators.GetIndicator<SampleSMA>(Source,SmaPeriod)

Example:
1

[Indicator(IsOverlay=true,TimeZone=TimeZones.UTC)]

publicclassSampleReferenceSMA:Indicator

[Parameter("Source")]

publicDataSeriesSource{getset}

[Parameter(DefaultValue=14)]

publicintSmaPeriod{getset}

10 [Output("ReferencedSMAOutput")]
11 publicIndicatorDataSeriesrefSMA{getset}
12
13 privateSampleSMAsma
14
15 protectedoverridevoidInitialize()
16 {
17 sma=Indicators.GetIndicator<SampleSMA>(Source,SmaPeriod)
18 }
19
20 publicoverridevoidCalculate(intindex)
21 {
22 refSMA[index]=sma.Result[index]
23 }
24 }

OscillatorsandtheLevelsAttribute
Indicatorsthatoscillatearoundaconstantvaluebelongtothecategoryofoscillators.Whencreating
oscillatorsitisusefulltodrawahorizontalorlevellineatthatconstantvaluearoundwhichtheindicator
oscillates.Inmanycasesthatvalueiszero.
Themomentumoscillatortypicallyoscillatesaround100,sowewilladdalevellineatthatvalueusingthe
Levelsattribute.
?
1

namespacecAlgo.Indicators

[Levels(100)]

[Indicator("MomentumOscillator")]

publicclassMomentumOscillator:Indicator

[Parameter]

publicDataSeriesSource{getset}

10 [Parameter(DefaultValue=14,MinValue=1)]
11 publicintPeriods{getset}
12
13 [Output("Main",Color=Colors.Green)]
14 publicIndicatorDataSeriesResult{getset}
15
16 publicoverridevoidCalculate(intindex)
17 {
18 Result[index]=100*Source[index]/Source[index
19 Periods]
20 }
21 }
}
Levelscanonlybeusedwhentheindicatorisnotoverlayedonthechart.Thatis,thepropertyIsOverlayis
notsettotrueintheIndicatorattributelikethis:[Indicator("MyOscillator",IsOverlay=true)]Thiswillnot
work.IsOverlayisfalsebydefaultsoifitisomittedlikeinthefollowingexampletheindicatorwillbe
displayedbelowthechartandtheLevelswillbedisplayedproperly.
Ifmultiplelinesarenecessary,thenaddacommaseparatedlistofthevalueswithintheparenthesis.The
followingaresomeexamples:
?
1

[Levels(0,50,100)]

[Levels(50.5,50.75)]

[Levels(0.001,0.002)]

IsLastBarandIsRealTime
Incertaincaseswemayneedanindicatorthatrequirestobecalculatedatthelastbar.Then,theIsLastBar
propertycanbechecked,todetermineifasthenamesuggests,theindexparameteroftheCalculate
method,isthatofthelastbar.

ThefollowingindicatordisplaysthelastopentimeinNYandTokyowhiletheindicatorisbasedonUTC
time.
?
1

[Indicator(IsOverlay=true,TimeZone=TimeZones.UTC)]

publicclassTimeInDifferentParts:Indicator

publicoverridevoidCalculate(intindex)

if(IsRealTime)

DisplayTime(index)

10 protectedvoidDisplayTime(intindex)
11 {
12 DateTimenyDateTime=
13 MarketSeries.OpenTime[index].AddHours(5)
14 DateTimetokyoDateTime=
15 MarketSeries.OpenTime[index].AddHours(7)
16

17 stringnyTime=nyDateTime.ToShortTimeString()
18 stringtokyoTime=tokyoDateTime.ToShortTimeString()
19
20 ChartObjects.DrawText("Title","LastBarOpenTime",
21 StaticPosition.TopLeft,Colors.Lime)
22 ChartObjects.DrawText("NY","
23 NY"+nyTime,
24 StaticPosition.TopLeft,Colors.Lime)
25 ChartObjects.DrawText("Tokyo","
26
27 Tokyo"+tokyoTime,
28 StaticPosition.TopLeft,Colors.Lime)
}
}

Combiningtwoormoreindicatorsinone
Incasewewanttohavemanyindicatorsdisplayedonthesamepanelthatarenotoverlayedonthechart
wemaycombinetheminonecustomindicator.
Example1Aroon,RSIandDirectionalMovementSystem
ThefollowingindicatorcombinestheAroon,RSIandDirectionalMovementSysteminone.
?
1

usingcAlgo.API

usingcAlgo.API.Indicators

namespacecAlgo.Indicators

[Indicator(IsOverlay=false,TimeZone=TimeZones.UTC,

ScalePrecision=5)]

publicclassAroon_RSI_DMS:Indicator

10 privateAroonaroon
11 privateRelativeStrengthIndexrsi
12 privateDirectionalMovementSystemdms
13
14 [Parameter]
15 publicDataSeriesSource{getset}
16
17 [Parameter(DefaultValue=14)]
18 publicintPeriods{getset}
19

20
21 [Output("AroonUp",Color=Colors.LightSkyBlue)]
22 publicIndicatorDataSeriesAroonUp{getset}
23
24 [Output("AroonDown",Color=Colors.Red)]
25 publicIndicatorDataSeriesAroonDn{getset}
26
27 [Output("Rsi",Color=Colors.Green)]
28 publicIndicatorDataSeriesRsi{getset}
29

30 [Output("DIPlus",Color=Colors.DarkGreen)]
31 publicIndicatorDataSeriesDmsDIPlus{getset}
32
33 [Output("DIMinus",Color=Colors.DarkRed)]
34 publicIndicatorDataSeriesDmsDIMinus{getset}
35
36 [Output("ADX",Color=Colors.Blue)]
37 publicIndicatorDataSeriesDmsADX{getset}
38
39
40 protectedoverridevoidInitialize()
41 {
42 //Initializeandcreatenestedindicators
43 aroon=Indicators.Aroon(Periods)
44 rsi=Indicators.RelativeStrengthIndex(Source,Periods)
45 dms=Indicators.DirectionalMovementSystem(Periods)
46 }
47
48
49 publicoverridevoidCalculate(intindex)
50 {
51 AroonUp[index]=aroon.Up[index]
52 AroonDn[index]=aroon.Down[index]
53
54 Rsi[index]=rsi.Result[index]
55
56 DmsADX[index]=dms.ADX[index]
57 DmsDIMinus[index]=dms.DIMinus[index]
58 DmsDIPlus[index]=dms.DIPlus[index]
59
60 }
61
62 }
}

Multipletimeframes
Example1Usingmultipletimeframes
Thefollowingexampledisplaysamovingaverageondifferenttimeframes.
?
1

usingcAlgo.API

usingcAlgo.API.Internals

usingcAlgo.API.Indicators

namespacecAlgo.Indicators

[Indicator(IsOverlay=true,TimeZone=TimeZones.UTC)]

publicclassMultiTF_MA:Indicator

10 [Parameter(DefaultValue=50)]
11 publicintPeriod{getset}
12
13 [Output("MA",Color=Colors.Yellow)]
14 publicIndicatorDataSeriesMA{getset}
15
16 [Output("MA5",Color=Colors.Orange)]
17 publicIndicatorDataSeriesMA5{getset}
18
19 [Output("MA10",Color=Colors.Red)]
20 publicIndicatorDataSeriesMA10{getset}
21
22 privateMarketSeriesseries5
23 privateMarketSeriesseries10
24
25 privateMovingAveragema
26 privateMovingAveragema5
27 privateMovingAveragema10
28
29 protectedoverridevoidInitialize()
30 {
31 series5=MarketData.GetSeries(TimeFrame.Minute5)
32 series10=MarketData.GetSeries(TimeFrame.Minute10)

33
34 ma=Indicators.MovingAverage(
35 MarketSeries.Close,Period,
36 MovingAverageType.Triangular)
37 ma5=Indicators.MovingAverage(
38 series5.Close,Period,
39 MovingAverageType.Triangular)
40 ma10=Indicators.MovingAverage(
41 series10.Close,Period,
42 MovingAverageType.Triangular)
43 }
44
45 publicoverridevoidCalculate(intindex)
46 {
47 MA[index]=ma.Result[index]
48
49 varindex5=series5.OpenTime.GetIndexByTime(
50 MarketSeries.OpenTime[index])
51 if(index5!=1)
52 MA5[index]=ma5.Result[index5]
53
54 varindex10=series10.OpenTime.GetIndexByTime(
55 MarketSeries.OpenTime[index])
56
57 if(index10!=1)
58 MA10[index]=ma10.Result[index10]
}

}
}
Example2Usingmultipletimeframesandsymbols
?
1

usingSystem

usingcAlgo.API

usingcAlgo.API.Indicators

usingcAlgo.API.Internals

namespacecAlgo.Indicators

[Indicator(IsOverlay=true,TimeZone=TimeZones.UTC)]

publicclassMultiSymbolMA:Indicator

10 {
11 privateMovingAveragema1,ma2,ma3
12 privateMarketSeriesseries2,series3
13 privateSymbolsymbol2,symbol3
14
15 [Parameter(DefaultValue="EURCHF")]
16 publicstringSymbol2{getset}
17
18 [Parameter(DefaultValue="EURCAD")]
19 publicstringSymbol3{getset}
20
21 [Parameter(DefaultValue=14)]
22 publicintPeriod{getset}
23
24 [Parameter(DefaultValue=MovingAverageType.Simple)]
25 publicMovingAverageTypeMaType{getset}
26
27 [Output("MASymbol1",Color=Colors.Magenta)]
28 publicIndicatorDataSeriesResult1{getset}
29
30 [Output("MASymbol2",Color=Colors.Magenta)]
31 publicIndicatorDataSeriesResult2{getset}
32
33 [Output("MASymbol3",Color=Colors.Magenta)]
34 publicIndicatorDataSeriesResult3{getset}
35
36 protectedoverridevoidInitialize()
37 {

38 symbol2=MarketData.GetSymbol(Symbol2)
39 symbol3=MarketData.GetSymbol(Symbol3)
40
41 series2=MarketData.GetSeries(symbol2,TimeFrame)
42 series3=MarketData.GetSeries(symbol3,TimeFrame)
43
44 ma1=Indicators.MovingAverage(MarketSeries.Close,Period,
45 MaType)
46

47 ma2=Indicators.MovingAverage(series2.Close,Period,
48 MaType)
49 ma3=Indicators.MovingAverage(series3.Close,Period,
50 MaType)
51 }
52
53 publicoverridevoidCalculate(intindex)
54 {
55 ShowOutput(Symbol,Result1,ma1,MarketSeries,index)
56 ShowOutput(symbol2,Result2,ma2,series2,index)
57 ShowOutput(symbol3,Result3,ma3,series3,index)
58 }
59
60 privatevoidShowOutput(Symbolsymbol,IndicatorDataSeries
61 result,
62 MovingAveragemovingAverage,MarketSeriesseries,intindex)
63 {
64 varindex2=
65 series.OpenTime.GetIndexByTime(MarketSeries.OpenTime[index])
66 result[index]=movingAverage.Result[index2]
67
68 stringtext=string.Format("{0}{1}",symbol.Code,
Math.Round(result[index],symbol.Digits))
ChartObjects.DrawText(symbol.Code,text,index,
result[index],
VerticalAlignment.Top,HorizontalAlignment.Right,
Colors.Yellow)
}
}
}

Potrebbero piacerti anche