317 lines
12 KiB
C#
317 lines
12 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);
|
|
}
|
|
|
|
var evaeragePurchasedCount = 0;
|
|
|
|
// 보유한 종목 수 계산
|
|
foreach (var item in _analysisDatas)
|
|
{
|
|
/**
|
|
* 사는 시점에 갖고 있는 Count 수로 정정
|
|
*/
|
|
|
|
var count = _analysisDatas.Count(t => t.StartDate <= item.StartDate && t.EndDate >= item.StartDate && t != item);
|
|
|
|
// Ts <= Os <= Te
|
|
// Ts <= Oe <= Te
|
|
//var count = _analysisDatas.Count(target => (target.StartDate <= item.StartDate && target.EndDate >= item.StartDate) ||
|
|
//(target.StartDate <= item.EndDate && target.EndDate >= item.EndDate)
|
|
//);
|
|
|
|
item.PurchasedCount = count;
|
|
evaeragePurchasedCount += count;
|
|
}
|
|
|
|
evaeragePurchasedCount /= _analysisDatas.Count();
|
|
|
|
winRate = winRate * 100 / _analysisDatas.Count();
|
|
|
|
labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2} 평균 보유 수 : {3}" ,
|
|
double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), _analysisDatas.Count(), evaeragePurchasedCount);
|
|
|
|
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;
|
|
// 종목 보유 수
|
|
var evaeragePurchasedCount = 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;
|
|
|
|
// 종목 보유 수 계산하기
|
|
// Ts <= Os <= Te
|
|
// Ts <= Oe <= Te
|
|
|
|
var count = nodeList.Count(target => (Convert.ToDateTime(target["StartDate"]) <= data.StartDate && Convert.ToDateTime(target["EndDate"]) >= data.StartDate) ||
|
|
(Convert.ToDateTime(target["StartDate"]) <= data.EndDate && Convert.ToDateTime(target["EndDate"]) >= data.EndDate)
|
|
);
|
|
|
|
evaeragePurchasedCount += count;
|
|
data.PurchasedCount = count;
|
|
}
|
|
|
|
winRate = winRate * 100 / nodeList.Count();
|
|
evaeragePurchasedCount /= nodeList.Count();
|
|
}
|
|
|
|
labelControl_WinRateProfitRate.Text = string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2} 평균 보유 수 : {3}",
|
|
double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), nodeList.Count(), evaeragePurchasedCount);
|
|
}
|
|
|
|
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();
|
|
}
|
|
}
|
|
} |