Hi All,
I'm integrating PECL trader PHP https://pecl.php.net/package/trader
I'm using a simple indicator MFI.
http://php.net/manual/en/function.trader-gmfi.php
For input of test data I use the example given on;
https://www.investopedia.com/terms/m/mfi.asp
---------------------------
Money Flow Index Calculation Example While a 14-day period is typically
used in calculating the MFI, for simplicity's sake, below is a four-day
example. Assume a stock's high, low and closing prices for four days are
listed along with volume as:
Day one: high = $24.60, low = $24.20, closing = $24.28, volume = 18,000
shares
Day two: high = $24.48, low = $24.24, closing = $24.33, volume = 7,200
shares
Day three: high = $24.56, low = $23.43, closing = $24.44, volume = 12,000
shares
Day four: high = $25.16, low = $24.25, closing = $25.05, volume = 20,000
shares
Using the above formula, the typical prices are:
Day one = $24.36
Day two = $24.35
Day three = $24.14
Day four = $24.82
Raw money flow for each day is:
Day one = $24.36 x 18,000 = 438,487
Day two = $24.35 x 7,200 = 175,323
Day three = $24.56 x 12,000 = 289,736
Day four = $25.16 x 20,000 = 496,400
Money flows are:
Positive money flow = 438,487 + 496,400 = 934,887
Negative money flow = 175,323 + 289,736 = 465,059
Money flow ratio = 934,887 / 465,059 = 2.01
Money flow index = 100 - 100 / (1 + 2.01) = 100 - 33.22 = 66.78
---------------------------
The php code I use.
// Get the values from the storage
$data = $db->get_latest_HLCV( $indicator['pair'],
$indicator['exchange'],
$indicator['interval'],
$indicator['period']
);
// Parse the storage data to data which is good for trader mfi
foreach ($data as $key => $value) {
$datahigh[] = floatval($value[1]); // 1 because timestam is on
pos 0.
$datalow[] = floatval($value[2]);
$dataclose[] = floatval($value[3]);
$datavolume[] = floatval($value[4]);
}
// Convert it all to an CSV array for debuging purpopes only
$tmpdata = $db->convert_array_to_scv($data);
var_dump($tmpdata);
// Show the content of the input, output
var_dump($datahigh);
var_dump($datalow);
var_dump($dataclose);
var_dump($datavolume);
$mfi = trader_mfi($datahigh, $datalow,$dataclose,$datavolume);
var_dump($mfi);
Which give me the following output
All data together (for easy porpose only)
string(139)
1529735640,24.60,24.20,24.28,18000
1529735700,24.48,24.24,24.33,7200
1529735760,24.56,23.43,24.44,12000
1529735820,25.15,24.25,25.05,20000
Array Data High
array(4) {
[0]=>
float(24.6)
[1]=>
float(24.48)
[2]=>
float(24.56)
[3]=>
float(25.15)
}
Array data Low
array(4) {
[0]=>
float(24.2)
[1]=>
float(24.24)
[2]=>
float(23.43)
[3]=>
float(24.25)
}
array data close
array(4) {
[0]=>
float(24.28)
[1]=>
float(24.33)
[2]=>
float(24.44)
[3]=>
float(25.05)
}
Array data volume
array(4) {
[0]=>
float(18000)
[1]=>
float(7200)
[2]=>
float(12000)
[3]=>
float(20000)
}
The the result of the MFI according to trader_MFI is
array(2) {
[2]=>
float(0)
[3]=>
float(63.146)
}
But according to investopedia this should be 66.78.
Q1, Is there a explanation why there are differences?
Q2 If I add the period as argument to the trader_mfi function with value 4
$mfi = trader_mfi($datahigh, $datalow,$dataclose,$datavolume,4);
the mfi cannot be calculated. Does somebody knows why?
Regards,