技术图形,诸如头肩顶、头肩底、W底、圆底等,代码逻辑实现后,要使用股票数据验证,这类主要依靠视觉判断的技术图形,获得的结果能及时在图表中展示出来,对代码的开发、校验、结果的准确度确认等能起到事半功倍的效果,本工具就是基于此需求所做的开发。

本文以“头肩底”为例进行讲解

目录

效果

计算技术图形策略代码

工具代码

工具使用

数据


效果

计算技术图形策略代码

前置说明:

1. 必须以“excute_strategy”为方法名

2. 一个参数,股票日数据文件路径

3. 策略代码写完后,命名,保存在“shape_recognition_strategy”文件夹中,‘shape_recognition_strategy’文件夹的创建位置在下文中会介绍

4. 将策略文件名写入主程序类StrategeMainWidget的self.strategyname_code_map对应的兼职对中

def excute_strategy(daily_file_path):'''名称:头肩底处理过程:结合图形说明,从最近的日期往前找1. (1)号位为起点位2. 从(1)号位开始找最近最小值设为(2)号位3. 找到(2)号位后,找最近最大值设为(3)号位4. 判断(3)号位是否小于(1)号位:5. (3)号位小于(1)号位,找最近最小值设为(4)号位6. (3)号位大于等于(1)号位,将(3)号位设为(1)号位,从第二步开始,直到找到(4)号位7. 找到(4)号位后,判断(4)号位是否小于(2)号位:8. (4)号位小于(2)号位,找最近最大值设为(5)号位9. (4)号位大于等于(2)号位,将(3)号位设为(1)号位,从第二步开始,直到找到(5)号位10. 找到(5)号位后,判断(5)号位是否和(3)号位在相近的水平位置:11. (5)号位和(3)号位在相近的水平位置,找最近最小值设为(6)号位12. 找到(6)号位后,判断(6)号位是否大于(4)号位:13. (6)号位大于(4)号位,找最近最大值设为(7)号位14. (6)号位小于等于(4)号位,将(5)号位设为(1)号位,从第二步开始,直到找到(7)号位15. 找到(7)号位后,判断(7)号位是否大于(5)号位:16. (7)号位大于(5)号位,找图完毕。17. (7)号位小于等于(5)号位,将(5)号位设为(1)号位,从第二步开始,直到完毕。前置条件:计算时间区间 2021-01-01 到 2022-01-01:param daily_file_path: 股票日数据文件路径:return:'''import pandas as pdimport osstart_date_str = '2021-01-01'end_date_str = '2022-01-01'df = pd.read_csv(daily_file_path,encoding='utf-8')# 删除停牌的数据df = df.loc[df['openPrice'] > 0].copy()df['o_date'] = df['tradeDate']df['o_date'] = pd.to_datetime(df['o_date'])df = df.loc[(df['o_date'] >= start_date_str) & (df['o_date']<=end_date_str)].copy()# 保存未复权收盘价数据df['close'] = df['closePrice']# 计算前复权数据df['openPrice'] = df['openPrice'] * df['accumAdjFactor']df['closePrice'] = df['closePrice'] * df['accumAdjFactor']df['highestPrice'] = df['highestPrice'] * df['accumAdjFactor']df['lowestPrice'] = df['lowestPrice'] * df['accumAdjFactor']df.reset_index(inplace=True)df['i_row'] = [i for i in range(len(df))]# 开始计算one_point = Noneone_val = Nonetwo_point = Nonetwo_val = Nonethree_point = Nonethree_val = Nonefour_point = Nonefour_val = Nonefive_point = Nonefive_val = Nonesix_point = Nonesix_val = Noneseven_point = Noneseven_val = Nonegap_pct = 0.005for i in range(len(df)-1,0,-1):if seven_point:if six_point-seven_point < 5 or seven_val < five_val:one_point = seven_pointone_val = seven_valtwo_point = Nonetwo_val = Nonethree_point = Nonethree_val = Nonefour_point = Nonefour_val = Nonefive_point = Nonefive_val = Nonesix_point = Nonesix_val = Noneseven_point = Noneseven_val = Noneelse:breakif six_point:if five_point - six_point < 3 or six_val < four_val:one_point = five_pointone_val = five_valtwo_point = six_pointtwo_val = six_valthree_point = Nonethree_val = Nonefour_point = Nonefour_val = Nonefive_point = Nonefive_val = Nonesix_point = Nonesix_val = Noneseven_point = Noneseven_val = Nonepassif five_point:if four_point - five_point < 3 or five_val*(1+gap_pct)<=three_val or five_val*(1-gap_pct)>=three_val:one_point = five_pointone_val = five_valtwo_point = Nonetwo_val = Nonethree_point = Nonethree_val = Nonefour_point = Nonefour_val = Nonefive_point = Nonefive_val = Nonesix_point = Nonesix_val = Noneseven_point = Noneseven_val = Nonepassif four_point:if three_point - four_point < 3 or four_val > two_val:one_point = three_pointone_val = three_valtwo_point = four_pointtwo_val = four_valthree_point = Nonethree_val = Nonefour_point = Nonefour_val = Nonefive_point = Nonefive_val = Nonesix_point = Nonesix_val = Noneseven_point = Noneseven_val = Nonepassif three_point:if two_point - three_point < 3 or three_val > one_val:one_point = three_pointone_val = three_valtwo_point = Nonetwo_val = Nonethree_point = Nonethree_val = Nonefour_point = Nonefour_val = Nonefive_point = Nonefive_val = Nonesix_point = Nonesix_val = Noneseven_point = Noneseven_val = Nonepassif two_point:if one_point - two_point < 5:one_point = Noneone_val = Nonetwo_point = Nonetwo_val = Nonethree_point = Nonethree_val = Nonefour_point = Nonefour_val = Nonefive_point = Nonefive_val = Nonesix_point = Nonesix_val = Noneseven_point = Noneseven_val = Noneif one_point is None:if one_val is None:one_val = df.iloc[i]['highestPrice']else:if one_val < df.iloc[i]['highestPrice']:one_val = df.iloc[i]['highestPrice']else:if one_val*(1-gap_pct) <= df.iloc[i]['highestPrice']:passelse:one_point = i + 1two_val = df.iloc[i]['lowestPrice']if one_point and two_point is None:if two_val is None:two_val = df.iloc[i]['lowestPrice']else:if two_val > df.iloc[i]['lowestPrice']:two_val = df.iloc[i]['lowestPrice']else:if two_val*(1+gap_pct) >= df.iloc[i]['lowestPrice']:passelse:two_point = i+1three_val = df.iloc[i]['highestPrice']if one_point and two_point and three_point is None:if three_val is None:three_val = df.iloc[i]['highestPrice']else:if three_val < df.iloc[i]['highestPrice']:three_val = df.iloc[i]['highestPrice']else:if three_val*(1-gap_pct) <= df.iloc[i]['highestPrice']:passelse:three_point = i+1four_val = df.iloc[i]['lowestPrice']if one_point and two_point and three_point and four_point is None:if four_val is None:four_val = df.iloc[i]['lowestPrice']else:if four_val > df.iloc[i]['lowestPrice']:four_val = df.iloc[i]['lowestPrice']else:if four_val*(1+gap_pct) >= df.iloc[i]['lowestPrice']:passelse:four_point = i + 1five_val = df.iloc[i]['highestPrice']if one_point and two_point and three_point and four_point and five_point is None:if five_val is None:five_val = df.iloc[i]['highestPrice']else:if five_val < df.iloc[i]['highestPrice']:five_val = df.iloc[i]['highestPrice']else:if five_val*(1-gap_pct) <= df.iloc[i]['highestPrice']:passelse:five_point = i + 1six_val = df.iloc[i]['lowestPrice']if one_point and two_point and three_point and four_point and five_point and six_point is None:if six_val is None:six_val = df.iloc[i]['lowestPrice']else:if six_val > df.iloc[i]['lowestPrice']:six_val = df.iloc[i]['lowestPrice']else:if six_val*(1+gap_pct) >= df.iloc[i]['lowestPrice']:passelse:six_point = i+1seven_val = df.iloc[i]['highestPrice']if one_point and two_point and three_point and four_point and five_point and six_point and seven_point is None:if seven_val is None:seven_val = df.iloc[i]['highestPrice']else:if seven_val < df.iloc[i]['highestPrice']:seven_val = df.iloc[i]['highestPrice']else:if seven_val*(1-gap_pct) <= df.iloc[i]['highestPrice']:passelse:seven_point = i + 1passres_duration = []res_line = []res_table = []if one_point and two_point and three_point and four_point and five_point and six_point and seven_point:res_duration.append([seven_point,one_point])res_line.append([(five_point,five_val),(three_point,three_val)])res_table = [['1',df.iloc[one_point]['tradeDate'],one_val],['2',df.iloc[two_point]['tradeDate'],two_val],['3',df.iloc[three_point]['tradeDate'],three_val],['4',df.iloc[four_point]['tradeDate'],four_val],['5',df.iloc[five_point]['tradeDate'],five_val],['6',df.iloc[six_point]['tradeDate'],six_val],['7',df.iloc[seven_point]['tradeDate'],seven_val]]passfile_name = os.path.basename(daily_file_path)title_str = file_name.split('.')[0]line_data = {'title_str':title_str,'whole_header':['日期','收','开','高','低'],'whole_df':df,'whole_pd_header':['tradeDate','closePrice','openPrice','highestPrice','lowestPrice'],'start_date_str':start_date_str,'end_date_str':end_date_str,'res_duration':res_duration,'res_line':res_line,'res_table':res_table,'temp':len(res_duration)}return line_data

