반응형
SMALL

 

한국투자증권 자동매매 프로그램

API 정보 입력

종목 정보 입력

주문 결과

 

 

계좌 정보

잔고:
보유 주식:

신규 상장 기업

    오늘의 주가 및 거래량

    종목명 현재가 변동률 거래량

    기업별 세무 신고액

    ----------------------------------------------------------------코드소스----------------------------------------------------
    <!DOCTYPE html>
    <html lang="ko">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>한국투자증권 자동매매 프로그램</title>
        <script src="https://unpkg.com/@tailwindcss/browser@4"></script>
        <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
        <style>
            body {
                font-family: 'Inter', sans-serif;
            }
            /* 추가 스타일 */
            #realtime-stock-table {
                border-collapse: collapse;
                width: 100%;
                margin-top: 20px;
            }
            #realtime-stock-table th, #realtime-stock-table td {
                border: 1px solid #ddd;
                padding: 8px;
                text-align: left;
            }
            #realtime-stock-table th {
                background-color: #f0f0f0;
            }
            .up {
                color: red;
            }
            .down {
                color: blue;
            }
            .even {
                color: black;
            }
        </style>
        <script>
            tailwind.config = {
                theme: {
                    extend: {
                        fontFamily: {
                            'inter': ['Inter', 'sans-serif'],
                        },
                    },
                },
            }
        </script>
    </head>
    <body class="bg-gray-100 p-4">
        <div class="container mx-auto p-6 bg-white rounded-lg shadow-md">
            <h1 class="text-2xl font-semibold text-center text-gray-800 mb-6">한국투자증권 자동매매 프로그램</h1>

            <div id="api-info" class="mb-6 p-4 bg-gray-50 rounded-lg border border-gray-200">
                <h2 class="text-lg font-semibold text-gray-700 mb-4">API 정보 입력</h2>
                <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
                    <div class="mb-2">
                        <label for="account-number" class="block text-gray-700 text-sm font-bold mb-2">계좌번호:</label>
                        <input type="text" id="account-number" placeholder="계좌번호를 입력하세요" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                    <div class="mb-2">
                        <label for="access-token" class="block text-gray-700 text-sm font-bold mb-2">Access Token:</label>
                        <input type="text" id="access-token" placeholder="Access Token을 입력하세요" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                    <div class="mb-2">
                        <label for="app-key" class="block text-gray-700 text-sm font-bold mb-2">App Key:</label>
                        <input type="text" id="app-key" placeholder="App Key를 입력하세요" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                    <div class="mb-2">
                        <label for="app-secret" class="block text-gray-700 text-sm font-bold mb-2">App Secret:</label>
                        <input type="text" id="app-secret" placeholder="App Secret을 입력하세요" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                </div>
            </div>

            <div id="stock-info" class="mb-6 p-4 bg-gray-50 rounded-lg border border-gray-200">
                <h2 class="text-lg font-semibold text-gray-700 mb-4">종목 정보 입력</h2>
                <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
                    <div class="mb-2">
                        <label for="stock-code" class="block text-gray-700 text-sm font-bold mb-2">종목 코드:</label>
                        <input type="text" id="stock-code" placeholder="종목 코드를 입력하세요" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                    <div class="mb-2">
                        <label for="quantity" class="block text-gray-700 text-sm font-bold mb-2">매수/매도 수량:</label>
                        <input type="number" id="quantity" value="1" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                     <div class="mb-2">
                        <label for="price" class="block text-gray-700 text-sm font-bold mb-2">매수/매도 가격 (지정가):</label>
                        <input type="number" id="price" placeholder="매수/매도 가격을 입력하세요 (선택 사항)" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                </div>
            </div>

            <div id="transaction-buttons" class="flex justify-center space-x-4 mb-6">
                <button id="buy-button" class="bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">매수</button>
                <button id="sell-button" class="bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">매도</button>
                <button id="cancel-button" class="bg-yellow-500 hover:bg-yellow-700 text-gray-800 font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">취소</button>
            </div>

            <div id="order-results" class="mb-6 p-4 bg-gray-50 rounded-lg border border-gray-200">
                <h2 class="text-lg font-semibold text-gray-700 mb-4">주문 결과</h2>
                <div id="result-message" class="text-gray-700"></div>
            </div>

            <div id="account-info" class="p-4 bg-gray-50 rounded-lg border border-gray-200">
                <h2 class="text-lg font-semibold text-gray-700 mb-4">계좌 정보</h2>
                <div id="account-balance" class="text-gray-700 mb-2">잔고: </div>
                <div id="stock-holdings" class="text-gray-700">보유 주식: </div>
            </div>

            <div id="new-listings" class="mb-6 p-4 bg-gray-50 rounded-lg border border-gray-200">
                <h2 class="text-lg font-semibold text-gray-700 mb-4">신규 상장 기업</h2>
                <ul id="new-listings-list" class="list-disc list-inside text-gray-700">
                    </ul>
            </div>

            <div id="realtime-stock-info" class="p-4 bg-gray-50 rounded-lg border border-gray-200">
                <h2 class="text-lg font-semibold text-gray-700 mb-4">오늘의 주가 및 거래량</h2>
                <table id="realtime-stock-table">
                    <thead>
                        <tr>
                            <th>종목명</th>
                            <th>현재가</th>
                            <th>변동률</th>
                            <th>거래량</th>
                        </tr>
                    </thead>
                    <tbody>
                        </tbody>
                </table>
            </div>

            <div id="tax-info" class="p-4 bg-gray-50 rounded-lg border border-gray-200">
                <h2 class="text-lg font-semibold text-gray-700 mb-4">기업별 세무 신고액</h2>
                <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
                    <div class="mb-2">
                        <label for="company-code" class="block text-gray-700 text-sm font-bold mb-2">회사 코드:</label>
                        <input type="text" id="company-code" placeholder="회사 코드를 입력하세요" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                    <div class="mb-2">
                        <label for="year" class="block text-gray-700 text-sm font-bold mb-2">년도:</label>
                        <input type="number" id="year" value="2023" class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                    </div>
                </div>
                <button id="show-tax-button" class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">세무 신고액 조회</button>
                <div id="tax-result" class="mt-4 text-gray-700"></div>
            </div>
        </div>

        <script>
            const accountNumberInput = document.getElementById('account-number');
            const accessTokenInput = document.getElementById('access-token');
            const appKeyInput = document.getElementById('app-key');
            const appSecretInput = document.getElementById('app-secret');
            const stockCodeInput = document.getElementById('stock-code');
            const quantityInput = document.getElementById('quantity');
            const priceInput = document.getElementById('price');
            const buyButton = document.getElementById('buy-button');
            const sellButton = document.getElementById('sell-button');
            const cancelButton = document.getElementById('cancel-button');
            const resultMessage = document.getElementById('result-message');
            const accountBalanceDisplay = document.getElementById('account-balance');
            const stockHoldingsDisplay = document.getElementById('stock-holdings');
            const newListingsList = document.getElementById('new-listings-list');
            const realtimeStockTable = document.getElementById('realtime-stock-table').getElementsByTagName('tbody')[0];
            const companyCodeInput = document.getElementById('company-code');
            const yearInput = document.getElementById('year');
            const showTaxButton = document.getElementById('show-tax-button');
            const taxResultDisplay = document.getElementById('tax-result');

            // 실제 API 호출 시에는 HTTPS를 사용해야 합니다.
            const API_BASE_URL = 'https://openapi.koreainvestment.com:9443'; // 실전 투자 URL
            // const API_BASE_URL = 'https://openapivts.koreainvestment.com:29443'; // 모의 투자 URL

            let accessToken = '';

            // Access Token 발급 함수 (실제 사용 시에는 보안에 유의하여 서버에서 처리해야 합니다.)
            async function getAccessToken() {
                const appKey = appKeyInput.value;
                const appSecret = appSecretInput.value;

                const tokenUrl = `${API_BASE_URL}/oauth2/token`;

                const requestBody = new URLSearchParams();
                requestBody.append('grant_type', 'client_credentials');
                requestBody.append('appkey', appKey);
                requestBody.append('appsecret', appSecret);

                try {
                    const response = await fetch(tokenUrl, {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/x-www-form-urlencoded',
                        },
                        body: requestBody,
                    });

                    if (!response.ok) {
                        throw new Error(`HTTP error! status: ${response.status}`);
                    }

                    const data = await response.json();
                    accessToken = data.access_token;
                    console.log('Access Token 발급 성공:', accessToken);
                    return accessToken;

                } catch (error) {
                    console.error('Access Token 발급 실패:', error);
                    resultMessage.textContent = `Access Token 발급 실패: ${error.message}`;
                    return null;
                }
            }

            // 주식 주문 함수
            async function placeOrder(orderType) {
                const accountNumber = accountNumberInput.value;
                const stockCode = stockCodeInput.value;
                const quantity = quantityInput.value;
                const price = priceInput.value; // 지정가 주문 가격
                const accessToken = await getAccessToken();

                 if (!accessToken) {
                    resultMessage.textContent = "Access Token이 없습니다. 발급 후 다시 시도해주세요.";
                    return;
                 }

                const orderUrl = `${API_BASE_URL}/uapi/domestic-stock/v1/trading/order`;
                const header = {
                    'Content-Type': 'application/json; charset=utf-8',
                    'Authorization': `Bearer ${accessToken}`,
                    'appkey': appKeyInput.value,
                    'appsecret': appSecretInput.value,
                    'tr_id': orderType === 'buy' ? (price ? 'TTTC0801U' : 'TTTC0802U') : (price ? 'TTTC0803U' : 'TTTC0804U'), // 매수: TTTC0801U(지정가), TTTC0802U(시장가), 매도: TTTC0803U(지정가), TTTC0804U(시장가)
                    'custtype': 'P',
                };

                const body = {
                    'CANO': accountNumber.substring(0, 8), // 계좌번호 앞 8자리
                    'ACNT_PRDT_CD': accountNumber.substring(8), // 계좌번호 뒤 2자리
                    'PDNO': stockCode,
                    'ORD_QTY': quantity,
                    'ORD_TYPE': price ? '01' : '00', // 00: 시장가, 01: 지정가
                    'ORD_PRICE': price || '', // 지정가인 경우에만 가격 설정
                };

                try {
                    const response = await fetch(orderUrl, {
                        method: 'POST',
                        headers: header,
                        body: JSON.stringify(body),
                    });

                    if (!response.ok) {
                        const errorData = await response.json(); // 에러 응답을 JSON 형태로 파싱
                        let errorMessage = `주문 실패: ${response.status}`;
                        if (errorData && errorData.rt_msg) { // 에러 메시지가 있다면 추가
                            errorMessage += ` - ${errorData.rt_msg}`;
                        }
                        throw new Error(errorMessage);
                    }

                    const data = await response.json();
                    console.log('주문 성공:', data);
                    resultMessage.textContent = `주문 성공: ${data.msg1 || '성공적으로 처리되었습니다.'}`;

                } catch (error) {
                    console.error('주문 실패:', error);
                    resultMessage.textContent = `주문 실패: ${error.message}`;
                }
            }

            // 주문 취소 함수
            async function cancelOrder() {
                 const accountNumber = accountNumberInput.value;
                const stockCode = stockCodeInput.value;
                const accessToken = await getAccessToken();

                 if (!accessToken) {
                    resultMessage.textContent = "Access Token이 없습니다. 발급 후 다시 시도해주세요.";
                    return;
                 }

                const cancelUrl = `${API_BASE_URL}/uapi/domestic-stock/v1/trading/ordercancel`;
                const header = {
                    'Content-Type': 'application/json; charset=utf-8',
                    'Authorization': `Bearer ${accessToken}`,
                    'appkey': appKeyInput.value,
                    'appsecret': appSecretInput.value,
                    'tr_id': 'TTTC0805U', // 주문 취소 TR_ID
                    'custtype': 'P',
                };

                // 주문 취소 시 필요한 정보.  원 주문 번호(org_no)를 알아야 함.
                // 여기서는 예시로 임의의 주문 번호를 사용. 실제로는 주문 체결 내역 조회 API 등을 통해 얻어야 함.
                const body = {
                    'CANO': accountNumber.substring(0, 8),
                    'ACNT_PRDT_CD': accountNumber.substring(8),
                    'KRX_FWDG_ORD_NO': '1234567890',  // !!! 실제 주문 번호로 변경 필요 !!!
                    'PDNO': stockCode,
                    'ORD_QTY': quantityInput.value,
                };

                try {
                    const response = await fetch(cancelUrl, {
                        method: 'POST',
                        headers: header,
                        body: JSON.stringify(body),
                    });

                    if (!response.ok) {
                        const errorData = await response.json();
                        let errorMessage = `주문 취소 실패: ${response.status}`;
                        if (errorData && errorData.rt_msg) {
                             errorMessage += ` - ${errorData.rt_msg}`;
                        }
                        throw new Error(errorMessage);
                    }

                    const data = await response.json();
                    console.log('주문 취소 성공:', data);
                    resultMessage.textContent = `주문 취소 성공: ${data.msg1 || '성공적으로 처리되었습니다.'}`;

                } catch (error) {
                    console.error('주문 취소 실패:', error);
                    resultMessage.textContent = `주문 취소 실패: ${error.message}`;
                }
            }

            // 계좌 잔고 조회 함수
            async function getAccountBalance() {
                const accountNumber = accountNumberInput.value;
                const accessToken = await getAccessToken();

                if (!accessToken) {
                    resultMessage.textContent = "Access Token이 없습니다. 발급 후 다시 시도해주세요.";
                    return;
                }

                const balanceUrl = `${API_BASE_URL}/uapi/domestic-stock/v1/account/balance`;
                const header = {
                    'Content-Type': 'application/json; charset=utf-8',
                    'Authorization': `Bearer ${accessToken}`,
                    'appkey': appKeyInput.value,
                    'appsecret': appSecretInput.value,
                    'tr_id': 'TTTC8434R', // 잔고 조회 TR_ID
                    'custtype': 'P',
                };

                const body = {
                    'CANO': accountNumber.substring(0, 8),
                    'ACNT_PRDT_CD': accountNumber.substring(8),
                    'AFHR_FLUI_ID': '0', // 0: 출금가능금액, 1: 총평가금액
                    'OFL_YN': 'N',
                };

                try {
                    const response = await fetch(balanceUrl, {
                        method: 'GET',
                        headers: header,
                        body: JSON.stringify(body),
                    });

                    if (!response.ok) {
                        const errorData = await response.json();
                        let errorMessage = `잔고 조회 실패: ${response.status}`;
                         if (errorData && errorData.rt_msg) {
                            errorMessage += ` - ${errorData.rt_msg}`;
                        }
                        throw new Error(errorMessage);
                    }

                    const data = await response.json();
                    console.log('계좌 잔고 조회 성공:', data);

                    // 잔고 정보 표시
                    if (data.output && data.output.length > 0) {
                        accountBalanceDisplay.textContent = `잔고: ${parseInt(data.output[0].hldg_sbl_amt).toLocaleString()} 원`;
                    } else {
                        accountBalanceDisplay.textContent = '잔고 정보 없음';
                    }


                } catch (error) {
                    console.error('잔고 조회 실패:', error);
                    resultMessage.textContent = `잔고 조회 실패: ${error.message}`;
                }
            }

            // 계좌 보유 주식 조회 함수
            async function getStockHoldings() {
                const accountNumber = accountNumberInput.value;
                const accessToken = await getAccessToken();
                 if (!accessToken) {
                    resultMessage.textContent = "Access Token이 없습니다. 발급 후 다시 시도해주세요.";
                    return;
                }

                const holdingsUrl = `${API_BASE_URL}/uapi/domestic-stock/v1/account/stock`;
                const header = {
                    'Content-Type': 'application/json; charset=utf-8',
                    'Authorization': `Bearer ${accessToken}`,
                    'appkey': appKeyInput.value,
                    'appsecret': appSecretInput.value,
                    'tr_id': 'TTTC8436R', // 보유 주식 조회 TR_ID
                    'custtype': 'P',
                };

                const body = {
                    'CANO': accountNumber.substring(0, 8),
                    'ACNT_PRDT_CD': accountNumber.substring(8),
                    'AFHR_FLUI_ID': '0',
                    'OFL_YN': 'N',
                    'PRCS_DVSN': '01', // 01: 주식 잔고, 02: 펀드 잔고
                };

                try {
                    const response = await fetch(holdingsUrl, {
                        method: 'GET',
                        headers: header,
                        body: JSON.stringify(body),
                    });

                    if (!response.ok) {
                        const errorData = await response.json();
                        let errorMessage = `보유 주식 조회 실패: ${response.status}`;
                        if (errorData && errorData.rt_msg) {
                            errorMessage += ` - ${errorData.rt_msg}`;
                        }
                        throw new Error(errorMessage);
                    }

                    const data = await response.json();
                    console.log('계좌 보유 주식 조회 성공:', data);

                    // 보유 주식 정보 표시
                    if (data.output && data.output.length > 0) {
                        let holdingsText = '보유 주식: ';
                        data.output.forEach(stock => {
                            holdingsText += `${stock.pdnm}(${stock.hldg_qty}주), `;
                        });
                        holdingsText = holdingsText.slice(0, -2); // 마지막 ', ' 제거
                        stockHoldingsDisplay.textContent = holdingsText;
                    } else {
                        stockHoldingsDisplay.textContent = '보유 주식 정보 없음';
                    }

                } catch (error) {
                    console.error('보유 주식 조회 실패:', error);
                    resultMessage.textContent = `보유 주식 조회 실패: ${error.message}`;
                }
            }

            // 신규 상장 기업 조회 함수 (실제 API 연동 필요)
            async function getNewListings() {
                // 실제로는 한국투자증권 API 또는 다른 데이터 소스를 통해 신규 상장 기업 정보를 가져와야 합니다.
                // 여기서는 임시로 더미 데이터를 사용합니다.
                const newListings = [
                    { name: 'A기업', date: '2024-07-24' },
                    { name: 'B기업', date: '2024-07-25' },
                    { name: 'C기업', date: '2024-07-26' },
                ];

                // Get new listings from OpenDart
                try {
                    const response = await fetch('https://opendart.fss.or.kr/api/existed.json?crp_cd=00126380&bsns_year=2023&api_key=YOUR_API_KEY');
                    if (!response.ok) {
                        throw new Error(`HTTP error! status: ${response.status}`);
                    }
                    const data = await response.json();
                    console.log("OpenDart API 호출 결과", data);
                    //신규상장기업 데이터 처리 로직
                    if (data && Array.isArray(data.list)) {
                        newListingsList.innerHTML = '';
                        data.forEach(item => {
                            const li = document.createElement('li');
                            li.textContent = `${item.crp_nm} (${item.est_dt})`;
                            newListingsList.appendChild(li);
                        });
                    }

                } catch (error) {
                    console.error("신규상장기업 조회 실패", error);
                    resultMessage.textContent = `신규 상장 기업 조회 실패: ${error.message}`;
                }

                // 신규 상장 기업 목록 표시
                newListings.forEach(item => {
                    const li = document.createElement('li');
                    li.textContent = `${item.name} (${item.date})`;
                    newListingsList.appendChild(li);
                });
            }

            // 실시간 주가 조회 함수 (Web Socket API필요)
            async function getRealtimeStockPrice() {
                // 실제로는 한국투자증권 Web Socket API를 사용하여 실시간 주가를 받아와야 합니다.
                // 여기서는 임시로 더미 데이터를 생성하여 표시합니다.
                const dummyStocks = [
                    { name: '삼성전자', currentPrice: 70000, changeRate: 0.5, volume: 1000000 },
                    { name: 'LG전자', currentPrice: 150000, changeRate: -1.2, volume: 500000 },
                    { name: 'SK하이닉스', currentPrice: 120000, changeRate: 0, volume: 800000 },
                ];

                // Clear the table
                realtimeStockTable.innerHTML = '';

                dummyStocks.forEach(stock => {
                    const row = realtimeStockTable.insertRow();
                    const nameCell = row.insertCell();
                    const priceCell = row.insertCell();
                    const changeRateCell = row.insertCell();
                    const volumeCell = row.insertCell();

                    nameCell.textContent = stock.name;
                    priceCell.textContent = stock.currentPrice.toLocaleString();
                    changeRateCell.textContent = `${stock.changeRate.toFixed(2)}%`;
                    changeRateCell.className = stock.changeRate > 0 ? 'up' : stock.changeRate < 0 ? 'down' : 'even';
                    volumeCell.textContent = stock.volume.toLocaleString();
                });
            }

            // 기업별 세무 신고액 조회 함수 (Open Dart API 활용)
            async function getCompanyTaxReport() {
                const companyCode = companyCodeInput.value;
                const year = yearInput.value;
                const apiKey = 'YOUR_API_KEY'; // 여기에 발급받은 API 키를 입력하세요.

                if (!companyCode) {
                    taxResultDisplay.textContent = "회사 코드를 입력해주세요.";
                    return;
                }

                const apiUrl = `https://opendart.fss.or.kr/api/taxReport.json?crp_cd=${companyCode}&bsns_year=${year}&api_key=${apiKey}`;

                try {
                    const response = await fetch(apiUrl);
                    if (!response.ok) {
                        throw new Error(`HTTP error! status: ${response.status}`);
                    }
                    const data = await response.json();
                    console.log('세무 신고액 조회 결과:', data);

                    // 결과 표시
                    if (data && data.list && data.list.length > 0) {
                        let resultText = `
                            <p>회사 코드: ${data.list[0].crp_cd}</p>
                            <p>회사 이름: ${data.list[0].crp_nm}</p>
                            <p>사업 연도: ${data.list[0].bsns_year}</p>
                            <p>법인세액 (천원): ${data.list[0].corp_tax_amt}</p>
                            <p>총 납부액 (천원): ${data.list[0].ttl_pay_amt}</p>
                        `;
                        taxResultDisplay.innerHTML = resultText;
                    } else {
                        taxResultDisplay.textContent = "해당하는 세무 신고 내역이 없습니다.";
                    }

                } catch (error) {
                    console.error('세무 신고액 조회 실패:', error);
                    taxResultDisplay.textContent = `세무 신고액 조회 실패: ${error.message}`;
                }
            }

            // 이벤트 리스너 등록
            buyButton.addEventListener('click', () => placeOrder('buy'));
            sellButton.addEventListener('click', () => placeOrder('sell'));
            cancelButton.addEventListener('click', cancelOrder);
            showTaxButton.addEventListener('click', getCompanyTaxReport);

            // 페이지 로드 시 계좌 정보, 잔고, 신규 상장 기업 정보 및 실시간 주가 조회
            window.onload = async () => {
                if (accountNumberInput.value) {
                    await getAccountBalance();
                    await getStockHoldings();
                }
                await getNewListings();
                getRealtimeStockPrice(); // 최초 1회 호출

                // 5초마다 실시간 주가 갱신 (실제로는 Web Socket을 사용해야 함)
                setInterval(getRealtimeStockPrice, 5000);
            };
        </script>
    </body>
    </html>
    반응형
    반응형
    SMALL

    한국투자증권 API를 활용하여 자동매매 프로그램을 HTML 형식으로 만드는 것은 조금 복잡한 작업입니다. HTML은 주로 웹 페이지의 구조와 콘텐츠를 표시하는 데 사용되며, 자동매매와 같은 논리적 처리는 자바스크립트 및 서버 측 언어(예: Python, Node.js 등)를 통해 수행됩니다. 여기서는 기본적인 HTML 구조와 함께 자바스크립트를 사용하여 간단한 자동매매 프로그램의 구조를 설명해 드리겠습니다. 기본적인 HTML 및 JavaScript 구조: 아래 예시는 자바스크립트를 사용하여 한국투자증권 API와 통신하고, 간단한 자동매매 논리를 구현하는 방법을 보여줍니다. 실제 API 호출을 위해서는 인증 정보와 API 문서에 따른 정확한 엔드포인트 및 파라미터가 필요합니다. Copy

     

     

    한국투자증권 자동매매 프로그램

    상태: 대기 중

    설명: HTML 구조: HTML 문서는 기본적으로 페이지의 구조를 정의합니다. h1 태그는 페이지 제목을, div 태그는 현재 상태를 표시하는 데 사용됩니다. JavaScript: startAutoTrading 함수는 자동매매를 시작하는 데 사용됩니다. fetch 메서드는 API 엔드포인트에 요청을 보내는 데 사용됩니다. 이 예시에서는 매수 주문을 보내는 방법을 보여줍니다. 요청에는 headers에 인증 토큰이 포함되어야 하며, 실제로는 한국투자증권 API 문서에 따라 정확한 엔드포인트와 파라미터를 사용해야 합니다. 이벤트 리스너: button 태그의 클릭 이벤트를 통해 startAutoTrading 함수가 실행됩니다. 이 예시는 기본적인 구조를 보여줄 뿐이며, 실제 자동매매 시스템을 구현하려면 더 많은 고려 사항이 필요합니다. 예를 들어, 시장 데이터 수집, 실시간 업데이트, 위험 관리, 오류 처리 등이 포함될 수 있습니다. 또한, 한국투자증권의 API 문서를 참고하여 정확한 요청 형식을 확인해야 합니다. Claude 3.5 Sonnet 한국투자증권 API를 활용한 자동매매 웹 프로그램을 만들어보겠습니다. HTML과 JavaScript를 사용하여 기본적인 구조를 구현하겠습니다. Copy

     

     

    한국투자증권 자동매매 시스템

    계좌 정보

    자동매매 설정

    거래 내역

    시간 종목 거래유형 수량 가격

    주요 기능 설명: 계정 연결 API Key와 Secret Key를 입력받아 한국투자증권 API에 연결 보안을 위해 Secret Key는 password 타입으로 마스킹 처리 자동매매 설정 종목코드와 거래 수량을 입력받아 자동매매 실행 실시간 시세 모니터링 및 매매 조건 설정 가능 거래 내역 관리 실행된 모든 거래를 테이블 형태로 표시 시간, 종목, 거래유형, 수량, 가격 정보 포함 스타일링 반응형 디자인으로 다양한 화면 크기 지원 직관적인 UI/UX 구현 실제 구현 시 추가해야 할 사항: 한국투자증권 API 연동 Copy// API 연동 예시 코드 const KIS_API = { baseUrl: 'https://openapi.koreainvestment.com:9443', async connect(apiKey, secretKey) { // API 연결 구현 }, async getPrice(stockCode) { // 현재가 조회 구현 }, async order(stockCode, amount, price, type) { // 주문 실행 구현 } }; 웹소켓 연결을 통한 실시간 시세 처리 에러 처리 및 로깅 시스템 보안 기능 강화 거래 전략 설정 기능 이 코드는 기본적인 구조만 제공하며, 실제 운영을 위해서는 한국투자증권의 API 규격에 맞춰 추가적인 개발이 필요합니다. Gemini 1.5 Pro 죄송합니다. HTML 형식으로 한국투자증권 API를 사용하는 자동매매 프로그램을 직접 만들어 드릴 수는 없습니다. 저는 코드를 직접 실행하거나 외부 시스템과 상호 작용할 수 없기 때문입니다. 또한, API 키와 같은 중요한 정보를 저에게 공유해서는 안 됩니다. 하지만 자동매매 프로그램의 HTML 구조를 구성하는 데 도움이 되는 몇 가지 팁과 샘플 코드를 제공할 수 있습니다. 이를 바탕으로 실제 API 연동 및 기능 구현은 직접 개발하셔야 합니다. HTML 구조 예시: Copy

     

     

    자동매매 프로그램

    계좌 정보

    계좌번호:

    잔고:

    매매 설정





    주문 결과

     

    설명: 위 코드는 기본적인 HTML 구조를 보여줍니다. 계좌 정보, 매매 설정, 주문 결과를 표시하는 영역으로 구성되어 있습니다. script.js 파일에는 실제 API 호출 및 주문 실행 로직을 JavaScript로 구현해야 합니다. 한국투자증권 API 문서를 참고하여 API 호출 방법, 필요한 파라미터, 응답 형식 등을 확인하십시오. API 키와 같은 중요한 정보는 안전하게 관리하고, 절대로 외부에 노출되지 않도록 주의해야 합니다. 추가적으로 고려해야 할 사항: API 사용 권한: 한국투자증권에서 제공하는 API 사용 권한을 획득해야 합니다. 인증: API 호출 시 필요한 인증 절차를 구현해야 합니다. 오류 처리: API 호출 실패, 네트워크 오류 등 다양한 오류 상황에 대한 처리 로직을 구현해야 합니다. 보안: API 키와 같은 중요한 정보는 안전하게 저장하고 관리해야 합니다. 주의: 저는 금융 투자에 대한 전문적인 조언을 제공할 수 없습니다. 투자 결정은 본인의 판단과 책임하에 이루어져야 합니다. 이 샘플 코드와 설명이 자동매매 프로그램 개발에 도움이 되기를 바랍니다. 더 궁금한 사항이 있으면 언제든지 질문해주세요. 하지만 API 연동 및 실제 구현은 직접 진행하셔야 한다는 점을 다시 한번 강조합니다. Reflection 모델 응답 분석: 첫 번째 응답의 분석: 강점: HTML과 JavaScript의 기본 구조를 명확하게 설명 API 호출의 기본적인 구조를 제시 코드의 각 부분에 대한 상세한 설명 제공 약점: 실제 한국투자증권 API의 구체적인 구현 부분이 부족 에러 처리가 기본적인 수준에 그침 두 번째 응답의 분석: 강점: 더 완성도 높은 UI/UX 구현 제공 CSS 스타일링이 포함된 상세한 코드 거래 내역 관리 기능 포함 실제 구현 시 고려사항을 상세히 제시 약점: API 연동 부분이 예시 수준에 그침 세 번째 응답의 분석: 강점: 보안 관련 주의사항을 명확히 제시 실제 구현 시 고려사항을 현실적으로 설명 API 사용 권한 등 중요 사항 강조 약점: 코드 구현이 기본적인 수준에 그침 실제 기능 구현 부분이 제한적 종합적 평가: 세 응답 모두 HTML 기반의 자동매매 프로그램 구현에 대한 기본적인 접근 방식을 제시 두 번째 응답이 가장 완성도 높은 UI/UX 구현을 제공 세 번째 응답이 보안과 실제 구현 시 고려사항을 가장 현실적으로 제시 모든 응답이 실제 한국투자증권 API 연동 부분에서는 제한적인 정보를 제공 한국투자증권 API 활용 자동매매 프로그램 구현 Copy

     

     

    계정 설정

    주문 설정

     

    거래 내역

    시간 종목 유형 수량 가격 상태

     

    주요 기능 설명: 계정 설정 및 API 연동 API Key와 Secret Key를 통한 인증 토큰 기반 인증 시스템 구현 보안을 위한 키 관리 주문 처리 시스템 매수/매도 주문 실행 실시간 주문 상태 확인 에러 처리 및 예외 상황 관리 거래 내역 관리 실시간 거래 내역 업데이트 거래 상태 모니터링 히스토리 데이터 관리 구현 시 주의사항: 보안 API 키는 서버 측에서 안전하게 관리 HTTPS 통신 필수 중요 정보 암호화 처리 에러 처리 네트워크 오류 대응 API 호출 실패 처리 사용자 입력 검증 성능 최적화 실시간 데이터 처리 최적화 메모리 사용 관리 네트워크 요청 최적화 이 코드는 기본적인 구조만 제공하며, 실제 운영을 위해서는 한국투자증권의 API 문서를 참고하여 추가적인 개발이 필요합니다. 키움증권사의 주식 상장및주식종목을 분류별로정리해서 표형식으로 만들어저링크 클릭시 자세한종목을 을 알수 있도록 정리해서 표형식으로 만들어 조 Mixture-of-Agents GPT-4o 키움증권사의 주식 상장 및 주식 종목을 분류별로 정리하여 표 형식으로 만들고, 링크 클릭 시 자세한 종목 정보를 알 수 있도록 HTML로 구조를 설계할 수 있습니다. 아래는 이러한 요구사항을 충족하는 HTML 표의 예시입니다. Copy

     

     

    키움증권 주식 종목 분류

    분류 종목명 상세 정보
    IT 삼성전자 자세히 보기
    자동차 현대자동차 자세히 보기
    바이오 셀트리온 자세히 보기
    금융 KB금융 자세히 보기

    구조 설명: HTML 표 구조: 표의 각 행은 특정 주식 종목을 나타냅니다. 각 열은 분류, 종목명, 상세 정보 링크를 포함합니다. 링크 구성: 각 종목명에 대한 링크가 제공되어 있으며, 자세히 보기를 클릭하면 해당 종목의 추가 정보를 제공하는 페이지로 이동합니다. 링크 URL은 예시로 작성된 것이며, 실제 운영 시에는 정확한 정보 페이지 URL로 변경해야 합니다. 스타일링: CSS를 사용하여 표의 스타일을 지정했습니다. 보다 가독성 있는 디자인을 위해 색상과 배경색을 조정했습니다. 링크의 기본 스타일을 지정하여 사용자가 마우스를 올렸을 때 스타일 변경을 통해 인터랙션을 제공합니다. 이 HTML 예시는 기본적인 구조와 스타일을 제공하며, 실제 사용 시에는 각 종목에 대한 구체적인 링크와 정보를 업데이트해야 합니다. Claude 3.5 Sonnet 키움증권 주식 종목 분류 테이블 Copy

     

     

    키움증권 주식종목 분류표

    KOSPI 시장
    업종분류 종목수 시가총액(억원) 상세정보
    전기전자 85 1,258,400 상세보기
    화학 72 892,300 상세보기
    금융업 65 785,600 상세보기
    운수장비 58 652,400 상세보기


    KOSDAQ 시장
    업종분류 종목수 시가총액(억원) 상세정보
    IT소프트웨어 95 425,600 상세보기
    바이오 82 385,200 상세보기
    반도체 45 298,400 상세보기


    테마별 분류
    테마명 종목수 등락률 상세정보
    2차전지 45 +2.8% 상세보기
    메타버스 38 +1.5% 상세보기
    수소경제 32 +0.9% 상세보기
    ${category} 상세정보

    ${category} 종목 상세정보

    ${(details[category] || []).map(item => ` `).join('')}
    종목코드 종목명 현재가 등락률
    ${item.code} ${item.name} ${item.price} ${item.change}
    `); }

    주요 기능 설명: 시장별 분류 KOSPI 시장 KOSDAQ 시장 테마별 분류 표시 정보 업종/테마명 종목 수 시가총액 등락률 상세정보 기능 팝업창으로 상세 종목 정보 표시 종목코드, 종목명, 현재가, 등락률 등 표시 실시간 데이터 연동 가능 구조 사용 시 주의사항: 실제 구현 시에는 키움증권 API나 데이터베이스와 연동하여 실시간 데이터를 표시해야 합니다. 상세정보 팝업의 데이터는 예시이며, 실제 데이터로 교체해야 합니다. 보안과 성능을 고려한 추가적인 개발이 필요합니다. 이 코드는 기본 구조만 제공하며, 실제 운영을 위해서는 키움증권의 API를 연동하여 실시간 데이터를 표시하도록 수정해야 합니다. Gemini 1.5 Pro 키움증권 API를 이용하여 모든 상장 주식 종목을 실시간으로 가져와 분류별로 정리하고, 링크를 통해 상세 정보를 확인할 수 있도록 하는 HTML 표를 제작하는 것은 현 단계에서 제 능력 밖입니다. 저는 웹페이지를 실시간으로 생성하거나 외부 링크를 만들 수 없습니다. 하지만, 키움증권에서 제공하는 Open API를 이용하여 주식 정보를 가져오고, 이를 표 형태로 정리하는 방법에 대한 기본적인 HTML 구조와 JavaScript 코드 예시를 제공할 수 있습니다. 이 코드는 실제 API 연동 및 데이터 처리는 포함하지 않으며, API 사용 방법은 키움증권 Open API 문서를 참조해야 합니다. Copy

     

     

    키움증권 주식 종목 분류

    분류 종목 코드 종목명 상세 정보

    코드 설명: HTML 표 구조를 생성하고, JavaScript를 통해 동적으로 데이터를 추가합니다. fetch 함수를 사용하여 API에서 주식 정보를 가져오는 예시를 보여줍니다. (실제 API 연동은 키움증권 Open API 문서 참조) API에서 받은 데이터를 반복 처리하여 표의 행을 생성합니다. 상세 정보 링크는 예시이며, 실제 API 및 데이터 구조에 맞춰 수정해야 합니다. 추가적으로 고려할 사항: API 키 관리: API 키는 보안상 중요하므로 안전하게 관리해야 합니다. 에러 처리: API 호출 실패 등의 에러 상황에 대한 처리 로직을 추가해야 합니다. 데이터 업데이트: 실시간 데이터를 표시하려면 주기적으로 API를 호출하여 데이터를 업데이트해야 합니다. 사용자 인터페이스: 표시되는 정보, 정렬, 검색 등 사용자 인터페이스를 개선할 수 있습니다. 이 샘플 코드와 설명이 키움증권 API를 활용한 주식 정보 표시 기능 개발에 도움이 되기를 바랍니다. 더 궁금한 점이 있으면 알려주세요. Reflection 모델 응답 분석: 첫 번째 응답: 기본적인 HTML 표 구조와 스타일링 제공 단순한 구조로 이해하기 쉬움 약점: 실제 데이터와 분류가 제한적이며, 상세 기능이 부족함 두 번째 응답: 가장 포괄적이고 상세한 구현 제공 KOSPI, KOSDAQ, 테마별 분류 등 체계적인 구조 팝업창을 통한 상세정보 표시 기능 구현 JavaScript를 통한 동적 데이터 처리 강점: 실제 운영에 필요한 대부분의 기능 포함 세 번째 응답: API 연동에 대한 실질적인 구현 방법 제시 보안 및 에러 처리에 대한 고려사항 포함 강점: 실제 개발 시 고려해야 할 기술적 측면 강조 종합 분석: 두 번째 응답이 가장 완성도가 높으며, 실제 사용 가능한 구조 제공 세 번째 응답의 API 연동 관련 고려사항은 매우 중요 모든 응답이 기본적인 HTML/CSS/JavaScript 구조를 공유 Copy

     

     

    KOSPI 시장

    업종분류 종목수 시가총액(억원) 등락률 상세정보

    KOSDAQ 시장

    업종분류 종목수 시가총액(억원) 등락률 상세정보

    테마별 분류

    테마명 종목수 등락률 상세정보

    주요 기능 및 특징: 시장별 분류 KOSPI, KOSDAQ, 테마별 구분 각 섹션별 독립적인 테이블 구조 반응형 디자인으로 모바일 지원 데이터 표시 업종별 종목 수, 시가총액, 등락률 표시 상세정보 모달창 구현 실시간 데이터 업데이트 지원 보안 및 에러 처리 API 키 보안 관리 데이터 로드 실패 시 에러 처리 사용자 입력 검증 사용자 경험 직관적인 인터페이스 모달창을 통한 상세정보 표시 반응형 디자인으로 다양한 디바이스 지원 이 구현은 실제 운영을 위해 키움증권 API 연동 및 추가적인 보안 설정이 필요합니다.

    반응형

    '정보' 카테고리의 다른 글

    Python과 Selenium을 이용한 파일 자동 업로드 프로그램 1편  (0) 2025.01.27
    외국인근로자채용관련  (0) 2025.01.27
    주식거래매매  (1) 2025.01.20
    주식거래매매  (0) 2025.01.17
    사업계획서작성프로그램  (0) 2025.01.17
    반응형
    SMALL

     

    자동매매 프로그램

    실시간 주식 정보

    현재 가격: 0

    거래량: 0

     

     

     

     

     

    <!DOCTYPE html>
    <html lang="ko">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>자동매매 프로그램</title>
      <style>
          body {
              font-family: Arial, sans-serif;
              margin: 20px;
              padding: 20px;
              border: 1px solid #ccc;
              border-radius: 5px;
          }
          h1 {
              text-align: center;
          }
          #stockInfo {
              margin-top: 20px;
          }
          .button {
              padding: 10px 15px;
              margin: 5px;
              border: none;
              border-radius: 5px;
              cursor: pointer;
          }
          .buy {
              background-color: #4CAF50;
              color: white;
          }
          .sell {
              background-color: #f44336;
              color: white;
          }
      </style>
    </head>
    <body>
      <h1>자동매매 프로그램</h1>
      <div>
          <label for="stockSymbol">주식 종목 입력:</label>
          <input type="text" id="stockSymbol" placeholder="예: AAPL">
          <button class="button" onclick="getStockInfo()">정보 조회</button>
      </div>
      <div id="stockInfo">
          <h2>실시간 주식 정보</h2>
          <p id="currentPrice">현재 가격: <span id="price">0</span> 원</p>
          <p id="stockVolume">거래량: <span id="volume">0</span></p>
      </div>
      <button class="button buy" onclick="buyStock()">매수</button>
      <button class="button sell" onclick="sellStock()">매도</button>

      <script>
          // 여기에 한국증권 API 호출 및 자동매매 로직을 추가하세요.
          let currentSymbol = '';

          function getStockInfo() {
              const symbol = document.getElementById('stockSymbol').value;
              currentSymbol = symbol; // 현재 종목 저장

              // API를 통해 현재 주식 정보를 가져오는 코드
              // 예시: fetch(`API_URL?symbol=${symbol}`)
              // .then(response => response.json())
              // .then(data => {
              //     document.getElementById('price').innerText = data.price;
              //     document.getElementById('volume').innerText = data.volume;
              // });
              alert(`${symbol}의 정보를 조회합니다.`); // 실제 API 호출 부분 대체
          }

          function buyStock() {
              if (!currentSymbol) {
                  alert('주식 종목을 먼저 입력하세요.');
                  return;
              }
              // 매수 로직을 여기에 추가하세요.
              alert(`${currentSymbol} 매수 주문이 실행되었습니다.`);
          }

          function sellStock() {
              if (!currentSymbol) {
                  alert('주식 종목을 먼저 입력하세요.');
                  return;
              }
              // 매도 로직을 여기에 추가하세요.
              alert(`${currentSymbol} 매도 주문이 실행되었습니다.`);
          }

          // 주식 정보를 주기적으로 업데이트
          // setInterval(updateStockInfo, 5000); // 5초마다 업데이트
      </script>
    </body>
    </html>

     

     

     

     

     

    매매프로그램정보 html  형식으로  복사 해서 사용하시면 되여 

     

    반응형
    반응형
    SMALL

    아래는 AI 기반 자동 트레이딩 봇을 위한 Python 코드 예제입니다. 이 코드는 머신러닝을 사용하여 주식 가격을 예측하고, 예측에 따라 거래를 실행합니다.



    # AI 자동 트레이딩 봇: 예제 코드

    import pandas as pd

    import numpy as np

    from sklearn.ensemble import RandomForestRegressor

    from sklearn.model_selection import train_test_split

    from sklearn.metrics import mean_squared_error

    import yfinance as yf

    import alpaca_trade_api as tradeapi  # 암호화폐 거래를 위한 ccxt로 대체 가능

     

     

    # Step 1: 데이터 수집

    def get_stock_data(ticker, start_date, end_date):

        """야후 금융에서 주식 데이터를 가져옵니다."""

        data = yf.download(ticker, start=start_date, end=end_date)

        data['Returns'] = data['Adj Close'].pct_change()

        data['Target'] = data['Adj Close'].shift(-1)  # 다음 날 종가를 예측

        data = data.dropna()

        return data

     

    # Step 2: 피처 엔지니어링

    def create_features(data):

        """모델에 사용할 피처를 생성합니다."""

        data['SMA_10'] = data['Adj Close'].rolling(window=10).mean()

        data['SMA_50'] = data['Adj Close'].rolling(window=50).mean()

        data['Volatility'] = data['Returns'].rolling(window=10).std()

        features = ['SMA_10', 'SMA_50', 'Volatility', 'Returns']

        return data[features], data['Target']

     

    # Step 3: 머신러닝 모델

    def train_model(X, y):

        """주식 가격을 예측하는 머신러닝 모델을 학습시킵니다."""

        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

        model = RandomForestRegressor(n_estimators=100, random_state=42)

        model.fit(X_train, y_train)

        predictions = model.predict(X_test)

        error = np.sqrt(mean_squared_error(y_test, predictions))

        print(f"모델 RMSE(평균제곱근오차): {error:.2f}")

        return model

     

    # Step 4: 거래 로직

    def execute_trade(api, ticker, prediction, threshold=0.01):

        """예측에 따라 거래를 실행합니다."""

        current_price = float(api.get_last_trade(ticker).price)

        if prediction > current_price * (1 + threshold):

            print(f"{ticker} 구매 중: 현재 가격 {current_price}")

            api.submit_order(symbol=ticker, qty=1, side='buy', type='market', time_in_force='gtc')

        elif prediction < current_price * (1 - threshold):

            print(f"{ticker} 판매 중: 현재 가격 {current_price}")

            api.submit_order(symbol=ticker, qty=1, side='sell', type='market', time_in_force='gtc')

     

    # Step 5: 브로커 API 통합

    def main():

        # Alpaca API 설정 (여기에 본인의 API 키 입력)

        api = tradeapi.REST('YOUR_ALPACA_API_KEY', 'YOUR_ALPACA_SECRET_KEY', 'https://paper-api.alpaca.markets')

        

        # 예제: AAPL 주식 거래

        ticker = 'AAPL'

        start_date = '2020-01-01'

        end_date = '2023-01-01'

     

        # 데이터 수집 및 처리

        data = get_stock_data(ticker, start_date, end_date)

        X, y = create_features(data)

     

        # 모델 학습

        model = train_model(X, y)

     

        # 다음 날의 가격 예측

        latest_data = X.iloc[-1].values.reshape(1, -1)

        prediction = model.predict(latest_data)[0]

        print(f"{ticker}의 예측 가격: {prediction:.2f}")

     

        # 거래 실행

        execute_trade(api, ticker, prediction)

     

    if __name__ == "__main__":

        main()




     

    코드의 주요 구성 요소:

    1. 데이터 수집
    2. 모델 학습
    3. 거래 로직
    4. API 통합

    추가 주의 사항:

    • 리스크 관리: 손절매(stop-loss)와 목표 수익선(take-profit)을 반드시 설정하세요.
    • 테스트: 실제 환경에 배포하기 전에 백테스트와 모의 거래를 철저히 진행하세요.
    • 규제 준수: 해당 지역의 거래 규정을 반드시 준수하세요.
    • 확장 가능성: 감정 분석, 뉴스 스크래핑, LSTM과 같은 고급 AI 모델을 추가하여 성능을 개선할 수 있습니다.


    반응형

    + Recent posts