K线图和分时图

2024-01-17 21:18
文章标签 线图 分时图

本文主要是介绍K线图和分时图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


代码仓库用~

package com.cxzapp.stamp.ui;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;import com.chengxuanzhang.lib.util.StringUtil;
import com.cxzapp.stamp.modules.user.UserModels;import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;/*** Created by softrice on 15/10/18.*/
public class OnTimeChartView extends View {/*** color*/int chartBgColor = 0xFF272727;//图标背景色int upTextColor = Color.RED;//上升时text的颜色int defaultTextColor = Color.WHITE;//默认字体颜色int downTextColor = Color.GREEN;//下降的时候text的颜色int bordColor = 0xFF333333;//图标边框颜色int charDivideLineColor = 0xFF333333;//图表分割线颜色int charBaseDivideLineColor = 0xFF432925;//开盘价分割线颜色int pathLineColor = 0xFFBFBFBF;//折线的颜色int hintLineColor = 0xFFFF423D;//点击时 提示线的颜色/*** size*/int viewHeight;//view 的高度int viewPadding = 10;//图表边距int textSize = 12;//字体大小 单位spint chartHeight;//图表高度int leftTextLenght;//左边数字的长度int rightTextLenght;//右边数字的长度int textHigh;//text高度int chartWidth;//图表的宽度//chart 的上下左右int top;int left;int right;int bottom;/*** paint*/Paint textPaint;Paint linePaint;/*** touch 部分*/float currentX;//当前点击的xfloat currentY;//当前点击的ylong downTime;//手指点击下的时间 毫秒int intervalTime = 300;//时间间隔 单位 毫秒 点击抬起时间小于该值触发点击事件TouchListener touchListener;/*** data*/List<UserModels.StampChart> stampChartList;double maxValue = 2999.01;double minValue = 1320.89;double openValue;List<String> xTitle;final int YValueNum = 3;//从开盘价开始 往上 和 往下 的刻度数目/*** time*/Calendar c = Calendar.getInstance();int startTime;int endTime;int afternoonTime;public OnTimeChartView(Context context) {super(context);init();}public OnTimeChartView(Context context, AttributeSet attrs) {super(context, attrs);init();}public OnTimeChartView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {setBackgroundColor(chartBgColor);//获取今天的涨跌图 早上9:30 晚上15:00c.set(Calendar.HOUR_OF_DAY, 9);c.set(Calendar.MINUTE, 30);c.set(Calendar.SECOND, 0);startTime = (int) (c.getTime().getTime() / 1000);c.set(Calendar.HOUR_OF_DAY, 15);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);endTime = (int) (c.getTime().getTime() / 1000);c.set(Calendar.HOUR_OF_DAY, 13);c.set(Calendar.MINUTE, 0);c.set(Calendar.SECOND, 0);afternoonTime = (int) (c.getTime().getTime() / 1000);textPaint = new Paint();linePaint = new Paint();textPaint.setAntiAlias(true);linePaint.setAntiAlias(true);textPaint.setTextSize(sp2px(textSize));leftTextLenght = (int) (textPaint.measureText("88888.88") + 0.5);rightTextLenght = (int) (textPaint.measureText("-10.00") + 0.5);textHigh = getTextHight(textPaint);chartHeight = 13 * textHigh;viewHeight = chartHeight + 2 * textHigh + 2 * viewPadding;xTitle = new ArrayList<>();xTitle.add("09:30");xTitle.add("10:30");xTitle.add("11:30/13:00");xTitle.add("14:00");xTitle.add("15:00");}private int getTextHight(Paint paint) {Paint.FontMetrics fontMetrics = paint.getFontMetrics();return (int) (fontMetrics.bottom - fontMetrics.top + 0.5f);}/*** 长度只能match* 高度只可wrap 和 match*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int specMode = MeasureSpec.getMode(heightMeasureSpec);setMeasuredDimension(widthMeasureSpec, viewHeight);chartWidth = getWidth() - 2 * viewPadding - leftTextLenght - rightTextLenght;top = textHigh + viewPadding;left = viewPadding + leftTextLenght;right = viewPadding + leftTextLenght + chartWidth;bottom = textHigh + viewPadding + chartHeight;}@Overrideprotected void onDraw(Canvas canvas) {//  super.onDraw(canvas);drawY(canvas);drawX(canvas);drawBorder(canvas);drawPathLine(canvas);drawHint(canvas);}private void drawHint(Canvas canvas) {if (currentX == -1 || currentY == -1 || stampChartList == null || stampChartList.size() == 0)return;if (!(currentX <= right && currentX >= left && currentY >= top && currentY <= bottom))return;DecimalFormat df = new DecimalFormat("0.00");linePaint.setStrokeWidth(1);linePaint.setColor(hintLineColor);textPaint.setColor(defaultTextColor);textPaint.setTextAlign(Paint.Align.CENTER);int position = getDataNum();if (position != -1) {UserModels.StampChart chart = stampChartList.get(position);canvas.drawLine(currentX, top, currentX, bottom, linePaint);int y = getPriceY(chart.CurPrice);canvas.drawLine(left, y, right, y, linePaint);canvas.drawText(StringUtil.formatDate(chart.update_time, "HH:mm"), currentX, viewHeight - viewPadding - textHigh, textPaint);if (chart.CurPrice >= openValue)textPaint.setColor(upTextColor);elsetextPaint.setColor(downTextColor);textPaint.setTextAlign(Paint.Align.LEFT);canvas.drawText(df.format(chart.CurPrice), viewPadding, y + getTextBottom(textPaint), textPaint);double valuePercent = (chart.CurPrice - openValue) / openValue * 100;canvas.drawText(df.format(valuePercent), getWidth() - viewPadding - rightTextLenght, y + getTextBottom(textPaint), textPaint);canvas.drawText(df.format(chart.CurPrice), viewPadding, y + getTextBottom(textPaint), textPaint);}}private int getDataNum() {for (int i = 0; i < stampChartList.size(); i++) {UserModels.StampChart chart = stampChartList.get(i);if (chart.CurPrice == 0) continue;if (Math.abs(getTimeX(chart.update_time) - currentX) <= 1) {return i;}}return -1;}private void drawPathLine(Canvas canvas) {if (stampChartList == null || stampChartList.size() == 0)return;linePaint.setStrokeWidth(1);linePaint.setColor(pathLineColor);linePaint.setAntiAlias(true);PointF oldF = new PointF(getTimeX(stampChartList.get(0).update_time), getPriceY((float) openValue));for (int i = 0; i < stampChartList.size(); i++) {UserModels.StampChart tmp = stampChartList.get(i);if (tmp.CurPrice < 0.1)continue;int x = (int) getTimeX(tmp.update_time);int y = (int) getPriceY(tmp.CurPrice);canvas.drawLine(oldF.x, oldF.y, x, y, linePaint);oldF.set(x, y);}}private int getPriceY(float curPrice) {return (int) ((maxValue - curPrice) * 1.0 / (maxValue - minValue) * chartHeight + viewPadding + textHigh);}private int getTimeX(int update_time) {if (update_time > afternoonTime) {return (int) ((update_time - afternoonTime + 2 * 60 * 60) * 1.0 / (4 * 60 * 60) * (chartWidth) + viewPadding + leftTextLenght);} else {return (int) ((update_time - startTime) * 1.0 / (4 * 60 * 60) * (chartWidth) + viewPadding + leftTextLenght);}}private void drawBorder(Canvas canvas) {linePaint.setStrokeWidth(1);linePaint.setColor(bordColor);canvas.drawLine(left, top, right, top, linePaint);canvas.drawLine(left, bottom, right, bottom, linePaint);canvas.drawLine(left, top, left, bottom, linePaint);canvas.drawLine(right, top, right, bottom, linePaint);
//        linePaint.setColor(charBaseDivideLineColor);
//        canvas.drawLine(left, (top + bottom) / 2, right, (top + bottom) / 2, linePaint);linePaint.setColor(charDivideLineColor);int y = chartHeight / YValueNum / 2;for (int i = 1; i < YValueNum; i++) {canvas.drawLine(left, (top + bottom) / 2 + y * i, right, (top + bottom) / 2 + y * i, linePaint);canvas.drawLine(left, (top + bottom) / 2 - y * i, right, (top + bottom) / 2 - y * i, linePaint);}int x = chartWidth / (xTitle.size() - 1);for (int i = 1; i < xTitle.size() - 1; i++) {canvas.drawLine(left + i * x, top, left + i * x, bottom, linePaint);}linePaint.setColor(charBaseDivideLineColor);linePaint.setStrokeWidth(2);canvas.drawLine(left, (top + bottom) / 2, right, (top + bottom) / 2, linePaint);}private void drawY(Canvas canvas) {double mid = (maxValue + minValue) / 2;textPaint.setColor(defaultTextColor);textPaint.setTextAlign(Paint.Align.LEFT);DecimalFormat df = new DecimalFormat("0.00");canvas.drawText(df.format(mid) + "", viewPadding, viewHeight / 2 + getTextBottom(textPaint), textPaint);canvas.drawText("0.00", getWidth() - viewPadding - rightTextLenght, viewHeight / 2 + getTextBottom(textPaint), textPaint);textPaint.setColor(upTextColor);textPaint.setTextAlign(Paint.Align.LEFT);for (int i = 1; i <= YValueNum; i++) {double value = mid + (maxValue - mid) * i / YValueNum;double valuePercent = (value - openValue) / openValue * 100;canvas.drawText(df.format(value) + "", viewPadding, viewHeight / 2 - textHigh * 2 * i + getTextBottom(textPaint), textPaint);canvas.drawText(df.format(valuePercent), getWidth() - viewPadding - rightTextLenght, viewHeight / 2 - textHigh * 2 * i + getTextBottom(textPaint), textPaint);}textPaint.setTextAlign(Paint.Align.LEFT);textPaint.setColor(downTextColor);for (int i = 1; i <= YValueNum; i++) {double value = mid - (mid - minValue) * i / YValueNum;double valuePercent = (value - openValue) / openValue * 100;canvas.drawText(df.format(value) + "", viewPadding, viewHeight / 2 + textHigh * 2 * i + getTextBottom(textPaint), textPaint);canvas.drawText(df.format(valuePercent), getWidth() - viewPadding - rightTextLenght, viewHeight / 2 + textHigh * 2 * i + getTextBottom(textPaint), textPaint);}}private int getTextBottom(Paint textPaint) {Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();return (int) fontMetrics.bottom;}private int getTextTop(Paint textPaint) {Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();return (int) fontMetrics.top;}private void drawX(Canvas canvas) {DecimalFormat df = new DecimalFormat("0.00");textPaint.setTextAlign(Paint.Align.CENTER);textPaint.setColor(defaultTextColor);for (int i = 0; i < xTitle.size(); i++) {canvas.drawText(xTitle.get(i), viewPadding + leftTextLenght + chartWidth / 4 * i, viewHeight - viewPadding, textPaint);}textPaint.setTextAlign(Paint.Align.LEFT);if (stampChartList != null && stampChartList.size() > 0) {double value = stampChartList.get(stampChartList.size() - 1).CurPrice;canvas.drawText("最新" + df.format(value), viewPadding + leftTextLenght, viewPadding - getTextTop(textPaint), textPaint);int len = (int) textPaint.measureText("最新" + "19488.67");double dis = value - openValue;double disPercent = dis / openValue * 100;if (value < openValue) {textPaint.setColor(downTextColor);canvas.drawText(" ↓" + df.format(dis) + "(" + df.format(disPercent) + "%)", viewPadding + leftTextLenght + len, viewPadding - getTextTop(textPaint), textPaint);} else {textPaint.setColor(upTextColor);canvas.drawText(" ↑" + df.format(dis) + "(" + df.format(disPercent) + "%)", viewPadding + leftTextLenght + len, viewPadding - getTextTop(textPaint), textPaint);}} else {canvas.drawText("最新-- --(--)", viewPadding + leftTextLenght, viewPadding - getTextTop(textPaint), textPaint);}textPaint.setColor(defaultTextColor);textPaint.setTextAlign(Paint.Align.RIGHT);canvas.drawText("涨跌幅(%)", getWidth() - rightTextLenght - viewPadding, viewPadding - getTextTop(textPaint), textPaint);}public void setStampChartList(List<UserModels.StampChart> stampChartList) {this.stampChartList = stampChartList;openValue = 0;maxValue = Double.MIN_VALUE;minValue = Double.MAX_VALUE;if (stampChartList != null) {for (int i = 0; i < stampChartList.size(); i++) {double curPrice = stampChartList.get(i).CurPrice;if (curPrice == 0)continue;if (openValue == 0)openValue = curPrice;maxValue = maxValue > curPrice ? maxValue : curPrice;minValue = minValue < curPrice ? minValue : curPrice;}} else {return;}double dis = Math.max(maxValue - openValue, openValue - minValue);dis += 5;maxValue = openValue + dis;minValue = openValue - dis;this.postInvalidate();}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {super.dispatchTouchEvent(event);Calendar c = Calendar.getInstance();switch (event.getAction()) {case MotionEvent.ACTION_UP:currentX = -1;currentY = -1;break;case MotionEvent.ACTION_MOVE:float x = event.getX();float y = event.getY();if (judgeDownOrUp(x, y)) {currentX = -1;currentY = -1;getParent().requestDisallowInterceptTouchEvent(false);} else {getParent().requestDisallowInterceptTouchEvent(true);currentX = event.getX();currentY = event.getY();}break;case MotionEvent.ACTION_DOWN:downTime = c.getTimeInMillis() ;currentX = event.getX();currentY = event.getY();break;}return true;}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_UP:Calendar c = Calendar.getInstance();long upTime = c.getTimeInMillis();if (upTime - downTime <= intervalTime) {if (touchListener != null) {touchListener.click();}} else {getParent().requestDisallowInterceptTouchEvent(false);}currentX = -1;currentY = -1;break;}postInvalidate();return super.onTouchEvent(event);}private boolean judgeDownOrUp(float x, float y) {if (Math.abs(currentX - x) + 10 < Math.abs(currentY - y)) {return true;} else {return false;}}public int sp2px(float spValue) {final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}public void setTouchListener(TouchListener touchListener) {this.touchListener = touchListener;}public void setMaxValue(double maxValue) {this.maxValue = maxValue;}public void setMinValue(double minValue) {this.minValue = minValue;}public interface TouchListener {void click();}
}


