관리자에 의해 프로그램 사용법 QnA로 이동되었습니다
모니터 화면이 작다보니깐 전략실행차트에서 수직분할로 지표를 넣었는데 과거데이터를 확인할때 차트를 돌려 볼때 지표를 넣은 분할차트에서 똑같이 드래그를 해야 되는데 혹시 한번에 같이 옮겨지는 방법이 있을까요? 염치없지만 안되면 되게 해주시면 감사하겠습니다.
고맙습니다. 꾸벅^^
답변완료
매도수식 문의 드립니다.
기존에는 예스스팟 종목검색으로 매수를 하고 2103 TS창에서 신규편입종목 TS를 설정했는데 TS내 기능이 좀 부족해서 수식을 만들었습니다. 그런데 작동이 안돼서 수정좀 문의 드립니다.
1. 2103 TS창내 기능은 4% 수익이던 10%수익이던 제가설정한 익절 2%에서 매도를 하는데 저는 직장인이라 차트를 자주 못봐서 수익의 N%를 익절 라인으로 설정 하고 싶습니다.
2. N%를 40%설정시 4%수익일때 1.6% , 10%수익일때 4% 로 익절 라인을 설정하고 싶습니다.
3.신규종목, 기존종목 모두 N%를 설정 하고 싶습니다.
4.TS 시작 수익을 A%로 설정 하고 싶습니다.
아래는 제가 게시판 내용 찾아 가면서 작성해본 예스스팟입니다. 현재 작동을 안하는데 수정좀 부탁드릴께요. up*date는 금지어라 *처리 했습니다.
var Rcv = 0;
var Item = [];
var EP = []; // 진입가격
var HH = []; // 최고가
var lastRequestTime = 0; // 마지막 요청 시간을 추적하기 위한 변수
function Main_OnStart() {
Rcv = 0;
// 기존 보유 종목에 대한 정보 초기화 및 요청
for (var j = 0; j < Account1.Balance.count; j++) {
var sItemCode = Account1.Balance[j].code;
EP[Rcv] = Account1.Balance[j].avgUnitCost;
HH[Rcv] = Account1.Balance[j].avgUnitCost; // 초기 최고가를 진입가로 설정
Main.ReqMarketData(sItemCode, 0, 0);
}
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) {
// 잔고에 새로운 종목 편입
if (sAccntNum == Account1.number && lUp*dateID == 30001) {
// 편입된 종목의 진입가와 최고가를 구할 기초값 저장 후 종목객체 요청
Account1.SetBalance(sItemCode, 0);
if (Account1.Balance.count) {
EP[Rcv] = Account1.Balance.avgUnitCost;
HH[Rcv] = Account1.Balance.avgUnitCost; // 초기 최고가를 진입가로 설정
Main.ReqMarketData(sItemCode, 0, 0);
}
}
}
function Main_OnRcvMarketData(MarketData) {
Item[Rcv] = MarketData;
Rcv++;
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) {
var currentTime = new Date().getTime();
if (currentTime - lastRequestTime >= 5000) { // 5초가 지났는지 확인
lastRequestTime = currentTime; // 마지막 요청 시간 업데이트
processMarketUp*date(sItemCode, lUp*dateID);
} else {
setTimeout(function() {
Main_OnUp*dateMarket(sItemCode, lUp*dateID);
}, 5000 - (currentTime - lastRequestTime));
}
}
function processMarketUp*date(sItemCode, lUp*dateID) {
if (lUp*dateID == 20001) {
for (var i = 0; i < Item.length; i++) {
if (Item[i].code == sItemCode) {
// 잔고편입 이후의 최고가 계산
if (Item[i].current > HH[i]) {
HH[i] = Item[i].current;
var profitRate = (HH[i] - EP[i]) / EP[i];
if (profitRate >= 0.0382) {
var tsRate = profitRate * 0.30;
if (Item[i].current <= HH[i] * (1 - tsRate)) {
Account1.SetBalance(Item[i].code, 0);
if (Account1.Balance.count > 0) {
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Item[i].Ask(5), 0);
Main.RemoveMarketData(Item[i]);
}
}
}
}
}
}
}
}
답변완료
[글번호 1034] 관련 추가 질문
안녕하세요? 1034에서 요청하신 아래 내용으로
-----------------------------------------------------
2. 당일 매매를 원칙으로 작성을 하려고 합니다.
A. 매도 조건은 (Timer는 어떤 단위가 좋을 것 같은지요?)
손절은 -3% - 보유수량 30%, -5% - 보유수량 40%, -7% - 보유수량 전량
수익은 3% - 보유수량 30%, 5% - 보유수량 40%, 7% - 보유수량 전량
Trailing Stop 매도: 당일 고점 대비 -3% (보유수량 50%) - 스팟으로 가능 할까요?
전일 종가 이하 : 매수가 전일 종가 이상 이면 보유수량 50% 손절
- 스팟으로 가능 할까요?
B. 장종료 동시호가 전량 매도(수익,손해 나더라도)
C. 상한가 전량매도(수익에 상관없이)
-------------------------------------------------------------------------
수식을 변경 요청 드립니다.
윗글의 경우는 종목이 검색되면 function Main_OnRcvMarketData(MarketData) 함수 내에서 매수를 실행하는 경우에 대해서 작성이 되었는데,
저는 파워검색으로 검색된 종목에 확장차트 시스템식을 적용해서 나오는 매수/매도 시그날을 이용해서 매매하게 코드가 되어 있습니다. 위의 예제를 참고해서 변경해 보려고 시도해 보고 있는데, 아직 실력이 미천하여 잘 안 되고 있습니다. 변경 부탁 드립니다.
아래는 제가 사용하고 있는 코드의 function Main_OnRiseSignal(ChartEx, Signal) 부분입니다.
----------------------------------------------------------------------------------
function Main_OnRiseSignal(ChartEx, Signal)
{
var d = new Date();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//신호발생 종목에 대해 잔고셋팅
종목코드 = Main.GetOrderCode(Signal.code)
Account1.SetBalance(종목코드 ,0);
var buyable = 1; // 매수가능 종목으로 설정, 당일 매수 리스트에 있으면 아래 구문에서 0으로 설정
if (BuyList.length > 0)
{
for (var i = 0; i < Buylist.length; i++)
{
if (BuyList[i] == 종목코드)
{
buyable = 0; // 당일 매수했던 종목 재매수 금지
}
}
}
//매수신호이고 잔고가 없고, 당일 매수한 적이 없을 때 매수한다.
if (Signal.signalKind == 1 && Account1.Balance.count == 0 && buyable == 1)
{
//Account1.OrderBuy(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1);
// Account1.OrderBuy(Main.GetOrderCode(Signal.code),1,0,1);
// Account1.OrderBuy(Main.GetOrderCode(Signal.code),Math.floor(100000/ChartEx.GetClose(1,0)),0,1);
Account1.OrderBuy(종목코드, 1, 0,1); //단주 매수 1: 시장가
BuyList.push(종목코드); // 종목코드를 저장한다.
Main.MessageList(HHMMSS,"매수주문s1 : ",종목코드);
// Main.MessageLog("매수주문"); //1주종목 0현재봉 0주문가격 1시장가
}
if (Signal.signalKind == 2)
{
//전체미체결주문 갯수
var num = Account1.GetTheNumberOfUnfills();
//전체 미체결수 만큼 루프를 돌면서
for (var i = 0; i < num; i++)
{
//미체결을 하나씩 셋팅하고
Account1.SetUnfill(i);
//미체결종목이 신호종목과 같고 미체결수량이 있으면
if (Account1.Unfill.code == Main.GetOrderCode(Signal.code) && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고수량만큼만 매도
if (Account1.Balance.count > 0)
{
//Account1.OrderSell(Main.GetOrderCode(ChartEx.GetCode(1)),1,0,1);
// Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1);
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,0,1); // 1: 시장가
Main.MessageList(HHMMSS, "매도주문s2 : ",Main.GetOrderCode(Signal.code),Account1.Balance.count);
}
}
}
---------------------------------------------------------------------------------
바쁘시겠지만, 수정 부탁 드립니다.
답변완료
종목명 확인 방법 문의
ReqChartEx로 확장차트를 생성하고, 거기에 시스템을 적용한 후, 시스템에서 신호가 발생했을 때, 종목명(주식 종목명 입니다.)과 종목코드번호, 그리고 신호종류(매수와 청산) 정보를 확인하고자 합니다.
질의1)
그런데 ReqChartItem에는 code만이 있고 Signal객체에도 code만 보이는데(name은 종목명이 아니라 신호명이고), 종목의 이름을 확인하는 방법은 어떻게 하면 될까요?
질의2)
그리고, 신호종류는 파생에서는 signalKind가 4가지로 발생하지만 주식에서는 1 buy와 2 exitlong만 발생하는게 맞지요?
질의3)
ReqChartEx로 확장 챠트를 생성하고, 거기에 특정 시스템을 적용하여, 해당 시스템에서 신호가 수신할 수 있는 함수를 만들어서 거기서 신호(거기에 신호가 발생한 챠트 정보도 얻을 수 있다면 더 좋구요)가 도착했을 때 신호 정보 또는 신호 객체에서 신호명, 종목코드, 종목명, signalKind, 신호발생시각을 조회할 수 있기를 원합니다. 조회된 내용을 확인해볼 수 있도록 MessageList로 출력해보는 것 까지 코드로 샘플 작성 부탁드립니다.
질의4)
그리고, reqchartex로 생성하면 바로 만들어 지는게 아니라 OnRcvChartEx()라는데에서 뭔가를 해줘야 챠트가 제대로 생성이 되는건가요?
질의5)
그리고, ChartEx라는 객체가 생성되는 것 까지는 대충은 이해를 하는데 이걸 remove해야 하는 것이 메모리 관리상 안전할 거 같은데 이 remove 작업은 어느 단계에서 해주면 되고, 그러려면 여러 chartex객체를 어떻게 관리해야 하는 게 좋을까요?
질의6)
.push()라는 걸 어떤 것에 대해서 어떻게 쓰는 건지 메뉴얼을 찾아봐도 안나오길래, 혹시나 하고 java스크립트 문법을 찾아보니 array 변수에 대해서 .push .pop .sort .splice .shift .unshift 등을 지원하던데, 변수 선언 시 var AA = []; 와 같이 array변수로 선언된 AA와 같은 것에 대해서는 이러한 멤버함수와 같이 생긴 것을 사용할 수 있는 것인지요?
질의7)
java스크립트에 대해 잘 몰라서 그러는데, 배열을 초기화 하려면 배열변수에 'AA = []' 와 같이 해주거나 AA.length = 0 이라고 하는 방식으로 처리하면 되나요?
-------------
전화로 상세한 답변 잘 들었습니다. 감사합니다~