工具代码

导入需要的包

import sys,json,os,math,time,talib
from threading import Thread
import numpy as np
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta
from typing import Dict,Any,List
from PyQt5 import QtCore,QtGui,QtWidgets
from PyQt5.QtCore import Qt
import pyqtgraph as pg
import pyqtgraph.examples
pg.setConfigOption('background','k')
pg.setConfigOption('foreground','w')

pygtgraph 日期横坐标控件、蜡烛图控件、分页表格控件,请查看该博文。

K线与结果显示控件

class PyQtGraphKWidget(QtWidgets.QWidget):def __init__(self):super().__init__()self.init_data()self.init_ui()def init_data(self):# https://www.sioe.cn/yingyong/yanse-rgb-16/# self.color_line = (30, 144, 255)self.color_line = (255, 255, 0)# 0 幽灵的白色; 1 纯黄; 2 紫红色; 3 纯绿; 4 道奇蓝self.color_list = [(248, 248, 255), (255, 255, 0), (255, 0, 255), (0, 128, 0), (30, 144, 255)]self.main_fixed_target_list = []  # 主体固定曲线,不能被删除self.whole_df = Noneself.whole_header = Noneself.whole_pd_header = Noneself.current_whole_data = Noneself.current_whole_df = Noneself.res_duration = Noneself.res_line = Noneself.res_table = Nonepassdef init_ui(self):self.whole_duration_label = QtWidgets.QLabel('左边界~右边界')self.title_label = QtWidgets.QLabel('执行过程查看')self.title_label.setAlignment(Qt.AlignCenter)self.title_label.setStyleSheet('QLabel{font-size:18px;font-weight:bold}')xax = RotateAxisItem(orientation='bottom')xax.setHeight(h=80)self.pw = pg.PlotWidget(axisItems={'bottom': xax})self.pw.setMouseEnabled(x=True, y=True)# self.pw.enableAutoRange(x=False,y=True)self.pw.setAutoVisible(x=False, y=True)layout_right = QtWidgets.QVBoxLayout()layout_right.addWidget(self.title_label)layout_right.addWidget(self.whole_duration_label)layout_right.addWidget(self.pw)self.setLayout(layout_right)passdef set_data(self, data: Dict[str, Any]):title_str = data['title_str']whole_header = data['whole_header']whole_df = data['whole_df']whole_pd_header = data['whole_pd_header']res_duration = data['res_duration']res_line = data['res_line']res_table = data['res_table']self.whole_header = whole_headerself.whole_df = whole_dfself.whole_pd_header = whole_pd_headerself.res_duration = res_durationself.res_line = res_lineself.res_table = res_tableself.title_label.setText(title_str)self.whole_duration_label.setText(f"{self.whole_df.iloc[0]['tradeDate']}~{self.whole_df.iloc[-1]['tradeDate']}")self.current_whole_df = self.whole_df.copy()self.caculate_and_show_data()passdef caculate_and_show_data(self):df = self.current_whole_df.copy()df.reset_index(inplace=True)df['i_count'] = [i for i in range(len(df))]tradeDate_list = df['tradeDate'].values.tolist()x = range(len(df))xTick_show = []x_dur = math.ceil(len(df) / 20)for i in range(0, len(df), x_dur):xTick_show.append((i, tradeDate_list[i]))if len(df) % 20 != 0:xTick_show.append((len(df) - 1, tradeDate_list[-1]))candle_data = []for i, row in df.iterrows():candle_data.append((row['i_count'], row['openPrice'], row['closePrice'], row['lowestPrice'], row['highestPrice']))self.current_whole_data = df.loc[:, self.whole_pd_header].values.tolist()# 开始配置显示的内容self.pw.clear()xax = self.pw.getAxis('bottom')xax.setTicks([xTick_show])candle_fixed_target = CandlestickItem(candle_data)self.main_fixed_target_list.append(candle_fixed_target)self.pw.addItem(candle_fixed_target)# 标记技术图形 startif len(self.res_duration)>0:for item in self.res_duration:signal_fiexed_target = pg.LinearRegionItem([item[0], item[1]],movable=False, brush=(self.color_line[0], self.color_line[1], self.color_line[2], 50))self.pw.addItem(signal_fiexed_target)passif len(self.res_line)>0:for item in self.res_line:angle = math.atan2((item[1][1] - item[0][1]),(item[1][0] - item[0][0]))theta = angle * (180 / math.pi)signal_fiexed_target = pg.InfiniteLine(pos=item[0], movable=False, angle=theta,pen=pg.mkPen({'color': self.color_line, 'width': 1}))self.pw.addItem(signal_fiexed_target)pass# 标记技术图形 endself.vLine = pg.InfiniteLine(angle=90, movable=False)self.hLine = pg.InfiniteLine(angle=0, movable=False)self.label = pg.TextItem()self.pw.addItem(self.vLine, ignoreBounds=True)self.pw.addItem(self.hLine, ignoreBounds=True)self.pw.addItem(self.label, ignoreBounds=True)self.vb = self.pw.getViewBox()self.proxy = pg.SignalProxy(self.pw.scene().sigMouseMoved, rateLimit=60, slot=self.mouseMoved)self.pw.enableAutoRange()passdef mouseMoved(self, evt):pos = evt[0]if self.pw.sceneBoundingRect().contains(pos):mousePoint = self.vb.mapSceneToView(pos)index = int(mousePoint.x())if index >= 0 and index < len(self.current_whole_data):target_data = self.current_whole_data[index]html_str = ''for i, item in enumerate(self.whole_header):html_str += f"<br/>{item}:{target_data[i]}"self.label.setHtml(html_str)self.label.setPos(mousePoint.x(), mousePoint.y())self.vLine.setPos(mousePoint.x())self.hLine.setPos(mousePoint.y())passdef mouseClicked(self, evt):passdef updateViews(self):passpass

