1. 영호 조건식 추가 진행중!!!!!

This commit is contained in:
USER002
2024-06-14 16:49:57 +09:00
parent 6d788f795a
commit 5bab59e2b2
11 changed files with 353 additions and 245 deletions

View File

@@ -34,13 +34,9 @@ namespace BitgetAPI.IndicatorConditionSetup
/// </summary>
public int Displacement { get; set; } = 26;
// 기준선 설정z
public CommonProperty.Indicator_IchmokuOverLine IndicatorIchmokuOverLine { get; set; }
// 캔들당 일목균형표 계산하기
public void calIchimokuData(List<CandleData> candleDatas, CandleData candleData)
{
// 현재 종가 인덱스
var endIndex = candleDatas.Count() - 1;

View File

@@ -0,0 +1,241 @@
using BitgetApi.Data;
using BitgetAPI.IndicatorConditionSetup;
using DevExpress.Utils.IoC;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BitgetAPI.IndicatorConditionSetup
{
public class IndicatorProcess
{
CommonProperty commonProperty = CommonProperty.Instance;
// 스레드 시작/종료 플래그
public bool Is_th_SignalInfo;
public List<object> checkedMarkets;
public List<object> intervalList;
// 신호검색 리스트 작성
// 신호 Long 상승 (구매)
public List<SignalInfoData> signals_LU = null;
// 신호 Short 하락 (구매)
public List<SignalInfoData> signals_SD = null;
// 검색현황 Long 하락 (판매)
public List<SignalInfoData> signals_LD = null;
// 검색현황 Short 상승 (판매)
public List<SignalInfoData> signals_SU = null;
public TimeSpan sesstionTime;
// 조건식 설정 상태
public bool checked구름떼상향돌파 = false;
public bool checked구름떼하향돌파 = false;
public bool 영호조건식_상향돌파 = false;
public bool 영호조건식_하향돌파 = false;
// 전봉이 구름떼 돌파후 시가가 구름떼 위에서 시작하는 것
// 전봉이 구름떼 하락후 시가가 구름떼 밑에서 시작하는 것
public void calProcess()
{
IchimokuConditionSetup ichimokuConditionSetup = new IchimokuConditionSetup();
MovingAverageConditionSetup movingAverageConditionSetup = new MovingAverageConditionSetup();
// 추후 공통화 및 소스정리 필요
while (true)
{
if (!Is_th_SignalInfo) break;
//Thread.Sleep(200);
var nowTime = DateTime.Now;
// 특정 시간 이후 삭제
foreach (var item in signals_LU.ToList())
{
// 시간 지나면 삭제
if (item.SignalStart + sesstionTime < nowTime)
{
signals_LU.Remove(item);
continue;
}
var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == item.MarketName);
var lastCandleData = findedMarket.candleDataList[item.MCandleTimeType].OrderBy(i => i.Argument).ToList().Last();
if (lastCandleData.IchimokData != null)
{
if (checked구름떼상향돌파)
{
item.Price = lastCandleData.Close;
item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100;
item.IndicatorRate = (lastCandleData.Close / item.IndicatorPrice) * 100 - 100;
}
}
}
foreach (var item in signals_SD.ToList())
{
// 시간 지나면 삭제
if (item.SignalStart + sesstionTime < nowTime)
{
signals_SD.Remove(item);
continue;
}
var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == item.MarketName);
var lastCandleData = findedMarket.candleDataList[item.MCandleTimeType].OrderBy(i => i.Argument).ToList().Last();
if (lastCandleData.IchimokData != null)
{
if (checked구름떼하향돌파)
{
item.Price = lastCandleData.Close;
item.Rate = (lastCandleData.Close / lastCandleData.Open) * 100 - 100;
item.IndicatorRate = (lastCandleData.Close / item.IndicatorPrice) * 100 - 100;
}
}
}
foreach (var item in signals_LD.ToList())
if (item.SignalStart + sesstionTime < nowTime) signals_SU.Remove(item);
foreach (var item in signals_SU.ToList())
if (item.SignalStart + sesstionTime < nowTime) signals_SD.Remove(item);
// 체크된 마켓 정보
foreach (string market in checkedMarkets)
{
var findedMarket = commonProperty.candleDataLists.Find(i => i.ConGoodsData.MarketName == market);
foreach (CommonProperty.MCandleTimeType interval in Enum.GetValues(typeof(CommonProperty.MCandleTimeType)))
{
// Description
var description = Utils.Convertor.GetEnumDescription((Enum)interval);
if (!intervalList.Contains(description)) continue;
// 시간별로 정렬하기 (임시 리스트)
var candleDatas = findedMarket.candleDataList[interval];
var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList();
var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData);
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData);
candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1);
var candleData_전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전봉);
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전봉);
if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선
&& candleData.Close > candleData.IchimokData.상한선)
{
var price = candleData.Close;
var rate = (candleData.Close / candleData.Open) * 100 - 100;
var indicatorPrice = candleData.Open;
var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
var signalData = signals_LU.Find(i => i.MarketName.Equals(market));
// 없으면 생성
if (signalData == null)
{
SignalInfoData signalInfoData = new SignalInfoData();
signalInfoData.SignalStart = nowTime;
signalInfoData.MarketName = market;
signalInfoData.Description = string.Format("{0} 구름떼 상승", description);
signalInfoData.Rate = rate;
signalInfoData.Price = price;
signalInfoData.IndicatorPrice = indicatorPrice;
signalInfoData.IndicatorRate = indicatorRate;
signalInfoData.MCandleTimeType = interval;
signals_LU.Add(signalInfoData);
}
}
else if (checked구름떼상향돌파 && candleData_전봉.Open > candleData_전봉.IchimokData.하한선 && candleData.Open < candleData.IchimokData.하한선 && candleData.High < candleData.IchimokData.하한선
&& candleData.Close < candleData.IchimokData.하한선)
{
var price = candleData.Close;
var rate = (candleData.Close / candleData.Open) * 100 - 100;
var indicatorPrice = candleData.Open;
var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
var signalData = signals_SD.Find(i => i.MarketName.Equals(market));
// 없으면 생성
if (signalData == null)
{
SignalInfoData signalInfoData = new SignalInfoData();
signalInfoData.SignalStart = nowTime;
signalInfoData.MarketName = market;
signalInfoData.Description = string.Format("{0} 구름떼 하락", description);
signalInfoData.Rate = rate;
signalInfoData.Price = price;
signalInfoData.IndicatorPrice = indicatorPrice;
signalInfoData.IndicatorRate = indicatorRate;
signalInfoData.MCandleTimeType = interval;
signals_SD.Add(signalInfoData);
}
}
if (영호조건식_상향돌파 || 영호조건식_하향돌파)
{
candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1);
var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전봉);
// 24,72 높은값
var 높은값_74_21_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[21].Value);
// 24,72 낮은값
var 낮은값_74_21_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[21].Value);
// 24,72 높은값
var 높은값_74_21_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[21].Value);
// 24,72 낮은값
var 낮은값_74_21_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[21].Value);
if (영호조건식_상향돌파 &&
candleData_전봉.movingAverageDataList[72].Value < candleData_전봉.IchimokData.상한선)
{
}
else if (영호조건식_하향돌파)
{
if (낮은값_74_21_전봉 < candleData_전봉.IchimokData.하한선 &&
candleData_전봉.movingAverageDataList[4].Value < 낮은값_74_21_전봉)
{
}
}
}
}
}
}
}
public void calIchimokuProcess_Add()
{
}
public void calIchimokuProcess_Update()
{
}
}
}

