본문 바로가기
Back_end/Api (업비트) 자동매매

[Spring Project] 코인 자동매매 프로그램 만들기 - 2. 업비트 매수, 매수 취소

by 8Antony 2022. 10. 21.

 

매수

 

market : 종목 정보 

ask : 매수

bid : 매도 

 

https://docs.upbit.com/reference/%EC%A3%BC%EB%AC%B8%ED%95%98%EA%B8%B0

 

업비트 개발자 센터

업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.

docs.upbit.com

 

 

 

1. VO 작성 (UPBIT open API에 있는 것들로)

 

 

 

public class OrderVo {
	private String market;
	private String side;
	private String volume;
	private String price;
	private String ord_type;

 

 

 

2. api 호출 메소드 (orders)작성 

 

 

 

public void orders(OrderVo orderVo) throws NoSuchAlgorithmException, UnsupportedEncodingException{
		String accessKey = "";
        String secretKey = "";
        String serverUrl = "https://api.upbit.com";
        
        HashMap<String, String> params = new HashMap<>();
        params.put("market", orderVo.getMarket());
        params.put("side", orderVo.getSide());
        params.put("volume", orderVo.getVolume());
        params.put("price", orderVo.getPrice());
        params.put("ord_type", orderVo.getOrd_type());
        
        ArrayList<String> queryElements = new ArrayList<>();
        for(Map.Entry<String, String> entity : params.entrySet()) {
            queryElements.add(entity.getKey() + "=" + entity.getValue());
        }

        String queryString = String.join("&", queryElements.toArray(new String[0]));

        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(queryString.getBytes("UTF-8"));

        String queryHash = String.format("%0128x", new BigInteger(1, md.digest()));

        Algorithm algorithm = Algorithm.HMAC256(secretKey);
        String jwtToken = JWT.create()
                .withClaim("access_key", accessKey)
                .withClaim("nonce", UUID.randomUUID().toString())
                .withClaim("query_hash", queryHash)
                .withClaim("query_hash_alg", "SHA512")
                .sign(algorithm);

        String authenticationToken = "Bearer " + jwtToken;

        try {
            HttpClient client = HttpClientBuilder.create().build();
            HttpPost request = new HttpPost(serverUrl + "/v1/orders");
            request.setHeader("Content-Type", "application/json");
            request.addHeader("Authorization", authenticationToken);
            request.setEntity(new StringEntity(new Gson().toJson(params)));

            HttpResponse response = client.execute(request);
            HttpEntity entity = response.getEntity();

            System.out.println(EntityUtils.toString(entity, "UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
	}

 

 

3. Test 파일에 내 예약 매수 (Java application)

 

 

		// 주문 객체 생성
		OrderVo orderVo = new OrderVo();
		orderVo.setMarket("KRW-GAS");
		orderVo.setOrd_type("limit");
		orderVo.setPrice("50000");
		orderVo.setSide("bid");
		orderVo.setVolume("20");
		
		// 주문 실행
		api.orders(orderVo);

 

 

주문 객체를 생성한 후 KRW_GAS 를 20개 매수 한다는 의미이다. (주문 총 금액 setPrice = 50000)

 

api 메소드에서 get 했으니, Test 파일에서는 Set으로 값을 넣어준다. 

 

 

4. 출력 결과

 

 

 

 

매수 취소 

 

 

 

 

 

1. api 호출 메소드 (cancel)작성 

 

 

public void cancel(String uuid) throws NoSuchAlgorithmException, UnsupportedEncodingException {
		String accessKey = "";
        String secretKey = "";
        String serverUrl = "https://api.upbit.com";
        
        HashMap<String, String> params = new HashMap<>();
        params.put("uuid", uuid);

        ArrayList<String> queryElements = new ArrayList<>();
        for(Map.Entry<String, String> entity : params.entrySet()) {
            queryElements.add(entity.getKey() + "=" + entity.getValue());
        }

        String queryString = String.join("&", queryElements.toArray(new String[0]));

        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(queryString.getBytes("UTF-8"));

        String queryHash = String.format("%0128x", new BigInteger(1, md.digest()));

        Algorithm algorithm = Algorithm.HMAC256(secretKey);
        String jwtToken = JWT.create()
                .withClaim("access_key", accessKey)
                .withClaim("nonce", UUID.randomUUID().toString())
                .withClaim("query_hash", queryHash)
                .withClaim("query_hash_alg", "SHA512")
                .sign(algorithm);

        String authenticationToken = "Bearer " + jwtToken;

        try {
            HttpClient client = HttpClientBuilder.create().build();
            HttpDelete request = new HttpDelete(serverUrl + "/v1/order?" + queryString);
            request.setHeader("Content-Type", "application/json");
            request.addHeader("Authorization", authenticationToken);

            HttpResponse response = client.execute(request);
            HttpEntity entity = response.getEntity();

            System.out.println(EntityUtils.toString(entity, "UTF-8"));
        } catch (IOException e) {
            e.printStackTrace();
        }
	}

 

취소할 주문의 uuid 값만 쓸 것이니, VO 가 필요 X 

 

 

 

2. Test 파일에 내 매수 취소 (Java application)

 

 

		// 주문 취소 
		//api.cancel("uuid 넣기");

 

 

 

3. 출력 결과

 

 

 

만약 매수 매도 내역을 DB에 저장하고 싶으면, service + impl 를 생성 해 개발 가능하다. 

 

하지만 자동매매 프로그램이다 보니, 원금의 몇 % 매수 매도를 할지에 대한 기준치가 확실하지 않아 천천히 고민을 해보고 싶습니다.

댓글