void drawMACD(xGraphics g, int y, int h) { calcMACD(); if (mCandleCnt < 5) { return; } // translate to XYs //====================== float lo = 1000; float hi = -1000; int i; float[] his = pMACDHistogram; for (i = 0; i < mCandleCnt; i++) { his[i] = pMACD[i] - pMACDSignal9[i]; } //=========================== float[] macd = pMACD; float[] signal = pMACDSignal9; his = pMACDHistogram; int cnt = mCandleCnt; // get the highest int w = getW(); float rx = (float)w / cnt; // lo/hi for (i = 0; i < cnt; i++) { if (macd[i] > hi) { hi = macd[i]; } if (macd[i] < lo) { lo = macd[i]; } } for (i = 0; i < cnt; i++) { if (signal[i] > hi) { hi = signal[i]; } if (signal[i] < lo) { lo = signal[i]; } } if (hi < 0) { hi = 0; } if (lo < 0) { lo = -lo; } float double_hi = Utils.ABS_FLOAT(hi) > Utils.ABS_FLOAT(lo) ? hi : lo;// hi + lo; double_hi = 2 * Utils.ABS_FLOAT(double_hi); int minHistoH = 9; int signalDrawH = h - 2 * minHistoH; int OY = y + h / 2; float ry = 0; if (double_hi != 0) { OY = y + h / 2; ry = (float)signalDrawH / double_hi; } // make sure all macd is now > 0 && < 100 for (i = 0; i < cnt; i++) { mLineMACD[2 * i + 1] = (short)(OY - macd[i] * ry); mLineSignal9[2 * i + 1] = (short)(OY - signal[i] * ry); } // cnt == CHART_W int max_time = getMaxTimeOfChart(); int timeb = Utils.EXTRACT_HOUR(mTimes[0]) * 3600 + Utils.EXTRACT_MINUTE(mTimes[0]) * 60 + Utils.EXTRACT_SECOND(mTimes[0]); rx = (float)getW() / max_time; for (i = 0; i < cnt; i++) { int time = timeToSeconds(mTimes[i]); time -= timeb; mLineMACD[2 * i] = (short)(time * rx); mLineSignal9[2 * i] = mLineMACD[2 * i]; } // histogram hi = 0; for (i = 0; i < cnt; i++) { if (Utils.ABS_FLOAT(his[i]) > hi) { hi = Utils.ABS_FLOAT(his[i]); } } // int deltaY = 0;//deltaLoHi*mDrawingH/double_hi; double_hi = 2 * hi; // double_hi == 100 pixels int halfH = h / 2; float hry = 0; if (hi != 0) { hry = (float)halfH / hi;//double_hi; } i = 0; int drawW = 0; for (i = 0; i < cnt; i++) { if (double_hi != 0) { mHistogramH[i] = (short)(-his[i] * ry); } else { mHistogramH[i] = 0; } if (mHistogramH[i] == 0) { if (his[i] > 0) { mHistogramH[i] = -1; } else { mHistogramH[i] = 1; } } int time = timeToSeconds(mTimes[i]); time -= timeb; mHistogramXY[2 * i] = (short)(time * rx); drawW = mHistogramXY[2 * i]; mHistogramXY[2 * i + 1] = (short)OY; } // =========================================================== // ===== now draw ===== // =========================================================== g.setColor(C.COLOR_FADE_YELLOW); g.drawLine(0, OY, getW() - 20, OY); g.setColor(C.COLOR_FADE_YELLOW0); g.drawString(mContext.getFontSmall(), "0", getW() - 20, OY, xGraphics.VCENTER); int hisW = (int)(((float)drawW / mCandleCnt) * 2.0f / 3); int hisW2 = hisW / 2; if (hisW <= 0) { hisW = 1; } //g.setColor(0x6000ff00); for (i = 0; i < mCandleCnt; i++) { //g.fillRect(mHistogramXY[2 * i], mHistogramXY[2 * i + 1], hisW, mHistogramH[i]); if (mHistogramH[i] < 0) { g.setColor(0xff70ee00); } else { g.setColor(0xffc03000); } //g.drawRect(mHistogramXY[2 * i] - hisW2, mHistogramXY[2 * i + 1], hisW, mHistogramH[i]); g.drawRect(mHistogramXY[2 * i], mHistogramXY[2 * i + 1], 1, mHistogramH[i]); //g.drawVerticalLine(mHistogramXY[2 * i], mHistogramXY[2 * i + 1] + hisW / 2, mHistogramH[i]); } g.setColor(C.COLOR_BLUE_LIGHT); g.drawLines(mLineMACD, mCandleCnt, 2.0f); g.setColor(0xffff0000); g.drawLines(mLineSignal9, mCandleCnt, 1.0f); }
void recalcMACD() { float[] macd; float[] signal; float[] his; int i; int cnt; Share s = getShare(); s.calcMACD(); Share share = s; //====================== his = share.pMACDHistogram; for (i = 0; i < s.getCandleCount(); i++) { his[i] = share.pMACD[i] - share.pMACDSignal9[i]; } //=========================== macd = share.pMACD; signal = share.pMACDSignal9; his = share.pMACDHistogram; cnt = mChartLineLength; mLineMACD = allocMem(mLineMACD, cnt * 2); mLineSignal9 = allocMem(mLineSignal9, cnt * 2); mHistogramXY = allocMem(mHistogramXY, cnt * 2); mHistogramH = allocMem(mHistogramH, cnt * 1); // get the highest float rx = (float)getDrawingW() / cnt; // lo/hi for (i = 0; i < cnt; i++) { if (macd[i + s.mBeginIdx] > hi) { hi = macd[i + s.mBeginIdx]; } if (macd[i + s.mBeginIdx] < lo) { lo = macd[i + s.mBeginIdx]; } } for (i = 0; i < cnt; i++) { if (signal[i + s.mBeginIdx] > hi) { hi = signal[i + s.mBeginIdx]; } if (signal[i + s.mBeginIdx] < lo) { lo = signal[i + s.mBeginIdx]; } } if (hi < 0) { hi = 0; } if (lo < 0) { lo = -lo; } float double_hi = Utils.ABS_FLOAT(hi) > Utils.ABS_FLOAT(lo) ? hi : lo;// hi + lo; double_hi = 2 * Utils.ABS_FLOAT(double_hi); int minHistoH = 9; int signalDrawH = getDrawingH() - 2 * minHistoH; int OY = getH() / 2;// 0 + CHART_BORDER_SPACING_Y + minHistoH; //float ry = 0; if (double_hi != 0) { OY = getH() / 2;// (int)((float)hi * signalDrawH / double_hi); ry = (float)signalDrawH / double_hi; } mOY = OY; // double_hi == 100 pixels // make sure all macd is now > 0 && < 100 float tmp_macd; float tmp_signal; for (i = 0; i < cnt; i++) { tmp_macd = macd[i + s.mBeginIdx]; // + hi; tmp_signal = signal[i + s.mBeginIdx]; // + hi; //if (hi != 0) { mLineMACD[2 * i + 1] = (short)(OY - tmp_macd * ry); mLineSignal9[2 * i + 1] = (short)(OY - tmp_signal * ry); } } // cnt == CHART_W for (i = 0; i < cnt; i++) { mLineMACD[2 * i] = (short)(0 + CHART_BORDER_SPACING_X + i * rx + getStartX()); mLineSignal9[2 * i] = mLineMACD[2 * i]; } // histogram hi = 0; for (i = 0; i < cnt; i++) { if (Utils.ABS_FLOAT(his[i + s.mBeginIdx]) > hi) { hi = Utils.ABS_FLOAT(his[i + s.mBeginIdx]); } } // int deltaY = 0;//deltaLoHi*mDrawingH/double_hi; double_hi = 2 * hi; // double_hi == 100 pixels int halfH = getDrawingH() / 2; float hry = 0; if (hi != 0) { hry = (float)halfH / hi;//double_hi; } for (i = 0; i < cnt; i++) { if (double_hi != 0) { mHistogramH[i] = (short)(-his[i + s.mBeginIdx] * ry); } else { mHistogramH[i] = 0; } if (mHistogramH[i] == 0) { if (his[i + s.mBeginIdx] > 0) { mHistogramH[i] = -1; } else { mHistogramH[i] = 1; } } mHistogramXY[2 * i] = (short)(0 + CHART_BORDER_SPACING_X + i * rx + getStartX()); mHistogramXY[2 * i + 1] = (short)OY;//mY + CHART_BORDER_SPACING_Y + halfH - deltaY; } }