View File

@@ -1,4 +1,6 @@
using BitgetAPI.Data;
using BitgetAPI.Data.IndicatorData;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -14,9 +16,41 @@ namespace BitgetAPI.IndicatorConditionSetup
// 이동 평균선 종류
public CommonProperty.MovingAverageType MovingAverageType { get; set; }
// 기간
public int CandleLegnth { get; set; }
public int CandleLegnth24 { get; set; } = 24;
// 기간
public int CandleLegnth4 { get; set; } = 4;
// 기간
public int CandleLegnth72 { get; set; } = 72;
// 가격
public CommonProperty.CandlePriceType MACandlePriceType { get; set; }
public CommonProperty.CandlePriceType MACandlePriceType { get; set; }
// 추후 업데이트 된것을 계산 안하는거 고려 !!!!
public void Cal_YHK_Downpublic(List<CandleData> candleDatas, CandleData candleData)
{
// 현재 종가 인덱스
var endIndex = candleDatas.Count() - 1;
if (candleData == null) return;
// Moving 없으면 생성
if (candleData.movingAverageDataList == null) candleData.movingAverageDataList = new Dictionary<int, MovingAverageData>();
candleData.movingAverageDataList.Add(CandleLegnth4, new MovingAverageData());
candleData.movingAverageDataList.Add(CandleLegnth24, new MovingAverageData());
candleData.movingAverageDataList.Add(CandleLegnth72, new MovingAverageData());
foreach(var item in candleData.movingAverageDataList)
{
// 전봉까지 만듬
var datas = candleDatas.FindAll(i =>
candleDatas.IndexOf(i) > endIndex - item.Key &&
candleDatas.IndexOf(i) <= endIndex);
candleData.movingAverageDataList[item.Key] = new MovingAverageData();
candleData.movingAverageDataList[item.Key].Value = datas.Sum(i => i.Close);
}
}
}
}