How To Compute Chaikin Money Flow (CMF) in Kotlin?

by erin_nader , in category: Technical Analysis , a month ago

How To Compute Chaikin Money Flow (CMF) in Kotlin?

Facebook Twitter LinkedIn Whatsapp

1 answer

by earlene_cummings , a month ago

@erin_nader 

To compute Chaikin Money Flow (CMF) in Kotlin, you can follow these steps:

  1. Define variables for high, low, close prices, and volume.
  2. Calculate the Money Flow Multiplier (MFM) by first calculating the Typical Price (TP) for each period: (High + Low + Close) / 3
  3. Calculate the Money Flow Volume (MFV): TP * Volume
  4. Calculate the Positive Money Flow (PMF) and Negative Money Flow (NMF) for each period: PMF = Sum of MFV for periods with higher closing prices than the previous period NMF = Sum of MFV for periods with lower closing prices than the previous period
  5. Calculate the Money Flow Ratio (MFR): PMF / NMF
  6. Calculate the CMF by taking a 20-period moving average of the MFR.


Here's an example code snippet in Kotlin to compute the Chaikin Money Flow (CMF):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
fun calculateCMF(highPrices: List<Double>, lowPrices: List<Double>, closePrices: List<Double>, volumes: List<Double>): List<Double> {
    val mfMultiplier = mutableListOf<Double>()
    val mfVolume = mutableListOf<Double>()
    val positiveMF = mutableListOf<Double>()
    val negativeMF = mutableListOf<Double>()
    val mfRatio = mutableListOf<Double>()
    val cmf = mutableListOf<Double>()

    for (i in 0 until closePrices.size) {
        val typicalPrice = (highPrices[i] + lowPrices[i] + closePrices[i]) / 3
        mfMultiplier.add(typicalPrice)

        val moneyFlowVolume = typicalPrice * volumes[i]
        mfVolume.add(moneyFlowVolume)

        if (i > 0) {
            if (closePrices[i] > closePrices[i - 1]) {
                positiveMF.add(moneyFlowVolume)
            } else if (closePrices[i] < closePrices[i - 1]) {
                negativeMF.add(moneyFlowVolume)
            }
        }

        if (positiveMF.size >= 20 && negativeMF.size >= 20) {
            val positiveSum = positiveMF.subList(positiveMF.size - 20, positiveMF.size).sum()
            val negativeSum = negativeMF.subList(negativeMF.size - 20, negativeMF.size).sum()

            val moneyFlowRatio = positiveSum / negativeSum
            mfRatio.add(moneyFlowRatio)

            // Calculate CMF as a 20-period moving average of MFR
            if (mfRatio.size >= 20) {
                val cmfValue = mfRatio.subList(mfRatio.size - 20, mfRatio.size).average()
                cmf.add(cmfValue)
            } else {
                cmf.add(0.0)
            }
        }
    }
    return cmf
}


You can then call this function with the high, low, close price lists and volume list to get the corresponding CMF values. Remember to adjust the input data according to your specific requirements.