Files
Million/Million Hunter/HunterSubForm/TestBoardForm.cs
2023-05-23 09:27:20 +09:00

867 lines
38 KiB
C#

using DevExpress.XtraEditors;
using Million;
using Million.Data;
using Million.DbManagement;
using Million.HunterSubForm;
using Million.IndicatorConditionSetup;
using Million.Manager;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Million_Hunter.HunterSubForm
{
public partial class TestBoardForm : DevExpress.XtraEditors.XtraForm
{
ResultViewerForm parentForm = null;
List<AnalysisData> analysisDatas = null;
CommonProperty.MCandleTimeType MCandleTimeType;
bool ignoreChangedfilter = false;
public TestBoardForm(ResultViewerForm resultViewerForm)
{
InitializeComponent();
parentForm = resultViewerForm;
analysisDatas = parentForm._analysisDatas;
// 시간 단위 가져오기
var candleTimeTypeList = Enum.GetNames(enumType: typeof(CommonProperty.MCandleTimeType));
comboBoxEdit_defaultTime.Properties.Items.AddRange(candleTimeTypeList);
comboBoxEdit_defaultTime.SelectedText = "H1";
}
/// <summary>
/// 한시간 봉 채우기
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_FullInsertCandle_Click(object sender, EventArgs e)
{
// 시간 단위 설정 (AnalysisData에 추가하기)
// 조건식에 포함되는 시간 단위 가져오기 (IndicatorConditionSetup 을 여기에서 밖에 쓸 때가 없음)
var candleTypes = parentForm._totalIndicator.Select(t => t.MCandleTimeType).Distinct().ToList();
#region 기본 Indicator 데이터 생성하기
// Bol(40,1), Bol(40,2), Ichimoku(기본)
var _chartIndicatorCoditionSetups = new List<IndicatorCoditionSetup>();
_chartIndicatorCoditionSetups.Add(new BolingerConditionSetup()
{
IndicatorType = CommonProperty.IndicatorType.볼린저밴드,
Period = 40,
Squared = 1,
Description = "bol40_1",
MCandleTimeType = candleTypes.First()
}); ;
_chartIndicatorCoditionSetups.Add(new BolingerConditionSetup()
{
IndicatorType = CommonProperty.IndicatorType.볼린저밴드,
Period = 40,
Squared = 2,
Description = "bol40_2",
MCandleTimeType = candleTypes.First()
});
_chartIndicatorCoditionSetups.Add(new IchimokuConditionSetup()
{
IndicatorType = CommonProperty.IndicatorType.일목균형표,
ConversionPeriod = 9,
BaselinePeriod = 26,
LaggingSpan2Period = 52,
Displacement = 26,
Description = "ich",
MCandleTimeType = candleTypes.First()
});
#endregion
/*
Enum.TryParse(comboBoxEdit_defaultTime.SelectedItem.ToString(),
out CommonProperty.MCandleTimeType mCandleTimeType);
*/
MCandleTimeType = CommonProperty.MCandleTimeType.H1;
//차트 Date Time 설정하기
var StartDateInterval = 80 * 30;
var EndDateInterval = 100;
foreach(var analysisData in parentForm._analysisDatas)
{
var startDate = analysisData.StartDate;
var endDate = analysisData.EndDate;
var chartStartDate = startDate;
var chartEndDate = endDate;
// Default : 1 시간
// 추가 : 4, 8,
switch (candleTypes.First())
{
case CommonProperty.MCandleTimeType.H1:
chartStartDate = startDate - new TimeSpan(0, StartDateInterval, 0, 0);
chartEndDate = startDate + new TimeSpan(0, EndDateInterval, 0, 0);
// annotation 추가 시 Datetime 비교를 위해 00분으로 변환
startDate = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd HH:00"));
endDate = Convert.ToDateTime(endDate.ToString("yyyy-MM-dd HH:00"));
break;
case CommonProperty.MCandleTimeType.H4:
chartStartDate = startDate - new TimeSpan(0, StartDateInterval * 4, 0, 0);
chartEndDate = startDate + new TimeSpan(0, EndDateInterval * 4, 0, 0);
startDate = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd HH:00"));
endDate = Convert.ToDateTime(endDate.ToString("yyyy-MM-dd HH:00"));
break;
case CommonProperty.MCandleTimeType.M1:
chartStartDate = startDate - new TimeSpan(0, 0, StartDateInterval, 0);
chartEndDate = startDate + new TimeSpan(0, 0, EndDateInterval, 0);
break;
case CommonProperty.MCandleTimeType.M10:
case CommonProperty.MCandleTimeType.M5:
case CommonProperty.MCandleTimeType.M3:
case CommonProperty.MCandleTimeType.M30:
case CommonProperty.MCandleTimeType.M15:
break;
case CommonProperty.MCandleTimeType.D1:
chartStartDate = startDate - new TimeSpan(StartDateInterval, 0, 0, 0);
chartEndDate = startDate + new TimeSpan(EndDateInterval, 0, 0, 0);
startDate = Convert.ToDateTime(startDate.ToString("yyyy-MM-dd"));
endDate = Convert.ToDateTime(endDate.ToString("yyyy-MM-dd"));
break;
}
var dic = DataManager.GetStandardData(_chartIndicatorCoditionSetups, chartStartDate, chartEndDate, analysisData.OriginalSearchResult.MarketData
, _chartIndicatorCoditionSetups, true, candleTypes);
var dic_4 = DataManager.GetConvertCandleDataList(dic[CommonProperty.MCandleTimeType.H1], CommonProperty.MCandleTimeType.H4);
foreach (var setup in _chartIndicatorCoditionSetups)
{
setup.excute(dic_4);
}
var dic_8 = DataManager.GetConvertCandleDataList(dic[CommonProperty.MCandleTimeType.H1], CommonProperty.MCandleTimeType.H8);
foreach (var setup in _chartIndicatorCoditionSetups)
{
setup.excute(dic_8);
}
var dic_12 = DataManager.GetConvertCandleDataList(dic[CommonProperty.MCandleTimeType.H1], CommonProperty.MCandleTimeType.H12);
foreach (var setup in _chartIndicatorCoditionSetups)
{
setup.excute(dic_12);
}
var dic_1d = DataManager.GetConvertCandleDataList(dic[CommonProperty.MCandleTimeType.H1], CommonProperty.MCandleTimeType.D1);
foreach (var setup in _chartIndicatorCoditionSetups)
{
setup.excute(dic_1d);
}
dic.Add(CommonProperty.MCandleTimeType.H4, dic_4);
dic.Add(CommonProperty.MCandleTimeType.H8, dic_8);
dic.Add(CommonProperty.MCandleTimeType.H12, dic_12);
dic.Add(CommonProperty.MCandleTimeType.D1, dic_1d);
if (analysisData.CandleDatas != null)
{
analysisData.CandleDatas.Clear();
analysisData.CandleDatas = null;
}
analysisData.CandleDatas = dic;
}
MessageBox.Show("캔들 데이터 불러오기 완료");
}
/// <summary>
/// 데이터 초기화
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void simpleButton_Reset_Click(object sender, EventArgs e)
{
resetFilter();
ignoreChangedfilter = true;
checkEdit_구매이전봉볼린저40_1이하.Checked = false;
checkEdit_이전봉40_2볼린저이하.Checked = false;
ignoreChangedfilter = false;
parentForm.treeList_ResultData.RefreshDataSource();
parentForm.CalcurateProfitAndWinRate();
}
public void resetFilter()
{
// 구매 시점 이전 봉 40 1 볼린저 값 이하
foreach (var analysisData in parentForm._analysisDatas)
{
analysisData.Inclusion = true;
analysisData.Description = "";
}
}
public void calcurateFilter()
{
// 필터 초기화
resetFilter();
// 이전봉40_2볼린저이하
if (checkEdit_이전봉40_2볼린저이하.Checked)
{
// 구매 시점 이전 봉 40 1 볼린저 값 이하
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = analysisData.StartDate;
var endDate = analysisData.EndDate;
if (checkEdit_이전봉40_2볼린저이하.Checked)
{
var 구매이전봉 = startDate;
//차트 Date Time 설정하기
var StartDateInterval = -1;
구매이전봉 = changeDatetimeFormat(구매이전봉, StartDateInterval);
var candleData = analysisData.CandleDatas[MCandleTimeType].Find(item => item.DateTime == 구매이전봉);
// 시간대 캔들이 없으면 결과에서 제외
if (candleData == null)
{
analysisData.Description = "[오류:캔들없음]" + analysisData.Description;
analysisData.Inclusion = false;
continue;
}
var highValue = candleData.HighValue;
var bol402 = candleData.IndicatorDic["Bol402"]?.value;
if (bol402 != null)
{
// 제외된 조건인 아닌 경우
if (analysisData.Inclusion)
{
if (highValue < bol402)
{
analysisData.Inclusion = true;
analysisData.Description = '[' + checkEdit_이전봉40_2볼린저이하.Text + ']' + analysisData.Description;
}
else
analysisData.Inclusion = false;
}
}
}
}
}
// 이전봉40_1볼린저이하
if (checkEdit_구매이전봉볼린저40_1이하.Checked)
{
// 구매 시점 이전 봉 40 1 볼린저 값 이하
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = analysisData.StartDate;
var endDate = analysisData.EndDate;
if (checkEdit_구매이전봉볼린저40_1이하.Checked)
{
var 구매이전봉 = startDate;
//차트 Date Time 설정하기
var StartDateInterval = -1;
구매이전봉 = changeDatetimeFormat(구매이전봉, StartDateInterval);
var candleData = analysisData.CandleDatas[MCandleTimeType].Find(item => item.DateTime == 구매이전봉);
// 시간대 캔들이 없으면 결과에서 제외
if (candleData == null)
{
analysisData.Description = "[오류:캔들없음]" + analysisData.Description;
analysisData.Inclusion = false;
continue;
}
var highValue = candleData.HighValue;
var bol401 = candleData.IndicatorDic["Bol401"]?.value;
if (bol401 != null)
{
// 제외된 조건인 아닌 경우
if (analysisData.Inclusion)
{
if (highValue < bol401)
{
analysisData.Inclusion = true;
analysisData.Description = '[' + checkEdit_이전봉40_2볼린저이하.Text + ']' + analysisData.Description;
}
else
analysisData.Inclusion = false;
}
}
else
{
}
}
}
}
if (checkEdit_구름떼상한선하락시판매.Checked)
{
// 평균 승률 계산하기
double winRate = 0;
// 평균 수익률 계산하기
double profitRate = 0;
var count__ = 0;
var count_2 = 0;
var count_3 = 0;
foreach (var analysisData in parentForm._analysisDatas)
{
if (!analysisData.Inclusion) continue;
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var endDate = changeDatetimeFormat(analysisData.EndDate, 0);
var candleData = analysisData.CandleDatas.First().Value.Find(item => item.DateTime > startDate && item.DateTime < endDate &&
item.IndicatorDic["Ich2695226"]?.value != null && ((IchimokData)item.IndicatorDic["Ich2695226"]).GetOverValue() > item.LowValue);
if (candleData != null)
{
var endResut = changeDatetimeFormat(candleData.DateTime, 0);
var ichValue = ((IchimokData)candleData.IndicatorDic["Ich2695226"]).GetOverValue();
if (ichValue > analysisData.BuyValue)
{
analysisData.WinFlag = true;
}
else
{
analysisData.WinFlag = false;
}
analysisData.EarningRate = analysisData.EarningRate = (-100 + (ichValue / analysisData.BuyValue) * 100);
if (analysisData.EarningRate < -4)
{
}
}
}
var allCount = parentForm._analysisDatas.Count(item => item.Inclusion == true);
winRate = winRate * 100 / allCount;
MessageBox.Show(string.Format("승률 : {0:0.00} % 수익률 : {1:0.00} % 개수 : {2}",
double.Parse(winRate.ToString()), double.Parse(profitRate.ToString()), allCount.ToString()) );
}
if (checkEdit_구매전봉기준가중이동평균5봉이40봉크로스이후구매.Checked)
{
var Interval_5 = 5;
var Interval_40 = 40;
// 분모 구하기
var 분모5일 = 0;
var 분모40일 = 0;
for (int i = 1; i <= Interval_5; i++) 분모5일 += i;
for (int i=1; i<=Interval_40; i++) 분모40일 += i;
var ttt = parentForm._totalIndicator.First().MCandleTimeType;
foreach (var analysisData in parentForm._analysisDatas)
{
// 현재 시간 데이터 포함
var 구매이전봉_5일전거래시간 = changeDatetimeFormat(analysisData.StartDate, -Interval_5);
var 구매이전봉_40일전거래시간 = changeDatetimeFormat(analysisData.StartDate, -Interval_40);
var 구매이전봉_거래시간 = changeDatetimeFormat(analysisData.StartDate, -1);
var 가중이동평균5일 = 0.0;
var 가중이동평균40일 = 0.0;
int count_40 = Interval_40;
int count_5 = Interval_5;
var curDateTime = 구매이전봉_거래시간;
while (curDateTime >= 구매이전봉_40일전거래시간)
{
var candleData = analysisData.CandleDatas[MCandleTimeType].Find(item => item.DateTime == curDateTime);
var 거래량 = 0.0;
// 데이터가 없으면 거래량 0으로 사용
if (candleData == null) 거래량 = 0;
else 거래량 = Convert.ToDouble(candleData.MoneyVolume);
// 5일치 누적 및 계산이 끝났으면 그만 계산
if (curDateTime >= 구매이전봉_5일전거래시간)
{
가중이동평균5일 += count_5 * 거래량;
}
// 5일 계산
if (curDateTime == 구매이전봉_5일전거래시간)
{
가중이동평균5일 /= 분모5일;
// 5일 계산
거래량 = 0.0;
}
// 40일 누적
가중이동평균40일 += count_40 * 거래량;
// 40일 계산
if (curDateTime == 구매이전봉_40일전거래시간)
{
가중이동평균40일 /= 분모40일;
}
curDateTime = changeDatetimeFormat(curDateTime, -1);
count_40--;
count_5--;
}
// 제외된 조건인 아닌 경우 (만족 조건 중에서만 검색)
if (analysisData.Inclusion)
{
var result = false;
if (가중이동평균5일 > 가중이동평균40일)
{
result = true;
analysisData.Inclusion = true;
}
else
{
result = false;
analysisData.Inclusion = false;
}
analysisData.Description = string.Format("[{0},5일:{1:0.0},40일:{2:0.0}]",result, 가중이동평균5일, 가중이동평균40일);
}
}
}
if (checkEdit_종목보유수별수익률계산.Checked)
{
var coinCount = Convert.ToInt32(textEdit_종목보유수별수익률계산.Text);
//r Con
//inCount =
}
// 종가 판매
if (checkEdit_종가시간판매.Checked)
{
// 종가 판매 봉기준
var candleInterval = Convert.ToInt32(textEdit_종가시간판매.Text);
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var endDate = changeDatetimeFormat(analysisData.EndDate, 0);
var 종가판매기준시간 = changeDatetimeFormat(startDate, candleInterval);
if (analysisData.Inclusion)
{
if (changeDatetimeFormat(endDate, 0) > 종가판매기준시간)
{
var data = analysisData.CandleDatas.First().Value.Find(item => item.DateTime == 종가판매기준시간);
if(data == null)
{
var date = new DateTime();
date = 종가판매기준시간;
while (data == null)
{
date = changeDatetimeFormat(date, -1);
data = analysisData.CandleDatas.First().Value.Find(item => item.DateTime == date);
}
}
// 수익률 구하기
analysisData.EarningRate = (-100 + (data.EndValue / analysisData.BuyValue) * 100);
analysisData.WinFlag = analysisData.EarningRate > 0 ? true : false;
analysisData.SellValue = data.EndValue;
}
}
continue;
}
}
if(checkEdit_시가구름떼위에서시작.Checked)
{
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var data = analysisData.CandleDatas.First().Value.Find(item => item.DateTime == startDate);
var maxich = Math.Max(((IchimokData)data.IndicatorDic["Ich2695226"]).value, ((IchimokData)data.IndicatorDic["Ich2695226"]).value2);
if (analysisData.Inclusion)
if (maxich >= data.StartValue) analysisData.Inclusion = false;
}
}
if (checkEdit_시가가볼린저401보다작음.Checked)
{
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var data = analysisData.CandleDatas.First().Value.Find(item => item.DateTime == startDate);
if (analysisData.Inclusion)
if (data.IndicatorDic["Bol401"].value <= data.StartValue) analysisData.Inclusion = false;
}
}
if(checkEdit_4시간_8시간구름떼위.Checked)
{
foreach (var analysisData in parentForm._analysisDatas)
{
if (!analysisData.Inclusion) continue;
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var data = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H1].Find(item => item.DateTime == startDate);
var data4 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H4].Find(item => changeDatetimeFormat(startDate, -4) <= item.DateTime && item.DateTime <= startDate);
if (data4 == null)
{
var dateT4 = new DateTime();
dateT4 = startDate;
while (data4 == null)
{
data4 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H4].Find(item => changeDatetimeFormat(dateT4, -4) <= item.DateTime && item.DateTime <= dateT4);
dateT4 = changeDatetimeFormat(dateT4, -4);
}
}
var data8 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H8].Find(item => changeDatetimeFormat(startDate, -8) <= item.DateTime && item.DateTime <= startDate);
if (data8 == null)
{
var dateT8 = new DateTime();
dateT8 = startDate;
while (data8 == null)
{
data8 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H8].Find(item => changeDatetimeFormat(dateT8, -8) <= item.DateTime && item.DateTime <= dateT8);
dateT8 = changeDatetimeFormat(dateT8, -8);
}
}
var maxich = Math.Max(((IchimokData)data.IndicatorDic["Ich2695226"]).value, ((IchimokData)data.IndicatorDic["Ich2695226"]).value2);
var maxich4 = Math.Max(((IchimokData)data4.IndicatorDic["Ich2695226"]).value, ((IchimokData)data4.IndicatorDic["Ich2695226"]).value2);
var maxich8 = Math.Max(((IchimokData)data8.IndicatorDic["Ich2695226"]).value, ((IchimokData)data8.IndicatorDic["Ich2695226"]).value2);
if(analysisData.Inclusion)
if (maxich8 >= data8.StartValue || maxich4 >= data4.StartValue) analysisData.Inclusion = false;
}
}
if(checkEdit_4시간_8시간구름떼위_양봉.Checked)
{
foreach (var analysisData in parentForm._analysisDatas)
{
if (!analysisData.Inclusion) continue;
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var data = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H1].Find(item => item.DateTime == startDate);
var data4 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H4].Find(item => changeDatetimeFormat(startDate, -4) <= item.DateTime && item.DateTime <= startDate);
if (data4 == null)
{
var dateT4 = new DateTime();
dateT4 = startDate;
while (data4 == null)
{
data4 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H4].Find(item => changeDatetimeFormat(dateT4, -4) <= item.DateTime && item.DateTime <= dateT4);
dateT4 = changeDatetimeFormat(dateT4, -4);
}
}
var data8 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H8].Find(item => changeDatetimeFormat(startDate, -8) <= item.DateTime && item.DateTime <= startDate);
if (data8 == null)
{
var dateT8 = new DateTime();
dateT8 = startDate;
while (data8 == null)
{
data8 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H8].Find(item => changeDatetimeFormat(dateT8, -8) <= item.DateTime && item.DateTime <= dateT8);
dateT8 = changeDatetimeFormat(dateT8, -8);
}
}
var data12 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H12].Find(item => changeDatetimeFormat(startDate, -12) <= item.DateTime && item.DateTime <= startDate);
if (data12 == null)
{
var dateT12 = new DateTime();
dateT12 = startDate;
while (data12 == null)
{
data12 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.H12].Find(item => changeDatetimeFormat(dateT12, -12) <= item.DateTime && item.DateTime <= dateT12);
dateT12 = changeDatetimeFormat(dateT12, -12);
}
}
var data24 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.D1].Find(item => changeDatetimeFormat(startDate, -24) <= item.DateTime && item.DateTime <= startDate);
if (data24 == null)
{
var dateT24 = new DateTime();
dateT24 = startDate;
while (data24 == null)
{
data24 = analysisData.CandleDatas[CommonProperty.MCandleTimeType.D1].Find(item => changeDatetimeFormat(dateT24, -24) <= item.DateTime && item.DateTime <= dateT24);
dateT24 = changeDatetimeFormat(dateT24, -24);
}
}
var maxich = Math.Max(((IchimokData)data.IndicatorDic["Ich2695226"]).value, ((IchimokData)data.IndicatorDic["Ich2695226"]).value2);
var maxich4 = Math.Max(((IchimokData)data4.IndicatorDic["Ich2695226"]).value, ((IchimokData)data4.IndicatorDic["Ich2695226"]).value2);
var maxich8 = Math.Max(((IchimokData)data8.IndicatorDic["Ich2695226"]).value, ((IchimokData)data8.IndicatorDic["Ich2695226"]).value2);
var maxich12 = Math.Max(((IchimokData)data12.IndicatorDic["Ich2695226"]).value, ((IchimokData)data12.IndicatorDic["Ich2695226"]).value2);
//var maxichD1 = Math.Max(((IchimokData)data24.IndicatorDic["Ich2695226"]).value, ((IchimokData)data24.IndicatorDic["Ich2695226"]).value2);
if (analysisData.Inclusion)
{
//if (!(maxichD1 < data24.StartValue && maxich12 < data12.StartValue && maxich8 < data8.StartValue && maxich4 < data4.StartValue
if(!(maxich12 < data12.StartValue && maxich8 < data8.StartValue && maxich4 < data4.StartValue
//&& data12.IndicatorDic["Bol401"].value < data12.StartValue
// && data8.IndicatorDic["Bol401"].value < data8.StartValue
// && data4.IndicatorDic["Bol401"].value < data4.StartValue
)) analysisData.Inclusion = false;
}
}
}
if(checkEdit_구름떼돌파몇봉이내.Checked)
{
var timeInterval = Convert.ToInt32(textEdit_구름떼돌파몇봉이내.Text);
foreach (var analysisData in parentForm._analysisDatas)
{
if (analysisData.Inclusion)
{
var 몇봉이내이전봉시간 = changeDatetimeFormat(analysisData.StartDate, -timeInterval -1);
var data = analysisData.CandleDatas.First().Value.Find(item => item.DateTime == 몇봉이내이전봉시간);
if (data == null)
{
analysisData.Description += "데이터 없음" + analysisData.Description;
continue;
}
var ichData = (IchimokData)data.IndicatorDic["Ich2695226"];
if (data.HighValue < Math.Max(ichData.value2, ichData.value2))
{
analysisData.Inclusion = true;
}
else analysisData.Inclusion = false;
}
}
}
if (checkEdit_시가볼린저40_1아래.Checked)
{
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var data = analysisData.CandleDatas.First().Value.Find(item => item.DateTime == startDate);
if (data == null)
{
analysisData.Description += "데이터 없음" + analysisData.Description;
continue;
}
if (analysisData.Inclusion)
{
if (data.StartValue < data.IndicatorDic["Bol401"].value) analysisData.Inclusion = true;
else analysisData.Inclusion = false;
}
}
}
if (checkEdit_시가구름떼위.Checked)
{
foreach (var analysisData in parentForm._analysisDatas)
{
var startDate = changeDatetimeFormat(analysisData.StartDate, 0);
var data = analysisData.CandleDatas.First().Value.Find(item => item.DateTime == startDate);
if (data == null)
{
analysisData.Description += "데이터 없음" + analysisData.Description;
continue;
}
if (analysisData.Inclusion)
{
var ichData = (IchimokData)data.IndicatorDic["Ich2695226"];
if (data.StartValue > Math.Max(ichData.value, ichData.value2)) analysisData.Inclusion = true;
else analysisData.Inclusion = false;
}
}
}
parentForm.CalcurateProfitAndWinRate();
parentForm.treeList_ResultData.RefreshDataSource();
}
/// <summary>
/// 시간/분/일 등의 Datetime 과 비교하기 위한 Format String 변경 함수
/// </summary>
/// <param name="dateTime"></param>
/// <param name="StartDateInterval"></param>
/// <returns></returns>
public DateTime changeDatetimeFormat(DateTime dateTime, int StartDateInterval)
{
var _dateTime = dateTime;
switch (MCandleTimeType)
{
case CommonProperty.MCandleTimeType.H1:
_dateTime = Convert.ToDateTime(dateTime.ToString("yyyy-MM-dd HH:00")) + new TimeSpan(0, StartDateInterval, 0, 0);
break;
case CommonProperty.MCandleTimeType.H4:
_dateTime = Convert.ToDateTime(dateTime.ToString("yyyy-MM-dd HH:00")) + new TimeSpan(0, StartDateInterval * 4, 0, 0);
break;
case CommonProperty.MCandleTimeType.M1:
break;
case CommonProperty.MCandleTimeType.M10:
case CommonProperty.MCandleTimeType.M5:
case CommonProperty.MCandleTimeType.M3:
case CommonProperty.MCandleTimeType.M30:
case CommonProperty.MCandleTimeType.M15:
break;
case CommonProperty.MCandleTimeType.D1:
_dateTime = Convert.ToDateTime(dateTime.ToString("yyyy-MM-dd")) + new TimeSpan(StartDateInterval, 0, 0, 0);
break;
}
return _dateTime;
}
/// <summary>
/// 이전봉40_2볼린저이하
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void checkEdit_common_CheckedChanged(object sender, EventArgs e)
{
if(!ignoreChangedfilter)
{
calcurateFilter();
}
}
private void simpleButton_찬_Click(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Step = 1;
progressBar1.Value = 0;
progressBar1.Maximum = parentForm._analysisDatas.Count;
new Thread(() => test11()).Start();
}
private void test11()
{
var _chartIndicatorCoditionSetups = new List<IndicatorCoditionSetup>();
_chartIndicatorCoditionSetups.Add(new BolingerConditionSetup()
{
IndicatorType = CommonProperty.IndicatorType.볼린저밴드,
Period = 40,
Squared = 1,
Description = "bol40_1",
MCandleTimeType = CommonProperty.MCandleTimeType.M1
}); ;
var lowAverArr = new List<double>();
var lowAverPlusArr = new List<double>();
foreach (var analysis in parentForm._analysisDatas)
{
if(analysis.BuyValue >= analysis.SellValue)
{
lowAverPlusArr.Add((analysis.SellValue - analysis.BuyValue) / analysis.BuyValue);
}
else
{
lowAverArr.Add((analysis.SellValue - analysis.BuyValue) / analysis.BuyValue);
}
UIController.next(this, progressBar1);
}
/*
foreach (var analysis in parentForm._analysisDatas)
{
var chartStartDate = analysis.StartDate;
var chartEndDate = analysis.EndDate;
var data = DbServiceFunctions.GetCandleData(analysis.OriginalSearchResult.MarketData, chartStartDate, chartEndDate, CommonProperty.MCandleTimeType.M1);
var selData = data.CandleDataLists_Im.Where(x => x.DateTime > chartStartDate && x.DateTime < chartEndDate).ToList();
if (selData.Count != 0)
{
var lowValue = selData.Min(x => x.LowValue);
if (analysis.BuyValue < analysis.SellValue)
{
lowAverPlusArr.Add((analysis.BuyValue - lowValue) / analysis.BuyValue);
}
else
{
lowAverArr.Add((analysis.BuyValue - lowValue) / analysis.BuyValue);
}
}
UIController.next(this, progressBar1);
}
*/
double aver = 0.0;
foreach(var low in lowAverArr)
{
aver += low;
}
aver = aver / lowAverArr.Count;
double aver2 = 0.0;
foreach (var low in lowAverPlusArr)
{
aver2 += low;
}
aver2 = aver2 / lowAverPlusArr.Count;
aver.ToString();
}
private void comboBoxEdit_defaultTime_SelectedIndexChanged(object sender, EventArgs e)
{
Enum.TryParse(comboBoxEdit_defaultTime.SelectedItem.ToString(),
out CommonProperty.MCandleTimeType mCandleTimeType);
}
}
}