Toggle navigation
Toggle navigation
This project
Loading...
Sign in
Crypto
/
Crypto-auto-trading
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
2019102152 김다빈
2021-12-07 02:53:31 +0000
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
86ea150d8345aa43e2a89903c6d16adef24047ad
86ea150d
1 parent
dcebf1c6
Delete remark and console.log
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
25 additions
and
61 deletions
index.js
index.js
View file @
86ea150
...
...
@@ -12,8 +12,6 @@ const HTTPS = require('https');
const
domain
=
"2019102152.osschatbot.ga"
const
sslport
=
23023
;
const
TARGET_URL
=
'https://api.line.me/v2/bot/message/reply'
const
bodyParser
=
require
(
'body-parser'
);
const
crypto
=
require
(
'crypto'
);
const
queryEncode
=
require
(
'querystring'
).
encode
;
...
...
@@ -38,7 +36,7 @@ app.use(bodyParser.json());
const
connect
=
mongoose
.
connect
(
config
.
mongoURI
,
{
useNewUrlParser
:
true
,
useUnifiedTopology
:
true
})
.
then
(()
=>
console
.
log
(
'
디비연결 성공
'
))
.
then
(()
=>
console
.
log
(
'
db connected...
'
))
.
catch
((
err
)
=>
console
.
log
(
err
));
...
...
@@ -69,18 +67,15 @@ function get_asset(market) {
if
(
data
[
i
].
currency
==
"KRW"
)
{
current_asset
+=
Number
(
data
[
i
].
balance
);
pre_asset
+=
Number
(
data
[
i
].
balance
);
// hold_coin[data[i].currency]={volume:data[i].balance};
}
else
{
pre_asset
+=
Number
(
data
[
i
].
balance
*
data
[
i
].
avg_buy_price
)
candle
=
await
get_candle
(
5
,
"KRW-"
+
data
[
i
].
currency
);
current_asset
+=
Number
(
candle
[
0
].
trade_price
*
data
[
i
].
balance
);
// hold_coin[data[i].currency]={avg_buy_price:data[i].avg_buy_price,volume:data[i].balance,current_price:candle[0].trade_price};
}
}
resolve
({
pre_asset
:
pre_asset
.
toFixed
(
0
).
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
),
current_asset
:
current_asset
.
toFixed
(
0
).
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
),
profit_data
:
(
current_asset
-
pre_asset
).
toFixed
(
0
).
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
)
,
yield_data
:
Number
((
current_asset
-
pre_asset
)
/
pre_asset
*
100
).
toFixed
(
2
).
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
)
});
}
else
if
(
market
==
"coin"
)
{
var
hold_coin
=
new
Object
();
for
(
var
i
=
0
;
i
<
data
.
length
;
i
++
)
{
var
candle
;
if
(
data
[
i
].
currency
==
"KRW"
)
{
...
...
@@ -90,20 +85,21 @@ function get_asset(market) {
var
avg_buy_price
=
Number
(
data
[
i
].
avg_buy_price
).
toFixed
(
data
[
i
].
avg_buy_price
<
1
?
3
:
0
)
var
volume
=
Number
(
data
[
i
].
balance
).
toFixed
(
8
);
var
current_price
=
Number
(
candle
[
0
].
trade_price
).
toFixed
(
data
[
i
].
current_price
<
1
?
3
:
0
);
var
buying_money
=
(
avg_buy_price
*
volume
).
toFixed
(
0
).
toString
().
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
);;
var
evaluation_money
=
(
current_price
*
volume
).
toFixed
(
0
).
toString
().
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
);;
var
yield_data
=
(
current_price
-
avg_buy_price
)
/
avg_buy_price
*
100
;
yield_data
=
Number
(
yield_data
).
toFixed
(
2
);
avg_buy_price
=
avg_buy_price
.
toString
().
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
);
volume
=
volume
.
toString
().
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
);
current_price
=
current_price
.
toString
().
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
);
yield_data
=
yield_data
.
toString
().
replace
(
/
\B(?<
!
\.\d
*
)(?=(\d{3})
+
(?!\d))
/g
,
","
);
hold_coin
[
data
[
i
].
currency
]
=
{
avg_buy_price
,
volume
,
current_price
,
yield_data
};
hold_coin
[
data
[
i
].
currency
]
=
{
avg_buy_price
,
volume
,
current_price
,
yield_data
,
buying_money
,
evaluation_money
};
}
}
resolve
(
hold_coin
);
}
else
{
data
.
filter
(
function
(
item
)
{
if
(
item
.
currency
==
market
.
split
(
'-'
)[
1
])
{
// resolve(item);
empty
.
market
=
item
;
}
else
if
(
item
.
currency
==
"KRW"
)
{
empty
.
KRW
=
item
...
...
@@ -120,7 +116,6 @@ function get_asset(market) {
}
async
function
get_marketName
()
{
var
data
=
new
Array
();
//전체 암호화폐 리스트 불러오기
let
response
=
await
fetch
(
`
${
server_url
}
/v1/market/all`
,
options
)
.
then
(
res
=>
res
.
json
())
.
then
(
json
=>
{
...
...
@@ -150,8 +145,6 @@ async function transaction_coin(coin_name, side, volume, price, ord_type, first
price
:
price
,
ord_type
:
ord_type
,
}
//시장가 매수인 경우 price를 얼마치 살건지 입력
//시장가 매도인경우 volume에 몇개를 팔건지 입력
const
query
=
queryEncode
(
body
)
const
hash
=
crypto
.
createHash
(
'sha512'
)
const
queryHash
=
hash
.
update
(
query
,
'utf-8'
).
digest
(
'hex'
)
...
...
@@ -183,40 +176,31 @@ async function transaction_coin(coin_name, side, volume, price, ord_type, first
lookup_order
(
result
.
uuid
);
}
if
(
side
==
"bid"
)
{
//처음 매수일 때
if
(
first
)
{
const
user
=
new
User
({
uid
:
1
,
krw_balance
:
my_asset
.
KRW
.
balance
,
market
:
coin_name
,
count
:
1
,
avg_buy_price
:
my_asset
.
market
.
avg_buy_price
,
volume
:
my_asset
.
market
.
balance
});
await
user
.
save
().
then
(()
=>
{
isuser
=
true
})
//2회 이상 매수일 때
}
else
{
User
.
findOneAndUpdate
({
uid
:
1
},
{
krw_balance
:
my_asset
.
KRW
.
balance
,
avg_buy_price
:
my_asset
.
market
.
avg_buy_price
,
volume
:
my_asset
.
market
.
balance
,
$inc
:
{
count
:
1
}
},
{
new
:
true
},
(
err
,
result
)
=>
{
if
(
err
)
{
//
console.log(err);
console
.
log
(
err
);
}
else
{
// console.log(result);
}
})
}
}
else
if
(
side
==
"ask"
)
{
//1회 매수 후 매도일 때
console
.
log
(
"매도 쪽으로 진입"
);
if
(
first
)
{
console
.
log
(
"1회 매수 후 매도"
)
User
.
deleteOne
({
market
:
coin_name
},
(
err
,
res
)
=>
{
if
(
err
)
{
// console.log(err);
User
.
findOneAndDelete
({
market
:
coin_name
},(
err
,
res
)
=>
{
if
(
err
){
console
.
log
(
err
);
}
else
{
krw_balance
=
my_asset
.
KRW
.
balance
;
divided_money
=
krw_balance
/
10
;
}
krw_balance
=
my_asset
.
KRW
.
balance
;
divided_money
=
krw_balance
/
10
;
});
//분할 매수 분할 매도 중일 때
})
}
else
{
console
.
log
(
"여러번 매수 후 매도"
);
User
.
findOneAndUpdate
({
uid
:
1
},
{
krw_balance
:
my_asset
.
KRW
.
balance
,
avg_buy_price
:
my_asset
.
market
.
avg_buy_price
,
volume
:
my_asset
.
market
.
balance
,
count
:
1
},
{
new
:
true
},
(
err
,
result
)
=>
{
if
(
err
)
{
// console.log(err);
}
else
{
console
.
log
(
result
);
console
.
log
(
err
);
}
})
}
...
...
@@ -225,7 +209,6 @@ async function transaction_coin(coin_name, side, volume, price, ord_type, first
return
;
}
async
function
get_marketInfo
()
{
//각 암호화폐 정보 조회
var
name_list
=
await
get_marketName
();
const
url2
=
`
${
server_url
}
/v1/ticker/?markets=
${
name_list
}
`
;
var
arr
=
new
Array
();
...
...
@@ -259,7 +242,7 @@ async function save_coin(arr) {
});
await
coin
.
save
((
err
)
=>
{
if
(
err
)
{
//
console.log(err)
console
.
log
(
err
)
}
})
}
...
...
@@ -272,9 +255,8 @@ async function refresh_db() {
if
(
result
.
length
!==
0
)
{
Coin
.
deleteMany
({
tid
:
{
$gt
:
0
}
},
(
err
,
result
)
=>
{
if
(
err
)
{
//
console.log(err);
console
.
log
(
err
);
}
else
{
// console.log(result);
}
})
}
...
...
@@ -291,36 +273,29 @@ async function get_candle(minute, market) {
return
candle
;
}
async
function
price_comparison
(
candle
,
user_data
=
null
,
isbuying
=
false
)
{
//매수한 코인이 있을 때
var
isbuying
=
isbuying
;
if
(
user_data
!=
null
)
{
console
.
log
(
"매수 평균가 : "
+
user_data
.
avg_buy_price
+
", 현재 가격 : "
+
candle
[
0
].
trade_price
);
//매수평균가가 현재 시장 가격보다 더 비쌀 경우
var
yield_data
=
(
candle
[
0
].
trade_price
-
user_data
.
avg_buy_price
)
/
user_data
.
avg_buy_price
*
100
;
if
(
yield_data
<=-
1
){
// if (user_data.avg_buy_price > candle[0].trade_price) {
if
(
user_data
.
count
<
9
)
{
transaction_coin
(
user_data
.
market
,
"bid"
,
null
,
divided_money
,
"price"
,
false
)
}
else
if
(
user_data
.
count
==
9
)
{
transaction_coin
(
user_data
.
market
,
"bid"
,
null
,
Math
.
floor
(
user_data
.
krw_balance
-
(
user_data
.
krw_balance
*
0.001
)),
"price"
,
false
)
}
//매수평균가가 현재 시장 가격보다 더 쌀 경우
//수수료 포함 0.5% 이상 수익중일 때
}
}
else
if
(
yield_data
>=
0.5
)
{
//매수 count가 1회이면서 수익률이 1.5프로 이상일때 시장가 전액 매도
if
(
user_data
.
count
==
1
&&
yield_data
>=
1.5
)
{
transaction_coin
(
user_data
.
market
,
"ask"
,
user_data
.
volume
,
null
,
"market"
);
//전체 계좌 제산의 10프로를 제외한 나머지 코인을 매도
console
.
log
(
user_data
);
if
(
user_data
.
count
==
1
)
{
if
(
yield_data
>=
1.5
){
transaction_coin
(
user_data
.
market
,
"ask"
,
user_data
.
volume
,
null
,
"market"
);
}
else
{
}
}
else
{
transaction_coin
(
user_data
.
market
,
"ask"
,
(
user_data
.
volume
/
user_data
.
count
)
*
(
user_data
.
count
-
1
),
null
,
"market"
,
false
);
}
}
//매수한 코인이 없을 때
}
else
{
await
Coin
.
findOne
({
name
:
candle
[
0
].
market
}).
then
(
async
(
result
)
=>
{
//가격이 떨어졌을때
//해당 코인의 count를 +1 해준다
//해당 코인의 count가 3이상이면 upbit api로 매수 주문을 보낸다.
if
(
candle
.
length
!=
0
&&
result
.
length
!=
0
)
{
var
yield_data
=
(
candle
[
0
].
trade_price
-
result
.
current_price
)
/
result
.
current_price
*
100
;
if
(
result
.
current_price
>
candle
[
0
].
trade_price
)
{
...
...
@@ -331,15 +306,12 @@ async function price_comparison(candle, user_data = null, isbuying = false) {
isbuying
=
true
;
}
}).
catch
(
err
=>
{
console
.
log
(
err
)
})
//가격이 상승했을때
//해당 코인의 count를 초기화한다.
}
else
if
(
result
.
current_price
<
candle
[
0
].
trade_price
){
console
.
log
(
result
.
korean_name
+
" "
+
candle
[
0
].
unit
+
"분 동안"
+
yield_data
.
toFixed
(
2
)
+
"% 상승"
);
await
Coin
.
findOneAndUpdate
({
name
:
candle
[
0
].
market
},
{
current_price
:
candle
[
0
].
trade_price
,
down_count
:
0
,
$inc
:
{
up_count
:
1
}
},
{
new
:
true
}).
then
(
async
(
result
)
=>
{
}).
catch
(
err
=>
{
console
.
log
(
err
);
})
}
}
else
{
console
.
log
(
result
);
}
})
}
...
...
@@ -347,10 +319,8 @@ async function price_comparison(candle, user_data = null, isbuying = false) {
}
async
function
check_coin
(
t1
)
{
User
.
find
().
then
(
async
(
user_data
)
=>
{
//매수한 코인이 있을 때
var
isbuying
=
user_data
.
length
!=
0
?
true
:
false
;
if
(
isbuying
)
{
//3회 이상 매수 했을시 15분봉으로 교체해서 가격 확인
if
(
user_data
[
0
].
count
>=
3
&&
delay_count
%
3
!=
0
&&
user_data
[
0
].
count
!=
10
)
{
delay_count
+=
1
;
}
else
{
...
...
@@ -359,7 +329,6 @@ async function check_coin(t1) {
await
price_comparison
(
candle
,
user_data
[
0
]);
}
}
//코인 count and 매수 매도 작업
for
(
var
i
=
0
;
i
<
t1
.
length
;
i
++
)
{
if
(
user_data
[
0
]
&&
user_data
[
0
].
market
==
t1
[
i
])
{
continue
;
...
...
@@ -378,7 +347,6 @@ async function latest_repeat(t1) {
let
minutes
=
today
.
getMinutes
();
let
seconds
=
today
.
getSeconds
();
if
(
seconds
==
0
)
{
// if (minutes == 0 && seconds == 0) {
clearInterval
(
check_time
);
sort_info
=
(
await
sort_data
());
(
await
refresh_db
());
...
...
@@ -394,7 +362,6 @@ async function latest_repeat(t1) {
let
minutes
=
today
.
getMinutes
();
let
seconds
=
today
.
getSeconds
();
console
.
log
(
"현재 시간은 "
+
today
.
toLocaleTimeString
());
//24시간마다 db 최신화...
if
(
count
==
12
*
24
)
{
count
=
0
;
sort_info
=
(
await
sort_data
());
...
...
@@ -449,7 +416,7 @@ function lookup_order(uuid,avg_buy_price=0,market="") {
if
(
avg_buy_price
!=
0
){
trading_notice
(
body
.
side
,
price
,
funds
,
volume
,
yield_data
,
market
);
}
else
{
trading_notice
(
body
.
side
,
price
,
funds
,
volume
);
trading_notice
(
body
.
side
,
price
,
funds
,
volume
,
0
,
market
);
}
})
return
;
...
...
@@ -458,7 +425,7 @@ function trading_notice(side, price, funds, volume,yield_data=0,market="") {
var
messages
=
new
Array
();
if
(
side
==
"bid"
)
{
messages
.
push
({
"type"
:
"text"
,
"text"
:
"매수 주문이 체결되었습니다."
});
messages
.
push
({
"type"
:
"text"
,
"text"
:
`
${
market
}
\n체결 금액 :
${
funds
}
원\n체결 수량 :
${
volume
}
개\n체결 평균가 :
${
price
}
원
\n
`
});
messages
.
push
({
"type"
:
"text"
,
"text"
:
`
${
market
}
\n체결 금액 :
${
funds
}
원\n체결 수량 :
${
volume
}
개\n체결 평균가 :
${
price
}
원`
});
}
else
{
messages
.
push
({
"type"
:
"text"
,
"text"
:
"매도 주문이 체결되었습니다."
});
messages
.
push
({
"type"
:
"text"
,
"text"
:
`
${
market
}
\n체결 금액 :
${
funds
}
원\n체결 수량 :
${
volume
}
개\n체결 평균가 :
${
price
}
원\n수익률 :
${
yield_data
}
%`
});
...
...
@@ -505,7 +472,6 @@ async function lookup_asset(replyToken) {
]
}
},
(
error
,
response
,
body
)
=>
{
console
.
log
(
body
)
});
return
;
}
...
...
@@ -522,7 +488,7 @@ async function lookup_hold_coin(replyToken) {
}
else
{
messages
.
push
({
"type"
:
"text"
,
"text"
:
`
${
coin_list
[
i
]}
\n보유 수량 :
${(
result
[
coin_list
[
i
]].
volume
)}
개\n매수 평균가 :
${
result
[
coin_list
[
i
]].
avg_buy_price
}
원\n현재가
${
result
[
coin_list
[
i
]].
current_price
}
원\n수익률 :
${
result
[
coin_list
[
i
]].
yield_data
}
%`
"text"
:
`
${
coin_list
[
i
]}
\n보유 수량 :
${(
result
[
coin_list
[
i
]].
volume
)}
개\n매수 평균가 :
${
result
[
coin_list
[
i
]].
avg_buy_price
}
원\n현재가
${
result
[
coin_list
[
i
]].
current_price
}
원\n
매수 금액 :
${
result
[
coin_list
[
i
]].
buying_money
}
\n평가 금액 :
${
result
[
coin_list
[
i
]].
evaluation_money
}
\n
수익률 :
${
result
[
coin_list
[
i
]].
yield_data
}
%`
})
}
}
...
...
@@ -543,7 +509,6 @@ async function lookup_hold_coin(replyToken) {
});
return
;
}
app
.
post
(
'/hook'
,
function
(
req
,
res
)
{
var
eventObj
=
req
.
body
.
events
[
0
];
if
(
eventObj
.
message
.
text
==
"자산"
)
{
...
...
@@ -562,7 +527,6 @@ try {
};
HTTPS
.
createServer
(
option
,
app
).
listen
(
sslport
,
async
()
=>
{
console
.
log
(
`[HTTPS] Server is started on port
${
sslport
}
`
);
// console.log(await get_asset());
await
get_asset
().
then
((
result
)
=>
{
krw_balance
=
result
[
0
].
balance
;
divided_money
=
krw_balance
/
10
...
...
Please
register
or
login
to post a comment