Files
Million/Million Hunter/HunterSubForm/ResultViewerForm.cs
2022-09-05 13:32:27 +09:00

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)
{
}
}
}