238 lines
9.1 KiB
C#
238 lines
9.1 KiB
C#
using DevExpress.XtraEditors;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using Million.SaveData;
|
|
using Million.FileDBManagement;
|
|
using Million.Data;
|
|
using DevExpress.XtraTreeList;
|
|
|
|
namespace Million_Hunter.HunterSubForm
|
|
{
|
|
public partial class ResultViewerForm : DevExpress.XtraEditors.XtraForm
|
|
{
|
|
// 저장 또는 불러온 Result Data
|
|
public SavedResultData _savedResultData;
|
|
// TreeList에 옮길 가공 데이터
|
|
public List<AnalysisData>_analysisDatas;
|
|
|
|
// Analysis Data 를 Load 하는 경우 저장 변수
|
|
public SavedAnalysisData _savedAnalysisData;
|
|
|
|
public ResultViewerForm(SavedResultData savedResultData)
|
|
{
|
|
InitializeComponent();
|
|
|
|
_savedResultData = savedResultData;
|
|
|
|
InitForm();
|
|
}
|
|
|
|
private void InitForm()
|
|
{
|
|
// 1. 결과 데이터 TreeList에 표기
|
|
// 시간 데이터 추가
|
|
//_savedResultData.SearchResultList.ToLookup()
|
|
dateEdit_StartDateTime.DateTime = _savedResultData.StartDateTime.Date;
|
|
dateEdit_EndDateTime.DateTime = _savedResultData.EndDateTime.Date;
|
|
dateEdit_SavedDateTime.DateTime = _savedResultData.SavedDateTime.Date;
|
|
textEdit_BuyRegularExpression.Text = _savedResultData.BuyRegularExpression;
|
|
textEdit_SellRegularExpression.Text = _savedResultData.SellRegularExpression;
|
|
|
|
// Buy/Sell 리스트에 데이터 추가
|
|
treeList_BuySetupList.DataSource = _savedResultData.BuySetupList;
|
|
treeList_SellSetupList.DataSource = _savedResultData.SellSetupList;
|
|
treeList_BuySetupList.RefreshDataSource();
|
|
treeList_SellSetupList.RefreshDataSource();
|
|
|
|
// _analysisDatas 리스트 초기화
|
|
if (_analysisDatas != null)
|
|
{
|
|
// 메모리 헤제
|
|
_analysisDatas.Clear();
|
|
_analysisDatas = null;
|
|
}
|
|
_analysisDatas = new List<AnalysisData>();
|
|
|
|
// 평균 승률 계산하기
|
|
double winRate = 0;
|
|
// 평균 수익률 계산하기
|
|
double profitRate = 0;
|
|
|
|
// 데이터 가공하기 (List<AnalysisData> _analysisDatas)
|
|
foreach (var searchResult in _savedResultData.SearchResultList)
|
|
{
|
|
var analysisData = AnalysisData.GetAnalysisData(true, searchResult.MarketData.ExchangePlace, searchResult.MarketData.CodeFullName, searchResult.MarketData.KorName,
|
|
searchResult.BuyValueList.Count, searchResult.StartDate, searchResult.BuyValueList.First(), searchResult.EndDate, searchResult.SellValue, searchResult.FirstEarningRate, searchResult.FirstWinFlag,
|
|
"", searchResult);
|
|
|
|
// 승률 계산하기
|
|
if (searchResult.FirstWinFlag) winRate++;
|
|
|
|
// 수익률 계산하기
|
|
profitRate += searchResult.FirstEarningRate;
|
|
|
|
_analysisDatas.Add(analysisData);
|
|
}
|
|
|
|
winRate = winRate * 100 / _analysisDatas.Count();
|
|
|
|
labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}",
|
|
double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), _analysisDatas.Count());
|
|
|
|
treeList_ResultData.DataSource = _analysisDatas;
|
|
treeList_ResultData.RefreshDataSource();
|
|
}
|
|
|
|
// 분석 결과 저장 버튼 클릭 이벤트
|
|
private void simpleButton_SavaAnalysisData_Click(object sender, EventArgs e)
|
|
{
|
|
// 결과 반영 체크 && Filter 된 노드만 리스트로 모음
|
|
var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true && Convert.ToBoolean(item["Inclusion"]) == true);
|
|
|
|
// 저장할 데이터 리스트
|
|
var saveDataList = new List<AnalysisData>();
|
|
|
|
// 평균 승률 계산하기
|
|
double winRate = 0;
|
|
// 평균 수익률 계산하기
|
|
double profitRate = 0;
|
|
|
|
// 값이 있으면 저장
|
|
if (nodeList != null && nodeList.Count() > 0)
|
|
{
|
|
foreach (var node in nodeList)
|
|
{
|
|
var data = (AnalysisData)treeList_ResultData.GetDataRecordByNode(node);
|
|
|
|
// 승률 계산하기
|
|
|
|
if (data.WinFlag) winRate++;
|
|
|
|
// 수익률 계산하기
|
|
profitRate += data.EarningRate;
|
|
|
|
saveDataList.Add(data);
|
|
}
|
|
|
|
winRate = winRate * 100 / nodeList.Count();
|
|
}
|
|
|
|
// 저장 데이터 클래스 만들기
|
|
SavedAnalysisData savedAnalysisData = new SavedAnalysisData()
|
|
{
|
|
AnalysisDataList = saveDataList,
|
|
TreeListFilterString = treeList_ResultData.ActiveFilterString,
|
|
Description = textEdit_Description.Text,
|
|
FirstWinRate = winRate,
|
|
FirstProfitRate = profitRate,
|
|
SavedTime = DateTime.Now
|
|
};
|
|
|
|
// 저장 하기
|
|
if (FileManager.SavedResultAnalysisDataToFile(savedAnalysisData, _savedResultData.SavedResultAnalysisDataPath))
|
|
{
|
|
MessageBox.Show("데이터 저장 성공");
|
|
textEdit_Description.Text = "";
|
|
}
|
|
|
|
else
|
|
MessageBox.Show("데이터 저장 실패");
|
|
}
|
|
|
|
// 결과 분석 데이터 불러오기 버튼 클릭 이벤트
|
|
private void simpleButton_LoadAnalysisResultData_Click(object sender, EventArgs e)
|
|
{
|
|
var loadAnalysisResultDataForm = new LoadAnalysisResultDataForm(this);
|
|
loadAnalysisResultDataForm.StartPosition = FormStartPosition.CenterParent;
|
|
if(loadAnalysisResultDataForm.ShowDialog(this) == DialogResult.OK)
|
|
{
|
|
// 정상으로 데이터를 로드 하면
|
|
if(_savedAnalysisData != null)
|
|
{
|
|
treeList_ResultData.DataSource = _savedAnalysisData.AnalysisDataList;
|
|
treeList_ResultData.RefreshDataSource();
|
|
|
|
labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}",
|
|
double.Parse(_savedAnalysisData.FirstWinRate.ToString()), double.Parse(_savedAnalysisData.FirstProfitRate.ToString()),
|
|
_savedAnalysisData.AnalysisDataList.Count);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void simpleButton_resetData_Click(object sender, EventArgs e)
|
|
{
|
|
// 데이터 초기화
|
|
InitForm();
|
|
}
|
|
|
|
// Analysis 데이터 더블 클릭
|
|
private void treeList_ResultData_MouseDoubleClick(object sender, MouseEventArgs e)
|
|
{
|
|
var treeList = sender as TreeList;
|
|
|
|
if (treeList == null) return;
|
|
|
|
var hitInfo = treeList.CalcHitInfo(e.Location);
|
|
|
|
if (hitInfo.HitInfoType != HitInfoType.Cell) return;
|
|
|
|
var selectedResultData = (AnalysisData)treeList.GetDataRecordByNode(hitInfo.Node);
|
|
|
|
Million.SubForm.ChartViewerForm chartViewerForm = new Million.SubForm.ChartViewerForm();
|
|
chartViewerForm.Visible = true;
|
|
}
|
|
|
|
// 승률(수익률 계산)
|
|
private void simpleButton_WinRateProfitRate_Click(object sender, EventArgs e)
|
|
{
|
|
CalcurateProfitAndWinRate();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 승률 및 수익률 계산 함수
|
|
/// </summary>
|
|
private void CalcurateProfitAndWinRate()
|
|
{
|
|
// 승률 수익률 계산하기
|
|
// 결과 반영 체크 && Filter 된 노드만 리스트로 모음
|
|
var nodeList = treeList_ResultData.FindNodes(item => item.Visible == true && Convert.ToBoolean(item["Inclusion"]) == true);
|
|
// 평균 승률 계산하기
|
|
double winRate = 0;
|
|
// 평균 수익률 계산하기
|
|
double profitRate = 0;
|
|
|
|
// 값이 있으면 저장
|
|
if (nodeList != null && nodeList.Count() > 0)
|
|
{
|
|
foreach (var node in nodeList)
|
|
{
|
|
var data = (AnalysisData)treeList_ResultData.GetDataRecordByNode(node);
|
|
|
|
// 승률 계산하기
|
|
|
|
if (data.WinFlag) winRate++;
|
|
|
|
// 수익률 계산하기
|
|
profitRate += data.EarningRate;
|
|
}
|
|
|
|
winRate = winRate * 100 / nodeList.Count();
|
|
}
|
|
|
|
labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}",
|
|
double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), _analysisDatas.Count());
|
|
}
|
|
|
|
private void treeList_ResultData_SelectionChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
}
|
|
} |