Hallo Paul,
Zo ver was je al...
value function MoneyFlowIndex (value xNumberOfBars=10,value xOverbought=80,value xOversold=20) begin
?
{---- variables ----}
value xTypical[],xMF,xPositive=0,xNegative=0,xMR;
xTypical := (High+Low+Close)/3;
xMF := xTypical*Volume;
xPositive := xPositive+(xTypical>xTypical[1])*xMF;
xNegative := xNegative+(xTypical
Nu moet ik een formule hebben voor de positieve Moneyflow, dit is de som van xPositive over een xNumberOfBars. Hetzelfde voor de negatieve Moneyflow. Om te beginnen moet je de oude waardes van xPositieve hebben om ze bij elkaar op te kunnen tellen. Zoals je het nu geprogrammeerd hebt, heb je alleen maar de waarde van vandaag en kun je dus niks meer.
Om alle waardes uit het verleden te bewaren, moet je van xPositive en xNegative een Series-variabele maken. Een dergelijke variabele heeft een 'geheugen' en je kunt dus refereren naar de waarde van gisteren e.d., net als bij de Close.
Dus:
value xTypical[],xMF,xPositive[]=0,xNegative[]=0,xMR;
Als je de waarden uit het verleden hebt, dan zijn er tal van manieren om ze te totaliseren. Ik noem er een paar...
methode 1: gewoon optellen met behulp van een for-loop...
?{---- bereken som door herhaald optellen ---}
?value xI, xSumPositive, xSumNegative;
?xSumPositive := 0;
?xSumNegative := 0;
?for xI := 0 to xNumberOfBars-1 do begin
? ?xSumPositive := xSumPositive+xPositive[xI];
? ?xSumNegative := xSumNegative+xNegative[xI];
? ?end;
Methode 2: Als je over hele lange perioden moet tellen, bijv. voor een 200-daags totaal, dan is het zonde om elke dag weer 200 waarden bij elkaar op te tellen. Je telt dan eenmalig alle 200 waarden op en vervolgens pas je die waarde elke volgende keer aan door de oudste waarde er van af te trekken en de nieuwe waarde er bij op te tellen. Dat is 100x sneller...
?{---- eerste keer gewoon optellen ---}
?value xI, xSumPositive=0, xSumNegative;
?if xSumPositive=0 or xSumPositive=_NA then begin
? ?xSumPositive := 0;
? ?xSumNegative := 0;
? ?for xI := 0 to xNumberOfBars-1 do begin
? ? ?xSumPositive := xSumPositive+xPositive[xI];
? ? ?xSumNegative := xSumNegative+xNegative[xI];
? ? ?end;
? end
? {---- daarna alleen nieuwe waarde erbij en oude eraf ---}
?else begin
? ?xSumPositive := xSumPositive+xPositive-xPositive[xNumberOfBars-1];
? ?xSumNegative := xSumNegative+xNegative-xNegative[xNumberOfBars-1];
? ?end;
? ?
Misschien is het je opgevallen dat ik niet test of de waarde op 0 was, maar ook of de waarde _NA is. De waarde _NA treedt namelijk op als een waarde niet berekend kan worden. Dus als je 200 bars bij elkaar wilt optellen en er pas 100 bars, dan krijg je als resultaat _NA. Pas bij de 200ste bar kan de optelling lukken en krijg je een waarde. ?
Methode 3: Truukje met Average. Als je de functie Average aanroept om het gemiddelde van N waarden te berekenen, dan zal deze functie is de N waarden bij elkaar optellen, en vervolgens delen door N. Dus door weer te vermenigvuldigen met N krijg je de som van de N waarden...
?xSumPositive := Average(xPositive,xNumberOfBars)*xNumberOfBars;
Methode 4: Maak gebruik van 'ongedocumenteerde' functies. Bij vestics worden tal van kant en klare indicatoren meegeleverd. Die indicatoren gebruiken vaak eigen handige functies. Niemand verbied je om die functies op te zoeken en te gebruiken. Je vindt alle functies in de designer links op het tabblad "Bron" onder het kopje "Alle modules".
Elke functie is voorzien van een korte omschrijving. Door de functie vervolgens te dubbelklikken wordt de bronkode getoond en kun je zien welke argumenten verwacht worden.
Zo vond ik dus de functie "Summation" die precies doet wat jij zoekt...
?xSumPositive := Summation(xPositive,xNumberOfBars);
Daarna ?moet een formule volgen voor xMR (Money Ratio), ?dit is de positieve Moneyflow/negatieve Moneyflow.(bv xMR=xPosMoneyFlow/xNegMoneyFlow) Als je eenmaal de waarden xSumPositive en xSumNegative hebt, dan is het delen straight forward...
?xMR := xSumPositive/xSumNegative;
Daarna moet volgen de
MoneyFlowIndex := 100-(100/(1+xMR));
Plot1(MoneyFlowIndex,'Money Flow Index'+NumToStr (xNumberOfBars));
end; ?Zo te zien heb je de rest al.
Nog een tip: ?Als je in het lijstje van de 'ongedocumenteerde' functies kijkt (zie methode 4 boven), dan zul je zien dat daar ook een functie is met de naam "MoneyFlow". Zou dat soms...? Hoewel, deze functie werkt niet met het gemiddelde, dus het is niet dezelfde als jij zoekt.
En nog een tip:Ook als je niets bij de functies vindt, hoef je nog niet pers? aan het programmeren te slaan. Ga naar
www.google.nl en tik wat zoekwoorden in, bijv. +money.flow +easylanguage en je krijgt meteen 57 hits.
Op die manier kun je bijna elke indicator wel kant en klaar downloaden van het internet.