主程序控件

class StrategeMainWidget(QtWidgets.QWidget):signal_runcode = QtCore.pyqtSignal(object)signal_time = QtCore.pyqtSignal(object)def __init__(self):super().__init__()self.thread_run: Thread = Noneself.thread_time: Thread = Noneself.init_data()self.init_ui()self.register_event()passdef init_data(self):self.pre_output_dir = './'self.results_output_dir = './k_recognition_output/'self.please_select_str: str = '--请选择--'self.k_strategy_path: str = '../shape_recognition_strategy/'self.stratege_run_start_time = Noneself.stratege_start = Falseself.current_stratege_py_str: str = ''self.dailydata_path:str = ''self.k_strategy_map: Dict[str,Any] = {'转势技术图形':['头肩顶','头肩底','复合头肩模式','圆底(蝶形底)','圆顶(蝶形顶)','双底(W底)','双顶(M顶)','三重顶和三重底','潜伏底','V形反转(V形底)','倒置V形反转(尖顶)','缺口','底部岛形反转','顶部岛形反转'],'整理技术图形':['上升三角形','下降三角形','底部三角形','扩散三角形(喇叭形)','收敛三角形','菱形(钻石形)','上升旗形(下飘旗形)','下降旗形(上飘旗形)','上升楔形','下降楔形','矩形(箱体)']}self.strategyname_code_map:Dict[str,str] = {'头肩顶': '','头肩底': '','复合头肩模式': '000','圆底(蝶形底)': '','圆顶(蝶形顶)': '','双底(W底)': '','双顶(M顶)': '','三重顶和三重底': '','潜伏底': '','V形反转(V形底)': '','倒置V形反转(尖顶)': '','缺口': '','底部岛形反转': '','顶部岛形反转': '','上升三角形': '','下降三角形': '','底部三角形': '','扩散三角形(喇叭形)': '','收敛三角形': '','菱形(钻石形)': '','上升旗形(下飘旗形)': '','下降旗形(上飘旗形)': '','上升楔形': '','下降楔形': '','矩形(箱体)': ''}self.table_header: List = ['点位','日期','值']passdef init_ui(self):self.setWindowTitle('股票技术图形识别工具')tip_0 = QtWidgets.QLabel('股票日数据文件:')self.dailydata_filepath_lineedit = QtWidgets.QLineEdit()self.dailydata_filepath_lineedit.setReadOnly(True)dailydata_choice_btn = QtWidgets.QPushButton('选择文件')dailydata_choice_btn.clicked.connect(self.dailydata_choice_btn_clicked)layout_top = QtWidgets.QHBoxLayout()layout_top.addWidget(tip_0)layout_top.addWidget(self.dailydata_filepath_lineedit)layout_top.addWidget(dailydata_choice_btn)layout_top.addStretch(1)tip_1 = QtWidgets.QLabel('类别:')self.type_combox = QtWidgets.QComboBox()self.type_combox.addItem(self.please_select_str)self.type_combox.addItems(list(self.k_strategy_map.keys()))self.type_combox.currentIndexChanged.connect(self.type_combox_currentIndexChanged)tip_2 = QtWidgets.QLabel('技术图形:')self.shape_combox = QtWidgets.QComboBox()self.shape_combox.addItem(self.please_select_str)self.shape_combox.currentIndexChanged.connect(self.shape_combox_currentIndexChanged)self.run_btn = QtWidgets.QPushButton('运行')self.run_btn.clicked.connect(self.run_btn_clicked)self.time_label = QtWidgets.QLabel('')layout_combox = QtWidgets.QFormLayout()layout_combox.addRow(tip_1,self.type_combox)layout_combox.addRow(tip_2,self.shape_combox)layout_combox.addRow(self.run_btn,self.time_label)self.code_textedit = QtWidgets.QTextEdit()self.code_textedit.setReadOnly(True)self.results_table = PageTableWidget()self.results_table.set_table_init_data({'headers':self.table_header})layout_left = QtWidgets.QVBoxLayout()layout_left.addLayout(layout_combox)layout_left.addWidget(self.code_textedit)layout_left.addWidget(self.results_table)self.line_widget = PyQtGraphKWidget()layout_down = QtWidgets.QHBoxLayout()layout_down.addLayout(layout_left,1)layout_down.addWidget(self.line_widget,2)layout = QtWidgets.QVBoxLayout()layout.addLayout(layout_top)layout.addLayout(layout_down)self.setLayout(layout)passdef register_event(self):self.signal_runcode.connect(self.thread_run_excuted)self.signal_time.connect(self.thread_time_excuted)passdef dailydata_choice_btn_clicked(self):path, _ = QtWidgets.QFileDialog.getOpenFileName(self,'打开股票日数据所在文件',self.pre_output_dir)if not path:returnself.dailydata_filepath_lineedit.setText(path)passdef type_combox_currentIndexChanged(self,cur_i:int):cur_txt = self.type_combox.currentText()if not cur_txt or cur_txt == self.please_select_str:returnshape_name_list = self.k_strategy_map[cur_txt]self.shape_combox.clear()self.shape_combox.addItem(self.please_select_str)self.shape_combox.addItems(shape_name_list)passdef shape_combox_currentIndexChanged(self,cur_i:int):cur_txt = self.shape_combox.currentText()if not cur_txt or cur_txt == self.please_select_str:returncur_strategy_name = self.strategyname_code_map[cur_txt]if cur_strategy_name == '000':QtWidgets.QMessageBox.information(self,'提示','代码实现太复杂,还是靠肉眼吧。。。',QtWidgets.QMessageBox.Yes)returnif len(cur_strategy_name)<=0:QtWidgets.QMessageBox.information(self,'提示','该K线形态的策略还没上线',QtWidgets.QMessageBox.Yes)returnstrategy_file_path = self.k_strategy_path + cur_strategy_namewith open(strategy_file_path,'r',encoding='utf-8') as fr:py_str = fr.read()if len(py_str)<=20:QtWidgets.QMessageBox.information(self,'提示','策略文件代码为空',QtWidgets.QMessageBox.Yes)returnself.code_textedit.setPlainText(py_str)passdef run_btn_clicked(self):'''运行按钮'''# 检查股票日数据文件夹dailydata_filepath = self.dailydata_filepath_lineedit.text()dailydata_filepath = dailydata_filepath.strip()if len(dailydata_filepath)<=0:QtWidgets.QMessageBox.information(self,'提示','请选择股票日数据文件',QtWidgets.QMessageBox.Yes)returnpy_str = self.code_textedit.toPlainText()if len(py_str)<20:QtWidgets.QMessageBox.information(self,'提示','请选择要执行的策略',QtWidgets.QMessageBox.Yes)returnself.current_stratege_py_str = py_strself.run_btn.setDisabled(True)self.shape_combox.setDisabled(True)self.stratege_run_start_time = datetime.now()self.stratege_start = Trueif self.thread_run:QtWidgets.QMessageBox.information(self,'提示','有策略正在运行',QtWidgets.QMessageBox.Yes)returnpre_data = {'py_str':py_str,'dailydata_filepath':dailydata_filepath}self.thread_run = Thread(target=self.running_run_thread,args=(pre_data,))self.thread_run.start()self.thread_time = Thread(target=self.running_time_thread)self.thread_time.start()passdef running_run_thread(self,data:Dict[str,Any]):'''执行代码线程'''py_str = data['py_str']dailydata_filepath = data['dailydata_filepath']namespace = {}fun_stragegy = compile(py_str,'<string>','exec')exec(fun_stragegy,namespace)ret = namespace['excute_strategy'](dailydata_filepath)self.signal_runcode.emit(ret)passdef thread_run_excuted(self,data:Dict):'''策略代码执行返回结果'''self.run_btn.setDisabled(False)self.shape_combox.setDisabled(False)# 保存结果文件self.results_table.set_table_full_data(data['res_table'])self.line_widget.set_data(data)self.thread_run = Noneself.thread_time = Noneself.stratege_start = FalseQtWidgets.QMessageBox.information(self,'提示','当前策略运行完毕',QtWidgets.QMessageBox.Yes)passdef running_time_thread(self):'''计时线程'''while self.stratege_start:now = datetime.now()interval_time = (now-self.stratege_run_start_time).secondsres_map = {'res':interval_time}self.signal_time.emit(res_map)time.sleep(1)passdef thread_time_excuted(self,data:Dict):'''计时返回结果'''res = data['res']self.time_label.setText(f"{res}s")passdef closeEvent(self, a0: QtGui.QCloseEvent) -> None:if self.thread_time:self.thread_time = Noneif self.thread_run:self.thread_run = Noneself.close()