package com.cxzapp.stamp.ui;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;import com.chengxuanzhang.lib.util.StringUtil;
import com.cxzapp.stamp.modules.user.UserModels;import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.List;/*** Created by softrice on 15/10/19.*/
public class CandleSticksChartView extends View {/*** 回调接口*/public interface TouchListener {void click();}/*** color*/int MA5Color = Color.WHITE;int MA10Color = 0xFFD57123;int Ma20Color = 0xFFCB37CA;int chartBgColor = 0xFF272727;//图标背景色int upTextColor = Color.RED;//上升时text的颜色int defaultTextColor = Color.WHITE;//默认字体颜色int downTextColor = Color.GREEN;//下降的时候text的颜色int bordColor = 0xFF333333;//图标边框颜色int charDivideLineColor = 0xFF333333;//图表分割线颜色int hintLineColor = 0xFFFF423D;///*** size*/int viewHeight;//view 的高度int viewPadding = 10;//图表边距int textSize = 12;//字体大小 单位spint chartHeight;//图表高度int leftTextLenght;//左边数字的长度int textHigh;//text高度int chartWidth;//图表的宽度int defaultStickWidth = 20;int stickWidth = defaultStickWidth;// 蜡烛宽度int hintBorderWidth;//详情框宽度int hintBorderLeftTextWidth;//详情框左边蚊子宽度int hintBorderPadding = 10;//chart 的上下左右int top;int left;int right;int bottom;/*** paint*/Paint textPaint;Paint linePaint;/*** touch 部分*/float currentX;//当前点击的xfloat currentY;//当前点击的ylong downTime;//手指点击下的时间int intervalTime = 300;//时间间隔 单位 毫秒 点击抬起时间小于该值触发点击事件TouchListener touchListener;/*** data*/List<UserModels.StampInfo> stampInfoList;double maxValue = 2000;double minValue = 1000;final int YValueNum = 7;//Y轴的刻度个数int XValueNum = 5;//X轴刻度个数int XDay = 10;double MA5 = -1, MA10 = -1, MA20 = -1;/*** time*/Calendar c = Calendar.getInstance();int startTime;int endTime;DecimalFormat df;public CandleSticksChartView(Context context) {super(context);init();}public CandleSticksChartView(Context context, AttributeSet attrs) {super(context, attrs);init();}public CandleSticksChartView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {df = new DecimalFormat("0.00");setBackgroundColor(chartBgColor);textPaint = new Paint();linePaint = new Paint();textPaint.setAntiAlias(true);linePaint.setAntiAlias(true);textPaint.setTextSize(sp2px(textSize));leftTextLenght = (int) (textPaint.measureText("88888.88") + 0.5);textHigh = getTextHight(textPaint);chartHeight = 13 * textHigh;viewHeight = chartHeight + 2 * textHigh + 2 * viewPadding;hintBorderLeftTextWidth = (int) (textPaint.measureText("日期: ") + 0.5);hintBorderWidth = (int) (textPaint.measureText("日期:20150518") + 0.5);}@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {super.dispatchTouchEvent(event);Calendar c = Calendar.getInstance();switch (event.getAction()) {case MotionEvent.ACTION_UP:currentX = -1;currentY = -1;break;case MotionEvent.ACTION_MOVE:float x = event.getX();float y = event.getY();if (judgeDownOrUp(x, y)) {currentX = -1;currentY = -1;getParent().requestDisallowInterceptTouchEvent(false);} else {getParent().requestDisallowInterceptTouchEvent(true);currentX = event.getX();currentY = event.getY();}break;case MotionEvent.ACTION_DOWN:downTime = c.getTimeInMillis();currentX = event.getX();currentY = event.getY();break;}return true;}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_UP:Calendar c = Calendar.getInstance();long upTime = c.getTimeInMillis();if (upTime - downTime <= intervalTime) {if (touchListener != null) {touchListener.click();}} else {getParent().requestDisallowInterceptTouchEvent(false);}currentX = -1;currentY = -1;break;}postInvalidate();return super.onTouchEvent(event);}@Overrideprotected void onDraw(Canvas canvas) {drawMA(canvas);drawY(canvas);drawX(canvas);drawBorder(canvas);drawCandleSticks(canvas);drawHint(canvas);}private void drawY(Canvas canvas) {textPaint.setColor(defaultTextColor);textPaint.setTextAlign(Paint.Align.LEFT);double disY = (float) ((maxValue - minValue) / (YValueNum - 1));for (int i = 0; i < YValueNum; i++) {double value = disY * i + minValue;canvas.drawText(df.format(value), viewPadding, (float) ((maxValue - value) / (maxValue - minValue) * chartHeight + viewPadding + textHigh + getTextBottom(textPaint)), textPaint);}}private void drawX(Canvas canvas) {if (stampInfoList == null || stampInfoList.size() == 0)return;textPaint.setColor(defaultTextColor);textPaint.setTextAlign(Paint.Align.RIGHT);for (int i = 0; i <= XValueNum; i++) {int time = startTime + i * XDay * 24 * 60 * 60;canvas.drawText(StringUtil.formatDate(time, "MMdd"),left + chartWidth / (XValueNum - 1) * i, viewHeight - viewPadding, textPaint);}int len5 = (int) textPaint.measureText("MA5:88888.88");textPaint.setColor(MA5Color);textPaint.setTextAlign(Paint.Align.LEFT);if (MA5 == -1)canvas.drawText("MA5:--", left, viewPadding - getTextTop(textPaint), textPaint);elsecanvas.drawText("MA5:" + df.format(MA5), left, viewPadding - getTextTop(textPaint), textPaint);int len10 = (int) textPaint.measureText("MA10:88888.88");textPaint.setColor(MA10Color);if (MA10 == -1)canvas.drawText("MA10:--", left + len5, viewPadding - getTextTop(textPaint), textPaint);elsecanvas.drawText("MA10:" + df.format(MA10), left + len5, viewPadding - getTextTop(textPaint), textPaint);textPaint.setColor(Ma20Color);if (MA20 == -1)canvas.drawText("MA20:--", left + len5 + len10, viewPadding - getTextTop(textPaint), textPaint);elsecanvas.drawText("MA20:" + df.format(MA20), left + len5 + len10, viewPadding - getTextTop(textPaint), textPaint);}private void drawBorder(Canvas canvas) {linePaint.setStrokeWidth(1);linePaint.setColor(bordColor);canvas.drawLine(left, top, right, top, linePaint);canvas.drawLine(left, bottom, right, bottom, linePaint);canvas.drawLine(left, top, left, bottom, linePaint);canvas.drawLine(right, top, right, bottom, linePaint);linePaint.setColor(charDivideLineColor);double disY = (maxValue - minValue) / (YValueNum - 1);for (int i = 1; i <= YValueNum - 1; i++) {double value = disY * i + minValue;int y = (int) (viewPadding + textHigh + (maxValue - value) / (maxValue - minValue) * chartHeight);canvas.drawLine(left, y, right, y, linePaint);}double disX = chartWidth * 1.0 / (XValueNum - 1);for (int i = 1; i < XValueNum - 1; i++) {int x = (int) (i * disX + left);canvas.drawLine(x, top, x, bottom, linePaint);}}private void drawCandleSticks(Canvas canvas) {if (stampInfoList == null || stampInfoList.size() == 0)return;int disX = getTimeX(stampInfoList.get(0).update_time + 24 * 60 * 60) - getTimeX(stampInfoList.get(0).update_time);if (disX < defaultStickWidth) {stickWidth = disX;} else {stickWidth = defaultStickWidth;}for (int i = 0; i < stampInfoList.size(); i++) {int high, low, open, close;int centerX;UserModels.StampInfo info = stampInfoList.get(i);high = getPriceY(info.HighPrice);low = getPriceY(info.LowPrice);open = getPriceY(info.OpenPrice);close = getPriceY(info.YesterBalancePrice);centerX = getTimeX(info.update_time);Rect rect = new Rect();disX = 20;if (info.OpenPrice < info.YesterBalancePrice) {linePaint.setColor(upTextColor);rect.set(centerX - disX / 2, close, centerX + disX / 2, open);canvas.drawRect(rect, linePaint);} else {linePaint.setColor(downTextColor);rect.set(centerX - disX / 2, open, centerX + disX / 2, close);canvas.drawRect(rect, linePaint);}linePaint.setStrokeWidth(1);canvas.drawLine(centerX, high, centerX, low, linePaint);}}private void drawMA(Canvas canvas) {if (stampInfoList == null || stampInfoList.size() == 0)return;if (stampInfoList.size() < 5)return;//MA5MA5 = 0;linePaint.setColor(MA5Color);linePaint.setStrokeWidth(2);linePaint.setTextAlign(Paint.Align.LEFT);double ave = 0;for (int i = 0; i < 5; i++) {UserModels.StampInfo info = stampInfoList.get(i);ave += info.YesterBalancePrice;}ave /= 5;int oldx, oldy;oldy = getPriceY((float) ave);oldx = getTimeX(stampInfoList.get(4).update_time);for (int i = 5; i < stampInfoList.size(); i++) {ave = 0;for (int j = 0; j < 5; j++) {UserModels.StampInfo info = stampInfoList.get(i - j);ave += info.YesterBalancePrice;}ave /= 5;MA5 += ave;int y = getPriceY((float) ave);int x = getTimeX(stampInfoList.get(i).update_time);canvas.drawLine(oldx, oldy, x, y, linePaint);oldx = x;oldy = y;}MA5 /= stampInfoList.size() - 4;//MA10if (stampInfoList.size() < 10)return;MA10 = 0;linePaint.setColor(MA10Color);ave = 0;for (int i = 0; i < 10; i++) {UserModels.StampInfo info = stampInfoList.get(i);ave += info.YesterBalancePrice;}ave /= 10;oldy = getPriceY((float) ave);oldx = getTimeX(stampInfoList.get(9).update_time);for (int i = 10; i < stampInfoList.size(); i++) {ave = 0;for (int j = 0; j < 10; j++) {UserModels.StampInfo info = stampInfoList.get(i - j);ave += info.YesterBalancePrice;}ave /= 10;MA10 += ave;int y = getPriceY((float) ave);int x = getTimeX(stampInfoList.get(i).update_time);canvas.drawLine(oldx, oldy, x, y, linePaint);oldx = x;oldy = y;}MA10 /= stampInfoList.size() - 9;//MA20if (stampInfoList.size() < 20)return;MA20 = 0;linePaint.setColor(MA10Color);ave = 0;for (int i = 0; i < 20; i++) {UserModels.StampInfo info = stampInfoList.get(i);ave += info.YesterBalancePrice;}ave /= 20;oldy = getPriceY((float) ave);oldx = getTimeX(stampInfoList.get(19).update_time);for (int i = 20; i < stampInfoList.size(); i++) {ave = 0;for (int j = 0; j < 20; j++) {UserModels.StampInfo info = stampInfoList.get(i - j);ave += info.YesterBalancePrice;}ave /= 20;MA20 += ave;int y = getPriceY((float) ave);int x = getTimeX(stampInfoList.get(i).update_time);canvas.drawLine(oldx, oldy, x, y, linePaint);oldx = x;oldy = y;}MA20 /= stampInfoList.size() - 19;}private void drawHint(Canvas canvas) {if (currentX == -1 || currentY == -1 || stampInfoList == null || stampInfoList.size() == 0)return;if (!(currentX <= right && currentX >= left && currentY >= top && currentY <= bottom))return;linePaint.setStrokeWidth(1);linePaint.setColor(hintLineColor);textPaint.setColor(defaultTextColor);textPaint.setTextAlign(Paint.Align.CENTER);int position = getDataNum();if (position != -1) {UserModels.StampInfo info = stampInfoList.get(position);canvas.drawLine(getTimeX(info.update_time), top, getTimeX(info.update_time), bottom, linePaint);drawHintDetail(canvas, position);}}private void drawHintDetail(Canvas canvas, int position) {// 绘制点击线条及详情区域UserModels.StampInfo info = stampInfoList.get(position);linePaint.setColor(Color.BLACK);linePaint.setAlpha(150);int borderLeft, borderRight, borderTop, borderBottom;if (getTimeX(info.update_time) > left + chartWidth * 1.0 / 2) {borderLeft = left;borderRight = left + hintBorderWidth + 2 * hintBorderPadding;borderTop = top;borderBottom = top + textHigh * 5 + 2 * hintBorderPadding;} else {borderLeft = right - (hintBorderWidth + 2 * hintBorderPadding);borderRight = right;borderTop = top;borderBottom = top + textHigh * 5 + 2 * hintBorderPadding;}canvas.drawRect(borderLeft, borderTop, borderRight, borderBottom, linePaint);textPaint.setTextAlign(Paint.Align.LEFT);try {canvas.drawText("日期: " + StringUtil.formatDate(info.update_time, "yyyyMMdd"), borderLeft + hintBorderPadding, borderTop + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("开盘: ", borderLeft + hintBorderPadding, borderTop + textHigh * 1.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("收盘: ", borderLeft + hintBorderPadding, borderTop + textHigh * 2.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("最高: ", borderLeft + hintBorderPadding, borderTop + textHigh * 3.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("最低: ", borderLeft + hintBorderPadding, borderTop + textHigh * 4.0f + hintBorderPadding - getTextTop(textPaint), textPaint);if (info.OpenPrice < info.YesterBalancePrice) {textPaint.setColor(upTextColor);} else {textPaint.setColor(downTextColor);}canvas.drawText(df.format(info.OpenPrice), borderLeft + hintBorderPadding + hintBorderLeftTextWidth, borderTop + textHigh * 1.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText(df.format(info.YesterBalancePrice), borderLeft + hintBorderPadding + hintBorderLeftTextWidth, borderTop + textHigh * 2.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText(df.format(info.HighPrice), borderLeft + hintBorderPadding + hintBorderLeftTextWidth, borderTop + textHigh * 3.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText(df.format(info.LowPrice), borderLeft + hintBorderPadding + hintBorderLeftTextWidth, borderTop + textHigh * 4.0f + hintBorderPadding - getTextTop(textPaint), textPaint);} catch (Exception e) {canvas.drawText("日期: -- --", borderLeft + hintBorderPadding, borderTop + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("开盘: -- --", borderLeft + hintBorderPadding, borderTop + textHigh * 1.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("收盘: -- --", borderLeft + hintBorderPadding, borderTop + textHigh * 2.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("最高: -- --", borderLeft + hintBorderPadding, borderTop + textHigh * 3.0f + hintBorderPadding - getTextTop(textPaint), textPaint);canvas.drawText("最低: -- --", borderLeft + hintBorderPadding, borderTop + textHigh * 4.0f + hintBorderPadding - getTextTop(textPaint), textPaint);}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(widthMeasureSpec, viewHeight);chartWidth = getWidth() - 2 * viewPadding - leftTextLenght;top = textHigh + viewPadding;left = viewPadding + leftTextLenght;right = getWidth() - viewPadding;bottom = textHigh + viewPadding + chartHeight;}private boolean judgeDownOrUp(float x, float y) {if (Math.abs(currentX - x) + 10 < Math.abs(currentY - y)) {return true;} else {return false;}}private int getTextBottom(Paint textPaint) {Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();return (int) fontMetrics.bottom;}private int getTextTop(Paint textPaint) {Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();return (int) fontMetrics.top;}private int getPriceY(float curPrice) {return (int) ((maxValue - curPrice) * 1.0 / (maxValue - minValue) * chartHeight + viewPadding + textHigh);}private int getTimeX(int update_time) {return (int) ((update_time - startTime) * 1.0 / (endTime - startTime) * chartWidth + leftTextLenght + viewPadding);}public void setTouchListener(TouchListener touchListener) {this.touchListener = touchListener;}public int sp2px(float spValue) {final float fontScale = getContext().getResources().getDisplayMetrics().scaledDensity;return (int) (spValue * fontScale + 0.5f);}private int getDataNum() {for (int i = 0; i < stampInfoList.size(); i++) {UserModels.StampInfo info = stampInfoList.get(i);if (Math.abs(getTimeX(info.update_time) - currentX) < stickWidth) {return i;}}return -1;}private int getTextHight(Paint paint) {Paint.FontMetrics fontMetrics = paint.getFontMetrics();return (int) (fontMetrics.bottom - fontMetrics.top + 0.5f);}public void setStampInfoList(List<UserModels.StampInfo> stampInfoList) {this.stampInfoList = stampInfoList;if (stampInfoList == null || stampInfoList.size() == 0)return;maxValue = Float.MIN_VALUE;minValue = Float.MAX_VALUE;for (int i = 0; i < stampInfoList.size(); i++) {UserModels.StampInfo info = stampInfoList.get(i);maxValue = maxValue > info.HighPrice ? maxValue : info.HighPrice;minValue = minValue < info.LowPrice ? minValue : info.LowPrice;minValue = minValue < info.YesterBalancePrice ? minValue : info.YesterBalancePrice;minValue = minValue < info.OpenPrice ? minValue : info.OpenPrice;maxValue = maxValue > info.OpenPrice ? maxValue : info.OpenPrice;maxValue = maxValue > info.YesterBalancePrice ? maxValue : info.YesterBalancePrice;}startTime = stampInfoList.get(0).update_time;startTime -= 24 * 60 * 60;endTime = stampInfoList.get(stampInfoList.size() - 1).update_time;if (startTime - endTime < 40 * 24 * 60 * 60) {XValueNum = 5;XDay = 10;} else {XValueNum = (startTime - endTime) / (10 * 24 * 60 * 60) + 2;XDay = 10;}endTime = startTime + (XValueNum - 1) * XDay * 24 * 60 * 60;this.postInvalidate();}
}


