커뮤니티

청산 수식 수정 요청드림

프로필 이미지
종호
2017-11-03 13:34:40
2670
글번호 224241
답변완료
아래 수식은 2계좌에서 1종목씩 거래시 합산 순수익 날때 동시 청산수식과 합산 순손실시 동시 청산 수식 입니다 그런데 합산 순수익이 날때 동시 청산이 이루어지지 않고 한 계좌만 청산이 되고 다른 계좌는 그대로 남아 있습니다. 2계좌 합산 순수익이나 순손실이 날 때 두계좌가 동시 청산 되도록 수식을 수정 요청드립니다. //계좌객체1 Account1 //계좌객체2 Account2 function Main_OnStart() { Main.SetTimer(1,5000);//5초 단위 체크 } function Main_OnTimer(nEventID) { if (nEventID == 1) { //총수익 누적할 변수 var sumPL = 0; //계좌1의 종목수 var num1 = Account1.GetTheNumberOfBalances(); //계좌2의 종목수 var num2 = Account2.GetTheNumberOfBalances(); //계좌1과 계좌2에 종목이 각 1개 이상일때만 if (num1 >= 1 && num2 >= 1) { //잔고 종목 총손익 계산 for (i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count; } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count; } } //잔고 종목 총손익 계산 for (i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { sumPL = sumPL + (Account2.Balance.avgUnitCost - Account2.Balance.current)*Account2.Balance.count; } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { sumPL = sumPL + (Account2.Balance.current - Account2.Balance.avgUnitCost)*Account2.Balance.count; } } //총손익이 특정값(0)보다 크면 전체종목 청산 if (sumPL > 0) { for (i = 0; i < num1;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } //총손익이 특정값(0)보다 작으면 전체종목 청산 if (sumPL < 0) { for (i = 0; i < num;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (i = 0; i < num;i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } } } }
답변 2
프로필 이미지

예스스탁 예스스탁 답변

2017-11-22 15:59:21

안녕하세요 예스스탁입니다. 총손익이 특정값(0)보다 크면 전체종목 청산에는 문제가 없습니다. 총손익이 특정값(0)보다 작으면 전체종목 청산하는 내용에서 for문에 종목수 변수가 num으로만 지정되어 있습니다. num1,num2로 변경하시면 됩니다. 다른 부분은 문제가 될부분이 없습니다. 테스트 결과 2계좌모두 정상주문 됩니다. //계좌객체1 Account1 //계좌객체2 Account2 function Main_OnStart() { Main.SetTimer(1,5000);//5초 단위 체크 } function Main_OnTimer(nEventID) { if (nEventID == 1) { //총수익 누적할 변수 var sumPL = 0; //계좌1의 종목수 var num1 = Account1.GetTheNumberOfBalances(); //계좌2의 종목수 var num2 = Account2.GetTheNumberOfBalances(); //계좌1과 계좌2에 종목이 각 1개 이상일때만 if (num1 >= 1 && num2 >= 1) { //잔고 종목 총손익 계산 for (var i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count; } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count; } } //잔고 종목 총손익 계산 for (var i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { sumPL = sumPL + (Account2.Balance.avgUnitCost - Account2.Balance.current)*Account2.Balance.count; } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { sumPL = sumPL + (Account2.Balance.current - Account2.Balance.avgUnitCost)*Account2.Balance.count; } } //총손익이 특정값(0)보다 크면 전체종목 청산 if (sumPL > 0) { for (var i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (var i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } //총손익이 특정값(0)보다 작으면 전체종목 청산 if (sumPL < 0) { for (var i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (var i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } } } } 즐거운 하루되세요 > 종호 님이 쓴 글입니다. > 제목 : 청산 수식 수정 요청드림 > 아래 수식은 2계좌에서 1종목씩 거래시 합산 순수익 날때 동시 청산수식과 합산 순손실시 동시 청산 수식 입니다 그런데 합산 순수익이 날때 동시 청산이 이루어지지 않고 한 계좌만 청산이 되고 다른 계좌는 그대로 남아 있습니다. 2계좌 합산 순수익이나 순손실이 날 때 두계좌가 동시 청산 되도록 수식을 수정 요청드립니다. //계좌객체1 Account1 //계좌객체2 Account2 function Main_OnStart() { Main.SetTimer(1,5000);//5초 단위 체크 } function Main_OnTimer(nEventID) { if (nEventID == 1) { //총수익 누적할 변수 var sumPL = 0; //계좌1의 종목수 var num1 = Account1.GetTheNumberOfBalances(); //계좌2의 종목수 var num2 = Account2.GetTheNumberOfBalances(); //계좌1과 계좌2에 종목이 각 1개 이상일때만 if (num1 >= 1 && num2 >= 1) { //잔고 종목 총손익 계산 for (i = 0; i < num1; i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count; } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count; } } //잔고 종목 총손익 계산 for (i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { sumPL = sumPL + (Account2.Balance.avgUnitCost - Account2.Balance.current)*Account2.Balance.count; } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { sumPL = sumPL + (Account2.Balance.current - Account2.Balance.avgUnitCost)*Account2.Balance.count; } } //총손익이 특정값(0)보다 크면 전체종목 청산 if (sumPL > 0) { for (i = 0; i < num1;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (i = 0; i < num2; i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } //총손익이 특정값(0)보다 작으면 전체종목 청산 if (sumPL < 0) { for (i = 0; i < num;i++) { Account1.SetBalanceIndex(i); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count,0,1); } if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,1); } } for (i = 0; i < num;i++) { Account2.SetBalanceIndex(i); if (Account2.Balance.count > 0 && Account2.Balance.position == 1) { Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count,0,1); } if (Account2.Balance.count > 0 && Account2.Balance.position == 2) { Account2.OrderSell(Account2.Balance.code, Account2.Balance.count,0,1); } } } } } }
프로필 이미지

종호

2017-11-29 11:18:12

언제나 큰도움 주셔서 감사합니다. 크루드오일을 수수료 포람해서 실제로 적용하고 싶습니다. 크루드오일 1틱은 10달러입니다. 수수료는 7.5달러 입니다. 1계좌에 1종목 만 있을 때가 있고 2계좌에 1종목이 더 추가 될 때가 있습니다. 수식에서 잔고 종목 총손익 sumPL 을 1계좌와 2계좌에서 매수,매도가 일어날 때 수수료를 포함하고 잔고 전체 청산할 때 수수료를 포함해서 순수 손익이 100달러 이상시 이익청산 되도록 수정을 부탁드립니다. 그리고 순수 이익청산시 잔고가 다청산되고 매매가 다시 일어 나서 잔고가 생기면 또 다시 순수이익실현이 반복될 수 있도록 부탁드립니다.