Money Flow Index - Hulp

Vragen en suggesties over handelssystemen en indicatoren

Moderator: Perry

Money Flow Index - Hulp

Berichtdoor Paul M » di 04 feb 2003, 13:29

Ik probeer een indicator te maken van het onderstaande verhaal, in het middenstuk kom ik voor een probleem te staan.


value function MoneyFlowIndex (value xNumberOfBars=10,value xOverbought=80,value xOversold=20) begin
?
?{---- variables ----}
?value xTypical[],xMF,xPositive=0,xNegative=0,xMR;
?{---calculatie variabelen---}
?xTypical := (High+Low+Close)/3;
?xMF := xTypical*Volume;
?xPositive := xPositive+(xTypical>xTypical[1])*xMF;
?xNegative := xNegative+(xTypical<xTypical[1])*xMF;

Nu moet ik een formule hebben voor de positieve Moneyflow, dit is de som van xPositive over een xNumberOfBars. Hetzelfde voor de negatieve Moneyflow.
Daarna ?moet een formule volgen voor xMR (Money Ratio), ?dit is de positieve Moneyflow/negatieve Moneyflow.(bv xMR=xPosMoneyFlow/xNegMoneyFlow)
Daarna moet volgen de
?MoneyFlowIndex := 100-(100/(1+xMR));
?Plot1(MoneyFlowIndex,'Money Flow Index'+NumToStr?(xNumberOfBars));
?end;
Wie kan mij voort helpen.
Alvast bedankt.
Groetjes Paul
Paul M
 
Berichten: 263
Geregistreerd op: vr 13 dec 2002, 23:21

Money Flow Index

Berichtdoor Pierre » wo 05 feb 2003, 17:13

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.
Pierre
 
Berichten: 412
Geregistreerd op: di 02 okt 2001, 9:46
Woonplaats: Leerdam

Money Flow Index

Berichtdoor Paul M » vr 07 feb 2003, 12:57

Hoi Pierre,

Bedankt voor de vele tips, erg leerzaam.
Ik heb methode 1 t/m 4 toegepast geen van allen met enig positief resultaat. De Debugger geeft bij elke methode, bij xSumPositive en xSumNegative een waarde NA. Ergens doet het niet wat het moet doen, maar ik weet nog niet waar? Misschien nog suggesties?

Groetjes Paul
Paul M
 
Berichten: 263
Geregistreerd op: vr 13 dec 2002, 23:21

Money Flow Index

Berichtdoor Pierre » vr 07 feb 2003, 13:26

Hallo Paul,

Heb je wel de eerste aanpassing gemaakt die ik noemde, namelijk om xPositive en xNegative van 'simpele' variabelen te veranderen naar series-variabelen door er [] achter te zetten?
Dus: value xTypical[],xMF,xPositive[]=0,xNegative[]=0,xMR;
Pierre
 
Berichten: 412
Geregistreerd op: di 02 okt 2001, 9:46
Woonplaats: Leerdam

Money Flow Index

Berichtdoor Paul M » vr 07 feb 2003, 22:11

Hallo Pierre,

Dat heb ik gedaan.
Bijvoorbeeld Methode 1:
value function MoneyFlowIndex (value xNumberOfBars=10,value xOverbought=80,value xOversold=20) begin

?
?{---- variables ----}
?value xTypical[],xMF,xPositive[]=0,xNegative[]=0,xMR,xI, xSumPositive, xSumNegative;
?xTypical := (High+Low+Close)/3;
?xMF := xTypical*Volume;
?xPositive := xPositive+(xTypical>xTypical[1])*xMF;
?xNegative := xNegative(xTypical<xTypical[1])*xMF;


{---- bereken som door herhaald optellen ---}
xSumPositive := 0;
xSumNegative := 0;
for xI := 0 to xNumberOfBars-1 do begin
? xSumPositive := xSumPositive+xPositive[xI];
? xSumNegative := xSumNegative+xNegative[xI];
? end;

?{---- calculate Money Ratio ----}
?xMR := xSumPositive/xSumNegative;

?{---- calculate Money Flow Index ----}
?MoneyFlowIndex := 100-(100/(1+xMR));
?{---Plotting---}
?Plot1(MoneyFlowIndex,'Money Flow Index'+NumToStr (xNumberOfBars));
?end; ?
? ?end;
Met bovenstaand resultaat.

Groetjes Paul


(Edited by Paul M at 10:18 pm op 7,feb. 2003)


(Edited by Paul M at 10:19 pm op 7,feb. 2003)


(Edited by Paul M at 10:20 pm op 7,feb. 2003)


(Edited by Paul M at 10:21 pm op 7,feb. 2003)
Paul M
 
Berichten: 263
Geregistreerd op: vr 13 dec 2002, 23:21

Money Flow Index

Berichtdoor Paul M » vr 07 feb 2003, 22:24

Regel wordt niet goed weergegeven

xNegative := xNegative(xTypical<xTypical[1])*xMF;

