Files
Million/Million Hunter/HunterSubForm/ResultViewerForm.cs
2023-05-09 17:33:06 +09:00

279 lines
11 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;
using Million.DbManagement;
using Million.IndicatorConditionSetup;
using Million.Manager;
using Million_Hunter.HunterSubForm;
namespace Million.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 List<IndicatorCoditionSetup> _totalIndicator;
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_SellRegularExpression.Text = _savedResultData.BuyRegularExpression;
textEdit_BuyRegularExpression.Text = _savedResultData.SellRegularExpression;
// Buy/Sell 리스트에 데이터 추가
treeList_BuySetupList.DataSource = _savedResultData.BuySetupList;
treeList_SellSetupList.DataSource = _savedResultData.SellSetupList;
treeList_BuySetupList.RefreshDataSource();
var buyIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.BuySetupList);
var sellIndicatorList = IndicatorSetupManager.InitDataSetup(_savedResultData.SellSetupList);
_totalIndicator = new List<IndicatorCoditionSetup>();
_totalIndicator.AddRange(buyIndicatorList);
_totalIndicator.AddRange(sellIndicatorList);
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.CoinFullName, 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 nodeList = treeList_ResultData.FindNodes(item => item.Visible == 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);
// 비고 저장
//data.Description =
}
winRate = winRate * 100 / nodeList.Count();
}
// 저장 데이터 클래스 만들기
SavedAnalysisData savedAnalysisData = new SavedAnalysisData()
{
AnalysisDataList = saveDataList,
TreeListFilterString = treeList_ResultData.ActiveFilterString.Replace("'", ""),
Description = textEdit_Description.Text,
FirstWinRate = winRate,
FirstProfitRate = profitRate,
ResultDataCount = saveDataList.Count,
SavedTime = DateTime.Now
};
// 저장 하기
if (DBConnection.QueryInsertExecuter_SavedAnalysisData(savedAnalysisData, _savedResultData))
{
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.Nodes.Clear();
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 selectedAnalysisData = (AnalysisData)treeList.GetDataRecordByNode(hitInfo.Node);
Million.SubForm.ChartViewerForm chartViewerForm = new Million.SubForm.ChartViewerForm(selectedAnalysisData,
_totalIndicator);
chartViewerForm.Visible = true;
}
// 승률(수익률 계산)
private void simpleButton_WinRateProfitRate_Click(object sender, EventArgs e)
{
CalcurateProfitAndWinRate();
}
/// <summary>
/// 승률 및 수익률 계산 함수
/// </summary>
public 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()), nodeList.Count());
}
private void treeList_ResultData_KeyUp(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Space:
var selections = treeList_ResultData.Selection;
foreach (var item in selections)
{
item["Inclusion"] = !Convert.ToBoolean(item["Inclusion"]);
}
break;
}
}
/// <summary>
/// 테스트보드 창 열기
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_TestBoard_Click(object sender, EventArgs e)
{
// 테스트 보드 창 만들기
TestBoardForm testBoard = new TestBoardForm(this);
testBoard.Show();
}
}
}