867 lines
38 KiB
C#
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);
|
|
|
|
}
|
|
}
|
|
} |