From 081c666c985333db45c3c6c50d82057709babdf7 Mon Sep 17 00:00:00 2001
From: kyh <1329522@naver.com>
Date: Thu, 29 Aug 2024 11:02:17 +0900
Subject: [PATCH 1/4] test
---
BitgetApi/BitgetApi.csproj | 1 -
BitgetApi/CommonProperty.cs | 51 ++++++++-
.../IndicatorProcess.cs | 103 ++++++++++++++++++
BitgetApi/WebService/WebConnection.cs | 29 ++++-
4 files changed, 173 insertions(+), 11 deletions(-)
diff --git a/BitgetApi/BitgetApi.csproj b/BitgetApi/BitgetApi.csproj
index 3cfffae..3f69e2e 100644
--- a/BitgetApi/BitgetApi.csproj
+++ b/BitgetApi/BitgetApi.csproj
@@ -94,7 +94,6 @@
MainForm.cs
-
ResXFileCodeGenerator
Resources.Designer.cs
diff --git a/BitgetApi/CommonProperty.cs b/BitgetApi/CommonProperty.cs
index a68334b..c09d510 100644
--- a/BitgetApi/CommonProperty.cs
+++ b/BitgetApi/CommonProperty.cs
@@ -91,6 +91,10 @@ namespace BitgetAPI
BitgetCandleStick_Coin = 22,
[Description("BitgetMCandle_FUTURE")]
BitgetCandleStick_Future = 23,
+ [Description("BitgetAccountList_FUTURE")]
+ BitgetAccountList_Future = 30,
+ [Description("BitgetOrder_FUTURE")]
+ BitgetOrder_Future = 31
#endregion
}
@@ -98,9 +102,47 @@ namespace BitgetAPI
public enum BitgetWebSocketType
{
현황정보_전체종목 = 0,
- 캔들정보 = 1
+ 캔들정보 = 1,
+ 보유List = 2,
+ 주문하기 = 3,
}
+ public enum Side
+ {
+ [Description("buy")]
+ buy = 0,
+ [Description("sell")]
+ sell =1
+ }
+
+ public enum OrderType
+ {
+ [Description("limit")]
+ limit = 0,
+ [Description("market")]
+ market = 1,
+ }
+
+ #region 선물거래 관련
+ public enum FutureMarginMode
+ {
+ [Description("isolated")]
+ isolated = 0,
+ [Description("crossed")]
+ crossed = 1,
+ }
+
+
+
+ public enum FutureSide
+ {
+ BuyShort = 0,
+ BuyLong = 1,
+ SellShort = 0,
+ SellLong = 1,
+ }
+ #endregion
+
// 시가/고가/종가/저가
public enum CandlePriceType
{
@@ -150,8 +192,7 @@ namespace BitgetAPI
캔들 = 1,
거래량 = 2
}
-
-
+
#region 업비트 URL
public static string UpbitURL = "https://api.upbit.com/";
public static string UpbitURL_MarketInfo = "https://api.upbit.com/v1/market/all";
@@ -176,8 +217,10 @@ namespace BitgetAPI
public static string BitgetURL_MarketInfo_FUTURE = "https://api.bitget.com/api/v2/mix/market/tickers?productType=USDT-FUTURES";
public static string BitgetURL_MarketCandle_Coin = "https://api.bitget.com/api/v2/spot/market/candles?symbol={0}&granularity={1}in&startTime={2}&endTime={3}&limit={4}";
- public static string BitgetURL_MarketCandle_Future = "https://api.bitget.com/api/v2/mix/market/candles?symbol={0}&granularity={1}&limit={2}&productType={3}";
+ public static string BitgetURL_MarketCandle_Future = "https://api.bitget.com/api/v2/mix/market/candles?symbol={0}&granularity={1}&limit={2}&productType={3}";
+ public static string BitgetURL_AccountList_Future = @"https://api.bitget.com/api/v2/mix/account/accounts?productType=USDT-FUTURES";
+ public static string BitgetURL_BuySellOrder_Future = @"https://api.bitget.com/api/v2/mix/order/place-order?";
#endregion
}
diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
index 8a0117c..47a9766 100644
--- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
+++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
@@ -1,15 +1,29 @@
using BitgetApi.Data;
using BitgetAPI.IndicatorConditionSetup;
+using BitgetAPI.WebService;
+using DevExpress.Utils.CodedUISupport;
+using DevExpress.Utils.Filtering.Internal;
using DevExpress.Utils.IoC;
+using DevExpress.XtraPrinting.HtmlExport.Native;
using DevExpress.XtraPrinting.Native;
+using DevExpress.XtraSpellChecker;
using System;
using System.Collections.Generic;
+using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static BitgetAPI.CommonProperty;
+using System.Web;
+using System.Windows.Media.Media3D;
+using DevExpress.XtraPrinting;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab;
+using static DevExpress.XtraPrinting.Native.ExportOptionsPropertiesNames;
+using System.Security.Cryptography;
+using System.Globalization;
+
namespace BitgetAPI.IndicatorConditionSetup
{
@@ -17,6 +31,11 @@ namespace BitgetAPI.IndicatorConditionSetup
{
CommonProperty commonProperty = CommonProperty.Instance;
+ //영호 Key
+ private string YHKIM_AccessKey = "bg_f93aa530288b6ec9d62095994c51972a";
+ private string YHKIM_SecreteKey = "2fce18bcd12ca23a7920c48295a58da031443ea383af8114ed599c1b14ac678e";
+ private string YHKIM_PassphraseKey = "dudgh0505";
+
// 스레드 시작/종료 플래그
public bool Is_th_SignalInfo;
public Dictionary> 전저점 = new Dictionary>();
@@ -67,6 +86,8 @@ namespace BitgetAPI.IndicatorConditionSetup
signals_LD.Clear();
signals_SU.Clear();
+ GetFutureAccountList();
+
// 추후 공통화 및 소스정리 필요
while (true)
{
@@ -818,6 +839,88 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
+ public List> GetFutureAccountList()
+ {
+ var timeSpan = DateTime.Now;
+
+ var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString();
+
+ var reqStr = "/api/v2/mix/account/accounts";
+
+ var nvc = new NameValueCollection {
+ {"ACCESS-KEY", YHKIM_AccessKey},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", reqStr, "productType=USDT-FUTURES", null, YHKIM_SecreteKey) },
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP",timestamp}
+ };
+
+ return (List>)WebConnection.SendWebServer(ExchangeWebReqType.BitgetAccountList_Future, BitgetURL_AccountList_Future, null, MCandleTimeType.M1, "", "", nvc);
+ }
+
+
+
+ public Dictionary FutureOrder(string symbol, FutureMarginMode marginMode, double size, double price, FutureSide futureSide, OrderType orderType)
+ {
+ var side = "";
+ var tradeSide = "";
+
+ if(futureSide == FutureSide.BuyShort)
+ {
+ side = "sell";
+ tradeSide = "open";
+ }
+ else if (futureSide == FutureSide.BuyLong)
+ {
+ side = "buy";
+ tradeSide = "Open";
+ }
+ else if (futureSide == FutureSide.SellShort)
+ {
+ side = "sell";
+ tradeSide = "close";
+ }
+ else if (futureSide == FutureSide.SellShort)
+ {
+ side = "buy";
+ tradeSide = "close";
+ }
+
+ if (orderType == OrderType.limit)
+ price = 0;
+
+ var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
+
+ var timestamp = (timeSpan.TotalSeconds * 1000).ToString();
+
+ var reqStr = "/api/v2/mix/order/place-order";
+
+ var nvc = new NameValueCollection {
+ {"ACCESS-KEY", new Guid().ToString()},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP", timestamp}
+ };
+
+ var postStr = string.Format("{\"symbol\": \"{0}\", \"productType\": \"usdt - futures\", \"marginMode\": \"{1}\", \"marginCoin\": \"USDT\", \"size\": \"{2}\", \"price\": \"{3}\", \"side\": \"{4}\", " +
+ "\"tradeSide\": \"{5}\", \"orderType\": \"{6}\", \"force\": \"gtc\", \"clientOid\": \"{8}\" }",
+ symbol, Utils.Convertor.GetEnumDescription((Enum)marginMode), size.ToString(),
+ price.ToString(), side, tradeSide, Utils.Convertor.GetEnumDescription((Enum)orderType), new Guid().ToString());
+
+ return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrder_Future, BitgetURL_BuySellOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc);
+ }
+
+ public string GenerateSignString(string timestamp, string method, string requestPath, string queryString, string body, string secretKey)
+ {
+ method = method.ToUpper();
+ body = body == null ? "" : body;
+ queryString = string.IsNullOrWhiteSpace(queryString) ? "" : "?" + queryString;
+ string preHash = timestamp + method + requestPath + queryString + body;
+
+ var encSecretKey_byteData = System.Text.Encoding.UTF8.GetBytes(secretKey);
+ var encPreHash_byteData = System.Text.Encoding.UTF8.GetBytes(preHash);
+
+ return Convert.ToBase64String(new HMACSHA256(encSecretKey_byteData).ComputeHash(encPreHash_byteData));
+ }
public void calIchimokuProcess_Add()
{
diff --git a/BitgetApi/WebService/WebConnection.cs b/BitgetApi/WebService/WebConnection.cs
index fce8b34..7185968 100644
--- a/BitgetApi/WebService/WebConnection.cs
+++ b/BitgetApi/WebService/WebConnection.cs
@@ -23,6 +23,7 @@ using System.Runtime.InteropServices;
using DevExpress.XtraEditors.Filtering;
using DevExpress.XtraExport.Xls;
using DevExpress.Utils.Filtering.Internal;
+using System.Collections.Specialized;
namespace BitgetAPI.WebService
{
@@ -40,7 +41,7 @@ namespace BitgetAPI.WebService
public static object SendWebServer(CommonProperty.ExchangeWebReqType exchangeWebReqType, string url = "",
MarketCandleDataList marketCandleDataList = null, CommonProperty.MCandleTimeType interval = MCandleTimeType.M1,
- string postData = "", string subUri = "")
+ string postData = "", string subUri = "", NameValueCollection headers = null)
{
object returnJsonData = null;
@@ -56,6 +57,8 @@ namespace BitgetAPI.WebService
// 웹 전송 타입 지정
var webConType = CommonProperty.WebConnectionType.GET;
+ if(postData.Length > 0) webConType = CommonProperty.WebConnectionType.POST;
+
// 1. WebRequest 객체 형성 및 HttpWebRequest 로 형변환
// 2. 거래소에 따른 헤더 파일 처리(POST 일 경우만 지정함)
@@ -82,13 +85,13 @@ namespace BitgetAPI.WebService
break;
case CommonProperty.ExchangeWebReqType.BitgetCandleStick_Future:
wReq = (HttpWebRequest)WebRequest.Create(new Uri(CommonProperty.BitgetURL_MarketCandle_Future));
- break;
- #endregion
+ break;
+ #endregion
}
}
+
else wReq = (HttpWebRequest)WebRequest.Create(new Uri(url));
-
-
+
// GET, POST 구분
switch (webConType)
{
@@ -105,6 +108,12 @@ namespace BitgetAPI.WebService
break;
}
+ if (headers != null)
+ {
+ wReq.Headers.Add(headers);
+ wReq.ContentType = "application/json";
+ }
+
using (var wRes = (HttpWebResponse)wReq.GetResponse())
{
var respPostStream = wRes.GetResponseStream();
@@ -144,7 +153,6 @@ namespace BitgetAPI.WebService
return commonProperty.marketInfoList;
}
- break;
case CommonProperty.ExchangeWebReqType.BitgetCandleStick_Coin:
{
@@ -251,6 +259,15 @@ namespace BitgetAPI.WebService
}
}
break;
+ case ExchangeWebReqType.BitgetAccountList_Future:
+ {
+ var datalist = JsonConvert.DeserializeObject>(resResult);
+ return JsonConvert.DeserializeObject>>(datalist["data"]?.ToString());
+ }
+ case ExchangeWebReqType.BitgetOrder_Future:
+ {
+ return JsonConvert.DeserializeObject>(resResult);
+ }
#endregion
}
}
From c15a5f000b5de726d8fc881601ec11e6f97ec854 Mon Sep 17 00:00:00 2001
From: kyh <1329522@naver.com>
Date: Thu, 29 Aug 2024 11:48:21 +0900
Subject: [PATCH 2/4] =?UTF-8?q?1.=20account=20=EC=B2=98=EB=A6=AC=20?=
=?UTF-8?q?=EC=99=84=EB=A3=8C=202.=20cancel,=20order,=20pendinglist=20?=
=?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=ED=95=A8=EC=88=98=20?=
=?UTF-8?q?=EC=83=9D=EC=84=B1=EB=A7=8C=20=ED=95=A8(Test=ED=95=84=EC=9A=94)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
BitgetApi/CommonProperty.cs | 11 ++++--
.../IndicatorProcess.cs | 37 ++++++++++++++++++-
2 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/BitgetApi/CommonProperty.cs b/BitgetApi/CommonProperty.cs
index c09d510..b8b14d5 100644
--- a/BitgetApi/CommonProperty.cs
+++ b/BitgetApi/CommonProperty.cs
@@ -94,7 +94,11 @@ namespace BitgetAPI
[Description("BitgetAccountList_FUTURE")]
BitgetAccountList_Future = 30,
[Description("BitgetOrder_FUTURE")]
- BitgetOrder_Future = 31
+ BitgetOrder_Future = 31,
+ [Description("BitgetOrderCancel_FUTURE")]
+ BitgetCancelOrder_Future = 32,
+ [Description("BitgetPendingOrder_FUTURE")]
+ BitgetPendingOrder_Future = 33
#endregion
}
@@ -220,8 +224,9 @@ namespace BitgetAPI
public static string BitgetURL_MarketCandle_Future = "https://api.bitget.com/api/v2/mix/market/candles?symbol={0}&granularity={1}&limit={2}&productType={3}";
public static string BitgetURL_AccountList_Future = @"https://api.bitget.com/api/v2/mix/account/accounts?productType=USDT-FUTURES";
- public static string BitgetURL_BuySellOrder_Future = @"https://api.bitget.com/api/v2/mix/order/place-order?";
-
+ public static string BitgetURL_BuySellOrder_Future = @"https://api.bitget.com/api/v2/mix/order/place-order";
+ public static string BitgetURL_CancelOrder_Future = @"https://api.bitget.com/api/v2/mix/order/cancel-order";
+ public static string BitgetURL_PendingOrders_Future = @"https://api.bitget.com/api/v2/mix/order/orders-pending?productType=usdt-futures";
#endregion
}
}
diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
index c5f29e5..a1fb152 100644
--- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
+++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
@@ -846,6 +846,24 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
+ public Dictionary GetPendingOrders()
+ {
+ var timeSpan = DateTime.Now;
+
+ var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString();
+
+ var reqStr = "/api/v2/mix/order/orders-pending";
+
+ var nvc = new NameValueCollection {
+ {"ACCESS-KEY", YHKIM_AccessKey},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", reqStr, "productType=USDT-FUTURES", null, YHKIM_SecreteKey) },
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP",timestamp}
+ };
+
+ return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetPendingOrder_Future, BitgetURL_PendingOrders_Future, null, MCandleTimeType.M1, "", "", nvc);
+ }
+
public List> GetFutureAccountList()
{
var timeSpan = DateTime.Now;
@@ -864,7 +882,24 @@ namespace BitgetAPI.IndicatorConditionSetup
return (List>)WebConnection.SendWebServer(ExchangeWebReqType.BitgetAccountList_Future, BitgetURL_AccountList_Future, null, MCandleTimeType.M1, "", "", nvc);
}
-
+ public Dictionary CancelFutureOrder(string symbol, string orderId)
+ {
+ var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
+
+ var timestamp = (timeSpan.TotalSeconds * 1000).ToString();
+
+ var reqStr = "/api/v2/mix/order/cancel-order";
+ var nvc = new NameValueCollection {
+ {"ACCESS-KEY", new Guid().ToString()},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP", timestamp}
+ };
+
+ var postStr = string.Format("{\"symbol\" : \"{0}\", \"orderId\" : \"{1}\", \"productType\" : \"usdt-futures\" , \"marginCoin\" : \"USDT\"}", symbol, orderId);
+
+ return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetCancelOrder_Future, BitgetURL_CancelOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc);
+ }
public Dictionary FutureOrder(string symbol, FutureMarginMode marginMode, double size, double price, FutureSide futureSide, OrderType orderType)
{
From 6bdf3ba130e958dd57314d9a3017a3bdceec97c4 Mon Sep 17 00:00:00 2001
From: kyh <1329522@naver.com>
Date: Thu, 29 Aug 2024 13:10:26 +0900
Subject: [PATCH 3/4] =?UTF-8?q?buy=20sell=20=EA=B4=80=EB=A0=A8=20=ED=95=A8?=
=?UTF-8?q?=EC=88=98=20=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=EC=B2=98=EB=A6=AC?=
=?UTF-8?q?=20->=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=8A=94=20=ED=95=84?=
=?UTF-8?q?=EC=9A=94?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
BitgetApi/CommonProperty.cs | 24 ++++-
.../IndicatorProcess.cs | 100 ++++++++++++++++--
2 files changed, 115 insertions(+), 9 deletions(-)
diff --git a/BitgetApi/CommonProperty.cs b/BitgetApi/CommonProperty.cs
index b8b14d5..390c7a2 100644
--- a/BitgetApi/CommonProperty.cs
+++ b/BitgetApi/CommonProperty.cs
@@ -98,7 +98,16 @@ namespace BitgetAPI
[Description("BitgetOrderCancel_FUTURE")]
BitgetCancelOrder_Future = 32,
[Description("BitgetPendingOrder_FUTURE")]
- BitgetPendingOrder_Future = 33
+ BitgetPendingOrder_Future = 33,
+ [Description("BitgetChangeLeverage_FUTURE")]
+ BitgetChangeLeverage_Future = 34,
+ [Description("BitgetChangeMarginMode_FUTURE")]
+ BitgetChangeMarginMode_Future = 35,
+ [Description("BitgetChangePositionMode_FUTURE")]
+ BitgetChangePositionMode_Future = 36,
+ [Description("BitgetOrderDetail_FUTURE")]
+ BitgetOrderDetail_Future = 37,
+
#endregion
}
@@ -119,6 +128,14 @@ namespace BitgetAPI
sell =1
}
+ public enum FuturePositionMode
+ {
+ [Description("one_way_mode")]
+ one_way_mode = 0,
+ [Description("hedge_mode")]
+ hedge_mode = 1
+ }
+
public enum OrderType
{
[Description("limit")]
@@ -227,6 +244,11 @@ namespace BitgetAPI
public static string BitgetURL_BuySellOrder_Future = @"https://api.bitget.com/api/v2/mix/order/place-order";
public static string BitgetURL_CancelOrder_Future = @"https://api.bitget.com/api/v2/mix/order/cancel-order";
public static string BitgetURL_PendingOrders_Future = @"https://api.bitget.com/api/v2/mix/order/orders-pending?productType=usdt-futures";
+ public static string BitgetURL_ChangeLeverage_Future = @"https://api.bitget.com/api/v2/mix/account/set-leverage";
+ public static string BitgetURL_ChangeMarginMode_Future = @"https://api.bitget.com/api/v2/mix/account/set-margin-mode";
+ public static string BitgetURL_ChangePositionMode_Future = @"https://api.bitget.com/api/v2/mix/account/set-position-mode";
+ public static string BitgetURL_OrderDetail_Future = @"https://api.bitget.com/api/v2/mix/order/detail";
+
#endregion
}
}
diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
index a1fb152..959534f 100644
--- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
+++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
@@ -23,6 +23,7 @@ using static System.Windows.Forms.VisualStyles.VisualStyleElement.Tab;
using static DevExpress.XtraPrinting.Native.ExportOptionsPropertiesNames;
using System.Security.Cryptography;
using System.Globalization;
+using Newtonsoft.Json;
namespace BitgetAPI.IndicatorConditionSetup
@@ -88,6 +89,18 @@ namespace BitgetAPI.IndicatorConditionSetup
GetFutureAccountList();
+ /**
+ * 사는 방법
+ * 1. ChangeFuturePositionMode 호출(한방향, 양방향 -> Long, Short)
+ * 2. FutureOrder 호출
+ * 1). Bitget_ChangeMarginMode_Future 를 통해Coin, ProductType 별 Margin Mode 변경
+ * 2). 변경된 Margin Coin 별 MarginMode에 Leverage를 Set 함
+ * 3). Buy 진행
+ * 3. GetPendingOrders를 통해 확인 가능
+ * 4. Sell 시 FutureOrder 호출
+ * 5. Order Detail를 통해 Client OID를 획득 후 처리
+ */
+
// 추후 공통화 및 소스정리 필요
while (true)
{
@@ -890,7 +903,7 @@ namespace BitgetAPI.IndicatorConditionSetup
var reqStr = "/api/v2/mix/order/cancel-order";
var nvc = new NameValueCollection {
- {"ACCESS-KEY", new Guid().ToString()},
+ {"ACCESS-KEY", YHKIM_AccessKey},
{"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
{"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
{"ACCESS-TIMESTAMP", timestamp}
@@ -901,18 +914,40 @@ namespace BitgetAPI.IndicatorConditionSetup
return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetCancelOrder_Future, BitgetURL_CancelOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc);
}
- public Dictionary FutureOrder(string symbol, FutureMarginMode marginMode, double size, double price, FutureSide futureSide, OrderType orderType)
+ public Dictionary ChangeFuturePositionMode(FuturePositionMode mode)
+ {
+ var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
+
+ var timestamp = (timeSpan.TotalSeconds * 1000).ToString();
+
+ var reqStr = "/api/v2/mix/account/set-position-mode";
+ var nvc = new NameValueCollection {
+ {"ACCESS-KEY", YHKIM_AccessKey},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP", timestamp}
+ };
+
+ var postStr = string.Format("{\"productType\" : \"USDT-FUTURES\", \"posMode\" : \"{0}\"}", Utils.Convertor.GetEnumDescription((Enum)mode));
+
+ return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangePositionMode_Future, BitgetURL_ChangePositionMode_Future, null, MCandleTimeType.M1, postStr, "", nvc);
+ }
+
+
+ public Dictionary FutureOrder(string symbol, FutureMarginMode marginMode, double size, double price, FutureSide futureSide, OrderType orderType, string leverage, string id = "")
{
var side = "";
var tradeSide = "";
-
- if(futureSide == FutureSide.BuyShort)
+
+ if (futureSide == FutureSide.BuyShort)
{
+ id = new Guid().ToString();
side = "sell";
tradeSide = "open";
}
else if (futureSide == FutureSide.BuyLong)
{
+ id = new Guid().ToString();
side = "buy";
tradeSide = "Open";
}
@@ -937,16 +972,65 @@ namespace BitgetAPI.IndicatorConditionSetup
var reqStr = "/api/v2/mix/order/place-order";
var nvc = new NameValueCollection {
- {"ACCESS-KEY", new Guid().ToString()},
+ {"ACCESS-KEY", YHKIM_AccessKey},
{"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
{"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
{"ACCESS-TIMESTAMP", timestamp}
};
- var postStr = string.Format("{\"symbol\": \"{0}\", \"productType\": \"usdt - futures\", \"marginMode\": \"{1}\", \"marginCoin\": \"USDT\", \"size\": \"{2}\", \"price\": \"{3}\", \"side\": \"{4}\", " +
+ if(futureSide == FutureSide.BuyShort|| futureSide == FutureSide.BuyLong)
+ {
+ //change margin mode 이후 leverage 처리 해야 함
+ var changeMarginModeStr = string.Format("{\"symbol\": \"{0}\", \"productType\": \"usdt-futures\", \"marginCoin\": \"USDT\", \"marginMode\": \"{1}\"}",
+ symbol, Utils.Convertor.GetEnumDescription((Enum)marginMode));
+ var nvcMargin = new NameValueCollection {
+ {"ACCESS-KEY", YHKIM_AccessKey},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", "/api/v2/mix/account/set-margin-mode", "", null, YHKIM_SecreteKey)},
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP", timestamp}
+ };
+ var result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeMarginMode_Future, BitgetURL_ChangeMarginMode_Future, null, MCandleTimeType.M1, changeMarginModeStr, "", nvcMargin);
+ if (result["msg"]?.ToString() != "success")
+ {
+ return null;
+ }
+
+ var leverageStr = string.Format("{\"symbol\": \"{0}\", \"productType\": \"usdt-futures\", \"marginCoin\": \"USDT\", \"leverage\": \"{1}\", \"holdSide\": \"{3}\"}",
+ symbol, leverage, futureSide == FutureSide.BuyShort ? "short" : "long");
+ var nvcLeverage = new NameValueCollection {
+ {"ACCESS-KEY", YHKIM_AccessKey},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", "/api/v2/mix/account/set-leverage", "", null, YHKIM_SecreteKey)},
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP", timestamp}
+ };
+ result = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangeLeverage_Future, BitgetURL_ChangeLeverage_Future, null, MCandleTimeType.M1, leverageStr, "", nvcLeverage);
+ if (result["msg"]?.ToString() != "success")
+ {
+ return null;
+ }
+ }
+ else
+ {
+ // sell은 ClientOID 가 필요
+ var orderDetailStr = "/api/v2/mix/order/detail";
+
+ var orderDetailnvc = new NameValueCollection {
+ {"ACCESS-KEY", YHKIM_AccessKey},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "GET", orderDetailStr, "symbol="+symbol.ToString()+"&orderId="+id.ToString()+"&productType=usdt-future", null, YHKIM_SecreteKey) },
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP",timestamp}
+ };
+
+ var orderDetail = (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrderDetail_Future, BitgetURL_OrderDetail_Future, null, MCandleTimeType.M1, "", "", orderDetailnvc);
+ if (orderDetail["msg"]?.ToString() != "success") return null;
+ var data = JsonConvert.DeserializeObject>(JsonConvert.SerializeObject(orderDetail["data"]));
+ id = data["clientOid"].ToString();
+ }
+
+ var postStr = string.Format("{\"symbol\": \"{0}\", \"productType\": \"usdt-futures\", \"marginMode\": \"{1}\", \"marginCoin\": \"USDT\", \"size\": \"{2}\", \"price\": \"{3}\", \"side\": \"{4}\", " +
"\"tradeSide\": \"{5}\", \"orderType\": \"{6}\", \"force\": \"gtc\", \"clientOid\": \"{8}\" }",
- symbol, Utils.Convertor.GetEnumDescription((Enum)marginMode), size.ToString(),
- price.ToString(), side, tradeSide, Utils.Convertor.GetEnumDescription((Enum)orderType), new Guid().ToString());
+ symbol, Utils.Convertor.GetEnumDescription((Enum)marginMode), size.ToString(),
+ price.ToString(), side, tradeSide, Utils.Convertor.GetEnumDescription((Enum)orderType), id);
return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrder_Future, BitgetURL_BuySellOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc);
}
From 3c7c418eb12fb0355f493bf4638ccfd48f434de6 Mon Sep 17 00:00:00 2001
From: kyh <1329522@naver.com>
Date: Wed, 4 Sep 2024 14:25:35 +0900
Subject: [PATCH 4/4] =?UTF-8?q?1.=20post=EA=B9=8C=EC=A7=80=20=ED=85=8C?=
=?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=99=84=202.=201,=205,=2015=EB=B6=84?=
=?UTF-8?q?=EB=B4=89=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A1=9C=20=EC=9B=90?=
=?UTF-8?q?=EB=B3=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../IndicatorProcess.cs | 565 +++++++++++++-----
BitgetApi/WebService/WebConnection.cs | 2 +-
2 files changed, 400 insertions(+), 167 deletions(-)
diff --git a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
index 959534f..2a810d5 100644
--- a/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
+++ b/BitgetApi/IndicatorConditionSetup/IndicatorProcess.cs
@@ -72,6 +72,17 @@ namespace BitgetAPI.IndicatorConditionSetup
//결과 리스트
public List> DownResultList = new List>();
+
+ //구매 리스트
+ public Dictionary> DownTempBuyList = new Dictionary>();
+ //결과 리스트
+ public List> DownTempResultList = new List>();
+
+ //구매 리스트
+ public Dictionary> UpTempBuyList = new Dictionary>();
+ //결과 리스트
+ public List> UpTempResultList = new List>();
+
public Dictionary 판매조건Flag = new Dictionary();
public Dictionary 최초조건Flag = new Dictionary();
// 전봉이 구름떼 돌파후 시가가 구름떼 위에서 시작하는 것
@@ -87,20 +98,6 @@ namespace BitgetAPI.IndicatorConditionSetup
signals_LD.Clear();
signals_SU.Clear();
- GetFutureAccountList();
-
- /**
- * 사는 방법
- * 1. ChangeFuturePositionMode 호출(한방향, 양방향 -> Long, Short)
- * 2. FutureOrder 호출
- * 1). Bitget_ChangeMarginMode_Future 를 통해Coin, ProductType 별 Margin Mode 변경
- * 2). 변경된 Margin Coin 별 MarginMode에 Leverage를 Set 함
- * 3). Buy 진행
- * 3. GetPendingOrders를 통해 확인 가능
- * 4. Sell 시 FutureOrder 호출
- * 5. Order Detail를 통해 Client OID를 획득 후 처리
- */
-
// 추후 공통화 및 소스정리 필요
while (true)
{
@@ -185,6 +182,7 @@ namespace BitgetAPI.IndicatorConditionSetup
dic.Add("clearFlag", true);
dic.Add("firstFlag", true);
dic.Add("flag", false);
+ dic.Add("tempFirstFlag", true);
dic.Add("breakFlag", false);
전저점.Add(market + strInterval, dic);
}
@@ -194,6 +192,7 @@ namespace BitgetAPI.IndicatorConditionSetup
dic.Add("val", 0);
dic.Add("clearFlag", true);
dic.Add("firstFlag", true);
+ dic.Add("tempFirstFlag", true);
dic.Add("flag", false);
dic.Add("breakFlag", false);
전고점.Add(market + strInterval, dic);
@@ -290,44 +289,35 @@ namespace BitgetAPI.IndicatorConditionSetup
// 24,48 높은값
var 높은값_48_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[48].Value, candleData_전전봉.movingAverageDataList[24].Value);
- var 높은값_72_24_전전봉 = Math.Max(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value);
// 24,48 낮은값
var 낮은값_48_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[48].Value, candleData_전전봉.movingAverageDataList[24].Value);
- var 낮은값_72_24_전전봉 = Math.Min(candleData_전전봉.movingAverageDataList[72].Value, candleData_전전봉.movingAverageDataList[24].Value);
// 24,48 높은값
var 높은값_48_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[48].Value, candleData_전봉.movingAverageDataList[24].Value);
- var 높은값_72_24_전봉 = Math.Max(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value);
// 24,48 낮은값
var 낮은값_48_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[48].Value, candleData_전봉.movingAverageDataList[24].Value);
- var 낮은값_72_24_전봉 = Math.Min(candleData_전봉.movingAverageDataList[72].Value, candleData_전봉.movingAverageDataList[24].Value);
// 24,48 높은값
var 높은값_48_24 = Math.Max(candleData.movingAverageDataList[48].Value, candleData.movingAverageDataList[24].Value);
- var 높은값_72_24 = Math.Max(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value);
// 24,48 낮은값
var 낮은값_48_24 = Math.Min(candleData.movingAverageDataList[48].Value, candleData.movingAverageDataList[24].Value);
- var 낮은값_72_24 = Math.Min(candleData.movingAverageDataList[72].Value, candleData.movingAverageDataList[24].Value);
var 높은값_12_낮은값48_24 = Math.Max(candleData.movingAverageDataList[12].Value, 낮은값_48_24);
- var 낮은값_12_높은값72_24 = Math.Min(candleData.movingAverageDataList[12].Value, 높은값_72_24);
+ var 낮은값_12_높은값48_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 전전봉48 = candleData_전전봉.movingAverageDataList[48].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 전봉48 = candleData_전봉.movingAverageDataList[48].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 현재봉48 = candleData.movingAverageDataList[48].Value;
- var 현재봉72 = candleData.movingAverageDataList[72].Value;
var 전봉Bol4 = candleData_전봉.movingAverageDataList[4].BolangerValue;
@@ -340,65 +330,66 @@ namespace BitgetAPI.IndicatorConditionSetup
var Bol4 = candleData.movingAverageDataList[4].BolangerValue;
var Bol12 = candleData.movingAverageDataList[12].BolangerValue;
var Bol24 = candleData.movingAverageDataList[24].BolangerValue;
-
- if ((int)interval != 60)
+
+ if ((int)interval != 5)
{
continue;
}
- #region 240분봉 처리
+ #region 15분봉 처리
//60분봉 관련 처리
- var candleDatas240 = findedMarket.candleDataList[MCandleTimeType.H4];
- var candleDatas240_정렬 = candleDatas240.OrderBy(i => i.Argument).ToList();
+ var candleDatas15 = findedMarket.candleDataList[MCandleTimeType.M15];
+ var candleDatas15_정렬 = candleDatas15.OrderBy(i => i.Argument).ToList();
- var candleData240 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument);
- if (candleData240 == null) continue;
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240);
- ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240);
+ var candleData15 = candleDatas15.Find(i => i.Argument == candleDatas15_정렬.Last().Argument);
+ if (candleData15 == null) continue;
+ movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas15_정렬, candleData15);
+ ichimokuConditionSetup.calIchimokuData(candleDatas15_정렬, candleData15);
- candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1);
- var candleData240_전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전봉);
+ 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_전봉);
- candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1);
- var candleData240_전전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전전봉);
+ 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_전전봉);
- candleDatas240_정렬.RemoveAt(candleDatas240_정렬.Count - 1);
- var candleData240_전전전봉 = candleDatas240.Find(i => i.Argument == candleDatas240_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas240_정렬, candleData240_전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas240_정렬, candleData240_전전봉);
+ 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 낮은값240_48_24 = Math.Min(candleData240.movingAverageDataList[48].Value, candleData240.movingAverageDataList[24].Value);
- var 높은값240_48_24 = Math.Max(candleData240.movingAverageDataList[48].Value, candleData240.movingAverageDataList[24].Value);
- var 전봉낮은값240_48_24 = Math.Min(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value);
- var 전봉높은값240_48_24 = Math.Max(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value);
- var 전전봉낮은값240_48_24 = Math.Min(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value);
- var 전전봉높은값240_48_24 = Math.Max(candleData240_전봉.movingAverageDataList[48].Value, candleData240_전봉.movingAverageDataList[24].Value);
+ var 낮은값15_48_24 = Math.Min(candleData15.movingAverageDataList[48].Value, candleData15.movingAverageDataList[24].Value);
+ var 높은값15_48_24 = Math.Max(candleData15.movingAverageDataList[48].Value, candleData15.movingAverageDataList[24].Value);
- var 현재봉240_12 = candleData240.movingAverageDataList[12].Value;
- var 전봉240_12 = candleData240_전봉.movingAverageDataList[12].Value;
- var 전전봉240_12 = candleData240_전전봉.movingAverageDataList[12].Value;
+ var 전봉낮은값15_48_24 = Math.Min(candleData15_전봉.movingAverageDataList[48].Value, candleData15_전봉.movingAverageDataList[24].Value);
+ var 전봉높은값15_48_24 = Math.Max(candleData15_전봉.movingAverageDataList[48].Value, candleData15_전봉.movingAverageDataList[24].Value);
+ var 전전봉낮은값15_48_24 = Math.Min(candleData15_전봉.movingAverageDataList[48].Value, candleData15_전봉.movingAverageDataList[24].Value);
+ var 전전봉높은값15_48_24 = Math.Max(candleData15_전봉.movingAverageDataList[48].Value, candleData15_전봉.movingAverageDataList[24].Value);
- var 현재봉240_4 = candleData240.movingAverageDataList[4].Value;
- var 전봉240_4 = candleData240_전봉.movingAverageDataList[4].Value;
- var 전전봉240_4 = candleData240_전전봉.movingAverageDataList[4].Value;
+ var 현재봉15_12 = candleData15.movingAverageDataList[12].Value;
+ var 전봉15_12 = candleData15_전봉.movingAverageDataList[12].Value;
+ var 전전봉15_12 = candleData15_전전봉.movingAverageDataList[12].Value;
- var 전봉240Bol4 = candleData240_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉240Bol12 = candleData240_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉240Bol24 = candleData240_전봉.movingAverageDataList[24].BolangerValue;
+ var 현재봉15_4 = candleData15.movingAverageDataList[4].Value;
+ var 전봉15_4 = candleData15_전봉.movingAverageDataList[4].Value;
+ var 전전봉15_4 = candleData15_전전봉.movingAverageDataList[4].Value;
- var 전전봉240Bol4 = candleData240_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉240Bol12 = candleData240_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉240Bol24 = candleData240_전전봉.movingAverageDataList[24].BolangerValue;
- var 현재봉240Bol4 = candleData240.movingAverageDataList[4].BolangerValue;
- var 현재봉240Bol12 = candleData240.movingAverageDataList[12].BolangerValue;
- var 현재봉240Bol24 = candleData240.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;
+ var 현재봉15Bol4 = candleData15.movingAverageDataList[4].BolangerValue;
+ var 현재봉15Bol12 = candleData15.movingAverageDataList[12].BolangerValue;
+ var 현재봉15Bol24 = candleData15.movingAverageDataList[24].BolangerValue;
#endregion
if (영호조건식_상향돌파)
@@ -413,13 +404,72 @@ namespace BitgetAPI.IndicatorConditionSetup
try
{
- var candle240Flag = 현재봉240_4 > 낮은값240_48_24 &&
- 현재봉240_4 > 전봉240_4 &&
- 현재봉240_12 > 전봉240_12 &&
- 전봉240Bol12 - 전봉240Bol24 > 현재봉240Bol12 - 현재봉240Bol24;
+ var candle15Flag = 현재봉15_4 > 현재봉12 &&
+ 현재봉15_4 > 전봉15_4 &&
+ //현재봉15_4 < candleData15.IchimokData.상한선 &&
+ 현재봉15_12 > 전봉15_12 &&
+ 전봉15Bol12 - 전봉15Bol24 > 현재봉15Bol12 - 현재봉15Bol24;
+
+ #region 1분봉 처리
+
+ var candleDatas1 = findedMarket.candleDataList[MCandleTimeType.M1];
+ var candleDatas1_정렬 = candleDatas1.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_48_24 = Math.Max(candleData1.movingAverageDataList[48].Value, candleData1.movingAverageDataList[24].Value);
+ var 낮은값1_48_24 = Math.Min(candleData1.movingAverageDataList[48].Value, candleData1.movingAverageDataList[24].Value);
+
+ var 전봉낮은값1_48_24 = Math.Min(candleData1_전봉.movingAverageDataList[48].Value, candleData1_전봉.movingAverageDataList[24].Value);
+ var 전봉높은값1_48_24 = Math.Max(candleData1_전봉.movingAverageDataList[48].Value, candleData1_전봉.movingAverageDataList[24].Value);
+ var 전전봉낮은값1_48_24 = Math.Min(candleData1_전전봉.movingAverageDataList[48].Value, candleData1_전전봉.movingAverageDataList[24].Value);
+ var 전전봉높은값1_48_24 = Math.Max(candleData1_전전봉.movingAverageDataList[48].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;
+
+ var candle1Flag = 현재봉1_4 > 높은값1_48_24 && 전봉1_4 < 현재봉1_4 && 전전봉1_4 < 전봉1_4 &&
+ candleData1.Close > candleData1.Open &&
+ candleData1.Close > candleData1.IchimokData.하한선 &&
+ 현재봉1_4 > candleData1.IchimokData.하한선 &&
+ 전봉1_4 < 현재봉1_4 &&
+ 현재봉1_12 > 전봉1_12;// &&
+ //전봉1Bol12 - 전봉1Bol24 > 현재봉1Bol12 - 현재봉1Bol24;
+
+ #endregion
var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4;
- var sellFlag = 현재봉4 < 낮은값_12_높은값72_24;
+ var sellFlag = 현재봉4 < 낮은값_12_높은값48_24;
var 전고점Data = 전고점[market + strInterval];
double.TryParse(전고점Data["val"].ToString(), out var val);
@@ -427,8 +477,14 @@ namespace BitgetAPI.IndicatorConditionSetup
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["tempFirstFlag"].ToString(), out var tempFirstFlag);
- if (현재봉4 < 낮은값_72_24)
+ if (전봉4 < 전봉12 && 전봉12 < 전봉24 && 전봉24 < 전봉48 && candleData.IchimokData.하한선 > 전봉4 && 전봉4 < 전전봉4)
+ if (tempFirstFlag)
+ 전고점Data["tempFirstFlag"] = false;
+
+
+ if (현재봉4 < 낮은값_48_24)
{
if (firstFlag)
전고점Data["firstFlag"] = false;
@@ -471,20 +527,110 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
+ //사는 시점
+ if (!UpTempBuyList.ContainsKey(market + interval))
+ {
+ if (!tempFirstFlag && 전봉4 > 전봉12 && 전봉12 > 전봉24 && 전봉24 > 전봉48 && candleData.IchimokData.상한선 < candleData.Close && 전봉4 > 전전봉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 }
+ };
+
+ UpTempBuyList.Add(market + interval, buyDic);
+ }
+ }
+ //파는 시점
+ else
+ {
+ var buyItem = UpTempBuyList[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 (!(현재봉4 > 현재봉12 && 현재봉12 > 현재봉24 && 현재봉24 > 현재봉48 && 현재봉48 > 현재봉48))
+ {
+
+ 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 }
+ };
+
+ UpTempResultList.Add(result);
+ UpTempBuyList.Remove(market + interval);
+ }
+ }
+
+
//사는 시점
if (!UpBuyList.ContainsKey(market + interval))
{
if (
(
- 전전봉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
+ 전전봉4 < 높은값_48_24_전전봉
+ && 전전봉4 > 낮은값_48_24_전전봉
+ && 전봉4 > 높은값_48_24_전봉
+ && 전봉12 < 높은값_48_24_전봉
+ && 전봉24 > 전전봉24
+ && 높은값_48_24_전봉 > candleData_전봉.IchimokData.하한선
+ && candleData_전봉.Close > candleData_전봉.IchimokData.하한선
+ && candleData_전봉.Open < candleData_전봉.Close
)
- && flag && !firstFlag && buyFlag && candle240Flag
+ && flag && !firstFlag && buyFlag && candle15Flag
+
+ //4 < 높은값_48_24_전전봉 &&
+ //전봉4 > 높은값_48_24_전봉 &&
+ //전봉12 > 전전봉12 &&
+ //((전봉4 < candleData_전봉.IchimokData.하한선 && 높은값_48_24_전봉 < candleData_전봉.IchimokData.하한선)
+ //|| (전봉4 > candleData_전봉.IchimokData.하한선 && 높은값_48_24_전봉 > candleData_전봉.IchimokData.하한선)) &&
+ //전봉4 - 전전봉4 > 전봉12 - 전전봉12 &&
+ //전봉12 - 전전봉12 > 전봉24 - 전전봉24
+ //)
+ //&& flag && !firstFlag && buyFlag && candle15Flag
+
)
{
// 없으면 생성
@@ -529,7 +675,7 @@ namespace BitgetAPI.IndicatorConditionSetup
}
else
{
- if (현재봉240_12 > 전봉240_12)
+ if (현재봉15_12 > 전봉15_12)
최초조건Flag[market + interval] = true;
}
}
@@ -568,7 +714,7 @@ namespace BitgetAPI.IndicatorConditionSetup
double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
var resultRate = ((price - buyPrice) / buyPrice) * 100;
- var result = new Dictionary()
+ var result = new Dictionary()
{
{ "MarketName", market },
{ "BuyDate", buyItem["BuyDate"]},
@@ -605,63 +751,69 @@ namespace BitgetAPI.IndicatorConditionSetup
try
{
- var candle240Flag = 현재봉240_4 < 높은값240_48_24 &&
- 현재봉240_4 < 전봉240_4 &&
- 현재봉240_12 < 전봉240_12 &&
- 전봉240Bol12 - 전봉240Bol24 > 현재봉240Bol12 - 현재봉240Bol24;
+ var candle15Flag = 현재봉15_4 < 높은값15_48_24 &&
+ candleData15.Open > candleData15.Close &&
+ 현재봉15_4 < 전봉15_4 && 전봉15_4 < 전전봉15_4 &&
+ 현재봉15_12 < 전봉15_12 && 전봉15_12 < 전전봉15_12 &&
+ 전봉15Bol12 - 전봉15Bol24 > 현재봉15Bol12 - 현재봉15Bol24;
- #region 3분봉 처리
- /*
- var candleDatas3 = findedMarket.candleDataList[MCandleTimeType.M3];
- var candleDatas3_정렬 = candleDatas3.OrderBy(i => i.Argument).ToList();
+ #region 1분봉 처리
- var candleData3 = candleDatas3.Find(i => i.Argument == candleDatas3_정렬.Last().Argument);
- if (candleData3 == null) continue;
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas3_정렬, candleData3);
- ichimokuConditionSetup.calIchimokuData(candleDatas3_정렬, candleData3);
+ var candleDatas1 = findedMarket.candleDataList[MCandleTimeType.M1];
+ var candleDatas1_정렬 = candleDatas1.OrderBy(i => i.Argument).ToList();
- candleDatas3_정렬.RemoveAt(candleDatas3_정렬.Count - 1);
- var candleData3_전봉 = candleDatas3.Find(i => i.Argument == candleDatas3_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas3_정렬, candleData3_전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas3_정렬, candleData3_전봉);
+ var candleData1 = candleDatas1.Find(i => i.Argument == candleDatas1_정렬.Last().Argument);
+ if (candleData1 == null) continue;
+ movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas1_정렬, candleData1);
+ ichimokuConditionSetup.calIchimokuData(candleDatas1_정렬, candleData1);
- candleDatas3_정렬.RemoveAt(candleDatas3_정렬.Count - 1);
- var candleData3_전전봉 = candleDatas3.Find(i => i.Argument == candleDatas3_정렬.Last().Argument);
- movingAverageConditionSetup.Cal_YHK_Downpublic(candleDatas3_정렬, candleData3_전전봉);
- ichimokuConditionSetup.calIchimokuData(candleDatas3_정렬, candleData3_전전봉);
+ 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 높은값3_48_24 = Math.Max(candleData3.movingAverageDataList[48].Value, candleData3.movingAverageDataList[24].Value);
- var 낮은값3_48_24 = Math.Min(candleData3.movingAverageDataList[48].Value, candleData3.movingAverageDataList[24].Value);
- var 높은값3_48_24 = Math.Max(candleData3.movingAverageDataList[48].Value, candleData3.movingAverageDataList[24].Value);
+ var 높은값1_48_24 = Math.Max(candleData1.movingAverageDataList[48].Value, candleData1.movingAverageDataList[24].Value);
+ var 낮은값1_48_24 = Math.Min(candleData1.movingAverageDataList[48].Value, candleData1.movingAverageDataList[24].Value);
- var 전봉낮은값3_48_24 = Math.Min(candleData3_전봉.movingAverageDataList[48].Value, candleData3_전봉.movingAverageDataList[24].Value);
- var 전봉높은값3_48_24 = Math.Max(candleData3_전봉.movingAverageDataList[48].Value, candleData3_전봉.movingAverageDataList[24].Value);
- var 전전봉낮은값3_48_24 = Math.Min(candleData3_전전봉.movingAverageDataList[48].Value, candleData3_전전봉.movingAverageDataList[24].Value);
- var 전전봉높은값3_48_24 = Math.Max(candleData3_전전봉.movingAverageDataList[48].Value, candleData3_전전봉.movingAverageDataList[24].Value);
+ var 전봉낮은값1_48_24 = Math.Min(candleData1_전봉.movingAverageDataList[48].Value, candleData1_전봉.movingAverageDataList[24].Value);
+ var 전봉높은값1_48_24 = Math.Max(candleData1_전봉.movingAverageDataList[48].Value, candleData1_전봉.movingAverageDataList[24].Value);
+ var 전전봉낮은값1_48_24 = Math.Min(candleData1_전전봉.movingAverageDataList[48].Value, candleData1_전전봉.movingAverageDataList[24].Value);
+ var 전전봉높은값1_48_24 = Math.Max(candleData1_전전봉.movingAverageDataList[48].Value, candleData1_전전봉.movingAverageDataList[24].Value);
- var 현재봉3_12 = candleData3.movingAverageDataList[12].Value;
- var 전봉3_12 = candleData3_전봉.movingAverageDataList[12].Value;
- var 전전봉3_12 = candleData3_전전봉.movingAverageDataList[12].Value;
+ var 현재봉1_12 = candleData1.movingAverageDataList[12].Value;
+ var 전봉1_12 = candleData1_전봉.movingAverageDataList[12].Value;
+ var 전전봉1_12 = candleData1_전전봉.movingAverageDataList[12].Value;
- var 현재봉3_4 = candleData3.movingAverageDataList[4].Value;
- var 전봉3_4 = candleData3_전봉.movingAverageDataList[4].Value;
- var 전전봉3_4 = candleData3_전전봉.movingAverageDataList[4].Value;
+ var 현재봉1_4 = candleData1.movingAverageDataList[4].Value;
+ var 전봉1_4 = candleData1_전봉.movingAverageDataList[4].Value;
+ var 전전봉1_4 = candleData1_전전봉.movingAverageDataList[4].Value;
- var 전봉3Bol4 = candleData3_전봉.movingAverageDataList[4].BolangerValue;
- var 전봉3Bol12 = candleData3_전봉.movingAverageDataList[12].BolangerValue;
- var 전봉3Bol24 = candleData3_전봉.movingAverageDataList[24].BolangerValue;
+ var 전봉1Bol4 = candleData1_전봉.movingAverageDataList[4].BolangerValue;
+ var 전봉1Bol12 = candleData1_전봉.movingAverageDataList[12].BolangerValue;
+ var 전봉1Bol24 = candleData1_전봉.movingAverageDataList[24].BolangerValue;
- var 전전봉3Bol4 = candleData3_전전봉.movingAverageDataList[4].BolangerValue;
- var 전전봉3Bol12 = candleData3_전전봉.movingAverageDataList[12].BolangerValue;
- var 전전봉3Bol24 = candleData3_전전봉.movingAverageDataList[24].BolangerValue;
- var 현재봉3Bol4 = candleData3.movingAverageDataList[4].BolangerValue;
- var 현재봉3Bol12 = candleData3.movingAverageDataList[12].BolangerValue;
- var 현재봉3Bol24 = candleData3.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;
+
+ var candle1Flag = 현재봉1_4 < 낮은값1_48_24 && 전봉1_4 > 현재봉1_4 && 전전봉1_4 > 전봉1_4 &&
+ candleData1.Close < candleData1.Open &&
+ candleData1.Close < candleData1.IchimokData.상한선 &&
+ 현재봉1_4 < candleData1.IchimokData.상한선 &&
+ 전봉1_4 > 현재봉1_4 &&
+ 현재봉1_12 < 전봉1_12;// &&
+ //전봉1Bol12 - 전봉1Bol24 > 현재봉1Bol12 - 현재봉1Bol24;
- //var candle3Flag = 현재봉3_4 < 낮은값3_48_24 && 전봉3_4 > 현재봉3_4 && 전전봉3_4 > 전봉3_4 && candleData3.Close < candleData3.IchimokData.상한선 && candleData3.Close < candleData3.Open;
- */
#endregion
var buyFlag = 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24 && 전전봉Bol4 > 전봉Bol4;
@@ -669,7 +821,7 @@ namespace BitgetAPI.IndicatorConditionSetup
//파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜
//var sellFlag = 전봉Bol12 - 전봉Bol24 < Bol12 - Bol24 || 현재봉4 > 낮은값_48_24;
//var sellFlag = 현재봉4 > 낮은값_48_24 || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24;
- var sellFlag = 현재봉4 > 높은값_12_낮은값48_24;// 현재봉4 > 낮은값_48_24 || 전봉12 < 전봉4 || (전봉4 > 전전봉4 && 전봉12 > 전전봉12) || 현재봉60_4 > 전봉60_4;// || 전봉4 - 전전봉4 > 0;// || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24;
+ var sellFlag = 현재봉1_4 > 높은값1_48_24;// 현재봉4 > 낮은값_48_24 || 전봉12 < 전봉4 || (전봉4 > 전전봉4 && 전봉12 > 전전봉12) || 현재봉60_4 > 전봉60_4;// || 전봉4 - 전전봉4 > 0;// || 전전봉Bol12 - 전전봉Bol24 < 전봉Bol12 - 전봉Bol24;
//파는 시점 볼랜저 전전봉 12 - 24 값이 전봉 12 - 24보다 클경우 팜
//var buyFlag = candleData_전봉.movingAverageDataList[12].BolangerValue > candleData_전봉.movingAverageDataList[24].BolangerValue && 전전봉Bol12 - 전전봉Bol24 > 전봉Bol12 - 전봉Bol24;
@@ -683,6 +835,11 @@ namespace BitgetAPI.IndicatorConditionSetup
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["tempFirstFlag"].ToString(), out var tempFirstFlag);
+
+ if (전봉4 > 전봉12 && 전봉12 > 전봉24 && 전봉24 > 전봉48 && candleData.IchimokData.상한선 < candleData.Close && 전봉4 > 전전봉4)
+ if (tempFirstFlag)
+ 전저점Data["tempFirstFlag"] = false;
if (현재봉4 > 높은값_48_24)
{
@@ -727,20 +884,99 @@ namespace BitgetAPI.IndicatorConditionSetup
}
}
+ //사는 시점
+ if (!DownTempBuyList.ContainsKey(market + interval))
+ {
+ if (!tempFirstFlag && 전봉4 < 전봉12 && 전봉12 < 전봉24 && 전봉24 < 전봉48 && candleData.IchimokData.하한선 > 전봉4 && 전봉4 < 전전봉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 }
+ };
+
+ DownTempBuyList.Add(market + interval, buyDic);
+ }
+ }
+ //파는 시점
+ else
+ {
+ var buyItem = DownTempBuyList[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 (!(현재봉4 < 현재봉12 && 현재봉12 < 현재봉24 && 현재봉24 < 현재봉48 && 현재봉48 < 전봉48))
+ {
+
+ 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 }
+ };
+
+ DownTempResultList.Add(result);
+ DownTempBuyList.Remove(market + interval);
+ }
+ }
+
//사는 시점
if (!DownBuyList.ContainsKey(market + interval))
{
- if (
- (
- 전전봉4 > 낮은값_48_24_전전봉 &&
- 전봉4 < 낮은값_48_24_전봉 &&
- 전봉12 < 전전봉12 &&
- ((전봉4 > candleData_전봉.IchimokData.상한선 && 낮은값_48_24_전봉 > candleData_전봉.IchimokData.상한선)
- ||(전봉4 < candleData_전봉.IchimokData.하한선 && 낮은값_48_24_전봉 < candleData_전봉.IchimokData.하한선)) &&
- 전봉4 - 전전봉4 < 전봉12 - 전전봉12 &&
- 전봉12 - 전전봉12 < 전봉24 - 전전봉24
- )
- && flag && !firstFlag && buyFlag && candle240Flag
+ if ((
+ 전전봉4 > 낮은값_48_24_전전봉
+ && 전전봉4 < 높은값_48_24_전전봉
+ && 전봉4 < 낮은값_48_24_전봉
+ && 전봉12 > 낮은값_48_24_전봉
+ && 전봉24 < 전전봉24
+ && 낮은값_48_24_전봉 < candleData_전봉.IchimokData.상한선
+ && candleData_전봉.Close < candleData_전봉.IchimokData.상한선
+ && candleData_전봉.Open > candleData_전봉.Close
+ )
+ && flag && !firstFlag && buyFlag && candle15Flag
)
{
// 없으면 생성
@@ -785,7 +1021,7 @@ namespace BitgetAPI.IndicatorConditionSetup
}
else
{
- if (현재봉240_12 > 전봉240_12)
+ if (현재봉15_12 > 전봉15_12)
최초조건Flag[market + interval] = true;
}
}
@@ -822,7 +1058,7 @@ namespace BitgetAPI.IndicatorConditionSetup
{
double.TryParse(buyItem["Price"].ToString(), out var buyPrice);
- var resultRate = ((price - buyPrice) / buyPrice) * 100 * -1;
+ var resultRate = ((price - buyPrice) / buyPrice) * 100;
var result = new Dictionary()
{
@@ -897,38 +1133,37 @@ namespace BitgetAPI.IndicatorConditionSetup
public Dictionary CancelFutureOrder(string symbol, string orderId)
{
- var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
+ var timeSpan = DateTime.Now;
- var timestamp = (timeSpan.TotalSeconds * 1000).ToString();
+ var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString();
var reqStr = "/api/v2/mix/order/cancel-order";
+ var postStr = "{\"symbol\" : \"" + symbol + "\", \"orderId\" : \"" + orderId + "\", \"productType\" : \"usdt-futures\" , \"marginCoin\" : \"USDT\"}";
var nvc = new NameValueCollection {
{"ACCESS-KEY", YHKIM_AccessKey},
- {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)},
{"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
{"ACCESS-TIMESTAMP", timestamp}
- };
-
- var postStr = string.Format("{\"symbol\" : \"{0}\", \"orderId\" : \"{1}\", \"productType\" : \"usdt-futures\" , \"marginCoin\" : \"USDT\"}", symbol, orderId);
-
+ };
+
return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetCancelOrder_Future, BitgetURL_CancelOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc);
}
public Dictionary ChangeFuturePositionMode(FuturePositionMode mode)
{
- var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
+ var timeSpan = DateTime.Now;
- var timestamp = (timeSpan.TotalSeconds * 1000).ToString();
+ var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString();
var reqStr = "/api/v2/mix/account/set-position-mode";
+ var postStr = "{\"productType\" : \"USDT-FUTURES\", \"posMode\" : \"" + Utils.Convertor.GetEnumDescription((Enum)mode) + "\"}";
+
var nvc = new NameValueCollection {
{"ACCESS-KEY", YHKIM_AccessKey},
- {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)},
{"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
{"ACCESS-TIMESTAMP", timestamp}
- };
-
- var postStr = string.Format("{\"productType\" : \"USDT-FUTURES\", \"posMode\" : \"{0}\"}", Utils.Convertor.GetEnumDescription((Enum)mode));
+ };
return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetChangePositionMode_Future, BitgetURL_ChangePositionMode_Future, null, MCandleTimeType.M1, postStr, "", nvc);
}
@@ -965,19 +1200,12 @@ namespace BitgetAPI.IndicatorConditionSetup
if (orderType == OrderType.limit)
price = 0;
- var timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));
+ var timeSpan = DateTime.Now;
- var timestamp = (timeSpan.TotalSeconds * 1000).ToString();
+ var timestamp = (((DateTimeOffset)timeSpan).ToUnixTimeSeconds() * 1000).ToString();
var reqStr = "/api/v2/mix/order/place-order";
- var nvc = new NameValueCollection {
- {"ACCESS-KEY", YHKIM_AccessKey},
- {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", null, YHKIM_SecreteKey)},
- {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
- {"ACCESS-TIMESTAMP", timestamp}
- };
-
if(futureSide == FutureSide.BuyShort|| futureSide == FutureSide.BuyLong)
{
//change margin mode 이후 leverage 처리 해야 함
@@ -1027,11 +1255,16 @@ namespace BitgetAPI.IndicatorConditionSetup
id = data["clientOid"].ToString();
}
- var postStr = string.Format("{\"symbol\": \"{0}\", \"productType\": \"usdt-futures\", \"marginMode\": \"{1}\", \"marginCoin\": \"USDT\", \"size\": \"{2}\", \"price\": \"{3}\", \"side\": \"{4}\", " +
- "\"tradeSide\": \"{5}\", \"orderType\": \"{6}\", \"force\": \"gtc\", \"clientOid\": \"{8}\" }",
- symbol, Utils.Convertor.GetEnumDescription((Enum)marginMode), size.ToString(),
- price.ToString(), side, tradeSide, Utils.Convertor.GetEnumDescription((Enum)orderType), id);
+ var postStr = "{\"symbol\": \"" + symbol + "\", \"productType\": \"usdt-futures\", \"marginMode\": \"" + Utils.Convertor.GetEnumDescription((Enum)marginMode) + "\", \"marginCoin\": \"USDT\", \"size\": \""
+ + size.ToString() + "\", \"price\": \"" + price.ToString() + "\", \"side\": \"" + side + "\", " + "\"tradeSide\": \"" + tradeSide + "\", \"orderType\": \"" + Utils.Convertor.GetEnumDescription((Enum)orderType)
+ + "\", \"force\": \"gtc\", \"clientOid\": \"" + id + "\" }";
+ var nvc = new NameValueCollection {
+ {"ACCESS-KEY", YHKIM_AccessKey},
+ {"ACCESS-SIGN", GenerateSignString(timestamp, "POST", reqStr, "", postStr, YHKIM_SecreteKey)},
+ {"ACCESS-PASSPHRASE", YHKIM_PassphraseKey },
+ {"ACCESS-TIMESTAMP", timestamp}
+ };
return (Dictionary)WebConnection.SendWebServer(ExchangeWebReqType.BitgetOrder_Future, BitgetURL_BuySellOrder_Future, null, MCandleTimeType.M1, postStr, "", nvc);
}
diff --git a/BitgetApi/WebService/WebConnection.cs b/BitgetApi/WebService/WebConnection.cs
index 7185968..e1b8633 100644
--- a/BitgetApi/WebService/WebConnection.cs
+++ b/BitgetApi/WebService/WebConnection.cs
@@ -104,7 +104,7 @@ namespace BitgetAPI.WebService
stream.Write(rgbyData, 0, rgbyData.Length);
}
wReq.ContentType = "application/x-www-form-urlencoded";
- wReq.ContentLength = rgbyData.Length;
+ //wReq.ContentLength = rgbyData.Length;
break;
}