Weer niet, moet ?hetzelfde zijn als xPositive maar dan kleiner dan.
Groetjes Paul

(Edited by Paul M at 10:29 pm op 7,feb. 2003)
Paul M
 
Berichten: 263
Geregistreerd op: vr 13 dec 2002, 23:21

Money Flow Index

Berichtdoor Pierre » zo 09 feb 2003, 11:01

Hallo Paul,

Allereerst het verdwijnen van de tekst achter het kleiner dan teken. Dat is helaas het gevolg van het feit dat een kleiner dan teken in internetpagina's (HTML) gebruikt wordt om allerlei opmaakcodes aan te geven. Het forum filtert alle HTML weg, dus vandaar dat stukken tekst wegvallen.

Je zou op de plaats van een kleiner dan een ander teken kunnen plaatsen, bijv. # en dan onderaan het bericht vermelden dat op de plaats van het hekje een kleiner dan moet staan.

Nu wat betreft de indicator...
Omdat je de xPositive waarde van de afgelopen N dagen bij elkaar op moet tellen, hebben we gezegd dat xPositive een series moest worden.

Dat heeft echter als gevolg dat xPositive voor elke dag een waarde heeft die je met een index kunt aangeven. Dus xPositive[0] is de waarde van vandaag, xPositive[1] is de waarde van gisteren, enz.

Als xPositive geen series-variabele is, dan is er maar ??n waarde, en dus gebruik je geen index.

In jouw functie staat ergens xPositive := xPositive+...enz. Eigenlijk wil je hier gebruik maken van de 'oude' waarde van xPositive om een nieuwe te berekenen. Om dat te doen moet je ook naar de 'oude' waarde refereren. Dus: xPositive := xPositive[1]+...

Hetzelfde geldt voor xNegative.

{--- bereken xPositive en xNegative---}
xTypical := (High+Low+Close)/3;
xMF := xTypical*Volume;
xPositive := xPositive[1]+(xTypical>xTypical[1])*xMF;
xNegative := xNegative[1]+(xTypical#xTypical[1])*xMF;
op de plaats van # moet een kleiner dan teken
Pierre
 
Berichten: 412
Geregistreerd op: di 02 okt 2001, 9:46
Woonplaats: Leerdam

Money Flow Index

Berichtdoor Paul M » zo 09 feb 2003, 22:46

Hallo Pierre,

Volgens mij is het gelukt, dankzij jouw hulp en een tijdie puzzelen.
Ik heb eerst een functie gemaakt:
value function vMoneyFlowIndex (value xNumberOfBars) begin

{---- variables ----}
?value xTypical[],xMF[],xPositive[],xNegative[],xI[], xSumPositive[], xSumNegative[],xChange[];
?xTypical := (High+Low+Close)/3;
?xMF := xTypical*Volume;
?xPositive:=xPositive*xMF;
?xNegative:=xNegative*xMF;

{---Kick-start calculatie---}
?if CurrentBar =1 or xSumPositive[1]=_NA or xSumNegative[1]=_NA then begin
?for xI := 0 to xNumberOfBars-1 do begin
?xChange:=xTypical[xI]-xTypical[xI+1];
?if xChange>0 then xPositive[xI]:=xChange else xPositive[xI]:=0;
?if xChange#0 then xNegative[xI]:=-xChange else xNegative[xI]:=0;
end;
?xSumPositive:=Average(xPositive,xNumberOfBars);
?xSumNegative:=Average(xNegative,xNumberOfBars); ?
end

{---Nieuwe calculatie---}
?else begin
?xChange:=xTypical-xTypical[1];
?if xChange>0 then xPositive[0]:=xChange else xPositive[0]:=0;
?if xChange#0 then xNegative[0]:=-xChange else xNegative[0]:=0;

{--- eerste keer gewoon optellen ---}
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;

{---- calculatie Money Flow Index----}
?if xSumNegative=0 and xSumPositive=0 then vMoneyFlowIndex := _NA
?else if xSumNegative=0 then vMoneyFlowIndex:=100
?else vMoneyFlowIndex:= 100-100/(xSumPositive/xSumNegative+1);
end;
end;
Daarna de indicator:
value function MoneyFlowIndex (value xNumberOfBars=10,value xOverbought=80,value xOversold=20) begin

value xMoneyFlowIndex;
{---Calculatie variabelen---}
xMoneyFlowIndex:= vMoneyFlowIndex(xNumberOfBars);
{---Plotting---}
Plot1(xMoneyFlowIndex,'Money Flow Index'+NumToStr(xNumberOfBars));
Plot2(xOverbought);
Plot3(xOversold);
end;

# vervangen door kleiner dan teken.
Pierre mijn dank.
Groetjes Paul


(Edited by Paul M at 10:48 pm op 9,feb. 2003)


(Edited by Paul M at 10:49 pm op 9,feb. 2003)
Paul M
 
Berichten: 263
Geregistreerd op: vr 13 dec 2002, 23:21


Keer terug naar Handelssystemen + Indicatoren

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 32 gasten

cron