2019102152 김다빈

Add selling algorithm and Modify buying algorithm

......@@ -21,24 +21,21 @@ const secret_key = process.env.secret_key;
const server_url = "https://api.upbit.com"
var krw_balance = 60000;
var divided_money = krw_balance / 10;
var krw_balance;
var divided_money;
var sort_info = new Array();
const mongoose = require('mongoose');
const config = require('./config/key');
app.use(bodyParser.json());
const connect = mongoose.connect(config.mongoURI, {
useNewUrlParser: true, useUnifiedTopology: true
})
.then(() => console.log('디비연결 성공'))
.catch((err) => console.log(err));
app.use(bodyParser.json());
var korean_name = new Object();
var korean_name = new Object();
function get_asset(market) {
const payload = {
......@@ -88,9 +85,8 @@ async function get_marketName() {
}
async function transaction_coin(coin_name, side, volume, price, ord_type, first = true) {
var volume = volume;
if (side == "ask") {
await User.findOne({ uid: 1 }).then((result) => {
console.log(result.volume);
if (side == "ask" && volume == "") {
await User.findOne({ market:coin_name }).then((result) => {
volume = String(result.volume);
}).catch(err => { console.log(err.error) });
}
......@@ -133,25 +129,36 @@ async function transaction_coin(coin_name, side, volume, price, ord_type, first
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);
}else{
console.log(result);
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);
} else {
// console.log(result);
}
})
}
} else if (side == "ask") {
//1회 매수 후 매도일 때
console.log("매도 쪽으로 진입");
if (first) {
User.deleteOne({ uid: 1 }, (err, res) => {
console.log("1회 매수 후 매도")
User.deleteOne({ market:coin_name }, (err, res) => {
if (err) {
console.log(err);
// console.log(err);
}
krw_balance = my_asset.KRW.balance;
console.log(krw_balance);
divided_money = krw_balance / 10;
});
//분할 매수 분할 매도 중일 때
} 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, count: 1 }, { new: true }, (err, result) => {
if (err) {
// console.log(err);
} else {
// console.log(result);
}
})
}
}
}).catch((err) => { console.log(err.error) })
......@@ -191,7 +198,7 @@ async function save_coin(arr) {
});
await coin.save((err) => {
if (err) {
console.log(err)
// console.log(err)
}
})
}
......@@ -204,9 +211,9 @@ 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);
// console.log(result);
}
})
}
......@@ -221,79 +228,89 @@ async function get_candle(minute, market) {
.then(json => candle = json)
return candle;
}
async function price_comparison(candle, avg_buy_price = 0) {
var isbuying=true;
if (avg_buy_price == 0) {
async function price_comparison(candle, user_data = null,isbuying=false) {
//매수한 코인이 있을 때
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 (user_data.avg_buy_price > candle[0].trade_price) {
if (user_data.count < 10) {
transaction_coin(user_data.market, "bid", null, divided_money, "price", false)
} else {
transaction_coin(user_data.market, "bid", null, user_data.krw_balance, "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프로를 제외한 나머지 코인을 매도
} 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로 매수 주문을 보낸다.
var yield_data = (candle[0].trade_price - result.current_price) / result.current_price * 100;
if (result.current_price > candle[0].trade_price) {
Coin.findOneAndUpdate({ name: candle[0].market }, { current_price: candle[0].trade_price, $inc: { count: 1 } }, { new: true }, (err, result) => {
if (err) {
console.log(err);
} else {
console.log("***" + result.korean_name + "은(는)" + result.count * 5 + "분 동안 하락중");
if (result.count >= 3) {
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,up_count:0,$inc: { down_count: 1 }}, { new: true }).then(async (result) => {
if (result.down_count >= 3) {
transaction_coin(result.name, "bid", null, divided_money, "price");
isbuying=false;
}
}
})
} else if (result.current_price < candle[0].trade_price) {
await Coin.findOneAndUpdate({ name: candle[0].market }, { current_price: candle[0].trade_price, count: 0 }, { new: true }).then(async (err, result) => {
if (err) {
console.log(err);
} else {
console.log(result.korean_name + "은(는)" + result.count * 5 + "분 동안 상승 혹은 정체중");
}
})
}).catch(err=>{console.log(err)})
//가격이 상승하거나 변동이 없을 때
//해당 코인의 count를 초기화한다.
} else{
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 {
if (avg_buy_price < candle[0].trade_price) {
transaction_coin(candle[0].market, "bid", null, divided_money, "price", false)
} else {
transaction_coin(candle[0].market, "ask", "", null, "market", false);
}
})
}
return isbuying;
}
async function check_coin(t1) {
User.find().then(async (user_data) => {
//아직 매수한 코인이 없을 때
if (user_data.length == 0) {
var isbuying = false;
for (var i = 0; i < t1.length; i++) {
if (isbuying) {
var candle = await get_candle(5, t1[i]);
isbuying=await price_comparison(candle);
console.log(isbuying);
}
}
//매수한 코인이 있을 때
} else {
//매수한 코인이 있을 때
if(user_data.length!=0) {
//3회 이상 매수 했을시 15분봉으로 교체해서 가격 확인
//15분봉 처리해야함
if (user_data[0].count > 3) {
var candle = await get_candle(15, user_data[0].market);
await price_comparison(candle, user_data[0].avg_buy_price);
} else {
setTimeout(async () => {
candle = await get_candle(15, user_data[0].market);
}, 60000 * 10);
}else{
var candle = await get_candle(5, user_data[0].market);
await price_comparison(candle, user_data[0].avg_buy_price);
}
await price_comparison(candle, user_data[0]);
}
var isbuying=user_data.length==0;
//코인 count and 매수 매도 작업
for(var i=0;i<t1.length;i++){
if(user_data[0]&&user_data[0].market!=t1[i]){
break;
}
var candle=await get_candle(5,t1[i]);
await price_comparison(candle,null,isbuying);
}
}).catch((err) => {
console.log(err);
})
}
async function latest_repeat(t1) {
let check_time = setInterval(async () => {
let today = new Date();
let minutes = today.getMinutes();
let seconds = today.getSeconds();
// if (seconds == 0) {
if (minutes == 0 && seconds == 0) {
if (seconds == 0) {
// if (minutes == 0 && seconds == 0) {
clearInterval(check_time);
sort_info = (await sort_data());
(await refresh_db());
......@@ -309,13 +326,14 @@ async function latest_repeat(t1) {
let minutes = today.getMinutes();
let seconds = today.getSeconds();
console.log("현재 시간은 " + today.toLocaleTimeString());
await (check_coin(t1).then(count++));
//1시간마다 db 최신화...
if (count == 12) {
count = 0;
sort_info = (await sort_data());
(await refresh_db());
console.log("db최신화");
} else {
await (check_coin(t1).then(count++));
}
}, 60000 * 5);
}
......@@ -327,12 +345,15 @@ try {
key: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/privkey.pem'), 'utf8').toString(),
cert: fs.readFileSync(path.resolve(process.cwd(), '/etc/letsencrypt/live/' + domain + '/cert.pem'), 'utf8').toString(),
};
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
});
var t1 = new Array();
await (latest_repeat(t1));
// console.log(await get_asset());
});
} catch (error) {
console.log('[HTTPS] HTTPS 오류가 발생하였습니다. HTTPS 서버는 실행되지 않습니다.');
......
......@@ -20,7 +20,11 @@ const coinSchema=mongoose.Schema({
type:Number,
required:true
},
count:{
up_count:{
type:Number,
default:0
},
down_count:{
type:Number,
default:0
}
......
......@@ -11,7 +11,7 @@ const userSchema=mongoose.Schema({
type:String,
},
count:{
type:Number,
type:Number
},
avg_buy_price:{
type:Number
......