工具使用

if __name__ == '__main__':QtCore.QCoreApplication.setAttribute(QtCore.Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)app = QtWidgets.QApplication(sys.argv)t_win = StrategeMainWidget()t_win.showMaximized()app.exec()pass

1. 在入口代码对应的py文件的上一级目录下创建 shape_recognition_strategy 文件夹,后续K线技术图形判别的策略代码都保存在这个文件夹下

数据

链接:https://pan.baidu.com/s/1acghH4GQyu_OaOUmEjPdHw 
提取码:6toe

PyQt5_股票技术图形查看工具相关推荐

  1. 股票技术图形怎么看?一文给你分析透!

    来源:财富池股票站 对于炒股的人来说,对股市进行技术分析很重要的一步便是掌握股票的曲线分析.而跟股票曲线相对应的便是股票技术图形,所以本文便带大家来分析股票技术图形. 首先说明,这里所说的股票技术图形 ...

  2. rfc 查看工具_使用技术RFC作为管理工具的6课

    rfc 查看工具 作为工程主管,我非常重视信任,并相信个人贡献者应参与架构和高级技术决策. 我认为每一行代码都是代表其他人(包括您将来的自己)做出的决定,拥有一支快速成长的分布式团队会使技术决策尤其难 ...

  3. 股票技术分析--任正德主编

    股票技术分析:散户完全自救手册–任正德主编 第二章 K线分析 2.1 K线的含义及画法 K线画法和含义(日K线) 当日开盘价(a)与当日收盘价(b)组成的区域叫K线实体,若a<b,则称此K线为阳 ...

  4. sFlow监控技术及Collector工具概述

    sFlow技术及Collector工具概述 1.1 sFlow概述 sFlow是Sampled Flow的简称,是一种用于监控数据网络上交换机或者路由器流量转发状况的技术.sFlow系统包含一个嵌入在 ...

  5. 在线获取浏览器指纹查看工具

    分享一个很好的浏览器指纹查看工具,感觉很好用,做检测测试很方便! 浏览器指纹_全面综合的浏览器指纹在线查看 (kaotop.com)http://www.kaotop.com/it/fingerpir ...

  6. assimp为什么获得一个黑色的图形_论文图形数据获取工具: Web Plot Digitizer应用详解...

    找参考数据是论文里让人头疼的事,之一.千辛万苦找到了参考文献,却只能找到数据图,截图清晰度不够,自己画又没有原始数据,有一款神器可以帮助我们解决这个问题,那就是--图形数据获取工具,名为Web Plo ...

  7. 本人制作的股票技术分析软件正式开源(.net wpf)

    为什么80%的码农都做不了架构师?>>> 本人制作的股票技术分析软件正式开源 该软件以股票数据为核心,尤其以按日数据为主,采用图表方式可视化股票数据 ,为用户提供简单的股票选择可视化 ...

  8. 给大家推荐一款高逼格的Linux磁盘信息查看工具

    可以使用df命令来显示在Linux.macOS和类Unix系统中挂载的文件系统上有多少可用磁盘空间.还可以使用du命令来估计文件空间的使用情况.我们现在有了另一个奇特的工具,名为duf,是一款gola ...

  9. rfc 查看工具_用于系统管理员的杀手级工具,Skype替代品,提高Linux技能,6个必读的RFC等

    rfc 查看工具 7月是Opensource.com上的SysAdmin赞赏月 SysAdminDay在7月底,但是我们整个月都在庆祝系统管理. 查看我们不断增长的SysAdmin系列 : Archi ...

