예스스탁
예스스탁 답변
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);
}
}
}
}
}
}