커뮤니티

트레일링 스탑 적용시 에러(정말 빠른 답변 부탁드립니다.)

프로필 이미지
종호
2018-08-30 15:48:55
2900
글번호 224580
답변완료
안녕하세요. 아래수식을 보아 주시고 제가 이 수식을 오늘 당장 적용해야하므로 가능하시다면 정말 빠르게 답변을 부탁드립니다. //계좌객체 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값하고 이상하게 항상 동일한 값으로 나옵니다. 수식을 목표한 트레일링스탑이 가능하도록 수정해 주시면 감사드리겠습니다.