답변완료
하루에 한 종목만 거래할수 있게 자바 부탁해요
하루에 한 종목만 거래할수 있게 자바 수정부탁해요 건강하세요
var timer120 = 120; // 2분
var 매수금 = 19000000;
var 손절 = 0.89;
var 익절 = 1.05;
var OrderList = [];
var MKList = [];
var req;
function Main_OnStart()
{
//1번 타이머, 2분
Main.SetTimer(1, timer120*1000);
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
//스팟 시작시 잔고평가금액
V1 = Account1.GetBalanceETCinfo(100);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1 && HHMMSS >= 90000 && HHMMSS < 113000)
{
//종목검색 수행
Main.ReqPowerSearch("단타테스트2")
}
if (nEventID == 1)
{
//계좌보유종수
var num = Account1.GetTheNumberOfBalances();
//9시~11시 15분 사이
if (HHMMSS >= 090000 && HHMMSS < 113000)
{
//보유종목이 1개 이상
if (num >= 1)
{
//계좌평가금액이 스팟시작시 평가금액대비 5% 이상이면 전종목 전량매도
if (Account1.GetBalanceETCinfo(100) >= V1*1.05)
{
//1번 타이머 종료
Main.KillTimer(1);
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 5%수익이거나 5% 손실이면 시장가 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
else //아니면 개별종목 5%익절, -5%손절 체크
{
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 5%수익이거나 -11% 손실이면 시장가 매도
if (Account1.Balance.count > 0 &&
(Account1.Balance.current >= Account1.Balance.avgUnitCost*1.05 ||
Account1.Balance.current <= Account1.Balance.avgUnitCost*0.89))
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
}
//14시 15분이후이면 모든 종목 전량 수익에 상관없이 매도
if (HHMMSS >= 141500)
{
//1번 타이머 종료
Main.KillTimer(1);
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 5%수익이거나 5% 손실이면 시장가 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
if (nEventID == 2)
{
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
OrderList = [];
if (nCount >= 1)
{
if (MKList.length == 0)
{
OrderList = aItemList;
}
else
{
for (var a = 0; a < nCount; a++)
{
var Add = true;
for (var b = 0; b < MKList.length; b++)
{
if (aItemList[a] == MKList[b].code)
{
Add = false;
}
}
if (Add == true && !IsStockInAccount(aItemList[a]))
{
OrderList.push(aItemList[a]);
}
}
}
}
if (OrderList.length == 0)
{
Main.SetTimer(1, timer120*1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OrderList[req])
{
MKList.push(MarketData);
// 계좌에 같은 종목이 있는지 확인
if (!IsStockInAccount(MarketData.code)) {
// 계좌에 없는 경우에만 매수
//Account1.OrderBuy(MarketData.code,1,0,1); 밑에 한번에 17000000 시장가에 매수
Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1);
//Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(4)),MarketData.Ask(1),0);
//지정가로 주문하고자 하시면 주문함수 내용을 위와 같이 변경하시면 됩니다.
Main.MessageList(MarketData.code + " 주식을 매수합니다.");
} else {
Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");
}
req = req+1;
if (req < OrderList.length)
{
var aa = Main.ReqMarketData(OrderList[req]);
if (aa == -1)
{
Main.SetTimer(2, 15000);
}
}
else
{
Main.SetTimer(1, timer120*1000);
}
}
}
function IsStockInAccount(stockCode) {
// 계좌에 해당 종목이 있는지 확인하는 함수
var numberOfBalances = Account1.GetTheNumberOfBalances();
for (var i = 0; i < numberOfBalances; i++) {
Account1.SetBalance(i);
if (stockCode == Account1.Balance.code) {
return true; // 계좌에 같은 종목이 있으면 true 반환
}
}
return false; // 계좌에 같은 종목이 없으면 false 반환
}
2024-08-26
517
글번호 226098
답변완료
취소 접수 확인을 위한 프라퍼티는 어떤것일까요?
주문을 취소한 것도, 주문접수 함수가 반응하네요.
Main_OnOrderResponse(OrderResponse)의 OrderResponse에서
원주문, 주문수정, 주문취소 각각을 구분하려면 어떤 프라퍼티를 이용해야 할까요?
그리고, STOP주문이나, 외부에서 한 주문의 경우를 구분할 수 있는지요?
있다면 어떻게 구분해야하는지 알려주시기 바랍니다.
2024-08-23
436
글번호 226086
답변완료
외가격 옵션 매수
1. 검토사항 (아래 수식)
진입조건(등가격의 합과 차)을 만족했을 때
등가콜과 등가풋 중 절대값이 작은 쪽의 등가격 옵션을 매수하는 수식을 작성해보았습니다.
코딩내용이 맞는지 봐주셨으면 합니다.
2. 요청수식
검토요청한 수식과 진입조건은 똑같습니다. 다만 매수는 등가격이 아니고 1행사가 아래인 외가격1 입니다.
등가콜과 등가풋 중 절대값이 작은 쪽의 외가격1 옵션을 매수합니다.
(판단은 등가격의 합과 차로, 액션은 외가격으로)
익절과 손절과 시간청산은 외가격1옵션으로 처리될 수 있도록 부탁드립니다.
포지션 청산은 다른 전략 미결제가 있으니 case by case 청산입니다.
****************************************************************************
var ID, num;
var Entry, Code;
var Xvol;
var HasExited; // 청산 후 재진입을 방지하는 변수
function Main_OnStart() {
Main.MessageList("Start");
Main.SetTimer(1, 5000); // 기존 타이머 설정 (5초 간격)
Main.SetTimer(2, 1000); // 15시 청산을 위한 타이머 설정 (1초 간격)
Entry = 0; // 초기 Entry 값 설정
HasExited = false; // 초기 재진입 가능 상태
}
function Main_OnTimer(nEventID) {
var d = new Date();
var HHMMSS = d.getHours() * 10000 + d.getMinutes() * 100 + d.getSeconds();
if (nEventID == 1) {
if (!HasExited) { // 재진입 방지 조건 추가
if (HHMMSS >= 84500) {
var CallPrice = Option1.GetCurrent(0, 0);
var PutPrice = Option1.GetCurrent(1, 0);
var CallAsk = Option1.GetAsk(Option1.GetATMCallRecent(0), 5);
var PutAsk = Option1.GetAsk(Option1.GetATMPutRecent(0), 5);
var absCall = Math.abs(CallPrice);
var absPut = Math.abs(PutPrice);
var sum = absCall + absPut;
var diff = Math.abs(absCall - absPut);
// 진입 조건
if (Entry == 0 && sum <= 5.00 && diff <= 2.50) {
if (absCall <= absPut) {
Entry = CallPrice;
Code = Option1.GetATMCallRecent(0);
ID = Account1.OrderBuy(Code, 1, CallAsk, 0);
Xvol = 1;
} else {
Entry = PutPrice;
Code = Option1.GetATMPutRecent(0);
ID = Account1.OrderBuy(Code, 1, PutAsk, 0);
Xvol = 1;
}
}
// 익절/손절 조건
if (Entry > 0 && Xvol > 0) {
var currentPrice = Option1.GetCurrent(Code);
if (currentPrice >= Entry + 0.50 || currentPrice <= Entry - 0.50) {
closePosition();
// 청산 후 매수 재진입 방지
HasExited = true; // 청산 후 재진입 방지
Main.KillTimer(1); // 타이머 1 종료
}
}
}
}
}
if (nEventID == 2) {
// 15시 청산 조건
if (HHMMSS >= 151000 && HHMMSS < 151500) { // 15시 15분에 청산
closePosition();
Main.KillTimer(2); // 타이머 2 종료
}
}
}
function closePosition() {
// 포지션 청산
if (Xvol > 0) {
if (Code) {
Account1.OrderSell(Code, Xvol, Option1.GetBid(Code, 5), 0);
}
}
Entry = 0; // Entry 값 초기화
Code = null; // Code 초기화
Xvol = 0; // 수량 초기화
// HasExited = true; // 청산 후 재진입 방지
}
function Main_OnOrderResponse(OrderResponse) {
// 주문 응답 처리
if (OrderResponse.orderID == ID) {
num = OrderResponse.orderNum;
}
}
2024-08-22
542
글번호 226084
답변완료
문의드립니다
안녕하세요 계좌잔고 에 있는데 중복매수되는걸 어떻게 해야하는지 문의드립니다
계좌에 잇다면 pass해야하는데 그걸 어떻게 넣어야 하는지 부탁드립니다
var 진입수량 = 2;
var DH, DH1, DL, DL1;
var BEID, BENM, SEID, SENM;
var CC, C1;
var T;
function Main_OnStart() {
Main.MessageList("Start");
T = 0;
}
function Main_OnU*dateMarket(sItemCode, lU*dateID)
{
if (lU*dateID == 20001) {
C1 = CC;
CC = MarketData1.current;
Main.MessageList("Main_OnU*dateMarket", MarketData1.current);
// 시초가 + 10틱 터치
if (T <= 0 &&
C1 > 0 &&
C1 < MarketData1.open + MarketData1.GetTickSize() * 10 &&
CC >= MarketData1.open + MarketData1.GetTickSize() * 10) {
T = 1;
BEID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 진입수량, MarketData1.current, 2);
Main.MessageList("매수 진입 주문: " + MarketData1.current,+ MarkerDatal.open);
}
// 매수 후 손절, 익절, 미체결 셋팅
if (T == 1)
{
// 손절 셋팅
if (MarketData1.current <= MarketData1.open - MarketData1.GetTickSize() * 8) {
청산수량처리(BENM, 진입수량, "매수 포지션 손절");
T = 0; // 초기화
}
// 익절 셋팅
else if (MarketData1.current >= MarketData1.open + MarketData1.GetTickSize() * 130) {
청산수량처리(BENM, 진입수량, "매수 포지션 익절");
T = 0; // 초기화
}
}
// 시초가 - 10틱 터치
if (T >= 0 &&
C1 > MarketData1.open - MarketData1.GetTickSize() * 10 &&
CC <= MarketData1.open - MarketData1.GetTickSize() * 10) {
T = -1;
SEID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 진입수량, MarketData1.current, 2);
Main.MessageList("매도 진입 주문: " + MarketData1.current,+ MarkerDatal.open);
}
// 매도 후 손절, 익절, 미체결 셋팅
if (T == -1) {
// 손절 셋팅
if (MarketData1.current >= MarketData1.open + MarketData1.GetTickSize() * 8) {
청산수량처리(SENM, 진입수량, "매도 포지션 손절");
T = 0; // 초기화
}
// 익절 셋팅
else if (MarketData1.current <= MarketData1.open - MarketData1.GetTickSize() * 130) {
청산수량처리(SENM, 진입수량, "매도 포지션 익절");
T = 0; // 초기화
}
}
}
}
function Main_OnOrderResponse(OrderResponse) {
if (OrderResponse.orderID == BEID) {
BENM = OrderResponse.orderNum;
}
if (OrderResponse.orderID == SEID) {
SENM = OrderResponse.orderNum;
}
}
function 청산수량처리(orderNum, 수량, message) {
Account1.SetUnfillOrderNumber(orderNum);
var 청산수량 = 수량 - Account1.Unfill.count;
if (Account1.Unfill.count > 0) {
Account1.OrderCancel(orderNum);
}
if (청산수량 > 0) {
if (T == 1) {
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 청산수량, MarketData1.current, 2);
Main.MessageList("매수 포지션 청산: " + MarketData1.current + " (" + message + ")");
} else if (T == -1) {
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 청산수량, MarketData1.current, 2);
Main.MessageList("매도 포지션 청산: " + MarketData1.current + " (" + message + ")");
}
}
}
이렇게 되있는데 어떤땐 정상적으로 2계약체결되고 어떤땐 4계약이 체결됩니다
2024-08-16
503
글번호 226083