안녕하세요.
아래수식을 보아 주시고 제가 이 수식을 오늘 당장 적용해야하므로 가능하시다면 정말 빠르게 답변을 부탁드립니다.
//계좌객체 Account1
function Main_OnStart()
{
Main.SetTimer(1,2000);//5초 단위 체크
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//총수익 누적할 변수
var sumPL = 0;
var sells = 0;
var buys = 0 ;
var profits = 0 ;
var hh =0 ;
//계좌의 종목수
var num = Account1.GetTheNumberOfBalances();
//종목이 2개 이상일때만
if (num >= 1)
{
//잔고 종목 총손익 계산
for (i = 0; i < num;i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count;
sells=Account1.Balance.count;
}
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count;
buys=Account1.Balance.count;
}
}
profits= sumPL*100 - (sells + buys)*2*7.5 ;
if ( profits >hh )
{ hh = profits ;
}
Main.MessageLog(" profits"+ profits+"달러") ;
Main.MessageLog(" hh" + hh+" ") ;
Main.MessageLog(" buys"+ buys+"개") ;
Main.MessageLog(" sells"+ sells+"개") ;
//총손익이 특정값(0)보다 크면 전체 종목 청산
if ( hh > 20 && (profits < ( hh * 0.5 )) )
{
hh = 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);
}
}
}
//총손익이 순수익 트레일링 스탑으로 전체종목 청산
}
}
}
에서 profits는 비용까지 계산한 순수한 순수익입니다.
profits가 20달러 이상 된 후에 트레일링 스탑을 profits의 최고가 (즉 hh)에서 50% 떨어지면
강제청산하려고 위에서
profits= sumPL*100 - (sells + buys)*2*7.5 ;
if ( profits > hh )
{ hh = profits ;
}
처럼 구성했습니다.
종목이 2종목이상이므로 순수익으로만 트레일링 스탑을 구성하려고 했습니다.
profits가 고가hh를 오버할 때만 새로운 고가hh가 되어야 하는데요.
Main.MessageLog(" hh" + hh+" ") ; 으로 확인해보면
고가hh 값은 profits값하고 이상하게 항상 동일한 값으로 나옵니다.
수식을 목표한 트레일링스탑이 가능하도록 수정해 주시면 감사드리겠습니다.
답변 1
예스스탁
예스스탁 답변
2018-09-11 11:09:48
안녕하세요
예스스탁입니다.
작성하신 코드 아래 내용에 보시면
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//총수익 누적할 변수
var sumPL = 0;
var sells = 0;
var buys = 0 ;
var profits = 0 ;
var hh =0 ;
타이머가 동작할때마다 항상 hh변수는 0으로 초기화가 되고 있습니다.
0으로 초기화가 된 이후에 아래 내용에 의해 hh값에 할당 되므로
profits이 +이면 그값이 그대로 hh에 저장되므로 손익이 0이상에서는 항상 같습니다.
손익이 -이면 hh는 0이 됩니다.
if ( profits >hh )
{
hh = profits ;
}
지정한 초단위로 손익계산해서 최고값을 저장해야 하므로
변수의 초기화를 해당 이벤트에서 밖에서 전역으로 선언하고 사용하시면 됩니다.
var hh = 0 ;
function Main_OnStart()
{
Main.SetTimer(1,5000);//5초 단위 체크
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//총수익 누적할 변수
var sumPL = 0;
var sells = 0;
var buys = 0 ;
var profits = 0 ;
//계좌의 종목수
var num = Account1.GetTheNumberOfBalances();
//종목이 2개 이상일때만
if (num >= 1)
{
//잔고 종목 총손익 계산
for (var i = 0; i < num;i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count;
sells = Account1.Balance.count;
}
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count;
buys=Account1.Balance.count;
}
}
profits = sumPL*100 - (sells + buys)*2*7.5 ;
if (profits > hh )
{
hh = profits ;
}
Main.MessageLog(" profits"+ profits+"달러") ;
Main.MessageLog(" hh" + hh+" ") ;
Main.MessageLog(" buys"+ buys+"개") ;
Main.MessageLog(" sells"+ sells+"개") ;
//총손익이 특정값(0)보다 크면 전체 종목 청산
if ( hh > 20 && (profits < ( hh * 0.5 )) )
{
hh = 0 ;
for (var 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);
}
}
}
//총손익이 순수익 트레일링 스탑으로 전체종목 청산
}
}
}
즐거운 하루되세요
> 종호 님이 쓴 글입니다.
> 제목 : 트레일링 스탑 적용시 에러(정말 빠른 답변 부탁드립니다.)
> 안녕하세요.
아래수식을 보아 주시고 제가 이 수식을 오늘 당장 적용해야하므로 가능하시다면 정말 빠르게 답변을 부탁드립니다.
//계좌객체 Account1
function Main_OnStart()
{
Main.SetTimer(1,2000);//5초 단위 체크
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
//총수익 누적할 변수
var sumPL = 0;
var sells = 0;
var buys = 0 ;
var profits = 0 ;
var hh =0 ;
//계좌의 종목수
var num = Account1.GetTheNumberOfBalances();
//종목이 2개 이상일때만
if (num >= 1)
{
//잔고 종목 총손익 계산
for (i = 0; i < num;i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
sumPL = sumPL + (Account1.Balance.avgUnitCost - Account1.Balance.current)*Account1.Balance.count;
sells=Account1.Balance.count;
}
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
sumPL = sumPL + (Account1.Balance.current - Account1.Balance.avgUnitCost)*Account1.Balance.count;
buys=Account1.Balance.count;
}
}
profits= sumPL*100 - (sells + buys)*2*7.5 ;
if ( profits >hh )
{ hh = profits ;
}
Main.MessageLog(" profits"+ profits+"달러") ;
Main.MessageLog(" hh" + hh+" ") ;
Main.MessageLog(" buys"+ buys+"개") ;
Main.MessageLog(" sells"+ sells+"개") ;
//총손익이 특정값(0)보다 크면 전체 종목 청산
if ( hh > 20 && (profits < ( hh * 0.5 )) )
{
hh = 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);
}
}
}
//총손익이 순수익 트레일링 스탑으로 전체종목 청산
}
}
}
에서 profits는 비용까지 계산한 순수한 순수익입니다.
profits가 20달러 이상 된 후에 트레일링 스탑을 profits의 최고가 (즉 hh)에서 50% 떨어지면
강제청산하려고 위에서
profits= sumPL*100 - (sells + buys)*2*7.5 ;
if ( profits > hh )
{ hh = profits ;
}
처럼 구성했습니다.
종목이 2종목이상이므로 순수익으로만 트레일링 스탑을 구성하려고 했습니다.
profits가 고가hh를 오버할 때만 새로운 고가hh가 되어야 하는데요.
Main.MessageLog(" hh" + hh+" ") ; 으로 확인해보면
고가hh 값은 profits값하고 이상하게 항상 동일한 값으로 나옵니다.
수식을 목표한 트레일링스탑이 가능하도록 수정해 주시면 감사드리겠습니다.