아래 수식은 수동으로 2가지 종목을 각각 매매후에 자리를 뜨고 자러 가는 사이에
본절 청산과 수익 추적 청산 하기 위한 수식입니다.
에러가 있는지 검토 요청드립니다.
수식이 문제가 없더라도 실전에서 문제가 없겠습니까?
GetPositionOpenPL 과 GetpositionQuantity 은
호출을 얼마 시간단위로 호출하는 것인지요?
분봉이 완성될 때마다 호출되는 것인지요?
GetPositionOpenPL 이 실제와 다를 때도 있습니까?
실제와 동일시하는 수식이 있으면 부탁드립니다.
var: quantity1(0),quantity2(0),러셀원가(0),가솔린원가(0);
var: 러셀이익(0),가솔린이익(0);
var: PL1(0),PL2(0),T(0);
var:러셀본전가(0), 가솔린본절가(0),러셀고가(0),가솔린고가(0), 러셀최고가(0),가솔린최고가(0);
PL1=GetPositionOpenPL("RTUV20","7212383908"); //러셀
PL2=GetPositionOpenPL("RB020","7212383908"); // 가솔린
quantity1=GetpositionQuantity("RTUV20","7212383908");//러셀 보유수량
quantity2=GetpositionQuantity("RB020","7212383908");//가솔린 보유수량
IF quantity1==0 Then
{
러셀원가 = PL1 ;
러셀이익=0 ;
러셀최고가=0;
러셀본전가=0 ;
T=0 ;
}
IF quantity2==0 Then
{
가솔린원가 = PL2 ;
가솔린이익=0;
가솔린최고가=0;
가솔린본절가=0;
T=0 ;
}
IF quantity1>0 Then
{
러셀이익 = PL1 -러셀원가 ;
}
IF quantity1>0 Then
{
러셀이익 > 러셀이익[1] ;
러셀최고가=러셀이익 ;
}
IF quantity2>0 Then
{
가솔린이익 = PL2 -가솔린원가 ;
}
IF quantity2>0 Then
{
가솔린이익 >가솔린이익[1] ;
가솔린최고가 = 가솔린이익;
}
IF quantity1[1]==0 and quantity1>0 then
{
러셀본전가 =c;
}
IF quantity2[1]==0 and quantity2>0 then
{
가솔린본절가 =c;
}
// 러셀을 수동으로 매매하고 이익이 나서 이익을 시스템식으로 보전하려고 합니다.
//러셀 매매후 이익이 나면
if quantity1>0 AND PL1 > 러셀원가 Then
{
러셀이익 = PL1 - 러셀원가 ;
T=1;
}
//가솔린 매매후 이익이 나면
if quantity2>0 AND PL2 > 가솔린원가 Then;
{
가솔린이익 = PL2 - 가솔린원가 ;
T=-1;
}
// 러셀 매수후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity1==1 and T==1 and 러셀이익 > pricescale*40 Then
{
Sell("bx1",AtStop,러셀본전가); // 러셀 본절가는 수동으로 넣어 줍니다.옆의 수식 맞습니까? 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 러셀 매수후 이익이 많이 나서 최고값 대비 50%로 가격이 떨어지면 수익 청산합니다.
if 러셀최고가 >= 러셀원가+pricescale*60 then
sell("bx2",atstop,(러셀최고가- 러셀원가)*0.5 ); // 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
// 러셀 매도후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity1==1 and T==1 and 러셀이익 > pricescale*40 Then {
Buy("sx1",AtStop,러셀본전가); // 러셀 본절가는 수동으로 넣어 주기도 합니다.옆의 수식 맞습니까? 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 러셀 매도후 이익이 많이 나서 최고삾 대비 50%로 가격이 덜어지면 수익 청산합니다.
if 러셀최고가 >= 러셀원가*60 then
Buy("sx2",atstop,(러셀최고가 - 러셀원가)*0.5 ); // 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
//////////////////////////////////////////////////////////
// 가솔린 매수후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity2==1 and T==-1 Then
{
Sell("bx11",AtStop,가솔린본절가); // 러셀 본절가는 수동으로 넣어 주기도 합니다..옆의 수식 맞습니까? 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 가솔린 매수후 이익이 많이 나서 최고값 대비 50%로 가격이 떨어지면 수익 청산합니다.
if highest(H,BarsSinceEntry) >= entryprice+pricescale*40 then
sell("bx22",atstop,highest(H,BarsSinceEntry)-(highest(H,BarsSinceEntry)-entryprice)*0.5 ); // 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
// 가솔린 매도후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity1==1 and T==-1 Then {
Buy("sx11",AtStop,가솔린본절가); // 러셀 본절가는 수동으로 넣어 줍니다.옆의 수식 맞습니까? 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 가솔린 매도후 이익이 많이 나서 최고삾 대비 50%로 가격이 덜어지면 수익 청산합니다.
if highest(H,BarsSinceEntry) >= entryprice+pricescale*40 then
Buy("sx22",atstop,lowest(L,BarsSinceEntry)+(entryprice-lowest(L,BarsSinceEntry))*0.5 ); // 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
MessageLog("quantity1= %.f " , quantity1 );
MessageLog("PL1= %.f " , PL1 );
답변 1
예스스탁
예스스탁 답변
2020-07-20 15:28:44
안녕하세요
예스스탁입니다.
1
수식은 시세가 들어올떄 마다 값계산을 합니다.
하지만 랭귀지에서 조건을 if문으로 지정하게 되는데
if문이 봉완성을 기준으로 만족여부를 최종판단하므로
예스랭귀지는 봉완성시를 기준으로 한다고 보셔야 합니다.
2
GetPositionOpenPL은 계좌에서 가져오는 값입니다.
해당함수외에는 수식으로 실제 계좌의 손익을 계산할 방법은 없습니다.
3
죄송하지만 해당 내용은 저희가 검증해 드리기 어렵습니다.
모의투자에 적용하셔서 직접 테스트해 보시고 수정보완하셔야 합니다.
해외선물 중 유진투자증권이나 한국투자증권에서 모의투자를 제공합니다.
즐거운 하루되세요
> 종호 님이 쓴 글입니다.
> 제목 : 수식 검토 요청합니다.
> 아래 수식은 수동으로 2가지 종목을 각각 매매후에 자리를 뜨고 자러 가는 사이에
본절 청산과 수익 추적 청산 하기 위한 수식입니다.
에러가 있는지 검토 요청드립니다.
수식이 문제가 없더라도 실전에서 문제가 없겠습니까?
GetPositionOpenPL 과 GetpositionQuantity 은
호출을 얼마 시간단위로 호출하는 것인지요?
분봉이 완성될 때마다 호출되는 것인지요?
GetPositionOpenPL 이 실제와 다를 때도 있습니까?
실제와 동일시하는 수식이 있으면 부탁드립니다.
var: quantity1(0),quantity2(0),러셀원가(0),가솔린원가(0);
var: 러셀이익(0),가솔린이익(0);
var: PL1(0),PL2(0),T(0);
var:러셀본전가(0), 가솔린본절가(0),러셀고가(0),가솔린고가(0), 러셀최고가(0),가솔린최고가(0);
PL1=GetPositionOpenPL("RTUV20","7212383908"); //러셀
PL2=GetPositionOpenPL("RB020","7212383908"); // 가솔린
quantity1=GetpositionQuantity("RTUV20","7212383908");//러셀 보유수량
quantity2=GetpositionQuantity("RB020","7212383908");//가솔린 보유수량
IF quantity1==0 Then
{
러셀원가 = PL1 ;
러셀이익=0 ;
러셀최고가=0;
러셀본전가=0 ;
T=0 ;
}
IF quantity2==0 Then
{
가솔린원가 = PL2 ;
가솔린이익=0;
가솔린최고가=0;
가솔린본절가=0;
T=0 ;
}
IF quantity1>0 Then
{
러셀이익 = PL1 -러셀원가 ;
}
IF quantity1>0 Then
{
러셀이익 > 러셀이익[1] ;
러셀최고가=러셀이익 ;
}
IF quantity2>0 Then
{
가솔린이익 = PL2 -가솔린원가 ;
}
IF quantity2>0 Then
{
가솔린이익 >가솔린이익[1] ;
가솔린최고가 = 가솔린이익;
}
IF quantity1[1]==0 and quantity1>0 then
{
러셀본전가 =c;
}
IF quantity2[1]==0 and quantity2>0 then
{
가솔린본절가 =c;
}
// 러셀을 수동으로 매매하고 이익이 나서 이익을 시스템식으로 보전하려고 합니다.
//러셀 매매후 이익이 나면
if quantity1>0 AND PL1 > 러셀원가 Then
{
러셀이익 = PL1 - 러셀원가 ;
T=1;
}
//가솔린 매매후 이익이 나면
if quantity2>0 AND PL2 > 가솔린원가 Then;
{
가솔린이익 = PL2 - 가솔린원가 ;
T=-1;
}
// 러셀 매수후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity1==1 and T==1 and 러셀이익 > pricescale*40 Then
{
Sell("bx1",AtStop,러셀본전가); // 러셀 본절가는 수동으로 넣어 줍니다.옆의 수식 맞습니까? 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 러셀 매수후 이익이 많이 나서 최고값 대비 50%로 가격이 떨어지면 수익 청산합니다.
if 러셀최고가 >= 러셀원가+pricescale*60 then
sell("bx2",atstop,(러셀최고가- 러셀원가)*0.5 ); // 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
// 러셀 매도후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity1==1 and T==1 and 러셀이익 > pricescale*40 Then {
Buy("sx1",AtStop,러셀본전가); // 러셀 본절가는 수동으로 넣어 주기도 합니다.옆의 수식 맞습니까? 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 러셀 매도후 이익이 많이 나서 최고삾 대비 50%로 가격이 덜어지면 수익 청산합니다.
if 러셀최고가 >= 러셀원가*60 then
Buy("sx2",atstop,(러셀최고가 - 러셀원가)*0.5 ); // 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
//////////////////////////////////////////////////////////
// 가솔린 매수후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity2==1 and T==-1 Then
{
Sell("bx11",AtStop,가솔린본절가); // 러셀 본절가는 수동으로 넣어 주기도 합니다..옆의 수식 맞습니까? 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 가솔린 매수후 이익이 많이 나서 최고값 대비 50%로 가격이 떨어지면 수익 청산합니다.
if highest(H,BarsSinceEntry) >= entryprice+pricescale*40 then
sell("bx22",atstop,highest(H,BarsSinceEntry)-(highest(H,BarsSinceEntry)-entryprice)*0.5 ); // 포지션이 매도이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
// 가솔린 매도후 이익이 나서 본절가로 가격이 떨어지면 본절가 청산합니다.
IF quantity1==1 and T==-1 Then {
Buy("sx11",AtStop,가솔린본절가); // 러셀 본절가는 수동으로 넣어 줍니다.옆의 수식 맞습니까? 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
// 가솔린 매도후 이익이 많이 나서 최고삾 대비 50%로 가격이 덜어지면 수익 청산합니다.
if highest(H,BarsSinceEntry) >= entryprice+pricescale*40 then
Buy("sx22",atstop,lowest(L,BarsSinceEntry)+(entryprice-lowest(L,BarsSinceEntry))*0.5 ); // 포지션이 매수이면 이 명령은 손으로 삭제합니다.
T=0 ;
}
MessageLog("quantity1= %.f " , quantity1 );
MessageLog("PL1= %.f " , PL1 );