diff --git a/Million Buyer/MainForm.cs b/Million Buyer/MainForm.cs
index 514672f..12e9919 100644
--- a/Million Buyer/MainForm.cs
+++ b/Million Buyer/MainForm.cs
@@ -412,7 +412,7 @@ namespace Million_Buyer
sw.Stop();
if (sw.Elapsed.TotalSeconds > 1)
InsertLog("Execute 계산 시간 : " + sw.Elapsed.ToString());
-
+
var minDateTime = dic[MCandleTimeType.M1].Select(t => t.DateTime).Min();
var maxDateTime = dic[MCandleTimeType.M1].Select(t => t.DateTime).Max().AddHours(1);
@@ -425,9 +425,24 @@ namespace Million_Buyer
#region 사고 파는 로직
//최신 데이터 가져오기
- var recentlyData = dic[MCandleTimeType.M1][dic[MCandleTimeType.M1].Count - 1];
+ var recentlyDataList = dic[MCandleTimeType.M1].Where(t=>t.RecentlyDataFlag).ToList();
+ if (recentlyDataList.Count == 0)
+ continue;
+ var maxTime = recentlyDataList.Select(t => t.DateTime).Max();
+ var recentlyData = recentlyDataList.FirstOrDefault(t => t.DateTime == maxTime);
+
if (recentlyData == null)
continue;
+
+ // Parent Recently Data는 indicator에 따라 달라질수 있으므로 전부다 처리한 후 초기화
+ foreach (var data in dic)
+ {
+ var recentlyList = data.Value.Where(t => t.RecentlyDataFlag).ToList();
+
+ foreach (var recentlyItem in recentlyList)
+ recentlyItem.RecentlyDataFlag = false;
+ }
+
/*
* 로직 설명
* 1. Buy List에 있는지 확인
@@ -473,6 +488,11 @@ namespace Million_Buyer
{
recentlyData.BuyCount = Math.Round(cycleBuyMoney / recentlyData.BuyValue, 8);
buyData.Uuid = OrderBuy(buyData.ConGoodsData.CoinFullName, recentlyData.BuyCount, recentlyData.BuyValue);
+ if (buyData.Uuid == "")
+ {
+ InsertLog("Return Data 가 에러라서 구매 불가. Log 확인 바람");
+ continue;
+ }
buyCycleCount++;
}
@@ -783,6 +803,7 @@ namespace Million_Buyer
InsertLog("------------------------------------");
InsertLog("Buy Return Data : " + JsonConvert.SerializeObject(returnData));
InsertLog("------------------------------------");
+ if (returnData == null) return "";
return returnData.Uuid;
}
diff --git a/Million Prototype/Form1.cs b/Million Prototype/Form1.cs
index c3cbd6e..0d2489f 100644
--- a/Million Prototype/Form1.cs
+++ b/Million Prototype/Form1.cs
@@ -158,9 +158,9 @@ namespace Million_Prototype
//사고 파는 rex 데이터 가져오는 부분
var buyRex = savedResultData.BuyRegularExpression;
var sellRex = savedResultData.SellRegularExpression;
- var buyScript = new InteratorScripter();
+ var buyScript = new InteratorScripter("");
buyScript.regularExpressionString = buyRex;
- var sellScript = new InteratorScripter();
+ var sellScript = new InteratorScripter("");
sellScript.regularExpressionString = sellRex;
//save 데이터
@@ -844,7 +844,7 @@ namespace Million_Prototype
ss123 = aa1.Except(aa4);
- InteratorScripter ss = new InteratorScripter();
+ InteratorScripter ss = new InteratorScripter("");
ss.regularExpressionString = aa;
ss.DicExcuteScript(aa1);
diff --git a/Million/Data/Upbit/Ticker.cs b/Million/Data/Upbit/Ticker.cs
index 3e8df56..01ff48f 100644
--- a/Million/Data/Upbit/Ticker.cs
+++ b/Million/Data/Upbit/Ticker.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
+using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
@@ -118,5 +120,51 @@ namespace Million.Data.Upbit
///
public DateTime LowstPriceDateOf52Week { get; set; }
+ public object DeepClone(object obj)
+ {
+ object objResult = null;
+
+ using (var ms = new MemoryStream())
+ {
+ var bf = new BinaryFormatter();
+ bf.Serialize(ms, obj);
+
+ ms.Position = 0;
+ objResult = bf.Deserialize(ms);
+ }
+
+ return objResult;
+ }
+
+ public Ticker Clone()
+ {
+ var ticker = new Ticker();
+
+ ticker.DateTime = DateTime;
+ ticker.CoinFullName = CoinFullName;
+ ticker.TradeDateTime = TradeDateTime;
+ ticker.OpeningPrice = OpeningPrice;
+ ticker.HighPrice = HighPrice;
+ ticker.LowPrice = LowPrice;
+ ticker.TradePrice = TradePrice;
+ ticker.BeforeDayClosePrice = BeforeDayClosePrice;
+ ticker.TrendType = TrendType;
+ ticker.AbsoluteChangePrice = AbsoluteChangePrice;
+ ticker.AbsoluteChangeRate = AbsoluteChangeRate;
+ ticker.SignedChangePrice = SignedChangePrice;
+ ticker.SignedChangeRate = SignedChangeRate;
+ ticker.TradeVolume = TradeVolume;
+ ticker.AccumulateTradePrice = AccumulateTradePrice;
+ ticker.AccumulateTradePrice24 = AccumulateTradePrice24;
+ ticker.AccumulateTradeVolume = AccumulateTradeVolume;
+ ticker.AccumulateTradeVolume24 = AccumulateTradeVolume24;
+ ticker.HighstPriceOf52Week = HighstPriceOf52Week;
+ ticker.HighstPriceDateOf52Week = HighstPriceDateOf52Week;
+ ticker.LowstPriceOf52Week = LowstPriceOf52Week;
+ ticker.LowstPriceDateOf52Week = LowstPriceDateOf52Week;
+
+ return ticker;
+
+ }
}
}
diff --git a/Million/Manager/CalculateManager.cs b/Million/Manager/CalculateManager.cs
index 7fd361e..c7a4020 100644
--- a/Million/Manager/CalculateManager.cs
+++ b/Million/Manager/CalculateManager.cs
@@ -346,7 +346,7 @@ namespace Million.Manager
//단순비교
else if (setUp.SubIndicatorSetupType == SubIndicatorSetupType.단순비교)
{
- SimpleComparison(setUp, parentCandleDataList, childrenCandleDataList, recentlyDataFlag);
+ SimpleComparison(setUp, parentCandleDataList, childrenCandleDataList, recentlyDataFlag, coinFullName);
}
//최초돌파
else if (setUp.SubIndicatorSetupType == SubIndicatorSetupType.최초돌파)
@@ -603,6 +603,10 @@ namespace Million.Manager
{
var dic = parent.CalculateFlag;
+ var val = GetValueData(subIndi, parent, subKey);
+
+
+
//Sub 조건 만족 여부
if (subScript.DicExcuteScript(dic))
{
@@ -613,6 +617,11 @@ namespace Million.Manager
subFlag = false;
var str = "";
+ if(val < parent.EndValue)
+ {
+
+ }
+
if (recentlyDataFlag)
{
if (!subManagement[coinFullName])
@@ -835,7 +844,7 @@ namespace Million.Manager
///
///
///
- public static void SimpleComparison(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, bool recentlyDataFlag)
+ public static void SimpleComparison(IndicatorCoditionSetup setUp, List parentCandleDataList, List childrenCandleDataList, bool recentlyDataFlag, string coinFullName)
{
//비교할 데이터 Key 설정
var key = GetKeyData(setUp);
@@ -871,9 +880,10 @@ namespace Million.Manager
{
compareFlag = CompareSettingValueOfTranspierce(setUp.IndicatorOver, overlapData, value);
}
-
+
if (compareFlag)
{
+ item.CalculateFlag[setUp.IndexString] = true;
var childList = new List();
if (item.CandleTimeType == (int)MCandleTimeType.M1)
{
@@ -971,6 +981,7 @@ namespace Million.Manager
if (flag)
{
child.CalculateFlag[setUp.IndexString] = true;
+
}
}
}
@@ -1014,7 +1025,7 @@ namespace Million.Manager
}
}
}
- item.CalculateFlag[setUp.IndexString] = true;
+
}
}
}
diff --git a/Million/Manager/IndicatorSetupManager.cs b/Million/Manager/IndicatorSetupManager.cs
index 4c0bd29..9e6074b 100644
--- a/Million/Manager/IndicatorSetupManager.cs
+++ b/Million/Manager/IndicatorSetupManager.cs
@@ -97,7 +97,7 @@ namespace Million.Manager
// Sub Indicator Class
var subIndicator = totalIndicators.Where(t => subIndStringList.Any(u => u == t.IndexString)).ToList();
-
+
// 선처리
CalculateManager.GetCalculateIndicator(totalIndicators, subIndStringList, null, startDate,
endDate, dic[MCandleTimeType.M1], subIndicator, dic, recentlyDataFlag, upperMainIndicatorFlag, coinFullName);
@@ -110,19 +110,7 @@ namespace Million.Manager
// 후처리
CalculateManager.GetCalculateIndicator(totalIndicators, totalIndi, null, startDate,
- endDate, dic[MCandleTimeType.M1], subIndicator, dic, recentlyDataFlag, upperMainIndicatorFlag, coinFullName);
-
-
- // Parent Recently Data는 indicator에 따라 달라질수 있으므로 전부다 처리한 후 초기화
- if (recentlyDataFlag)
- foreach (var data in dic)
- {
- var recentlyList = data.Value.Where(t => t.RecentlyDataFlag).ToList();
-
- foreach (var recentlyItem in recentlyList)
- recentlyItem.RecentlyDataFlag = false;
- }
-
+ endDate, dic[MCandleTimeType.M1], subIndicator, dic, recentlyDataFlag, upperMainIndicatorFlag, coinFullName);
return dic;
}
}
diff --git a/Million/Manager/RealtimeDataSettingManager.cs b/Million/Manager/RealtimeDataSettingManager.cs
index ccdfdda..7daa1df 100644
--- a/Million/Manager/RealtimeDataSettingManager.cs
+++ b/Million/Manager/RealtimeDataSettingManager.cs
@@ -108,7 +108,7 @@ namespace Million.Manager
this.tc = new TimerCallback(TimerEvent); // 이벤트 발생 처리 루틴
//0.5초 마다 쌓는거 진행 -> DB데이터 가지고와서 부터 데이터 처리
- this.timer = new System.Threading.Timer(tc, null, 0, 1000);
+ this.timer = new System.Threading.Timer(tc, null, 0, 500);
flag = true;
}
@@ -158,23 +158,31 @@ namespace Million.Manager
var candleList = candleDatas[type];
//Parallel.ForEach(candleList, item =>
//{
+ var tickList = new List();
+ var cloneTickList = new List();
+ lock (obj)
+ {
+ try
+ {
+ foreach (var item in tickerList)
+ {
+ cloneTickList.Add(item.Clone());
+ }
+ }
+ catch (Exception e)
+ {
+ LogManager.WriteLog(e.Message);
+ }
+ }
+
foreach (var item in candleList)
{
if (item.CandleDataLists_Im.Count > 0)
basicDateTime = item.CandleDataLists_Im.Select(t => t.DateTime).Max();
var coinFullName = item.ConGoodsData.CoinFullName;
- List tickList = null;
- lock (obj)
- {
- try
- {
- tickList = tickerList.Where(t => t.CoinFullName == coinFullName && basicDateTime < t.DateTime).OrderBy(t => t.DateTime).ToList();
- }
- catch (Exception e) {
- LogManager.WriteLog(e.Message);
- }
- }
+
+ tickList = cloneTickList.Where(t => t.CoinFullName == coinFullName).ToList();
// 호출 당시 시, 분, 초
var callH = basicDateTime.Hour;
diff --git a/Million/WebMangement/Upbit/UpbitAPI.cs b/Million/WebMangement/Upbit/UpbitAPI.cs
index 0322c19..f69fa73 100644
--- a/Million/WebMangement/Upbit/UpbitAPI.cs
+++ b/Million/WebMangement/Upbit/UpbitAPI.cs
@@ -232,6 +232,9 @@ namespace Million.WebMangement.Upbit
if (price != 0)
namevalCollection.Add("price", price.ToString());
+ var logStr = coinFullName + " 주문 금액 : " + price.ToString() + ", 주문량 : " + volume.ToString() + "\r\n";
+
+ LogManager.WriteLog(logStr, coinFullName);
var resResult = process.CallAPI(url, HttpMethod.Post, namevalCollection);
Order returnData;
@@ -251,7 +254,7 @@ namespace Million.WebMangement.Upbit
if (cnt == 10)
{
insertLog("Try Order Count 넘어감 -> CNT : " + cnt);
- var logStr = coinFullName + " 주문 에러!! 주문 returnData : " + JsonConvert.SerializeObject(returnData) + "\r\n"
+ logStr = coinFullName + " 주문 에러!! 주문 returnData : " + JsonConvert.SerializeObject(returnData) + "\r\n"
+ "resResult : " + resResult;
LogManager.WriteLog(logStr, coinFullName);
break;
diff --git a/Million/WebMangement/WebServiceFunctions.cs b/Million/WebMangement/WebServiceFunctions.cs
index 33ca817..301b30c 100644
--- a/Million/WebMangement/WebServiceFunctions.cs
+++ b/Million/WebMangement/WebServiceFunctions.cs
@@ -279,7 +279,7 @@ namespace Million.WebServices
{
var returnData = new List();
var datas = JsonConvert.DeserializeObject>>(resResult.ToString());
- var dateTimeData = DateTime.Now;
+
foreach (var item in datas)
{
double.TryParse(item["opening_price"]?.ToString(), out var opening_price);
@@ -301,11 +301,14 @@ namespace Million.WebServices
double.TryParse(item["timestamp"]?.ToString(), out var timeStamp);
var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0);
- dateTime = dateTime.AddSeconds(timeStamp);
-
+ dateTime = dateTime.AddMilliseconds(timeStamp);
+ dateTime = dateTime.AddHours(9);
var dateStr = item["trade_date"]?.ToString() + item["trade_time"]?.ToString();
-
+ if(!(dateTime.Day == DateTime.Now.Day && dateTime.Hour == DateTime.Now.Hour && dateTime.Minute == DateTime.Now.Minute))
+ {
+ continue;
+ }
var data = new Ticker();
data.CoinFullName = item["market"]?.ToString();
data.TradeDateTime = DateTime.ParseExact(dateStr, "yyyyMMddHHmmss", null);