这篇关于K线图和分时图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617245

相关文章

计算机毕业设计Python+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《Tensorflow股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和金融市场的日益复杂化,股票作为金融市场的重要组成部分,其价格波动受到广泛关注。传统的股票预测方法如技术分析和基本面分析,虽然在一定程度上能够辅助投资者做出决策,但存在主观性强、数据处理能力有限等不足,难以满足现代投资者的需求。因此,利用机器学习技术,特别是深度学习技术,对股票价格进行预测成为当前研究的热点

【科研绘图】【3D轨线图】:附Origin详细画图流程

目录 No.1 理解3D轨线图 No.2 画图流程 1 导入数据并绘图 2 设置绘图细节 3 设置坐标轴 4 效果图 No.1 理解3D轨线图 3D轨线图,是指在三维坐标系中,通过连续的点或线段连接而成的图形,用于表示一个或多个物体在三维空间中的运动路径。这些路径可以是直线、曲线或者更复杂的轨迹,它们随时间的变化而变化,从而展示物体的动态行为。 No.2 画图

计算机毕业设计Spark+PyTorch股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《Spark+PyTorch股票推荐与预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣,股票投资已成为广大投资者的重要选择之一。然而,股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票分析方法主要依赖于人工收集、整理和分析大量的市场数据,这不仅效率低下,而且难以准确捕捉市场的细微变化。因此,利用大数据和人工智能技术构建一个高效、

