답변완료
수정부탁드려요
검색된 각 종목마다 현 잔고의 10분의 1만큼만 사고 싶은데 수정부탁드려요
function Main_OnStart()
{
//1번 타이머, 60초
Main.SetTimer(1, 2000);
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//종목검색 수행
Main.ReqPowerSearch("3")
}
}
//종목검색 완료
function Main_OnRcvItemList(aItemList, nCount)
{
//1종목 이상 검색되면
if (nCount >= 1)
{
//리스트 첫종목부터 마지막종목까지 순차적으로
//1번 타이머 동작
for (var i = 0; i < nCount; i++)
{
//잔고를 셋팅
Account1.SetBalance(aItemList[i],0);
//보유수량이 없으면
if (Account1.Balance.count < 1)
{
//매수주문
Account1.OrderBuy(aItemList[i], 3,0,1);
}
}
}
}
2024-03-12
579
글번호 225962
답변완료
매도수식 문의 드립니다.
기존에는 예스스팟 종목검색으로 매수를 하고 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]);
}
}
}
}
}
}
}
}
2024-02-28
622
글번호 225957
답변완료
[글번호 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);
}
}
}
---------------------------------------------------------------------------------
바쁘시겠지만, 수정 부탁 드립니다.
2024-02-24
549
글번호 225955