最新文章

  1. windows下编译leveldb
  2. Linux的kickstart安装详解
  3. python语音播报-使用pyttsx3实现python语音播报
  4. python代码基础题-python3的基础练习题
  5. Android源码学习(3) Handler之MessageQueue
  6. Linux 下定时文件crontab配置
  7. 算法复习周------“动态规划之‘图像压缩’”
  8. MFC通过CImage绘制透明图层的png图片
  9. 关于 Linux中内网安装软件的一些笔记
  10. html app5 仿微信朋友圈,h5仿微信web版|仿微信电脑客户端|仿微信朋友圈源码
  11. 操作系统(02326)自考学习笔记/备考资料
  12. C# 二维与三维计算多边形面积的方法
  13. 免费天气API,天气JSON API,天气插件
  14. day3-作业(18-23)(java泛型总结一)
  15. 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)
  16. 按位运算符与逻辑运算符的区别
  17. licode服务器处理流程
  18. 【小旭学长-使用python进行城市数据分析】笔记篇(上)
  19. 【探索-字节跳动】字符串的排列
  20. 米家扫地机器人重置网络_手机换了小米扫地机如何连接wifi_米家机器人重置wifi...

热门文章

  1. Oracle EBS中打印二维码
  2. 2009经典语录,雷死人不要钱
  3. 【ML】KMeans 原理 + 实践(基于sklearn)
  4. 数字化转型, ERP加速衰落 or 激流勇进?
  5. 唯美PS转手绘之SAI篇_百度经验
  6. 信息系统项目管理师核心考点(四十六)采购工作说明书(SOW)
  7. 悟透delphi 第二章 DELPHI与WIN32时空
  8. 2018最新支付系统/第三方支付系统/第四方支付系统/聚合支
  9. Android中AlarmManager的使用
  10. 360兼容模式,搜狗等奇葩浏览器下无法正常渲染的问题