Cesium加载高速公路样式线图层和利用CSS撰写高速公路样式

在ArcGIS软件中是将多个线图层叠加(宽的叠加在下方防止遮盖其他图层)    依照此想法在Cesium中加载高速公路线图层时 在 Cesium 中,直接设置线(如 Polyline)的样式为“高速公路样式”并不直接支持,因为 Cesium 没有内置的特定于高速公路的样式选项。不过,你可以通过自定义线的样式来模拟高速公路的外观,包括在线的外边界添加黑色描边。 要在 Cesium 中实现

Origin制图——点线图转换为叠层图

1.当我们绘制点线图的时候我们发现,当数据差距较大或者差距较小的时候,绘制的图会很难看,如下图所示。怎么样才能更好的表达图的意思并且好看。那么接下来分享一下最新学习的叠层图教学。 2.首先我们还是按照点线图的画图方法,将点线图优化。简单优化后的数据图如下所示。可以看到这是很紧密的,也十分的不好看,因此我们需要对数据进行分层。 3.点击右上角的图层分层。原始是2行2列,我们只需要4行1列(4个

K 线图快速绘制教程:使用 KLineChart 展示 DolphinDB K 线

KLineChart 是一款开源、简单易用、适用场景丰富的 Web 前端金融图表,基于 html5 canvas 构建,零依赖压缩包仅 40K,非常轻量。它可以用于渲染金融 K 线图,同时支持多种数据源,提供了丰富的交互功能以及指标计算接口。由于 KLineChart 高度可定制且用户友好,非常适合开发者将复杂的图表功能集成到其他金融应用程序中。 DolphinDB 身为一个高性能的数据库,不仅

AI炒股:自动画出A股股票的K线图并添加技术指标

在deepseek中输入提示词: 你是一个Python编程专家,要完成一个编写Python脚本的任务,具体步骤如下: 用AKShare库获取股票贵州茅台(股票代码:600519)在2024年3月7日到2024年6月5日期间的历史行情数据-前复权。 然后绘制K线图,并在K线图上添加布林线、MACD 注意: 每一步都要输出信息到屏幕上; 日期格式是YYYYMMDD; 设置中文字体,以解决

箱线图模板

箱线图模板 import pandas as pdimport matplotlib.pyplot as plt# 创建一个示例数据字典,其中包含长度不同的列表data = {'Category1': [23, 45, 56, 78, 213, 45, 56, 78, 98, 123,88],'Category2': [123, 345, 56, 78, 213, 45, 56, 178,

百度 echarts K线图使用

看个效果图先 首先在需要插入图例的HTML中嵌入  <div id= "main"  style= "height:400px" ></div> 接着引入echarts.js    <script src= "http://echarts.baidu.com/build/dist/echarts.js" ></script> 最后在加入图例生成JS -------- 请

Python在股票交易分析中的应用:布林带与K线图的实战回测

引言 在股票交易的世界中,技术分析是投资者们用来预测市场动向的重要工具。布林带(Bollinger Bands)作为一种动态波动范围指标,因其直观性和实用性而广受欢迎。本文将通过Python代码,展示如何使用布林带结合K线图来分析股票价格走势,并寻找可能的交易信号。 布林带指标简介 布林带由三部分组成:中轨(移动平均线),上轨(中轨加上两倍标准差),以及下轨(中轨减去两倍标准差)。它们可以帮