From c17b0baf5b33677e6a84da7e5a81c4c2d68bec93 Mon Sep 17 00:00:00 2001
From: kyh <1329522@naver.com>
Date: Mon, 19 May 2025 13:22:46 +0900
Subject: [PATCH] =?UTF-8?q?Macd,=20=EA=B0=80=EA=B2=A9=20Range=20SMA=20?=
=?UTF-8?q?=ED=8F=89=EA=B7=A0=EC=9C=BC=EB=A1=9C=20=ED=8C=90=EB=A7=A4=20?=
=?UTF-8?q?=EB=93=B1=20=EC=B6=94=EA=B0=80=ED=95=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
BitgetApi/BitgetApi.csproj | 1 +
.../IndicatorProcess.cs | 3587 ++---------------
.../TradingViewConditionSetup.cs | 258 ++
3 files changed, 496 insertions(+), 3350 deletions(-)
create mode 100644 BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs
diff --git a/BitgetApi/BitgetApi.csproj b/BitgetApi/BitgetApi.csproj
index 35695d9..573d09d 100644
--- a/BitgetApi/BitgetApi.csproj
+++ b/BitgetApi/BitgetApi.csproj
@@ -112,6 +112,7 @@
+
diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
index 8a1b60a..04d1a62 100644
--- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
+++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
@@ -1,4 +1,6 @@
-using BitgetApi.Data;
+
+using BitgetApi.Data;
+using BitgetApi.IndicatorConditionSetup;
using BitgetApi.IndicatorData;
using BitgetAPI.Data;
using BitgetAPI.WebService;
@@ -130,7 +132,7 @@ namespace BitgetAPI.IndicatorConditionSetup
var range = 34;
IchimokuConditionSetup ichimokuConditionSetup = new IchimokuConditionSetup();
MovingAverageConditionSetup movingAverageConditionSetup = new MovingAverageConditionSetup();
- ImpulseMacdConditionSetup impulseMacdConditionSetup = new ImpulseMacdConditionSetup();
+ TradingViewConditionSetup tradingViewConditionSetup = new TradingViewConditionSetup();
signals_LU.Clear();
signals_SD.Clear();
signals_LD.Clear();
@@ -275,10 +277,8 @@ namespace BitgetAPI.IndicatorConditionSetup
var candleData_Main = candleDatas_정렬_Temp[i];
if (candleData_Main == null) continue;
-
- totalImperseMACDData[market + strInterval].Add(candleData_Main.Argument, impulseMacdConditionSetup.AddDataPoint(candleData_Main.High, candleData_Main.Low, candleData_Main.Close, true));
-
+
candleDatas_Temp_List.Add(candleData_Main);
ichimokuConditionSetup.calIchimokuData(candleDatas_Temp_List, candleData_Main);
@@ -298,163 +298,156 @@ namespace BitgetAPI.IndicatorConditionSetup
else {
if(nowTime.Minute > 0 && nowTime.Hour == 24)
전저고점Flag = true;
- }
- var keys = totalImperseMACDData[market + strInterval].Keys.OrderBy(t => t).ToList();
-
-
- if (keys.Count > 500)
- {
- for (var i = 0; i < 250; i++)
- totalImperseMACDData[market + strInterval].Remove(keys[i]);
- }
+ }
if (!BuyShortStep.ContainsKey(market))
{
BuyShortStep[market] = 0;
BuyLongStep[market] = 0;
}
-
- if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m")))
+ if (!(전저고점.ContainsKey(market + "30m")))
continue;
+ //if (!(전저고점.ContainsKey(market + "1m") && 전저고점.ContainsKey(market + "5m") && 전저고점.ContainsKey(market + "30m")))
+ // continue;
+
#region 1분봉 처리
// 시간별로 정렬하기 (임시 리스트)
- var candleDatas = findedMarket.candleDataList[MCandleTimeType.M1];
- var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList();
+ //var candleDatas = findedMarket.candleDataList[MCandleTimeType.M1];
+ //var candleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList();
- var calMacdCandleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList();
+ //var calMacdCandleDatas_정렬 = candleDatas.OrderBy(i => i.Argument).ToList();
- var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
+ //var candleData = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
- if (candleData == null) continue;
+ //if (candleData == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData);
+ //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);
+ //candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1);
+ //var candleData_전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
- if (candleData_전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전봉);
+ //if (candleData_전봉 == null) continue;
+ //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);
+ //candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1);
+ //var candleData_전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
- if (candleData_전전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전봉);
+ //if (candleData_전전봉 == null) continue;
+ //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);
+ //candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1);
+ //var candleData_전전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
- if (candleData_전전전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전전봉);
+ //if (candleData_전전전봉 == null) continue;
+ //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);
+ //candleDatas_정렬.RemoveAt(candleDatas_정렬.Count - 1);
+ //var candleData_전전전전봉 = candleDatas.Find(i => i.Argument == candleDatas_정렬.Last().Argument);
- if (candleData_전전전전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전전전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전전전봉);
+ //if (candleData_전전전전봉 == null) continue;
+ //ichimokuConditionSetup.calIchimokuData(candleDatas_정렬, candleData_전전전전봉);
+ //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_정렬, candleData_전전전전봉);
#endregion
#region 5분봉 처리
// 시간별로 정렬하기 (임시 리스트)
- var candleDatas_5 = findedMarket.candleDataList[MCandleTimeType.M5];
- var candleDatas_5_정렬 = candleDatas_5.OrderBy(i => i.Argument).ToList();
+ //var candleDatas_5 = findedMarket.candleDataList[MCandleTimeType.M5];
+ //var candleDatas_5_정렬 = candleDatas_5.OrderBy(i => i.Argument).ToList();
- var candleData_5 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
+ //var candleData_5 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
- if (candleData_5 == null) continue;
+ //if (candleData_5 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5);
+ //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5);
+ //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5);
- candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
- var candleData_5_전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
+ //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
+ //var candleData_5_전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
- if (candleData_5_전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전봉);
+ //if (candleData_5_전봉 == null) continue;
+ //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전봉);
+ //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전봉);
- candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
- var candleData_5_전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
+ //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
+ //var candleData_5_전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
- if (candleData_5_전전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전봉);
+ //if (candleData_5_전전봉 == null) continue;
+ //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전봉);
+ //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전봉);
- candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
- var candleData_5_전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
+ //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
+ //var candleData_5_전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
- if (candleData_5_전전전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전봉);
+ //if (candleData_5_전전전봉 == null) continue;
+ //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전봉);
+ //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전봉);
- candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
- var candleData_5_전전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
+ //candleDatas_5_정렬.RemoveAt(candleDatas_5_정렬.Count - 1);
+ //var candleData_5_전전전전봉 = candleDatas_5.Find(i => i.Argument == candleDatas_5_정렬.Last().Argument);
- if (candleData_5_전전전전봉 == null) continue;
- ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전전봉);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전전봉);
+ //if (candleData_5_전전전전봉 == null) continue;
+ //ichimokuConditionSetup.calIchimokuData(candleDatas_5_정렬, candleData_5_전전전전봉);
+ //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_5_정렬, candleData_5_전전전전봉);
#endregion
#region 30분봉 처리
// 시간별로 정렬하기 (임시 리스트)
var candleDatas_30 = findedMarket.candleDataList[MCandleTimeType.M30];
var candleDatas_30_정렬 = candleDatas_30.OrderBy(i => i.Argument).ToList();
-
+ var candleDatas_30_TempList = candleDatas_30.OrderBy(i => i.Argument).ToList();
var candleData_30 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument);
if (candleData_30 == null) continue;
-
ichimokuConditionSetup.calIchimokuData(candleDatas_30_정렬, candleData_30);
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30);
- var macdData_30 = new ImpulseMacdData();
+ //var macdData_30 = new ImpulseMacdData();
- var imperseMacd_keys_30 = totalImperseMACDData[market + "30m"].Keys.OrderBy(t => t).ToList();
+ //var imperseMacd_keys_30 = totalImperseMACDData[market + "30m"].Keys.OrderBy(t => t).ToList();
- if (imperseMacd_keys_30.LastOrDefault() < candleData_30.Argument)
- {
- macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, true);
- totalImperseMACDData[market + "30m"].Add(candleData_30.Argument, macdData_30);
- }
- else
- {
- macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, false);
- totalImperseMACDData[market + "30m"][candleData_30.Argument] = macdData_30;
- }
+ //if (imperseMacd_keys_30.LastOrDefault() < candleData_30.Argument)
+ //{
+ // macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, true);
+ // totalImperseMACDData[market + "30m"].Add(candleData_30.Argument, macdData_30);
+ //}
+ //else
+ //{
+ // macdData_30 = impulseMacdConditionSetup.AddDataPoint(candleData_30.High, candleData_30.Low, candleData_30.Close, false);
+ // totalImperseMACDData[market + "30m"][candleData_30.Argument] = macdData_30;
+ //}
- if (candleData_30.impulseMacdDataList == null) candleData_30.impulseMacdDataList = new Dictionary();
- if (candleData_30.impulseMacdDataList.ContainsKey(30)) candleData_30.impulseMacdDataList[30] = new ImpulseMacdData();
+ //if (candleData_30.impulseMacdDataList == null) candleData_30.impulseMacdDataList = new Dictionary();
+ //if (candleData_30.impulseMacdDataList.ContainsKey(30)) candleData_30.impulseMacdDataList[30] = new ImpulseMacdData();
- candleData_30.impulseMacdDataList[30] = macdData_30;
- var macdData_5 = new ImpulseMacdData();
+ //candleData_30.impulseMacdDataList[30] = macdData_30;
+ //var macdData_5 = new ImpulseMacdData();
- var imperseMacd_keys_5 = totalImperseMACDData[market + "5m"].Keys.OrderBy(t => t).ToList();
+ //var imperseMacd_keys_5 = totalImperseMACDData[market + "5m"].Keys.OrderBy(t => t).ToList();
- if (imperseMacd_keys_5.LastOrDefault() < candleData_5.Argument)
- {
- macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, true);
- totalImperseMACDData[market + "5m"].Add(candleData_5.Argument, macdData_5);
- }
- else
- {
- macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, false);
- totalImperseMACDData[market + "5m"][candleData_5.Argument] = macdData_5;
- }
+ //if (imperseMacd_keys_5.LastOrDefault() < candleData_5.Argument)
+ //{
+ // macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, true);
+ // totalImperseMACDData[market + "5m"].Add(candleData_5.Argument, macdData_5);
+ //}
+ //else
+ //{
+ // macdData_5 = impulseMacdConditionSetup.AddDataPoint(candleData_5.High, candleData_5.Low, candleData_5.Close, false);
+ // totalImperseMACDData[market + "5m"][candleData_5.Argument] = macdData_5;
+ //}
- if (candleData_5.impulseMacdDataList == null) candleData_5.impulseMacdDataList = new Dictionary();
- if (candleData_5.impulseMacdDataList.ContainsKey(5)) candleData_5.impulseMacdDataList[5] = new ImpulseMacdData();
- candleData_30.impulseMacdDataList[5] = macdData_5;
+ //if (candleData_5.impulseMacdDataList == null) candleData_5.impulseMacdDataList = new Dictionary();
+ //if (candleData_5.impulseMacdDataList.ContainsKey(5)) candleData_5.impulseMacdDataList[5] = new ImpulseMacdData();
+ //candleData_30.impulseMacdDataList[5] = macdData_5;
candleDatas_30_정렬.RemoveAt(candleDatas_30_정렬.Count - 1);
var candleData_30_전봉 = candleDatas_30.Find(i => i.Argument == candleDatas_30_정렬.Last().Argument);
@@ -486,71 +479,71 @@ namespace BitgetAPI.IndicatorConditionSetup
movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas_30_정렬, candleData_30_전전전전봉);
#endregion
- if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선
- && candleData.Close > candleData.IchimokData.상한선)
- {
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
+ //if (checked구름떼상향돌파 && candleData_전봉.Open < candleData_전봉.IchimokData.상한선 && candleData.Open > candleData.IchimokData.상한선 && candleData.Low > candleData.IchimokData.상한선
+ // && candleData.Close > candleData.IchimokData.상한선)
+ //{
+ // var indicatorPrice = candleData.Open;
+ // var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
- var description = string.Format("{0} 구름떼 상승", strInterval);
- var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
+ // var description = string.Format("{0} 구름떼 상승", strInterval);
+ // var signalData = signals_LU.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
- // 없으면 생성
- if (signalData == null)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
+ // // 없으면 생성
+ // if (signalData == null)
+ // {
+ // var price = candleData.Close;
+ // var rate = (candleData.Close / candleData.Open) * 100 - 100;
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
+ // SignalInfoData signalInfoData = new SignalInfoData();
+ // signalInfoData.SignalStart = nowTime;
+ // signalInfoData.MarketName = market;
+ // signalInfoData.Description = description;
+ // signalInfoData.Rate = rate;
+ // signalInfoData.Price = price;
+ // signalInfoData.IndicatorPrice = indicatorPrice;
+ // signalInfoData.IndicatorRate = indicatorRate;
+ // signalInfoData.MCandleTimeType = interval;
- signals_LU.Add(signalInfoData);
- }
+ // signals_LU.Add(signalInfoData);
+ // }
- }
- else if (checked구름떼상향돌파 && candleData_전봉.Open > candleData_전봉.IchimokData.하한선 && candleData.Open < candleData.IchimokData.하한선 && candleData.High < candleData.IchimokData.하한선
- && candleData.Close < candleData.IchimokData.하한선)
- {
+ //}
+ //else if (checked구름떼상향돌파 && candleData_전봉.Open > candleData_전봉.IchimokData.하한선 && candleData.Open < candleData.IchimokData.하한선 && candleData.High < candleData.IchimokData.하한선
+ // && candleData.Close < candleData.IchimokData.하한선)
+ //{
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
+ // var indicatorPrice = candleData.Open;
+ // var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
- var description = string.Format("{0} 구름떼 하락", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
+ // var description = string.Format("{0} 구름떼 하락", strInterval);
+ // var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
- // 없으면 생성
- if (signalData == null)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
+ // // 없으면 생성
+ // if (signalData == null)
+ // {
+ // var price = candleData.Close;
+ // var rate = (candleData.Close / candleData.Open) * 100 - 100;
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
+ // SignalInfoData signalInfoData = new SignalInfoData();
+ // signalInfoData.SignalStart = nowTime;
+ // signalInfoData.MarketName = market;
+ // signalInfoData.Description = description;
+ // signalInfoData.Rate = rate;
+ // signalInfoData.Price = price;
+ // signalInfoData.IndicatorPrice = indicatorPrice;
+ // signalInfoData.IndicatorRate = indicatorRate;
+ // signalInfoData.MCandleTimeType = interval;
- signals_SD.Add(signalInfoData);
- }
- }
+ // signals_SD.Add(signalInfoData);
+ // }
+ //}
if (영호조건식_상향돌파 || 영호조건식_하향돌파)
{
#region Main 봉 계산
-
+ /*
var 전전전봉3 = candleData_전전전봉.movingAverageDataList[3].Value;
var 전전전봉4 = candleData_전전전봉.movingAverageDataList[4].Value;
var 전전전봉8 = candleData_전전전봉.movingAverageDataList[8].Value;
@@ -642,22 +635,23 @@ namespace BitgetAPI.IndicatorConditionSetup
var Bol12_Up = candleData.movingAverageDataList[12].BolangerValue_Up;
var Bol24_Up = candleData.movingAverageDataList[24].BolangerValue_Up;
var Bol72_Up = candleData.movingAverageDataList[72].BolangerValue_Up;
+ */
#endregion
- var 현재봉3_5 = candleData_5.movingAverageDataList[3].Value;
- var 전봉3_5 = candleData_5_전봉.movingAverageDataList[3].Value;
- var 전전봉3_5 = candleData_5_전전봉.movingAverageDataList[3].Value;
- var 전전전봉3_5 = candleData_5_전전전봉.movingAverageDataList[3].Value;
+ //var 현재봉3_5 = candleData_5.movingAverageDataList[3].Value;
+ //var 전봉3_5 = candleData_5_전봉.movingAverageDataList[3].Value;
+ //var 전전봉3_5 = candleData_5_전전봉.movingAverageDataList[3].Value;
+ //var 전전전봉3_5 = candleData_5_전전전봉.movingAverageDataList[3].Value;
var 현재봉3_30 = candleData_30.movingAverageDataList[3].Value;
var 전봉3_30 = candleData_30_전봉.movingAverageDataList[3].Value;
var 전전봉3_30 = candleData_30_전전봉.movingAverageDataList[3].Value;
var 전전전봉3_30 = candleData_30_전전전봉.movingAverageDataList[3].Value;
- var 현재봉4_5 = candleData_5.movingAverageDataList[4].Value;
- var 전봉4_5 = candleData_5_전봉.movingAverageDataList[4].Value;
- var 전전봉4_5 = candleData_5_전전봉.movingAverageDataList[4].Value;
- var 전전전봉4_5 = candleData_5_전전전봉.movingAverageDataList[4].Value;
+ //var 현재봉4_5 = candleData_5.movingAverageDataList[4].Value;
+ //var 전봉4_5 = candleData_5_전봉.movingAverageDataList[4].Value;
+ //var 전전봉4_5 = candleData_5_전전봉.movingAverageDataList[4].Value;
+ //var 전전전봉4_5 = candleData_5_전전전봉.movingAverageDataList[4].Value;
var 현재봉4_30 = candleData_30.movingAverageDataList[4].Value;
var 전봉4_30 = candleData_30_전봉.movingAverageDataList[4].Value;
@@ -665,33 +659,37 @@ namespace BitgetAPI.IndicatorConditionSetup
var 전전전봉4_30 = candleData_30_전전전봉.movingAverageDataList[4].Value;
var 현재봉72_30 = candleData_30.movingAverageDataList[72].Value;
- var 현재봉72_5 = candleData_5.movingAverageDataList[72].Value;
+ //var 현재봉72_5 = candleData_5.movingAverageDataList[72].Value;
- var 저고점_1 = 전저고점[market + "1m"];
- var 저고점_5 = 전저고점[market + "5m"];
+ //var 저고점_1 = 전저고점[market + "1m"];
+ //var 저고점_5 = 전저고점[market + "5m"];
var 저고점_30 = 전저고점[market + "30m"];
- var returnVal = Calculate전고점(market, "1m", MCandleTimeType.M1, 전봉4, 전전봉4, 전전전봉4, candleData);
- if (!returnVal) continue;
- returnVal = Calculate전고점(market, "5m", MCandleTimeType.M5, 전봉4_5, 전전봉4_5, 전전전봉4_5, candleData_5);
- if (!returnVal) continue;
- returnVal = Calculate전고점(market, "30m", MCandleTimeType.M30, 전봉4_30, 전전봉4_30, 전전전봉4_30, candleData_30);
+ //var returnVal = Calculate전고점(market, "1m", MCandleTimeType.M1, 전봉4, 전전봉4, 전전전봉4, candleData);
+ //if (!returnVal) continue;
+ //returnVal = Calculate전고점(market, "5m", MCandleTimeType.M5, 전봉4_5, 전전봉4_5, 전전전봉4_5, candleData_5);
+ //if (!returnVal) continue;
+ var returnVal = Calculate전고점(market, "30m", MCandleTimeType.M30, 전봉4_30, 전전봉4_30, 전전전봉4_30, candleData_30);
if (!returnVal) continue;
- var 전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 2]];
- var 전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 3]];
- var 전전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 4]];
+ //var 전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 2]];
+ //var 전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 3]];
+ //var 전전전봉macdData_30 = totalImperseMACDData[market + "30m"][imperseMacd_keys_30[imperseMacd_keys_30.Count - 4]];
- var 전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 2]];
- var 전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 3]];
- var 전전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 4]];
+ //var 전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 2]];
+ //var 전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 3]];
+ //var 전전전봉macdData_5 = totalImperseMACDData[market + "5m"][imperseMacd_keys_5[imperseMacd_keys_5.Count - 4]];
+
+ //신규 데이터 Setup
+ tradingViewConditionSetup.SetData(candleDatas_30_TempList.Select(t => t.High).ToList(),
+ candleDatas_30_TempList.Select(t => t.Low).ToList(), candleDatas_30_TempList.Select(t => t.Close).ToList());
if (영호조건식_상향돌파)
{
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
+ var price = candleData_30.Close;
+ var rate = (candleData_30.Close / candleData_30.Open) * 100 - 100;
+ var indicatorPrice = candleData_30.Open;
+ var indicatorRate = (candleData_30.Close / indicatorPrice) * 100 - 100;
var description = string.Format("{0} 72,24,4 상승", strInterval);
var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
@@ -706,8 +704,21 @@ namespace BitgetAPI.IndicatorConditionSetup
var buyFlag = false;
- // 30분봉
- var flag_30 = ((저고점_30["Type"] == 0 &&
+ if (!BuyLongStep.ContainsKey(market))
+ BuyLongStep[market] = 0;
+
+ if (BuyLongStep[market] == 0)
+ {
+ if (tradingViewConditionSetup.IsLongSignal())
+ {
+ BuyLongStep[market] = 1;
+ BuyLongStepStampData[market] = 저고점_30["tempLowVal"];
+ }
+ }
+
+ if(BuyLongStep[market] == 1 && BuyLongStepStampData[market] < 저고점_30["tempLowVal"])
+ {
+ buyFlag = ((저고점_30["Type"] == 0 &&
저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] < 저고점_30["전저가"] && candleData_30_전봉.Close < 저고점_30["전고가"] && candleData_30.Close > 저고점_30["전고가"])
|| (저고점_30["Type"] == 1 &&
저고점_30["전저가"] > 저고점_30["전전저가"] && 저고점_30["전저가"] < 전봉4_30 && candleData_30_전봉.Close < 저고점_30["전고가"] && candleData_30.Close > 저고점_30["전고가"] && 전봉4_30 < 현재봉4_30 && 전봉4_30 < 전전봉4_30)
@@ -715,145 +726,15 @@ namespace BitgetAPI.IndicatorConditionSetup
저고점_30["전전전저가"] > 저고점_30["전전저가"] && 저고점_30["전전저가"] > 저고점_30["전저가"] && candleData_30_전봉.Close < 저고점_30["전고가"] && candleData_30.Close > 저고점_30["전고가"]))
&& 전봉4_30 < 현재봉4_30 && candleData_30.Open < candleData_30.Close;
- if(현재봉4_30 > 현재봉72_30)
- {
- if(저고점_30["전전고가"] > 저고점_30["전고가"])
+
+ //초기화 처리 필요
+ if (저고점_30["전고가"] < 저고점_30["전전고가"] ||
+ 저고점_30["전저가"] < 저고점_30["전전저가"])
{
- flag_30 = false;
+ BuyLongStep[market] = 0;
+ buyFlag = false;
}
- }
-
- var flag_5 = ((저고점_5["Type"] == 0 &&
- 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] < 저고점_5["전저가"] && candleData_5_전봉.Close < 저고점_5["전고가"] && candleData_5.Close > 저고점_5["전고가"])
- || (저고점_5["Type"] == 1 &&
- 저고점_5["전저가"] > 저고점_5["전전저가"] && 저고점_5["전저가"] < 전봉4_5 && candleData_5_전봉.Close < 저고점_5["전고가"] && candleData_5.Close > 저고점_5["전고가"] && 전봉4_5 < 현재봉4_5 && 전봉4_5 < 전전봉4_5)
- || (저고점_5["Type"] == 0 &&
- 저고점_5["전전전저가"] > 저고점_5["전전저가"] && 저고점_5["전전저가"] > 저고점_5["전저가"] && candleData_5_전봉.Close < 저고점_5["전고가"] && candleData_5.Close > 저고점_5["전고가"]))
- && 전봉4_5 < 현재봉4_5 && candleData_5.Open < candleData_5.Close;
-
- if (현재봉4_5 > 현재봉72_5)
- {
- if (저고점_5["전전고가"] > 저고점_5["전고가"])
- {
- flag_5 = false;
- }
- }
-
- var flag_1 = ((저고점_1["Type"] == 0 &&
- 저고점_1["전전전저가"] > 저고점_1["전전저가"] && 저고점_1["전전저가"] < 저고점_1["전저가"] && candleData_전봉.Close < 저고점_1["전고가"] && candleData.Close > 저고점_1["전고가"])
- || (저고점_1["Type"] == 1 &&
- 저고점_1["전저가"] > 저고점_1["전전저가"] && 저고점_1["전저가"] < 전봉4 && candleData_전봉.Close < 저고점_1["전고가"] && candleData.Close > 저고점_1["전고가"] && 전봉4 < 현재봉4 && 전봉4 < 전전봉4)
- || (저고점_1["Type"] == 0 &&
- 저고점_1["전전전저가"] > 저고점_1["전전저가"] && 저고점_1["전전저가"] > 저고점_1["전저가"] && candleData_전봉.Close < 저고점_1["전고가"] && candleData.Close > 저고점_1["전고가"]))
- && 전봉4 < 현재봉4 && candleData.Open < candleData.Close;
-
-
- var flag_1_72compare = 현재봉4 > 현재봉72 && 전봉4 > 전봉72;
-
- //추가
-
- //
-
- //var macdFlag = false;
-
- //if ((전전봉macdData_5.SH <= 0 && 전봉macdData_5.SH > 0 && macdData_5.MD < -30 && macdData_5.MD > 전봉macdData_5.MD)
- // || (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && macdData_5.MD > 0 && macdData_5.SH > 전봉macdData_5.SH))
- //{
- // macdFlag = true;
- //}
-
- //&& flag_5
- //if (macdFlag && flag_1)
- //{
- // buyFlag = true;
- //}
-
- if (!BuyLongStep.ContainsKey(market))
- BuyLongStep[market] = 0;
-
-
- if(BuyLongStep[market] == 0)
- {
- if (//(전전봉macdData_30.SH < 0 && 전봉macdData_30.SH > 0 && 전봉macdData_30.MD > 전전봉macdData_30.MD && macdData_30.MD > 전봉macdData_30.MD) || //&& 전봉macdData_30.MD < 0
- (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD > 0 && 전봉macdData_30.SH > 전전봉macdData_30.SH))
- {
- BuyLongStep[market] = 1;
- BuyLongStepStampData[market] = 저고점_30["tempLowVal"];
- }
-
- if(flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH > 0)
- {
- if (BuyLongStep[market] == 1)
- buyFlag = true;
-
- BuyLongStep[market] = 2;
- BuyLongStepStampData[market] = 저고점_30["tempLowVal"];
- }
- }
-
- if(BuyLongStep[market] == 1)
- {
- if (flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH > 0)
- buyFlag = true;
- }
-
- if (BuyLongStep[market] == 2)
- {
- if ((전전봉macdData_30.SH < 0 && 전봉macdData_30.SH > 0 && macdData_30.MD > 전봉macdData_30.MD) ||
- (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD > 0 && 전봉macdData_30.SH > 전전봉macdData_30.SH))
- {
- buyFlag = true;
- }
- }
-
-
- if (저고점_30["tempLowVal"] != BuyLongStepStampData[market] &&
- (저고점_30["전저가"] > 전봉4_30 ||
- 저고점_30["전전저가"] > 저고점_30["전저가"] ||
- 저고점_30["전고가"] < 저고점_30["전전고가"] ||
- 전봉macdData_30.SH < 0))
- {
- BuyLongStep[market] = 0;
- buyFlag = false;
- }
-
-
- //if ((전전봉macdData_5.SH < 0 && 전봉macdData_5.SH > 0 && 전봉macdData_5.MD < 0 && 전봉macdData_5.MD > 전전봉macdData_5.MD)
- // || (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && 전봉macdData_5.MD > 0 && 전봉macdData_5.SH > 전전봉macdData_5.SH))
- //{
- // BuyLongStep[market] = 1;
- // BuyLongStepStampData[market] = 저고점_5["tempLowVal"];
- //}
-
- //if (BuyLongStep[market] == 1)
- //{
- // if(flag_5)
- // {
- // BuyLongStep[market] = 2;
- // }
- // else
- // {
- // BuyLongStep[market] = 3;
- // }
- //}
-
- //if (BuyLongStep[market] == 2)
- //{
- // buyFlag = true;
- //}
- //else if (BuyLongStep[market] == 3)
- //{
- // if (flag_5)
- // {
- // buyFlag = true;
- // }
-
- // if(저고점_5["tempLowVal"] != BuyLongStepStampData[market] && 저고점_5["전전저가"] > 저고점_5["전저가"])
- // {
- // BuyLongStep[market] = 0;
- // buyFlag = false;
- // }
- //}
+ }
if (buyFlag)
{
@@ -881,8 +762,8 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "Price", price },
{ "Flag", 저고점_30["전고가"] > 저고점_30["전전고가"]},
{ "MCandleTimeType", (int)interval },
- { "CandleTime", candleData.Argument },
- { "Candle", candleData }
+ { "CandleTime", candleData_30.Argument },
+ { "Candle", candleData_30 }
};
UpBuyList.Add(market, buyDic);
@@ -910,7 +791,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "BuyDate", nowTime },
{ "Price", price },
{ "MCandleTimeType", (int)interval },
- { "Candle", candleData },
+ { "Candle", candleData_30 },
{ "Size", size },
{ "orderId", orderDic["orderId"] }
};
@@ -942,26 +823,14 @@ namespace BitgetAPI.IndicatorConditionSetup
}
var sellFlag = false;
- if (저고점_30["전저가"] > 전봉4_30)
- sellFlag = true;
-
- if (전봉macdData_30.SH < 0)
+
+ if(tradingViewConditionSetup.IsSmaMiddle(4, 12, true) ||
+ 저고점_30["전고가"] < 저고점_30["전전고가"] ||
+ 저고점_30["전저가"] > candleData_30_전봉.Close)
+ {
sellFlag = true;
-
- if (flag)
- {
- if (저고점_30["전고가"] < 저고점_30["전전고가"])
- {
- sellFlag = true;
- }
- }
- else
- {
- if (저고점_30["전고가"] > 저고점_30["전전고가"])
- {
- buyItem["Flag"] = true;
- }
}
+
if (sellFlag)
{
@@ -978,7 +847,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "BuyCandle", buyItem["Candle"] },
{ "SellDate", nowTime},
{ "SellPrice", price },
- { "SellCandle", candleData },
+ { "SellCandle", candleData_30 },
{ "Rate", resultRate }
};
@@ -1019,7 +888,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "BuyCandle", buyItem["Candle"] },
{ "SellDate", nowTime},
{ "SellPrice", price},
- { "SellCandle", candleData },
+ { "SellCandle", candleData_30 },
{ "Rate", resultRateData }
};
ResultList.Add(orderResult);
@@ -1039,10 +908,10 @@ namespace BitgetAPI.IndicatorConditionSetup
}
if (영호조건식_하향돌파)
{
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
+ var price = candleData_30.Close;
+ var rate = (candleData_30.Close / candleData_30.Open) * 100 - 100;
+ var indicatorPrice = candleData_30.Open;
+ var indicatorRate = (candleData_30.Close / indicatorPrice) * 100 - 100;
var description = string.Format("{0} 72,24,4 하락", strInterval);
var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
@@ -1055,147 +924,37 @@ namespace BitgetAPI.IndicatorConditionSetup
var buyFlag = false;
- var flag_30 = ((저고점_30["Type"] == 1 &&
- 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"] && candleData_30_전봉.Close > 저고점_30["전저가"])
- || (저고점_30["Type"] == 0 &&
- 저고점_30["전고가"] < 저고점_30["전전고가"] && 저고점_30["전고가"] > 전봉4_30 && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"] && 전봉4_30 > 현재봉4_30 && 전봉4_30 > 전전봉4_30)
- || (저고점_30["Type"] == 1 &&
- 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"])) && 전봉4_30 > 현재봉4_30 && candleData_30.Open > candleData_30.Close;
-
- if (현재봉4_30 < 현재봉72_30)
- {
- if (저고점_30["전전저가"] < 저고점_30["전저가"])
- {
- flag_30 = false;
- }
- }
-
- var flag_5 = ((저고점_5["Type"] == 1 &&
- 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] > 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"] && candleData_5_전봉.Close > 저고점_5["전저가"])
- || (저고점_5["Type"] == 0 &&
- 저고점_5["전고가"] < 저고점_5["전전고가"] && 저고점_5["전고가"] > 전봉4_5 && candleData_5.Close < 저고점_5["전저가"] && candleData_5_전봉.Close > 저고점_5["전저가"] && 전봉4_5 > 현재봉4_5 && 전봉4_5 > 전전봉4_5)
- || (저고점_5["Type"] == 1 &&
- 저고점_5["전전전고가"] < 저고점_5["전전고가"] && 저고점_5["전전고가"] < 저고점_5["전고가"] && candleData_5.Close < 저고점_5["전저가"] && candleData_5_전봉.Close > 저고점_5["전저가"]))
- && 전봉4_5 > 현재봉4_5 && candleData_5.Open > candleData_5.Close;
-
- if (현재봉4_5 < 현재봉72_5)
- {
- if (저고점_5["전전저가"] < 저고점_5["전저가"])
- {
- flag_5 = false;
- }
- }
-
- var flag_1 = ((저고점_1["Type"] == 1 &&
- 저고점_1["전전전고가"] < 저고점_1["전전고가"] && 저고점_1["전전고가"] > 저고점_1["전고가"] && candleData.Close < 저고점_1["전저가"] && candleData_전봉.Close > 저고점_1["전저가"])
- || (저고점_1["Type"] == 0 &&
- 저고점_1["전고가"] < 저고점_1["전전고가"] && 저고점_1["전고가"] > 전봉4 && candleData.Close < 저고점_1["전저가"] && candleData_전봉.Close > 저고점_1["전저가"] && 전봉4 > 현재봉4 && 전봉4 > 전전봉4)
- || (저고점_1["Type"] == 1 &&
- 저고점_1["전전전고가"] < 저고점_1["전전고가"] && 저고점_1["전전고가"] < 저고점_1["전고가"] && candleData.Close < 저고점_1["전저가"] && candleData_전봉.Close > 저고점_1["전저가"]))
- && 전봉4 > 현재봉4 && candleData.Open > candleData.Close;
-
- var flag_1_72compare = 현재봉4 < 현재봉72 && 전봉4 < 전봉72;
-
- //var macdFlag = false;
-
- //if ((전전봉macdData_5.SH >= 0 && 전봉macdData_5.SH < 0 && macdData_5.MD > 5 && macdData_5.MD < 전봉macdData_5.MD)
- // || (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && macdData_5.MD > 0 && macdData_5.SH < 전봉macdData_5.SH))
- //{
- // macdFlag = true;
- //}
- //&& flag_5 && flag_1
-
- //if (flag_1 && macdFlag)
- //{
- // buyFlag = true;
- //}
-
if (!BuyShortStep.ContainsKey(market))
BuyShortStep[market] = 0;
-
if (BuyShortStep[market] == 0)
{
- if (//(전전봉macdData_30.SH > 0 && 전봉macdData_30.SH < 0 && 전봉macdData_30.MD < 전전봉macdData_30.MD && macdData_30.MD < 전봉macdData_30.MD) ||// 전봉macdData_30.MD > 0 && )
- (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD < 0 && 전봉macdData_30.SH < 전전봉macdData_30.SH))
+ if (tradingViewConditionSetup.IsShortSignal())
{
BuyShortStep[market] = 1;
BuyShortStepStampData[market] = 저고점_30["tempHighVal"];
}
+ }
- if (flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH < 0)
+ if (BuyShortStep[market] == 1 && BuyShortStepStampData[market] < 저고점_30["tempHighVal"])
+ {
+ buyFlag = ((저고점_30["Type"] == 1 &&
+ 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] > 저고점_30["전고가"] && candleData_30.Close < 저고점_30["전저가"] && candleData_30_전봉.Close > 저고점_30["전저가"])
+ || (저고점_30["Type"] == 0 &&
+ 저고점_30["전고가"] < 저고점_30["전전고가"] && 저고점_30["전고가"] > 전봉4_30 && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"] && 전봉4_30 > 현재봉4_30 && 전봉4_30 > 전전봉4_30)
+ || (저고점_30["Type"] == 1 &&
+ 저고점_30["전전전고가"] < 저고점_30["전전고가"] && 저고점_30["전전고가"] < 저고점_30["전고가"] && candleData_30_전봉.Close > 저고점_30["전저가"] && candleData_30.Close < 저고점_30["전저가"]))
+ && 전봉4_30 > 현재봉4_30 && candleData_30.Open > candleData_30.Close;
+
+ //초기화 처리 필요
+ if (저고점_30["전고가"] > 저고점_30["전전고가"] ||
+ 저고점_30["전저가"] > 저고점_30["전전저가"])
{
- if (BuyShortStep[market] == 1)
- buyFlag = true;
-
- BuyShortStep[market] = 2;
- BuyShortStepStampData[market] = 저고점_30["tempHighVal"];
+ BuyShortStep[market] = 0;
+ buyFlag = false;
}
}
- if (BuyShortStep[market] == 1)
- {
- if (flag_30 && flag_5 && flag_1_72compare && flag_1 && 전봉macdData_30.SH < 0)
- buyFlag = true;
- }
-
-
- if (BuyShortStep[market] == 2)
- {
- if (//(전전봉macdData_30.SH > 0 && 전봉macdData_30.SH < 0 && 전봉macdData_30.MD < 전전봉macdData_30.MD && macdData_30.MD < 전봉macdData_30.MD) || // 전봉macdData_30.MD > 0 && )
- (전전전봉macdData_30.MD == 0 && 전전봉macdData_30.MD == 0 && 전봉macdData_30.MD < 0 && 전봉macdData_30.SH < 전전봉macdData_30.SH))
- {
- buyFlag = true;
- }
- }
-
- if (저고점_30["tempHighVal"] != BuyShortStepStampData[market] &&
- (저고점_30["전전고가"] < 저고점_30["전고가"] ||
- 저고점_30["전저가"] > 저고점_30["전전저가"] ||
- 저고점_30["전고가"] < 전봉4_30 ||
- 전봉macdData_30.SH > 0))
- {
- BuyShortStep[market] = 0;
- buyFlag = false;
- }
-
-
- //if ((전전봉macdData_5.SH > 0 && 전봉macdData_5.SH < 0 && 전봉macdData_5.MD > 0 && 전봉macdData_5.MD < 전전봉macdData_5.MD)
- //|| (전전전봉macdData_5.MD == 0 && 전전봉macdData_5.MD == 0 && 전봉macdData_5.MD < 0 && 전봉macdData_5.SH < 전전봉macdData_5.SH))
- //{
- // BuyShortStep[market] = 1;
- // BuyShortStepStampData[market] = 저고점_5["tempHighVal"];
- //}
-
- //if (BuyShortStep[market] == 1)
- //{
- // if (flag_5)
- // {
- // BuyShortStep[market] = 2;
- // }
- // else
- // {
- // BuyShortStep[market] = 3;
- // }
- //}
-
- //if (BuyShortStep[market] == 2)
- //{
- // buyFlag = true;
- //}
- //else if (BuyShortStep[market] == 3)
- //{
- // if (flag_5)
- // {
- // buyFlag = true;
- // }
- // if (저고점_5["tempHighVal"] != BuyShortStepStampData[market] && 저고점_5["전전고가"] < 저고점_5["전고가"])
- // {
- // BuyShortStep[market] = 0;
- // buyFlag = false;
- // }
- //}
-
if (buyFlag)
{
BuyShortStep[market] = 0;
@@ -1221,8 +980,8 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "Price", price },
{ "Flag", 저고점_30["전저가"] < 저고점_30["전전저가"]},
{ "MCandleTimeType", (int)interval },
- { "CandleTime", candleData.Argument },
- { "Candle", candleData }
+ { "CandleTime", candleData_30.Argument },
+ { "Candle", candleData_30 }
};
DownBuyList.Add(market, buyDic);
@@ -1250,7 +1009,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "BuyDate", nowTime },
{ "Price", price },
{ "MCandleTimeType", (int)interval },
- { "Candle", candleData },
+ { "Candle", candleData_30 },
{ "Size", size },
{ "orderId", orderDic["orderId"] }
};
@@ -1282,25 +1041,11 @@ namespace BitgetAPI.IndicatorConditionSetup
}
var sellFlag = false;
- if (저고점_30["전고가"] < 전봉4_30)
- sellFlag = true;
-
- if (전봉macdData_30.SH > 0)
- sellFlag = true;
-
- if (flag)
+ if (tradingViewConditionSetup.IsSmaMiddle(4, 12, false) ||
+ 저고점_30["전저가"] > 저고점_30["전전저가"] ||
+ 저고점_30["전고가"] < candleData_30_전봉.Close)
{
- if (저고점_30["전저가"] > 저고점_30["전전저가"])
- {
- sellFlag = true;
- }
- }
- else
- {
- if (저고점_30["전저가"] < 저고점_30["전전저가"])
- {
- buyItem["Flag"] = true;
- }
+ sellFlag = true;
}
if (sellFlag)
@@ -1319,7 +1064,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "BuyCandle", buyItem["Candle"] },
{ "SellDate", nowTime},
{ "SellPrice", price },
- { "SellCandle", candleData },
+ { "SellCandle", candleData_30 },
{ "Rate", resultRate }
};
@@ -1361,7 +1106,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{ "BuyCandle", buyItem["Candle"] },
{ "SellDate", nowTime},
{ "SellPrice", price },
- { "SellCandle", candleData },
+ { "SellCandle", candleData_30 },
{ "Rate", resultRateData }
};
ResultList.Add(orderResult);
@@ -1711,2861 +1456,3 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
}
-
-/*
-if (영호조건식_상향돌파 || 영호조건식_하향돌파)
- {
- var 전봉4 = candleData_전봉.movingAverageDataList[4].Value;
- var 전봉8 = candleData_전봉.movingAverageDataList[8].Value;
- var 전봉24 = candleData_전봉.movingAverageDataList[24].Value;
- var 전봉48 = candleData_전봉.movingAverageDataList[48].Value;
- var 전봉72 = candleData_전봉.movingAverageDataList[72].Value;
-
- var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value;
- var 전전봉8 = candleData_전전봉.movingAverageDataList[8].Value;
- var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value;
- var 전전봉48 = candleData_전전봉.movingAverageDataList[48].Value;
- var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value;
-
- var 현재봉4 = candleData.movingAverageDataList[4].Value;
- var 현재봉8 = candleData.movingAverageDataList[8].Value;
- var 현재봉12 = candleData.movingAverageDataList[12].Value;
- var 현재봉24 = candleData.movingAverageDataList[24].Value;
- var 현재봉48 = candleData.movingAverageDataList[48].Value;
- var 현재봉72 = candleData.movingAverageDataList[72].Value;
-
- var 전봉Bol4 = candleData_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉Bol12 = candleData_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉Bol24 = candleData_전봉.movingAverageDataList[24].BolangerValue;
-
- var 전전봉Bol4 = candleData_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉Bol12 = candleData_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉Bol24 = candleData_전전봉.movingAverageDataList[24].BolangerValue;
- var Bol4 = candleData.movingAverageDataList[4].BolangerValue;
- var Bol12 = candleData.movingAverageDataList[12].BolangerValue;
- var Bol24 = candleData.movingAverageDataList[24].BolangerValue;
-
- if ((int)interval != 1)
- {
- continue;
- }
-
- #region 5분봉 처리
- //15분봉이지만 60분봉으로 변경
- //var candleDatas5 = findedMarket.candleDataList[MCandleTimeType.M5].ToList();
- //var candleDatas5_정렬 = candleDatas5.OrderBy(i => i.Argument).ToList();
-
- //var candleData5 = candleDatas5.FirstOrDefault(i => i.Argument == candleDatas5_정렬.Last().Argument);
- //if (candleData5 == null) continue;
- //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas5_정렬, candleData5);
- //ichimokuConditionSetup.calIchimokuData(candleDatas5_정렬, candleData5);
-
-
- //candleDatas5_정렬.RemoveAt(candleDatas5_정렬.Count - 1);
- //var candleData5_전봉 = candleDatas5.FirstOrDefault(i => i.Argument == candleDatas5_정렬.Last().Argument);
- //movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas5_정렬, candleData5_전봉);
- //ichimokuConditionSetup.calIchimokuData(candleDatas5_정렬, candleData5_전봉);
-
- //var 현재봉5_4 = candleData5.movingAverageDataList[4].Value;
- //var 전봉5_4 = candleData5_전봉.movingAverageDataList[4].Value;
-
- #endregion
-
- if (영호조건식_상향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 상승", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- if (!UpBuyList.ContainsKey(market + interval))
- {
- if (
- candleData.IchimokData.하한선 > 현재봉4 &&
- candleData_전봉.IchimokData.하한선 > candleData_전봉.Close &&
- candleData_전봉.Open < candleData_전봉.Close &&
- 전봉4 > 전봉8 && 전전봉4 < 전전봉8 &&
- 전봉8 < 전봉24 && 전봉24 < 전봉48 && 전봉48 < 전봉72 &&
- 전전봉8 < 전전봉24 && 전전봉24 < 전전봉48 && 전전봉48 < 전전봉72 &&
- 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4
- ) {
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData }
- };
-
- UpBuyList.Add(market + interval, buyDic);
- SellLongStep.Add(market + interval, 8);
-
- if (LongCount < 2)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage);
-
- if (orderData == null)
- {
- Log.Error("Buy 안됨 확인 필요");
- continue;
- }
-
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyLongList.Add(orderDataDic);
- LongCount++;
-
-
- }
-
- }
- }
- //파는 시점
- else
- {
- var buyItem = UpBuyList[market + interval];
- if (interval < MCandleTimeType.H1)
- {
- if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval)
- {
- continue;
- }
- }
- //임시로 처리
- else
- {
- if ((nowTime.Hour == 0 ? 24 : nowTime.Hour) < ((DateTime)buyItem["BuyDate"]).Hour + ((int)interval / 60))
- {
- continue;
- }
- }
-
- var key = SellLongStep[market + interval];
- var sellFlag = false;
- switch (SellLongStep[market + interval])
- {
- case 8:
- if (전봉8 > 전봉24)
- {
- SellLongStep[market + interval] = 24;
- key = 24;
- }
- else
- {
- if (전봉4 < 전전봉4)
- {
- sellFlag = true;
- }
-
- else if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval * 2)
- {
- if (전봉4 > candleData_전봉.Close && 전봉4 < 전봉24)
- {
- sellFlag = true;
- }
- }
-
- if (현재봉4 < 현재봉8 && candleData.Close < candleData.movingAverageDataList[key].Value) sellFlag = true;
- }
- break;
- case 24:
- if (전봉8 > 전봉48)
- {
- SellLongStep[market + interval] = 48;
- key = 48;
- }
- break;
- case 48:
- key = 8;
- break;
- }
-
-
- if (candleData.movingAverageDataList[key].Value > 현재봉4 || sellFlag)
- {
-
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "Type", "상향"},
- { "BuyPrice", buyPrice },
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- UpResultList.Add(result);
- UpBuyList.Remove(market + interval);
- SellLongStep.Remove(market + interval);
-
- var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "상향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price},
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyLongList.Remove(orderDic);
- LongCount--;
- }
-
- }
- }
-
- }
- catch (Exception e)
- {
-
- }
- }
- if (영호조건식_하향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 하락", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- //사는 시점
- if (!DownBuyList.ContainsKey(market + interval))
- {
- if (
- candleData.IchimokData.상한선 < 현재봉4 &&
- candleData_전봉.IchimokData.상한선 < candleData_전봉.Close &&
- candleData_전봉.Open > candleData_전봉.Close &&
- 전봉4 < 전봉8 && 전전봉4 > 전전봉8 &&
- 전봉8 > 전봉24 && 전봉24 > 전봉48 && 전봉48 > 전봉72 &&
- 전전봉8 > 전전봉24 && 전전봉24 > 전전봉48 && 전전봉48 > 전전봉72 &&
- 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4
- )
- {
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData }
- };
-
- DownBuyList.Add(market + interval, buyDic);
-
-
- if(ShortCount < 2)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage);
-
- if (orderData == null) {
- Log.Error("Buy 안됨 확인 필요");
- continue;
- }
-
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyShortList.Add(orderDataDic);
- ShortCount++;
- SellShortStep.Add(market + interval, 8);
- }
- }
- }
- //파는 시점
- else
- {
- var buyItem = DownBuyList[market + interval];
- if (interval < MCandleTimeType.H1)
- {
- if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval)
- {
- continue;
- }
- }
- //임시로 처리
- else
- {
- if ((nowTime.Hour == 0 ? 24 : nowTime.Hour) < ((DateTime)buyItem["BuyDate"]).Hour + ((int)interval / 60))
- {
- continue;
- }
- }
-
- var key = SellShortStep[market + interval];
- var sellFlag = false;
- switch (SellShortStep[market + interval])
- {
- case 8:
- if (전봉8 < 전봉24)
- {
- SellShortStep[market + interval] = 24;
- key = 24;
- }
- else
- {
- if (전봉4 > 전전봉4)
- {
- sellFlag = true;
- }
- else if ((nowTime.Minute == 0 ? 60 : nowTime.Minute) < ((DateTime)buyItem["BuyDate"]).Minute + (int)interval * 2)
- {
- if (전봉4 < candleData_전봉.Close && 전봉4 > 전봉24)
- {
- sellFlag = true;
- }
- }
-
- if (현재봉4 > 현재봉8 && candleData.Close > candleData.movingAverageDataList[key].Value) sellFlag = true;
- }
-
- break;
- case 24:
- if (전봉8 < 전봉48)
- {
- SellShortStep[market + interval] = 48;
- key = 48;
- }
- break;
- case 48:
- key = 8;
- break;
-
- }
-
- if (candleData.movingAverageDataList[key].Value < 현재봉4 || sellFlag)
- {
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "BuyPrice", buyPrice },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- DownResultList.Add(result);
- DownBuyList.Remove(market + interval);
- SellShortStep.Remove(market + interval);
- var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
-
-
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyShortList.Remove(orderDic);
- ShortCount--;
- }
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- }
- }
- }
-
- */
-/*
- 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 높은값_48_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value);
- // 24,72 낮은값
- var 낮은값_48_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value);
- // 24,72 높은값
- var 높은값_48_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value);
- // 24,72 낮은값
- var 낮은값_48_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value);
-
- // 24,72 높은값
- var 높은값_48_24 = Math.Max(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value);
- // 24,72 낮은값
- var 낮은값_48_24 = Math.Min(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value);
-
- var 높은값_12_낮은값72_24 = Math.Max(candleData.movingAverageDataList[12].Value, 낮은값_48_24);
- var 낮은값_12_높은값72_24 = Math.Min(candleData.movingAverageDataList[12].Value, 높은값_48_24);
-
- var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value;
- var 전전봉12 = candleData_전전봉.movingAverageDataList[12].Value;
- var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value;
- var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value;
-
- var 전봉4 = candleData_전봉.movingAverageDataList[4].Value;
- var 전봉12 = candleData_전봉.movingAverageDataList[12].Value;
- var 전봉24 = candleData_전봉.movingAverageDataList[24].Value;
- var 전봉72 = candleData_전봉.movingAverageDataList[72].Value;
-
- var 현재봉4 = candleData.movingAverageDataList[4].Value;
- var 현재봉12 = candleData.movingAverageDataList[12].Value;
- var 현재봉24 = candleData.movingAverageDataList[24].Value;
- var 현재봉72 = candleData.movingAverageDataList[72].Value;
-
-
- var 전봉Bol4 = candleData_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉Bol12 = candleData_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉Bol24 = candleData_전봉.movingAverageDataList[24].BolangerValue;
-
- var 전전봉Bol4 = candleData_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉Bol12 = candleData_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉Bol24 = candleData_전전봉.movingAverageDataList[24].BolangerValue;
- var Bol4 = candleData.movingAverageDataList[4].BolangerValue;
- var Bol12 = candleData.movingAverageDataList[12].BolangerValue;
- var Bol24 = candleData.movingAverageDataList[24].BolangerValue;
-
- //5분봉이 default이지만 15분봉으로 변경
- if ((int)interval != 5)
- {
- continue;
- }
-
- #region 15분봉 처리
- //15분봉이지만 60분봉으로 변경
- var candleDatas15 = findedMarket.candleDataList[MCandleTimeType.M15];
- var candleDatas15_정렬 = candleDatas15.ToList().OrderBy(i => i.Argument).ToList();
-
- var candleData15 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument);
- if (candleData15 == null) continue;
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15);
- ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15);
-
-
- candleDatas15_정렬.RemoveAt(candleDatas15_정렬.Count - 1);
- var candleData15_전봉 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15_전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15_전봉);
-
- candleDatas15_정렬.RemoveAt(candleDatas15_정렬.Count - 1);
- var candleData15_전전봉 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15_전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15_전전봉);
-
- candleDatas15_정렬.RemoveAt(candleDatas15_정렬.Count - 1);
- var candleData15_전전전봉 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15_전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15_전전봉);
-
-
- var 낮은값15_72_24 = Math.Min(candleData15.movingAverageDataList[72].Value, candleData15.movingAverageDataList[24].Value);
- var 높은값15_72_24 = Math.Max(candleData15.movingAverageDataList[72].Value, candleData15.movingAverageDataList[24].Value);
-
- var 전봉낮은값15_72_24 = Math.Min(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value);
- var 전봉높은값15_72_24 = Math.Max(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value);
- var 전전봉낮은값15_72_24 = Math.Min(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value);
- var 전전봉높은값15_72_24 = Math.Max(candleData15_전봉.movingAverageDataList[72].Value, candleData15_전봉.movingAverageDataList[24].Value);
-
- var 현재봉15_12 = candleData15.movingAverageDataList[12].Value;
- var 전봉15_12 = candleData15_전봉.movingAverageDataList[12].Value;
- var 전전봉15_12 = candleData15_전전봉.movingAverageDataList[12].Value;
-
- var 현재봉15_4 = candleData15.movingAverageDataList[4].Value;
- var 전봉15_4 = candleData15_전봉.movingAverageDataList[4].Value;
- var 전전봉15_4 = candleData15_전전봉.movingAverageDataList[4].Value;
-
- var 전봉15Bol4 = candleData15_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉15Bol12 = candleData15_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉15Bol24 = candleData15_전봉.movingAverageDataList[24].BolangerValue;
-
- var 전전봉15Bol4 = candleData15_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉15Bol12 = candleData15_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉15Bol24 = candleData15_전전봉.movingAverageDataList[24].BolangerValue;
- var 현재봉15Bol4 = candleData15.movingAverageDataList[4].BolangerValue;
- var 현재봉15Bol12 = candleData15.movingAverageDataList[12].BolangerValue;
- var 현재봉15Bol24 = candleData15.movingAverageDataList[24].BolangerValue;
- #endregion
-
- #region 1분봉 처리
- //1분봉이지만 3분봉으로 변경
- var candleDatas1 = findedMarket.candleDataList[MCandleTimeType.M1];
- var candleDatas1_정렬 = candleDatas1.ToList().OrderBy(i => i.Argument).ToList();
-
- var candleData1 = candleDatas1.Find(i => i.Argument == candleDatas1_정렬.Last().Argument);
- if (candleData1 == null) continue;
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas1_정렬, candleData1);
- ichimokuConditionSetup.calIchimokuData(candleDatas1_정렬, candleData1);
-
- candleDatas1_정렬.RemoveAt(candleDatas1_정렬.Count - 1);
- var candleData1_전봉 = candleDatas1.Find(i => i.Argument == candleDatas1_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas1_정렬, candleData1_전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas1_정렬, candleData1_전봉);
-
- candleDatas1_정렬.RemoveAt(candleDatas1_정렬.Count - 1);
- var candleData1_전전봉 = candleDatas1.Find(i => i.Argument == candleDatas1_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas1_정렬, candleData1_전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas1_정렬, candleData1_전전봉);
-
-
- var 높은값1_72_24 = Math.Max(candleData1.movingAverageDataList[72].Value, candleData1.movingAverageDataList[24].Value);
- var 낮은값1_72_24 = Math.Min(candleData1.movingAverageDataList[72].Value, candleData1.movingAverageDataList[24].Value);
-
- var 전봉낮은값1_72_24 = Math.Min(candleData1_전봉.movingAverageDataList[72].Value, candleData1_전봉.movingAverageDataList[24].Value);
- var 전봉높은값1_72_24 = Math.Max(candleData1_전봉.movingAverageDataList[72].Value, candleData1_전봉.movingAverageDataList[24].Value);
- var 전전봉낮은값1_72_24 = Math.Min(candleData1_전전봉.movingAverageDataList[72].Value, candleData1_전전봉.movingAverageDataList[24].Value);
- var 전전봉높은값1_72_24 = Math.Max(candleData1_전전봉.movingAverageDataList[72].Value, candleData1_전전봉.movingAverageDataList[24].Value);
-
- var 현재봉1_12 = candleData1.movingAverageDataList[12].Value;
- var 전봉1_12 = candleData1_전봉.movingAverageDataList[12].Value;
- var 전전봉1_12 = candleData1_전전봉.movingAverageDataList[12].Value;
-
- var 현재봉1_4 = candleData1.movingAverageDataList[4].Value;
- var 전봉1_4 = candleData1_전봉.movingAverageDataList[4].Value;
- var 전전봉1_4 = candleData1_전전봉.movingAverageDataList[4].Value;
-
- var 전봉1Bol4 = candleData1_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉1Bol12 = candleData1_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉1Bol24 = candleData1_전봉.movingAverageDataList[24].BolangerValue;
-
- var 전전봉1Bol4 = candleData1_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉1Bol12 = candleData1_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉1Bol24 = candleData1_전전봉.movingAverageDataList[24].BolangerValue;
- var 현재봉1Bol4 = candleData1.movingAverageDataList[4].BolangerValue;
- var 현재봉1Bol12 = candleData1.movingAverageDataList[12].BolangerValue;
- var 현재봉1Bol24 = candleData1.movingAverageDataList[24].BolangerValue;
- #endregion
-
- #region 60분봉 처리
- //60분봉이지만 180분 처리
- var candleDatas60 = findedMarket.candleDataList[MCandleTimeType.H1];
- var candleDatas60_정렬 = candleDatas60.ToList().OrderBy(i => i.Argument).ToList();
-
- var candleData60 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument);
- if (candleData60 == null) continue;
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60);
- ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60);
-
-
- candleDatas60_정렬.RemoveAt(candleDatas60_정렬.Count - 1);
- var candleData60_전봉 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60_전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60_전봉);
-
- candleDatas60_정렬.RemoveAt(candleDatas60_정렬.Count - 1);
- var candleData60_전전봉 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60_전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60_전전봉);
-
- candleDatas60_정렬.RemoveAt(candleDatas60_정렬.Count - 1);
- var candleData60_전전전봉 = candleDatas60.Find(i => i.Argument == candleDatas60_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas60_정렬, candleData60_전전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas60_정렬, candleData60_전전전봉);
-
-
- var 낮은값60_72_24 = Math.Min(candleData60.movingAverageDataList[72].Value, candleData60.movingAverageDataList[24].Value);
- var 높은값60_72_24 = Math.Max(candleData60.movingAverageDataList[72].Value, candleData60.movingAverageDataList[24].Value);
-
- var 전봉낮은값60_72_24 = Math.Min(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value);
- var 전봉높은값60_72_24 = Math.Max(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value);
- var 전전봉낮은값60_72_24 = Math.Min(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value);
- var 전전봉높은값60_72_24 = Math.Max(candleData60_전봉.movingAverageDataList[72].Value, candleData60_전봉.movingAverageDataList[24].Value);
-
- var 현재봉60_12 = candleData60.movingAverageDataList[12].Value;
- var 전봉60_12 = candleData60_전봉.movingAverageDataList[12].Value;
- var 전전봉60_12 = candleData60_전전봉.movingAverageDataList[12].Value;
-
- var 현재봉60_4 = candleData60.movingAverageDataList[4].Value;
- var 전봉60_4 = candleData60_전봉.movingAverageDataList[4].Value;
- var 전전봉60_4 = candleData60_전전봉.movingAverageDataList[4].Value;
-
- var 전봉60Bol4 = candleData60_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉60Bol12 = candleData60_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉60Bol24 = candleData60_전봉.movingAverageDataList[24].BolangerValue;
-
- var 전전봉60Bol4 = candleData60_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉60Bol12 = candleData60_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉60Bol24 = candleData60_전전봉.movingAverageDataList[24].BolangerValue;
- var 현재봉60Bol4 = candleData60.movingAverageDataList[4].BolangerValue;
- var 현재봉60Bol12 = candleData60.movingAverageDataList[12].BolangerValue;
- var 현재봉60Bol24 = candleData60.movingAverageDataList[24].BolangerValue;
- #endregion
-
- if (영호조건식_상향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 상승", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- var candle15Flag = 현재봉15_4 > 현재봉15_12
- && candleData15.Open < candleData15.Close
- && 현재봉15_4 > 전봉15_4
- && 전봉15_4 > 전전봉15_4
- && 현재봉15_12 > 전봉15_12
- && 전봉15_12 > 전전봉15_12
- && 전봉15Bol12 - 전봉15Bol24 > 현재봉15Bol12 - 현재봉15Bol24;
-
- var candle60Flag = 현재봉60_4 > 현재봉60_12
- // && candleData60.Open < candleData60.Close
- && 현재봉60_4 > 전봉60_4
- //&& 전봉60_4 > 전전봉60_4
- && 현재봉60_12 > 전봉60_12
- // && 전봉60_12 > 전전봉60_12
- && 전봉60Bol12 - 전봉60Bol24 > 현재봉60Bol12 - 현재봉60Bol24;
-
-
- var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4;
- var sellFlag = 현재봉1_4 < 높은값1_72_24;
-
- var 전고점Data = 전고점[market + strInterval];
- double.TryParse(전고점Data["val"].ToString(), out var val);
- bool.TryParse(전고점Data["flag"].ToString(), out var flag);
- bool.TryParse(전고점Data["firstFlag"].ToString(), out var firstFlag);
- bool.TryParse(전고점Data["clearFlag"].ToString(), out var clearFlag);
- bool.TryParse(전고점Data["breakFlag"].ToString(), out var breakFlag);
- bool.TryParse(전고점Data["tempBuyFlag"].ToString(), out var tempBuyFlag);
-
- if (현재봉4 < 낮은값_48_24 && candleData.IchimokData.하한선 > candleData.Close)
- {
- if (firstFlag)
- 전고점Data["firstFlag"] = false;
-
- 전고점Data["flag"] = true;
- 전고점Data["clearFlag"] = true;
- 전고점Data["val"] = 0;
- 전고점Data["breakFlag"] = false;
- 전고점Data["tempBuyFlag"] = true;
- }
-
- if (!flag || !breakFlag)
- {
- if (val == 0)
- {
- 전고점Data["val"] = 전봉4;
- val = 전봉4;
- }
-
- if (전봉4 < 전전봉4 && clearFlag)
- {
- 전고점Data["clearFlag"] = false;
- if (전전봉4 < val)
- {
- 전고점Data["flag"] = false;
- 전고점Data["breakFlag"] = true;
- }
- else
- {
- 전고점Data["flag"] = true;
- }
- }
-
- else if (전봉4 > 전전봉4)
- {
- 전고점Data["clearFlag"] = true;
- if (val < 전봉4)
- {
- 전고점Data["val"] = 전봉4;
- }
- }
- }
- if (전전봉4 > 낮은값_48_24_전전봉
- && 전전봉4 < 높은값_48_24_전전봉
- && 전봉4 < 낮은값_48_24_전봉
- && 전봉12 > 낮은값_48_24_전봉)
- {
- if (UpList.ContainsKey(market + strInterval))
- {
- if (UpList[market + strInterval])
- UpList[market + strInterval] = false;
- }
- else
- {
- UpList.Add(market + strInterval, false);
- }
- }
-
- if ((
- 전전봉4 > 낮은값_48_24_전전봉
- && 전전봉4 < 높은값_48_24_전전봉
- && 전봉4 < 낮은값_48_24_전봉
- && 전봉12 > 낮은값_48_24_전봉
- && 전봉24 < 전전봉24
- && 전봉12 < 전전봉12
- && 전봉4 < 전전봉4
- && (!UpBuyValue.ContainsKey(market + strInterval) || (UpBuyValue.ContainsKey(market + strInterval) && UpBuyValue[market + strInterval] == 0))
- //&& 낮은값_48_24_전봉 < candleData_전봉.IchimokData.상한선
- //&& candleData_전봉.Close < candleData_전봉.IchimokData.상한선
- //&& candleData_전봉.Open > candleData_전봉.Close
- ))
- {
- if (UpBuyValue.ContainsKey(market + strInterval) && UpBuyValue[market + strInterval] == 0)
- {
- UpBuyValue[market + strInterval] = candleData.Open;
- }
- else
- {
- UpBuyValue.Add(market + strInterval, candleData.Open);
- }
- }
- else if (UpBuyValue.ContainsKey(market + strInterval) && UpBuyValue[market + strInterval] != 0 && 현재봉1_4 > 높은값1_72_24 && UpList.ContainsKey(market + strInterval) && !UpList[market + strInterval])
- {
- if (UpBuyValue[market + strInterval] < candleData.Close)
- {
- if (UpList.ContainsKey(market + strInterval))
- {
- UpList[market + strInterval] = true;
- }
- else
- {
- UpList.Add(market + strInterval, true);
- }
-
- }
-
- UpBuyValue[market + strInterval] = 0;
- }
-
- //사는 시점
- if (!UpBuyList.ContainsKey(market + interval))
- {
- if (
- (
- 전전봉4 < 높은값_48_24_전전봉
- && 전전봉4 > 낮은값_48_24_전전봉
- && 전봉4 > 높은값_48_24_전봉
- && 전봉12 < 높은값_48_24_전봉
- && 전봉24 > 전전봉24
- && 전봉12 > 전전봉12
- && 전봉4 > 전전봉4
- && 높은값_48_24_전봉 > candleData_전봉.IchimokData.하한선
- && candleData_전봉.Close > candleData_전봉.IchimokData.하한선
- && candleData_전봉.Open < candleData_전봉.Close
- )
- && flag && !firstFlag && buyFlag && tempBuyFlag
- && UpList.ContainsKey(market + strInterval) && UpList[market + strInterval]
-
- //4 < 높은값_72_24_전전봉 &&
- //전봉4 > 높은값_72_24_전봉 &&
- //전봉12 > 전전봉12 &&
- //((전봉4 < candleData_전봉.IchimokData.하한선 && 높은값_72_24_전봉 < candleData_전봉.IchimokData.하한선)
- //|| (전봉4 > candleData_전봉.IchimokData.하한선 && 높은값_72_24_전봉 > candleData_전봉.IchimokData.하한선)) &&
- //전봉4 - 전전봉4 > 전봉12 - 전전봉12 &&
- //전봉12 - 전전봉12 > 전봉24 - 전전봉24
- //)
- //&& flag && !firstFlag && buyFlag && candle15Flag
-
- )
- {
- 전고점Data["tempBuyFlag"] = false;
-
- if (!(candle15Flag && candle60Flag))
- continue;
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData }
- };
-
- UpBuyList.Add(market + interval, buyDic);
-
- if (val == 0)
- 전고점Data["val"] = 전봉4;
-
- 전고점Data["flag"] = false;
- 전고점Data["clearFlag"] = false;
-
-
- if (LongCount < 3)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage);
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyLongList.Add(orderDataDic);
- LongCount++;
- }
-
- }
- }
- //파는 시점
- else
- {
- var buyItem = UpBuyList[market + interval];
- if (interval < MCandleTimeType.H1)
- {
- if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval))
- {
- continue;
- }
- }
- //임시로 처리
- else
- {
- if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60))
- {
- continue;
- }
- }
-
- if (sellFlag)
- {
-
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "Type", "상향"},
- { "BuyPrice", buyPrice },
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- UpResultList.Add(result);
- UpBuyList.Remove(market + interval);
-
- var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "상향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price},
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyLongList.Remove(orderDic);
- LongCount--;
- }
-
- }
- }
-
- }
- catch (Exception e)
- {
-
- }
- }
- if (영호조건식_하향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 하락", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- var candle15Flag = 현재봉15_4 < 현재봉15_12
- && candleData15.Open > candleData15.Close
- && 현재봉15_4 < 전봉15_4
- && 전봉15_4 < 전전봉15_4
- && 현재봉15_12 < 전봉15_12
- && 전봉15_12 < 전전봉15_12
- && 전봉15Bol12 - 전봉15Bol24 > 현재봉15Bol12 - 현재봉15Bol24;
-
-
- var candle60Flag = 현재봉60_4 < 현재봉12
- // && candleData60.Open > candleData60.Close
- && 현재봉60_4 < 전봉60_4
- // && 전봉60_4 < 전전봉60_4
- && 현재봉60_12 < 전봉60_12
- //&& 전봉60_12 < 전전봉60_12
- && 전봉60Bol12 - 전봉60Bol24 > 현재봉60Bol12 - 현재봉60Bol24;
-
- var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4;
-
- var sellFlag = 현재봉1_4 > 높은값1_72_24;
-
- var 전저점Data = 전저점[market + strInterval];
- double.TryParse(전저점Data["val"].ToString(), out var val);
- bool.TryParse(전저점Data["flag"].ToString(), out var flag);
- bool.TryParse(전저점Data["firstFlag"].ToString(), out var firstFlag);
- bool.TryParse(전저점Data["clearFlag"].ToString(), out var clearFlag);
- bool.TryParse(전저점Data["breakFlag"].ToString(), out var breakFlag);
- bool.TryParse(전저점Data["tempBuyFlag"].ToString(), out var tempBuyFlag);
-
- if (현재봉4 > 높은값_48_24 && candleData.IchimokData.상한선 < candleData.Close)
- {
- if (firstFlag)
- 전저점Data["firstFlag"] = false;
-
- 전저점Data["flag"] = true;
- 전저점Data["clearFlag"] = true;
- 전저점Data["val"] = 0;
- 전저점Data["breakFlag"] = false;
- 전저점Data["tempBuyFlag"] = true;
- }
-
- if (!flag || !breakFlag)
- {
- if (val == 0)
- {
- 전저점Data["val"] = 전봉4;
- val = 전봉4;
- }
-
- if (전봉4 > 전전봉4 && clearFlag)
- {
- 전저점Data["clearFlag"] = false;
- if (전전봉4 > val)
- {
- 전저점Data["flag"] = false;
- 전저점Data["breakFlag"] = true;
- }
- else
- {
- 전저점Data["flag"] = true;
- }
- }
-
- else if (전봉4 < 전전봉4)
- {
- 전저점Data["clearFlag"] = true;
- if (val > 전봉4)
- {
- 전저점Data["val"] = 전봉4;
- }
- }
- }
- if (전전봉4 < 높은값_48_24_전전봉
- && 전전봉4 > 낮은값_48_24_전전봉
- && 전봉4 > 높은값_48_24_전봉
- && 전봉12 < 높은값_48_24_전봉)
- {
-
- if (DownList.ContainsKey(market + strInterval))
- {
- if (DownList[market + strInterval])
- DownList[market + strInterval] = false;
- }
- else
- {
- DownList.Add(market + strInterval, false);
- }
- }
-
- if ((
- 전전봉4 < 높은값_48_24_전전봉
- && 전전봉4 > 낮은값_48_24_전전봉
- && 전봉4 > 높은값_48_24_전봉
- && 전봉12 < 높은값_48_24_전봉
- && 전봉24 > 전전봉24 && 전봉12 > 전전봉12
- && 전봉4 > 전전봉4
- && (!DownBuyValue.ContainsKey(market + strInterval) || (DownBuyValue.ContainsKey(market + strInterval) && DownBuyValue[market + strInterval] == 0))
- //&& 높은값_48_24_전봉 > candleData_전봉.IchimokData.하한선
- //&& candleData_전봉.Close > candleData_전봉.IchimokData.하한선
- //&& candleData_전봉.Open < candleData_전봉.Close
- ))
- {
- if (DownBuyValue.ContainsKey(market + strInterval) && DownBuyValue[market + strInterval] == 0)
- {
- DownBuyValue[market + strInterval] = candleData.Open;
- }
- else
- {
- DownBuyValue.Add(market + strInterval, candleData.Open);
- }
- }
- else if (DownBuyValue.ContainsKey(market + strInterval) && DownBuyValue[market + strInterval] != 0 && 현재봉1_4 < 낮은값1_72_24 && DownList.ContainsKey(market + strInterval) && !DownList[market + strInterval])
- {
- if (DownBuyValue[market + strInterval] > candleData.Close)
- {
- if (DownList.ContainsKey(market + strInterval))
- {
- DownList[market + strInterval] = true;
- }
- else
- {
- DownList.Add(market + strInterval, true);
- }
-
- }
-
- DownBuyValue[market + strInterval] = 0;
- }
-
- //사는 시점
- if (!DownBuyList.ContainsKey(market + interval))
- {
- if ((
- 전전봉4 > 낮은값_48_24_전전봉
- && 전전봉4 < 높은값_48_24_전전봉
- && 전봉4 < 낮은값_48_24_전봉
- && 전봉12 > 낮은값_48_24_전봉
- && 전봉24 < 전전봉24
- && 전봉12 < 전전봉12
- && 전봉4 < 전전봉4
- && 낮은값_48_24_전봉 < candleData_전봉.IchimokData.상한선
- && candleData_전봉.Close < candleData_전봉.IchimokData.상한선
- && candleData_전봉.Open > candleData_전봉.Close
- )
- && flag && !firstFlag && buyFlag && tempBuyFlag
- && DownList.ContainsKey(market + strInterval) && DownList[market + strInterval]
- )
- {
- 전저점Data["tempBuyFlag"] = false;
- if (!(candle15Flag && candle60Flag))
- continue;
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData }
- };
-
- DownBuyList.Add(market + interval, buyDic);
-
- if (val == 0)
- 전저점Data["val"] = 전봉4;
-
- 전저점Data["flag"] = false;
- 전저점Data["clearFlag"] = false;
-
- if(ShortCount < 2)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage);
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyShortList.Add(orderDataDic);
- ShortCount++;
- }
- }
- }
- //파는 시점
- else
- {
- var buyItem = DownBuyList[market + interval];
- if (interval < MCandleTimeType.H1)
- {
- if (nowTime < ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval))
- {
- continue;
- }
- }
- //임시로 처리
- else
- {
- if (nowTime < ((DateTime)buyItem["BuyDate"]).AddHours(((int)interval) / 60))
- {
- continue;
- }
- }
-
-
- if (sellFlag)
- {
-
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "BuyPrice", buyPrice },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- DownResultList.Add(result);
- DownBuyList.Remove(market + interval);
-
- var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
-
-
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyShortList.Remove(orderDic);
- ShortCount--;
- }
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- }
- }
- }
- */
-/*
-if (영호조건식_상향돌파 || 영호조건식_하향돌파)
- {
- // 24,72 높은값
- var 높은값_72_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value);
- // 24,72 낮은값
- var 낮은값_72_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value);
- // 24,72 높은값
- var 높은값_72_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value);
- // 24,72 낮은값
- var 낮은값_72_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value);
-
- // 24,72 높은값
- var 높은값_72_24 = Math.Max(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value);
- // 24,72 낮은값
- var 낮은값_72_24 = Math.Min(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value);
-
- var 전전봉4 = candleData_전전봉.movingAverageDataList[4].Value;
- var 전전봉8 = candleData_전전봉.movingAverageDataList[8].Value;
- var 전전봉12 = candleData_전전봉.movingAverageDataList[12].Value;
- var 전전봉24 = candleData_전전봉.movingAverageDataList[24].Value;
- var 전전봉72 = candleData_전전봉.movingAverageDataList[72].Value;
-
- var 전봉4 = candleData_전봉.movingAverageDataList[4].Value;
- var 전봉8 = candleData_전봉.movingAverageDataList[8].Value;
- var 전봉12 = candleData_전봉.movingAverageDataList[12].Value;
- var 전봉24 = candleData_전봉.movingAverageDataList[24].Value;
- var 전봉72 = candleData_전봉.movingAverageDataList[72].Value;
-
- var 현재봉4 = candleData.movingAverageDataList[4].Value;
- var 현재봉8 = candleData.movingAverageDataList[8].Value;
- var 현재봉12 = candleData.movingAverageDataList[12].Value;
- var 현재봉24 = candleData.movingAverageDataList[24].Value;
- var 현재봉72 = candleData.movingAverageDataList[72].Value;
-
-
- var 전봉Bol4 = candleData_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉Bol12 = candleData_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉Bol24 = candleData_전봉.movingAverageDataList[24].BolangerValue;
-
- var 전전봉Bol4 = candleData_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉Bol12 = candleData_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉Bol24 = candleData_전전봉.movingAverageDataList[24].BolangerValue;
- var Bol4 = candleData.movingAverageDataList[4].BolangerValue;
- var Bol12 = candleData.movingAverageDataList[12].BolangerValue;
- var Bol24 = candleData.movingAverageDataList[24].BolangerValue;
-
- if ((int)interval != 15)
- {
- continue;
- }
-
-
- if (영호조건식_상향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 상승", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- //사는 시점
- if (!UpBuyList.ContainsKey(market + interval))
- {
- if (
- (
- 전전봉4 < 높은값_72_24_전전봉 &&
- 전봉4 > 높은값_72_24_전봉
- && 전봉8 < 높은값_72_24_전봉
- && 전봉12 < 높은값_72_24_전봉
- && 전봉4 > 전전봉4
- && 전봉8 > 전전봉8
- && 전봉12 > 전전봉12
- && 전봉4 > candleData_전봉.IchimokData.하한선
- )
- )
- {
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData }
- };
-
- UpBuyList.Add(market + interval, buyDic);
- SellLongStep.Add(market + interval, 0);
- if (LongCount < 5)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage);
- if (orderData != null)
- {
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyLongList.Add(orderDataDic);
- LongCount++;
- }
- }
- }
- }
- //파는 시점
- else
- {
- var buyItem = UpBuyList[market + interval];
- if (interval < MCandleTimeType.H1)
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
- //임시로 처리
- else
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
-
- var compareVal = 높은값_72_24;
- var val = SellLongStep[market + interval];
- var sellFlag = false;
-
- if (val != 101)
- {
- if (높은값_72_24 < 현재봉8)
- {
- SellLongStep[market + interval] = 101;
- val = 101;
- }
- }
-
- if (val == 101)
- {
- compareVal = 현재봉8;
- }
-
- if (candleData_전봉.Close < candleData_전봉.Open &&
- candleData_전전봉.Close < candleData_전전봉.Open &&
- candleData_전전전봉.Close < candleData_전전전봉.Open)
- sellFlag = true;
-
- if (현재봉4 < compareVal || sellFlag)
- {
-
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "Type", "상향"},
- { "BuyPrice", buyPrice },
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- UpResultList.Add(result);
- UpBuyList.Remove(market + interval);
- SellLongStep.Remove(market + interval);
-
- var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "상향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price},
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyLongList.Remove(orderDic);
- LongCount--;
- }
-
- }
- }
-
- }
- catch (Exception e)
- {
-
- }
- }
- if (영호조건식_하향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 하락", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- //사는 시점
- if (!DownBuyList.ContainsKey(market + interval))
- {
- if (
- 전전봉4 > 낮은값_72_24_전전봉
- && 전봉4 < 낮은값_72_24_전봉
- && 전봉8 > 낮은값_72_24_전봉
- && 전봉12 > 낮은값_72_24_전봉
- && 전봉4 < 전전봉4
- && 전봉8 < 전전봉8
- && 전봉12 < 전전봉12
- && candleData_전봉.IchimokData.상한선 > 전봉4
- )
- {
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData }
- };
-
- DownBuyList.Add(market + interval, buyDic);
- SellShortStep.Add(market + interval, 0);
-
- if (ShortCount < 5)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage);
- if (orderData != null)
- {
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyShortList.Add(orderDataDic);
- ShortCount++;
- }
- }
- }
- }
- //파는 시점
- else
- {
- var buyItem = DownBuyList[market + interval];
- if (interval < MCandleTimeType.H1)
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
- //임시로 처리
- else
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
-
- var compareVal = 낮은값_72_24;
- var val = SellShortStep[market + interval];
- var sellFlag = false;
-
- if (val != 101)
- {
- if (낮은값_72_24 > 현재봉8)
- {
- SellShortStep[market + interval] = 101;
- val = 101;
- }
- }
-
- if (val == 101)
- {
- compareVal = 현재봉8;
- }
-
-
- if (candleData_전봉.Close > candleData_전봉.Open &&
- candleData_전전봉.Close > candleData_전전봉.Open &&
- candleData_전전전봉.Close > candleData_전전전봉.Open)
- sellFlag = true;
-
-
- if (현재봉4 > compareVal || sellFlag)
- {
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "BuyPrice", buyPrice },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- DownResultList.Add(result);
- DownBuyList.Remove(market + interval);
- SellLongStep.Remove(market + interval);
- var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
-
-
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyShortList.Remove(orderDic);
- ShortCount--;
- }
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- }
- }
- }
- */
-
-
-/*
-
-if (영호조건식_상향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 상승", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- //사는 시점
- if (!UpBuyList.ContainsKey(market + interval))
- {
- var buyFlag = false;
- var buyTempFlag = false;
-
- var buyType = 0;
-
- if (BuyLongStep.ContainsKey(market + interval) && BuyLongStep[market + interval])
- {
- if (전봉72 < 전봉24 && 전봉12 < 전봉2 && 전봉24 < 전봉2 &&
- candleData_전봉.IchimokData.상한선 < 전봉24 &&
- (전전봉24 < 전봉24 && 전전봉12 < 전봉12))
- {
- buyTempFlag = true;
- buyType = 2;
- }
- else if (전봉2 < 전봉24)
- BuyLongStep[market + interval] = false;
- }
- else
- {
- if (
- candleData_전봉.IchimokData.상한선 > 전봉2 && candleData_전전봉.IchimokData.상한선 > 전전봉2 &&
- 전봉72 > 전봉2 && 전전봉72 > 전전봉2 && 전전봉24 > 전전봉2 && 전봉24 < 전봉2 && (전전봉24 < 전봉24 || 전전봉12 < 전봉12)
- )
- {
- buyTempFlag = true;
- buyType = 1;
- }
- else if (
- candleData_전봉.IchimokData.하한선 < 전봉2 && candleData_전전봉.IchimokData.하한선 < 전전봉2 &&
- 전봉24 < 전봉2 && 전전봉2 < 전전봉24 && 전전봉72 < 전전봉2 && 전봉72 < 전봉2 && (전전봉24 < 전봉24 || 전전봉12 < 전봉12)
- )
- {
- BuyLongStep[market + interval] = true;
- continue;
- }
- }
-
- if (buyTempFlag)
- {
- if (buyType == 1)
- {
- if (Bol12_Up < Bol24_Up && 전봉Bol12_Up < 전봉Bol24_Up && Math.Abs(전봉24 - 전봉Bol72_Down) < Math.Abs(전봉24 - 전봉72))
- {
- buyFlag = true;
- }
- }
- else if (buyType == 2)
- {
- if (Bol12_Up < Bol24_Up && 전봉Bol12_Up < 전봉Bol24_Up && Math.Abs(현재봉24 - Bol72_Up) < Math.Abs(현재봉24 - 현재봉72))
- {
- buyFlag = true;
- }
- }
- }
-
-
- if (buyFlag)
- {
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Type", buyType },
- { "CandleTime", candleData.Argument },
- { "MovingRate4_8", 현재봉8 - 현재봉4 },
- { "Candle", candleData }
- };
-
- UpBuyList.Add(market + interval, buyDic);
-
- var dic = new Dictionary
- {
- [1] = true,
- [2] = false,
- [3] = false,
- [4] = false,
- [5] = false
- };
- SellLongStep.Add(market + interval, dic);
- if (LongCount < 5)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage);
- if (orderData != null)
- {
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyLongList.Add(orderDataDic);
- LongCount++;
- }
- }
- }
- }
- //파는 시점
- else
- {
- var buyItem = UpBuyList[market + interval];
-
- if (interval < MCandleTimeType.H1)
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
- //임시로 처리
- else
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60);
- if (nowTime < buyTime)
- continue;
- }
-
- var sellFlag = false;
- int.TryParse(buyItem["Type"].ToString(), out var type);
- var val = SellLongStep[market + interval];
- //switch (type)
- //{
- // case 1:
- // if (전봉12 > 전봉24 && !val[2])
- // val[2] = true;
- // if (전봉2 > 전봉72 && !val[3])
- // val[3] = true;
- // if (전봉12 > 전봉72 && !val[4])
- // val[4] = true;
- // if (전봉24 > 전봉72 && !val[5])
- // val[5] = true;
-
- // if (val[1] && !val[2] && !val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉12 < 전봉24 && 전봉24 < 전봉2 && 전봉2 < 전봉72);
- // }
- // else if (val[1] && val[2] && !val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉24 < 전봉12 && 전봉12 < 전봉2 && 전봉2 < 전봉72);
- // }
- // else if (val[1] && !val[2] && val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉12 < 전봉24 && 전봉24 < 전봉72 && 전봉72 < 전봉2);
- // }
- // else if (val[1] && val[2] && val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉24 < 전봉12 && 전봉12 < 전봉72 && 전봉72 < 전봉2);
- // }
- // else if (val[1] && val[2] && val[3] && val[4] && !val[5])
- // {
- // sellFlag = !(전봉24 < 전봉72 && 전봉72 < 전봉12 && 전봉12 < 전봉2);
- // }
- // else if (val[1] && val[2] && val[3] && val[4] && val[5])
- // {
- // sellFlag = !(전봉72 < 전봉24 && 전봉24 < 전봉12 && 전봉12 < 전봉2);
- // }
-
- // break;
- // case 2:
- // if ((전봉24 < 현재봉24 && 전봉12 < 현재봉12) || 현재봉2 > 현재봉24)
- // {
- // sellFlag = true;
- // }
- // break;
-
- //}
- if (type == 1)
- {
- if (Math.Abs(전봉4 - 전봉Bol72_Down) < Math.Abs(전봉4 - 전봉72))
- {
- if (전봉2 < 전봉4 && !(전봉24 > 전전봉24 && 전봉12 > 전전봉12))
- {
- sellFlag = true;
- BuyLongStep[market + interval] = false;
- }
- else
- {
- if ((전전봉24 > 전봉24 && 전전봉12 > 전봉12) ||
- (전봉2 < 전봉24))
- {
- sellFlag = true;
- BuyLongStep[market + interval] = false;
- }
- }
-
- }
- else
- {
- if ((전전봉24 > 전봉24 && 전전봉12 > 전봉12) ||
- (전봉2 < 전봉24))
- {
- sellFlag = true;
- BuyLongStep[market + interval] = false;
- }
- }
- }
- else if (type == 2)
- {
- if ((전전봉24 > 전봉24 && 전전봉12 > 전봉12) ||
- ((전전봉24 > 전봉24 || 전전봉12 > 전봉12) && 현재봉2 < 현재봉72 && 전봉2 > 전봉72) ||
- 전봉24 > 전봉Bol72_Up && 전봉2 < 전봉Bol72_Up
- )
- {
- sellFlag = true;
- BuyLongStep[market + interval] = false;
- }
- }
- if (sellFlag)
- {
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "Type", "상향"},
- { "BuyPrice", buyPrice },
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- UpResultList.Add(result);
- UpBuyList.Remove(market + interval);
- SellLongStep.Remove(market + interval);
-
- var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "상향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price},
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyLongList.Remove(orderDic);
- LongCount--;
- }
-
- }
- }
-
- }
- catch (Exception e)
- {
-
- }
- }
- if (영호조건식_하향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 하락", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- //사는 시점
- if (!DownBuyList.ContainsKey(market + interval))
- {
- var buyFlag = false;
- var buyTempFlag = false;
-
- var buyType = 0;
-
- if (BuyShortStep.ContainsKey(market + interval) && BuyShortStep[market + interval])
- {
- if (전봉72 > 전봉24 && 전봉12 > 전봉2 && 전봉24 > 전봉2 &&
- candleData_전봉.IchimokData.하한선 > 전봉24 &&
- (전전봉24 > 전봉24 && 전전봉12 > 전봉12))
- {
- buyTempFlag = true;
- buyType = 2;
- }
- else if (전봉2 > 전봉24)
- BuyShortStep[market + interval] = false;
- }
- else
- {
- if (
- candleData_전봉.IchimokData.하한선 < 전봉2 && candleData_전전봉.IchimokData.하한선 < 전전봉2 &&
- 전봉72 < 전봉2 && 전전봉72 < 전전봉2 && 전전봉24 < 전전봉2 && 전봉24 > 전봉2 && (전전봉24 > 전봉24 || 전전봉12 > 전봉12)
- )
- {
- buyTempFlag = true;
- buyType = 1;
- }
- else if (
- candleData_전봉.IchimokData.상한선 > 전봉2 && candleData_전전봉.IchimokData.상한선 > 전전봉2 &&
- 전봉24 > 전봉2 && 전전봉2 > 전전봉24 && 전전봉72 > 전전봉2 && 전봉72 > 전봉2 && (전전봉24 > 전봉24 || 전전봉12 > 전봉12)
- )
- {
- BuyShortStep[market + interval] = true;
- continue;
- }
- }
-
- if (buyTempFlag)
- {
- if (buyType == 1)
- {
- if (Bol12_Down > Bol24_Down && 전봉Bol12_Down > 전봉Bol24_Down && Math.Abs(전봉24 - 전봉Bol72_Up) < Math.Abs(전봉24 - 전봉72))
- {
- buyFlag = true;
- }
- }
- else if (buyType == 2)
- {
- if (Bol12_Down > Bol24_Down && 전봉Bol12_Down > 전봉Bol24_Down && Math.Abs(현재봉24 - Bol72_Down) < Math.Abs(현재봉24 - 현재봉72))
- {
- buyFlag = true;
- }
- }
- }
-
- if (buyFlag)
- {
-
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Type", buyType },
- { "CandleTime", candleData.Argument },
- { "MovingRate4_8", 현재봉4 - 현재봉8 },
- { "Candle", candleData }
- };
-
- DownBuyList.Add(market + interval, buyDic);
- var dic = new Dictionary
- {
- [1] = true,
- [2] = false,
- [3] = false,
- [4] = false,
- [5] = false
- };
- SellShortStep.Add(market + interval, dic);
- if (buyType == 2)
- {
- BuyShortStep[market + interval] = false;
- }
- if (ShortCount < 5)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage);
- if (orderData != null)
- {
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyShortList.Add(orderDataDic);
- ShortCount++;
- }
- }
- }
- }
- //파는 시점
- else
- {
- var sellFlag = false;
- var buyItem = DownBuyList[market + interval];
-
- if (interval < MCandleTimeType.H1)
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
- //임시로 처리
- else
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60);
- if (nowTime < buyTime)
- continue;
- }
-
- int.TryParse(buyItem["Type"].ToString(), out var type);
-
- //switch (type)
- //{
- // case 1:
- // var val = SellShortStep[market + interval];
- // if (전봉12 < 전봉24 && !val[2])
- // val[2] = true;
- // if (전봉2 < 전봉72 && !val[3])
- // val[3] = true;
- // if (전봉12 < 전봉72 && !val[4])
- // val[4] = true;
- // if (전봉24 < 전봉72 && !val[5])
- // val[5] = true;
-
- // if (val[1] && !val[2] && !val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉12 > 전봉24 && 전봉24 > 전봉2 && 전봉2 > 전봉72);
- // }
- // else if (val[1] && val[2] && !val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉24 > 전봉12 && 전봉12 > 전봉2 && 전봉2 > 전봉72);
- // }
- // else if (val[1] && !val[2] && val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉12 > 전봉24 && 전봉24 > 전봉72 && 전봉72 >전봉2);
- // }
- // else if (val[1] && val[2] && val[3] && !val[4] && !val[5])
- // {
- // sellFlag = !(전봉24 > 전봉12 && 전봉12 > 전봉72 && 전봉72 > 전봉2);
- // }
- // else if (val[1] && val[2] && val[3] && val[4] && !val[5])
- // {
- // sellFlag = !(전봉24 > 전봉72 && 전봉72 > 전봉12 && 전봉12 > 전봉2);
- // }
- // else if (val[1] && val[2] && val[3] && val[4] && val[5])
- // {
- // sellFlag = !(전봉72 > 전봉24 && 전봉24 > 전봉12 && 전봉12 > 전봉2);
- // }
- // else
- // sellFlag = true;
- // break;
- // case 2:
- // if(전봉12 < 현재봉12 && 전봉24 < 현재봉24)
- // {
- // sellFlag = true;
- // }
- // break;
- //}
-
- if (type == 1)
- {
- if (Math.Abs(전봉4 - 전봉Bol72_Up) < Math.Abs(전봉4 - 전봉72))
- {
- if (전봉2 > 전봉4 && !(전봉24 < 전전봉24 && 전봉12 < 전전봉12))
- {
- sellFlag = true;
- BuyShortStep[market + interval] = false;
- }
- else
- {
- if ((전전봉24 < 전봉24 && 전전봉12 < 전봉12) ||
- (전봉2 > 전봉24))
- {
- sellFlag = true;
- BuyShortStep[market + interval] = false;
- }
- }
-
- }
- else
- {
- if ((전전봉24 < 전봉24 && 전전봉12 < 전봉12) ||
- (전봉2 > 전봉24))
- {
- sellFlag = true;
- BuyShortStep[market + interval] = false;
- }
- }
- }
- else if (type == 2)
- {
- if ((전전봉24 < 전봉24 && 전전봉12 < 전봉12) ||
- ((전전봉24 < 전봉24 || 전전봉12 < 전봉12) && 현재봉2 > 현재봉72 && 전봉2 < 전봉72) ||
- 전봉24 < 전봉Bol72_Down && 전봉2 > 전봉Bol72_Down
- )
- {
- sellFlag = true;
- BuyShortStep[market + interval] = false;
- }
- }
-
- if (sellFlag)
- {
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "BuyPrice", buyPrice },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- DownResultList.Add(result);
- DownBuyList.Remove(market + interval);
- SellShortStep.Remove(market + interval);
- var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
-
-
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyShortList.Remove(orderDic);
- ShortCount--;
- }
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- }
- }
-
- */
-
-/**
-
-if (영호조건식_상향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 상승", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- //사는 시점
- if (!UpBuyList.ContainsKey(market + interval))
- {
- var buyFlag = false;
-
- if(!BuyLongStep.ContainsKey(market + interval) || !BuyLongStep[market + interval])
- {
- if(전전봉2 < 전전봉Bol72_Down)
- {
- BuyLongStep[market + interval] = true;
- continue;
- }
- }
-
- if(BuyLongStep.ContainsKey(market + interval) || BuyLongStep[market + interval])
- {
- if(전봉24 < 현재봉24 && 전봉24 < 전봉72 && 현재봉24 < 현재봉72 && 전봉72 > 전봉2 && 현재봉72 < 현재봉2 && 현재봉24 > Bol72_Down)
- {
- buyFlag = true;
- }
- }
-
- if (buyFlag)
- {
- BuyLongStep[market + interval] = false;
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "CandleTime", candleData.Argument },
- { "MovingRate4_8", 현재봉8 - 현재봉4 },
- { "Candle", candleData }
- };
-
- UpBuyList.Add(market + interval, buyDic);
-
- var dic = new Dictionary
- {
- [1] = true,
- [2] = false,
- [3] = false,
- [4] = false,
- [5] = false
- };
- SellLongStep.Add(market + interval, dic);
- if (LongCount < 5)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyLong, OrderType.limit, YHKIM_Leverage);
- if (orderData != null)
- {
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyLongList.Add(orderDataDic);
- LongCount++;
- }
- }
- }
- }
- //파는 시점
- else
- {
- var buyItem = UpBuyList[market + interval];
-
- if (interval < MCandleTimeType.H1)
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
- //임시로 처리
- else
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60);
- if (nowTime < buyTime)
- continue;
- }
-
- var sellFlag = false;
-
- if(전봉24 < 전봉72)
- {
- if (전봉2 < 전봉72)
- sellFlag = true;
- if (전봉2 < 전봉Bol72_Up && 전전봉2 > 전전봉Bol72_Up)
- sellFlag = true;
-
- }
- else
- {
- if (현재봉24 < 현재봉72)
- sellFlag = true;
- if (Bol72_Up < 현재봉24)
- sellFlag = true;
- if (전봉72 > 현재봉72 && 전봉24 > 현재봉24)
- sellFlag = true;
- }
-
- if (sellFlag)
- {
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "Type", "상향"},
- { "BuyPrice", buyPrice },
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- UpResultList.Add(result);
- UpBuyList.Remove(market + interval);
- SellLongStep.Remove(market + interval);
-
- var orderDic = BuyLongList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellLong, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "상향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price},
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyLongList.Remove(orderDic);
- LongCount--;
- }
-
- }
- }
-
- }
- catch (Exception e)
- {
-
- }
- }
- if (영호조건식_하향돌파)
- {
- var price = candleData.Close;
- var rate = (candleData.Close / candleData.Open) * 100 - 100;
- var indicatorPrice = candleData.Open;
- var indicatorRate = (candleData.Close / indicatorPrice) * 100 - 100;
-
- var description = string.Format("{0} 72,24,4 하락", strInterval);
- var signalData = signals_SD.Find(i => i.MarketName.Equals(market) && i.Description.Equals(description));
-
- try
- {
- //사는 시점
- if (!DownBuyList.ContainsKey(market + interval))
- {
- var buyFlag = false;
-
- if (!BuyShortStep.ContainsKey(market + interval) || !BuyShortStep[market + interval])
- {
- if (전전봉2 > 전전봉Bol72_Up)
- {
- BuyShortStep[market + interval] = true;
- continue;
- }
- }
-
- if (BuyShortStep.ContainsKey(market + interval) || BuyShortStep[market + interval])
- {
- if (전봉24 > 현재봉24 && 전봉24 > 전봉72 && 현재봉24 > 현재봉72 && 전봉72 < 전봉2 && 현재봉72 > 현재봉2 && 현재봉24 < Bol72_Up)
- {
- buyFlag = true;
- }
- }
-
- if (buyFlag)
- {
- BuyShortStep[market + interval] = false;
- // 없으면 생성
- if (signalData == null)
- {
- SignalInfoData signalInfoData = new SignalInfoData();
- signalInfoData.SignalStart = nowTime;
- signalInfoData.MarketName = market;
- signalInfoData.Description = description;
- signalInfoData.Rate = rate;
- signalInfoData.Price = price;
- signalInfoData.IndicatorPrice = indicatorPrice;
- signalInfoData.IndicatorRate = indicatorRate;
- signalInfoData.MCandleTimeType = interval;
-
- signals_SD.Add(signalInfoData);
- }
- var buyDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
-
- { "CandleTime", candleData.Argument },
- { "MovingRate4_8", 현재봉4 - 현재봉8 },
- { "Candle", candleData }
- };
-
- DownBuyList.Add(market + interval, buyDic);
- var dic = new Dictionary
- {
- [1] = true,
- [2] = false,
- [3] = false,
- [4] = false,
- [5] = false
- };
- SellShortStep.Add(market + interval, dic);
- BuyShortStep[market + interval] = false;
- if (ShortCount < 5)
- {
- double size = YHKIM_OrderAmount / price * YHKIM_Leverage;
- var orderData = FutureOrder(market, FutureMarginMode.isolated, size, price, FutureSide.BuyShort, OrderType.limit, YHKIM_Leverage);
- if (orderData != null)
- {
- var orderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderData["data"]));
-
- var orderDataDic = new Dictionary
- {
- { "MarketName", market },
- { "BuyDate", nowTime },
- { "Price", price },
- { "MCandleTimeType", (int)interval },
- { "Candle", candleData },
- { "Size", size },
- { "orderId", orderDic["orderId"] }
- };
- BuyShortList.Add(orderDataDic);
- ShortCount++;
- }
- }
- }
- }
- //파는 시점
- else
- {
- var sellFlag = false;
- var buyItem = DownBuyList[market + interval];
-
- if (interval < MCandleTimeType.H1)
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddMinutes((int)interval);
- if (nowTime < buyTime)
- continue;
- }
- //임시로 처리
- else
- {
- var buyTime = ((DateTime)buyItem["BuyDate"]).AddHours((int)interval / 60);
- if (nowTime < buyTime)
- continue;
- }
-
- if (전봉24 > 전봉72)
- {
- if (전봉2 > 전봉72)
- sellFlag = true;
- if (전봉2 > 전봉Bol72_Down && 전전봉2 > 전전봉Bol72_Down)
- sellFlag = true;
- }
- else
- {
- if (현재봉24 > 현재봉72)
- sellFlag = true;
- if (Bol72_Down > 현재봉24)
- sellFlag = true;
- if (전봉72 < 현재봉72 && 전봉24 < 현재봉24)
- sellFlag = true;
- }
- if (sellFlag)
- {
- double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100;
-
- var result = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", buyItem["BuyDate"]},
- { "BuyPrice", buyPrice },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRate }
- };
-
- DownResultList.Add(result);
- DownBuyList.Remove(market + interval);
- SellShortStep.Remove(market + interval);
- var orderDic = BuyShortList.FirstOrDefault(t => t["MarketName"].ToString() == market);
-
- if (orderDic != null)
- {
- double.TryParse(orderDic["Size"].ToString(), out var size);
- var sellOrder = FutureOrder(market, FutureMarginMode.isolated, size, 0, FutureSide.SellShort, OrderType.market, YHKIM_Leverage, orderDic["orderId"].ToString());
-
- if (sellOrder != null)
- {
- var sellOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(sellOrder["data"]));
- }
- else
- {
- Log.Error("Sell 안됨 확인 필요");
- }
-
-
- double.TryParse(orderDic["Price"].ToString(), out var buyPriceValue);
- //var detail = GetFutureOrderDetail(market, sellOrderDic["orderId"]);
- //var detailOrderDic = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(detail["data"]));
-
- //double.TryParse(detailOrderDic["price"].ToString(), out var sellPriceValue);
-
- var resultRateData = ((price - buyPriceValue) / buyPriceValue) * 100;
-
- var orderResult = new Dictionary()
- {
- { "MarketName", market },
- { "BuyDate", orderDic["BuyDate"]},
- { "BuyPrice", orderDic["Price"] },
- { "Type", "하향"},
- { "MCandleTimeType", (int)interval },
- { "BuyCandle", buyItem["Candle"] },
- { "SellDate", nowTime},
- { "SellPrice", price },
- { "SellCandle", candleData },
- { "Rate", resultRateData }
- };
- ResultList.Add(orderResult);
- BuyShortList.Remove(orderDic);
- ShortCount--;
- }
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine(e.Message);
- }
- }
-
- */
\ No newline at end of file
diff --git a/BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs b/BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs
new file mode 100644
index 0000000..a91def1
--- /dev/null
+++ b/BitgetApi/IndicatorConditionSetup/TradingViewConditionSetup.cs
@@ -0,0 +1,258 @@
+using DevExpress.XtraEditors.TextEditController.InputHandler;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip;
+
+namespace BitgetApi.IndicatorConditionSetup
+{
+ public class TradingViewConditionSetup
+ {
+
+ // 기본 파라미터
+ public int LengthMA = 34;
+ public int LengthSignal = 12;
+ public int AdxLength = 12;
+ public double AdxThreshold = 24;
+ public double RangeThreshold = 2.2;
+ public double RangeThresholdSell = 2.2;
+
+ // 데이터 입력: High, Low, Close 배열 (최근 것이 맨 끝)
+ public List High;
+ public List Low;
+ public List Close;
+
+ // SMA4 계산용
+ private double[] Sma4;
+
+ public void SetData(List high, List low, List close)
+ {
+ High = high;
+ Low = low;
+ Close = close;
+ Sma4 = ComputeSma4();
+ }
+
+ // 1. SMMA 계산
+ private double CalcSmma(List src, int len)
+ {
+ double smma = src.Take(len).Average();
+ for (int i = len; i < src.Count; i++)
+ {
+ smma = (smma * (len - 1) + src[i]) / len;
+ }
+ return smma;
+ }
+
+ // 2. ZLEMA 계산
+ private double CalcZlema(List src, int length)
+ {
+ double ema1 = Ema(src, length);
+ double ema2 = Ema(Enumerable.Repeat(ema1, src.Count).ToList(), length);
+ double d = ema1 - ema2;
+ return ema1 + d;
+ }
+
+ // 3. EMA 계산
+ private double Ema(List src, int length)
+ {
+ double alpha = 2.0 / (length + 1);
+ double ema = src[0];
+ for (int i = 1; i < src.Count; i++)
+ {
+ ema = alpha * src[i] + (1 - alpha) * ema;
+ }
+ return ema;
+ }
+
+ // 4. SMA(4) 계산
+ private double[] ComputeSma4()
+ {
+ double[] sma4 = new double[Close.Count];
+ for (int i = 3; i < Close.Count; i++)
+ {
+ sma4[i] = (Close[i] + Close[i - 1] + Close[i - 2] + Close[i - 3]) / 4.0;
+ }
+ return sma4;
+ }
+
+ // 5. ADX (가장 간단한 형태)
+ private double ComputeAdx()
+ {
+ // 간단화: 실제 구현 시 true range, directional movement 등 추가 필요
+ return 25.0; // 더미값 또는 타 라이브러리 사용 가능
+ }
+
+ // 6. Impulse MACD 계산
+ public double ComputeMd(bool flag = true)
+ {
+ if (flag)
+ {
+ double hi = CalcSmma(High, LengthMA);
+ double lo = CalcSmma(Low, LengthMA);
+ var hlc3 = High.Zip(Low, (h, l) => (h + l + Close.Last()) / 3).ToList();
+ double mi = CalcZlema(hlc3, LengthMA);
+ if (mi > hi) return mi - hi;
+ else if (mi < lo) return mi - lo;
+ return 0;
+ }
+ else
+ {
+ var highTemp = new List();
+ foreach(var item in High)
+ highTemp.Add(item);
+ var lowTemp = new List();
+ foreach (var item in Low)
+ lowTemp.Add(item);
+ var closeTemp = new List();
+ foreach (var item in Close)
+ closeTemp.Add(item);
+
+ highTemp.RemoveAt(highTemp.Count - 1);
+ lowTemp.RemoveAt(lowTemp.Count - 1);
+ closeTemp.RemoveAt(closeTemp.Count - 1);
+
+ double hi = CalcSmma(highTemp, LengthMA);
+ double lo = CalcSmma(lowTemp, LengthMA);
+ var hlc3 = highTemp.Zip(lowTemp, (h, l) => (h + l + closeTemp.Last()) / 3).ToList();
+ double mi = CalcZlema(hlc3, LengthMA);
+ if (mi > hi) return mi - hi;
+ else if (mi < lo) return mi - lo;
+ return 0;
+ }
+
+
+ }
+
+ // 7. MACD, SignalLine 계산
+ public (double macdLine, double signalLine) ComputeMacd()
+ {
+ double macdLine = Ema(Close, 34) - Ema(Close, 12);
+ double signalLine = Ema(Enumerable.Repeat(macdLine, Close.Count).ToList(), 12);
+ return (macdLine, signalLine);
+ }
+
+ // 8. RangeBound 필터
+ public bool IsRangeBound()
+ {
+ double highestHigh = High.Skip(High.Count - 12).Max();
+ double lowestLow = Low.Skip(Low.Count - 12).Min();
+ double range = highestHigh - lowestLow;
+ return range < (highestHigh * RangeThreshold / 100.0);
+ }
+
+ public bool IsRangeBoundSell()
+ {
+ double highestHigh = High.Skip(High.Count - 12).Max();
+ double lowestLow = Low.Skip(Low.Count - 12).Min();
+ double range = highestHigh - lowestLow;
+ return range < (highestHigh * RangeThresholdSell / 100.0);
+ }
+
+ // 9. 트렌드 여부
+ public bool IsTrending()
+ {
+ return ComputeAdx() > AdxThreshold;
+ }
+
+ // 10. 매수 조건
+ public bool IsLongSignal()
+ {
+ double md = ComputeMd();
+ double prevMd = ComputeMd(false);
+ var (macd, signal) = ComputeMacd();
+ bool isUptrend = Close.Last() > Sma4.Last();
+
+ return isUptrend &&
+ ((prevMd == 0 && md > 0) || (macd < 0 && macd > signal)) &&
+ IsTrending() && !IsRangeBound();
+ }
+
+ // 11. 매도 조건
+ public bool IsShortSignal()
+ {
+ double md = ComputeMd();
+ double prevMd = ComputeMd(false);
+ var (macd, signal) = ComputeMacd();
+ bool isDowntrend = Close.Last() < Sma4.Last();
+
+ return isDowntrend &&
+ ((prevMd == 0 && md < 0) || (macd > 0 && macd < signal)) &&
+ IsTrending() && !IsRangeBoundSell();
+ }
+
+ public bool IsSmaHigh(int range, int count)
+ {
+ var list = new List();
+ for (int i = Close.Count - count - 1; i < count; i++)
+ {
+ var sum = 0.0;
+ for(int j = 0;j < range; j++)
+ {
+ sum += Close[i-j];
+ }
+ var data = sum / range;
+ list.Add(data);
+ }
+
+ if (list.Max() == list[list.Count - 1])
+ return true;
+ else
+ return false;
+ }
+
+ public bool IsSmaLow(int range, int count)
+ {
+ var list = new List();
+ for (int i = Close.Count - count - 1; i < count; i++)
+ {
+ var sum = 0.0;
+ for (int j = 0; j < range; j++)
+ {
+ sum += Close[i - j];
+ }
+ var data = sum / range;
+ list.Add(data);
+ }
+
+ if (list.Min() == list[list.Count - 1])
+ return true;
+ else
+ return false;
+ }
+
+ public bool IsSmaMiddle(int range, int count, bool longFlag) {
+ var list = new List();
+ for (int i = Close.Count - count - 1; i < count; i++)
+ {
+ var sum = 0.0;
+ for (int j = 0; j < range; j++)
+ {
+ sum += Close[i - j];
+ }
+ var data = sum / range;
+ list.Add(data);
+ }
+
+ if (longFlag)
+ {
+ if(list[list.Count - 1] > list.Average())
+ {
+ return true;
+ }
+ }
+ else
+ {
+ if (list[list.Count - 1] < list.Average())
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
+