예스스탁
예스스탁 답변
2022-05-24 10:44:33
안녕하세요
예스스탁입니다.
1
이전 질문에 대해 잘못 파악하고 작성해 드린부분이 있어
이전 질문기준으로 아래 청산식을 수정해 드립니다.
진입10회까지는 평단가+1%상승하면 전량청산하고
11회 이후에는 최근 3개 진입의 평단가와 수량만 산정해 청산하게 수정해 드립니다.
var : AE1(0),sum1(0),sum2(0),AE2(0);
var : Xcond1(False),Xcond2(False);
var : v3(0),v2(0),v1(0);
var : c3(0),c2(0),c1(0);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
}
if CurrentContracts > CurrentContracts[1] Then
{
V3 = V2;
V2 = V1;
V1 = CurrentContracts-CurrentContracts[1];
C3 = C2;
C2 = C1;
C1 = LatestEntryPrice(0);
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
}
Else
{
sum1 = (v3*C3)+(V2*C2)+(V1+C1);
sum2 = (V3+V2+V1);
AE2 = sum1/Sum2;
Xcond2 = False;
}
}
if Xcond1 == False Then
{
ExitLong("bx1",AtLimit,AE1*1.01);
}
if MaxEntries >= 11 and Xcond2 == False Then
{
ExitLong("bx2",AtLimit,AE2*1.01,"",sum2,1);
}
}
Else
{
AE1 = 0;
sum1 = 0;
sum2 = 0;
AE2 = 0;
Xcond1 = False;
Xcond2 = False;
V1 = 0;
V2 = 0;
V3 = 0;
C1 = 0;
C2 = 0;
c3 = 0;
}
2
수식에서 11회 진입이후 최근 3개의 진입에 대한
평단가와 수량을 산정해 청산함수에 가격과 수량을 지정하지만
청산함수는 단지 특정가격에 도달하면 지정한 수량을 청산하라는 내용일 뿐입니다.
신호상으로는 모두 첫진입부터 수량이 차감해서 가게 됩니다.
이를 최근 3개로 하려면 1~20번 진입까지 모두 이름을 달리하고
청산함수에 진입명을 지정해서 청산을 하게 하셔야 합니다.
청산함수는 청산함수 안에 진입이름을 지정하면 해당 진입신호와 해당 수량만 청산하게 됩니다.
다만 청산함수에 진입명을 지정해도 이는 신호상의 내용일뿐
실제 계좌잔고도 진입별로 수량이나 가격이 있는 것이 아니고 평단가와 수량만 있으므로
실제 계좌에서 시간을 구분해서 수량을 청산하는 것은 아닙니다.
최근 3개의 이름을 지정하고자 하시면 아래 내용 참고하시기 바랍니다.
해당 부분은 모든 케이스 감안해 작성하기에 시간이 많이 소모되어 저희가 작성해 드리기 어렵습니다.
예를들어 이름이 b1~b20이면 아래와 같이
현재 진입횟수에 따라 모두 따로 작성하고 진입명을 지정해 주셔야 합니다.
또한 해당 청산이 발동하면 이후 다음청산의 3개의 진입을 산정하는 코딩이 필요하게 됩니다.
if MaxEntries >= 11 Then
{
if MaxEntries == 11 Then
{
ExitLong("bx11a",AtStop,AE2*1.01,"b11");
ExitLong("bx11b",AtStop,AE2*1.01,"b10");
ExitLong("bx11c",AtStop,AE2*1.01,"b9");
}
if MaxEntries == 12 Then
{
ExitLong("bx12a",AtStop,AE2*1.01,"b12");
ExitLong("bx12b",AtStop,AE2*1.01,"b11");
ExitLong("bx12c",AtStop,AE2*1.01,"b10");
}
if MaxEntries == 13 Then
{
ExitLong("bx13a",AtStop,AE2*1.01,"b13");
ExitLong("bx13b",AtStop,AE2*1.01,"b12");
ExitLong("bx13c",AtStop,AE2*1.01,"b11");
}
............
}
즐거운 하루되세요
> 유경완 님이 쓴 글입니다.
> 제목 : [질문; 77224번] 에 대한 추가 질문 드립니다.
> 질문사항중 77224번에 대한 추가 질문이 있어서 문의 드립니다.
답변자료의 수식을 그데로 복사해서 넣으니까 10회 이후에 분할 매수되는 부분이
매도가 안되고 계속 보유하게 되어 있어서 아래 수식과 같이 //// 체크 부분의 위치에 수식을 추가하여 전량 매도가 가능하도록 하여 실행은 잘 되어 문제는 없어 보이는데,
1. 첨부한 캡쳐 사진 처럼 통합챠트에 bx3가 안나와도 될 위치에서 다른 종목들도 그렇고 bx1의 신호가 나올때 bx3가 섞여서 나옵니다.(어떤종목은 10회이하 분할 매수시에도 bx3가나오고, 어떤종목은 10회 이하에서는 bx1만 나올 때도 있고 그렇습니다.
해결 방법과 이유가 궁굼합니다.
2. 2번째로 첨부한 캡쳐 사진처럼 위의 1번 질문과 같이 bx3가 안나와야 할 위치에서 나올때는 거래내역에 거래수량이 0.000000 이런식으로 표기가 되는데 이것 또한 위의 1번과 같이 해결 방법을 알려 주시면 감사하겠습니다.
------------------------------------------------------------------------------------
var : AE1(0),Vol1(0),sum1(0),sum2(0),Vol2(0),AE2(0),Vol3(0),AE3(0);
var : Xcond1(False),Xcond2(False),Xcond3(False);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
if LatestExitName(0) == "bx3" Then
Xcond3 = true;
}
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
vol1 = CurrentContracts;
}
if Xcond1 == False and Vol1 > 0 Then
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율,"",vol1,1);
if MaxEntries >= 9 and MaxEntries <= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
sum1 = sum1 + (CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
sum2 = sum2 + (CurrentContracts-CurrentContracts[1]);
AE2 = sum1/sum2;
}
}
if MaxEntries >= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
Vol2 = Vol2 + (CurrentContracts-CurrentContracts[1]);
}
if Xcond2 == false Then
ExitLong("bx2",AtLimit,AE2*원하는_평단가요율,"",vol2,1);
}
///////////////////////////////////////////////////////////////////////////
if MaxEntries <= 10 and MaxEntries <= 19 Then
{
AE3 = AvgEntryPrice;
vol3 = CurrentContracts;
}
if Xcond3 == False and Vol3 > 0 Then
ExitLong("bx3",AtLimit,AE3*원하는_평단가요율,"",vol3,1);
/////////////////////////////////////////////////////////////////////////////
}
Else
{
AE1 = 0;
vol1 = 0;
sum1 = 0;
sum2 = 0;
vol2 = 0;
AE2 = 0;
AE3 = 0;
vol3 = 0;
Xcond1 = False;
Xcond2 = False;
Xcond3 = False;
}
친절한 답변 감사드립니다.
말씀하신 수식을 적용해 보니 10회 이전에는 평단가대비 1% 이익일때 익절을 하는데,
11회 이후에는 이익과 무관하게 무조건 3개의 평단가*1%로 해주셔서 전혀 이익이 나지 않고 있습니다.
1. 따라서 3개를 더해서 10회 이전과 같이 평단가의 1% 익절이 되도록 수정 부탁 드립니다.
2. 그리고 아래에 질문한 당초의 수식에 대한 bx3가 안나와도 될 위치에서 발생하는 이유도 같이 수정 및 이유를 알려 주시면 감사하겠습니다. 아래 당초의 수식도 좋은 수식인것 같아서 이수식도 활용 하고자 합니다.
3. 당초 수식중에 10회 이상 분할매수가 들어갈 경우 최초에 매수한 수량중 일부를 먼저 매도하도록 되어 있는데, 적용해 본 결과 최초1회분과 2회분만 매도가 되는데 그이유가 궁굼합니다.
수고해 주십시요..
------------------------------------------------------------------------------------
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : [질문; 77224번] 에 대한 추가 질문 드립니다.
>
안녕하세요
예스스탁입니다.
1
이전 질문에 대해 잘못 파악하고 작성해 드린부분이 있어
이전 질문기준으로 아래 청산식을 수정해 드립니다.
진입10회까지는 평단가+1%상승하면 전량청산하고
11회 이후에는 최근 3개 진입의 평단가와 수량만 산정해 청산하게 수정해 드립니다.
var : AE1(0),sum1(0),sum2(0),AE2(0);
var : Xcond1(False),Xcond2(False);
var : v3(0),v2(0),v1(0);
var : c3(0),c2(0),c1(0);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
}
if CurrentContracts > CurrentContracts[1] Then
{
V3 = V2;
V2 = V1;
V1 = CurrentContracts-CurrentContracts[1];
C3 = C2;
C2 = C1;
C1 = LatestEntryPrice(0);
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
}
Else
{
sum1 = (v3*C3)+(V2*C2)+(V1+C1);
sum2 = (V3+V2+V1);
AE2 = sum1/Sum2;
Xcond2 = False;
}
}
if Xcond1 == False Then
{
ExitLong("bx1",AtLimit,AE1*1.01);
}
if MaxEntries >= 11 and Xcond2 == False Then
{
ExitLong("bx2",AtLimit,AE2*1.01,"",sum2,1);
}
}
Else
{
AE1 = 0;
sum1 = 0;
sum2 = 0;
AE2 = 0;
Xcond1 = False;
Xcond2 = False;
V1 = 0;
V2 = 0;
V3 = 0;
C1 = 0;
C2 = 0;
c3 = 0;
}
2
수식에서 11회 진입이후 최근 3개의 진입에 대한
평단가와 수량을 산정해 청산함수에 가격과 수량을 지정하지만
청산함수는 단지 특정가격에 도달하면 지정한 수량을 청산하라는 내용일 뿐입니다.
신호상으로는 모두 첫진입부터 수량이 차감해서 가게 됩니다.
이를 최근 3개로 하려면 1~20번 진입까지 모두 이름을 달리하고
청산함수에 진입명을 지정해서 청산을 하게 하셔야 합니다.
청산함수는 청산함수 안에 진입이름을 지정하면 해당 진입신호와 해당 수량만 청산하게 됩니다.
다만 청산함수에 진입명을 지정해도 이는 신호상의 내용일뿐
실제 계좌잔고도 진입별로 수량이나 가격이 있는 것이 아니고 평단가와 수량만 있으므로
실제 계좌에서 시간을 구분해서 수량을 청산하는 것은 아닙니다.
최근 3개의 이름을 지정하고자 하시면 아래 내용 참고하시기 바랍니다.
해당 부분은 모든 케이스 감안해 작성하기에 시간이 많이 소모되어 저희가 작성해 드리기 어렵습니다.
예를들어 이름이 b1~b20이면 아래와 같이
현재 진입횟수에 따라 모두 따로 작성하고 진입명을 지정해 주셔야 합니다.
또한 해당 청산이 발동하면 이후 다음청산의 3개의 진입을 산정하는 코딩이 필요하게 됩니다.
if MaxEntries >= 11 Then
{
if MaxEntries == 11 Then
{
ExitLong("bx11a",AtStop,AE2*1.01,"b11");
ExitLong("bx11b",AtStop,AE2*1.01,"b10");
ExitLong("bx11c",AtStop,AE2*1.01,"b9");
}
if MaxEntries == 12 Then
{
ExitLong("bx12a",AtStop,AE2*1.01,"b12");
ExitLong("bx12b",AtStop,AE2*1.01,"b11");
ExitLong("bx12c",AtStop,AE2*1.01,"b10");
}
if MaxEntries == 13 Then
{
ExitLong("bx13a",AtStop,AE2*1.01,"b13");
ExitLong("bx13b",AtStop,AE2*1.01,"b12");
ExitLong("bx13c",AtStop,AE2*1.01,"b11");
}
............
}
즐거운 하루되세요
> 유경완 님이 쓴 글입니다.
> 제목 : [질문; 77224번] 에 대한 추가 질문 드립니다.
> 질문사항중 77224번에 대한 추가 질문이 있어서 문의 드립니다.
답변자료의 수식을 그데로 복사해서 넣으니까 10회 이후에 분할 매수되는 부분이
매도가 안되고 계속 보유하게 되어 있어서 아래 수식과 같이 //// 체크 부분의 위치에 수식을 추가하여 전량 매도가 가능하도록 하여 실행은 잘 되어 문제는 없어 보이는데,
1. 첨부한 캡쳐 사진 처럼 통합챠트에 bx3가 안나와도 될 위치에서 다른 종목들도 그렇고 bx1의 신호가 나올때 bx3가 섞여서 나옵니다.(어떤종목은 10회이하 분할 매수시에도 bx3가나오고, 어떤종목은 10회 이하에서는 bx1만 나올 때도 있고 그렇습니다.
해결 방법과 이유가 궁굼합니다.
2. 2번째로 첨부한 캡쳐 사진처럼 위의 1번 질문과 같이 bx3가 안나와야 할 위치에서 나올때는 거래내역에 거래수량이 0.000000 이런식으로 표기가 되는데 이것 또한 위의 1번과 같이 해결 방법을 알려 주시면 감사하겠습니다.
------------------------------------------------------------------------------------
var : AE1(0),Vol1(0),sum1(0),sum2(0),Vol2(0),AE2(0),Vol3(0),AE3(0);
var : Xcond1(False),Xcond2(False),Xcond3(False);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
if LatestExitName(0) == "bx3" Then
Xcond3 = true;
}
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
vol1 = CurrentContracts;
}
if Xcond1 == False and Vol1 > 0 Then
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율,"",vol1,1);
if MaxEntries >= 9 and MaxEntries <= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
sum1 = sum1 + (CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
sum2 = sum2 + (CurrentContracts-CurrentContracts[1]);
AE2 = sum1/sum2;
}
}
if MaxEntries >= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
Vol2 = Vol2 + (CurrentContracts-CurrentContracts[1]);
}
if Xcond2 == false Then
ExitLong("bx2",AtLimit,AE2*원하는_평단가요율,"",vol2,1);
}
///////////////////////////////////////////////////////////////////////////
if MaxEntries <= 10 and MaxEntries <= 19 Then
{
AE3 = AvgEntryPrice;
vol3 = CurrentContracts;
}
if Xcond3 == False and Vol3 > 0 Then
ExitLong("bx3",AtLimit,AE3*원하는_평단가요율,"",vol3,1);
/////////////////////////////////////////////////////////////////////////////
}
Else
{
AE1 = 0;
vol1 = 0;
sum1 = 0;
sum2 = 0;
vol2 = 0;
AE2 = 0;
AE3 = 0;
vol3 = 0;
Xcond1 = False;
Xcond2 = False;
Xcond3 = False;
}
예스스탁
예스스탁 답변
2022-05-24 15:29:17
안녕하세요
예스스탁입니다.
1
죄송합니다. 답변에 누락이 있었습니다.
bx1로 전량청산을 했는데도 불구하고 수량이 남아 포지션이 종료되지 않고
bx3을 추가해야 청산이 되는데 이는 부동소숫점오류 떄문입니다.
일반 거래소 종목은 수량에 소숫점이 없어서 해당 부분 문제가 없는데
암호화폐의 경우 수량에 소숫점이 있어 중복진입시에 수량을 합산할 때 발생하게 됩니다.
아시는 부분이겠지만 부동소숫점 오류는 컴퓨터 cpu가 계산시
10진법수를 2진법으로 환산해 계산한 후에 다시 10진법으로 돌려줄때
발생하는 오류로 소숫점 이하에 가비지 값이 붙는 경우를 말합니다.
예를 들어 1.05인데 1.050000000....1이나 1.0499999999....로 리턴되는 경우입니다.
그러므로 신호에서 실제 누적된 수량은 123.12345678이지만
각진입별 수량을 합산할때 부동소숫점오류가 있어
123.1234567799999999...로 저장되면
청산시 미세한 값이 남아버리게 되어 포지션이 끝나지 않고 매수상태가 유지가 됩니다.
만약 123.123456780000000...01로 계산되면 청산함수에 지정된 수량이
진입된 수량보다 크면 진입된 수량만큼만 청산해서 문제가 없게 됩니다.
2
해결하시는 방법은
if Xcond1 == False and Vol1 > 0 Then
{
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율);
}
위와 같이 전량청산 상황에서는 청산함수에 별도로 수량을 지정하지 않고 사용하시거나
혹은 아래와 같이 수량을 소숫점 9자리에서 반올림하여 8자리까지만 산정해 사용하시면 됩니다. 이부분은 종목별로 적당한 소숫점 자리에서 반올림하게 하시면 됩니다.
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
vol1 = round(CurrentContracts,9);
}
if Xcond1 == False and Vol1 > 0 Then
{
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율,"",vol1,1);
}
즐거운 하루되세요
> 유경완 님이 쓴 글입니다.
> 제목 : Re : Re : [질문; 77224번] 에 대한 추가 질문 드립니다.
> 친절한 답변 감사드립니다.
말씀하신 수식을 적용해 보니 10회 이전에는 평단가대비 1% 이익일때 익절을 하는데,
11회 이후에는 이익과 무관하게 무조건 3개의 평단가*1%로 해주셔서 전혀 이익이 나지 않고 있습니다.
1. 따라서 3개를 더해서 10회 이전과 같이 평단가의 1% 익절이 되도록 수정 부탁 드립니다.
2. 그리고 아래에 질문한 당초의 수식에 대한 bx3가 안나와도 될 위치에서 발생하는 이유도 같이 수정 및 이유를 알려 주시면 감사하겠습니다. 아래 당초의 수식도 좋은 수식인것 같아서 이수식도 활용 하고자 합니다.
3. 당초 수식중에 10회 이상 분할매수가 들어갈 경우 최초에 매수한 수량중 일부를 먼저 매도하도록 되어 있는데, 적용해 본 결과 최초1회분과 2회분만 매도가 되는데 그이유가 궁굼합니다.
수고해 주십시요..
------------------------------------------------------------------------------------
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : [질문; 77224번] 에 대한 추가 질문 드립니다.
>
안녕하세요
예스스탁입니다.
1
이전 질문에 대해 잘못 파악하고 작성해 드린부분이 있어
이전 질문기준으로 아래 청산식을 수정해 드립니다.
진입10회까지는 평단가+1%상승하면 전량청산하고
11회 이후에는 최근 3개 진입의 평단가와 수량만 산정해 청산하게 수정해 드립니다.
var : AE1(0),sum1(0),sum2(0),AE2(0);
var : Xcond1(False),Xcond2(False);
var : v3(0),v2(0),v1(0);
var : c3(0),c2(0),c1(0);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
}
if CurrentContracts > CurrentContracts[1] Then
{
V3 = V2;
V2 = V1;
V1 = CurrentContracts-CurrentContracts[1];
C3 = C2;
C2 = C1;
C1 = LatestEntryPrice(0);
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
}
Else
{
sum1 = (v3*C3)+(V2*C2)+(V1+C1);
sum2 = (V3+V2+V1);
AE2 = sum1/Sum2;
Xcond2 = False;
}
}
if Xcond1 == False Then
{
ExitLong("bx1",AtLimit,AE1*1.01);
}
if MaxEntries >= 11 and Xcond2 == False Then
{
ExitLong("bx2",AtLimit,AE2*1.01,"",sum2,1);
}
}
Else
{
AE1 = 0;
sum1 = 0;
sum2 = 0;
AE2 = 0;
Xcond1 = False;
Xcond2 = False;
V1 = 0;
V2 = 0;
V3 = 0;
C1 = 0;
C2 = 0;
c3 = 0;
}
2
수식에서 11회 진입이후 최근 3개의 진입에 대한
평단가와 수량을 산정해 청산함수에 가격과 수량을 지정하지만
청산함수는 단지 특정가격에 도달하면 지정한 수량을 청산하라는 내용일 뿐입니다.
신호상으로는 모두 첫진입부터 수량이 차감해서 가게 됩니다.
이를 최근 3개로 하려면 1~20번 진입까지 모두 이름을 달리하고
청산함수에 진입명을 지정해서 청산을 하게 하셔야 합니다.
청산함수는 청산함수 안에 진입이름을 지정하면 해당 진입신호와 해당 수량만 청산하게 됩니다.
다만 청산함수에 진입명을 지정해도 이는 신호상의 내용일뿐
실제 계좌잔고도 진입별로 수량이나 가격이 있는 것이 아니고 평단가와 수량만 있으므로
실제 계좌에서 시간을 구분해서 수량을 청산하는 것은 아닙니다.
최근 3개의 이름을 지정하고자 하시면 아래 내용 참고하시기 바랍니다.
해당 부분은 모든 케이스 감안해 작성하기에 시간이 많이 소모되어 저희가 작성해 드리기 어렵습니다.
예를들어 이름이 b1~b20이면 아래와 같이
현재 진입횟수에 따라 모두 따로 작성하고 진입명을 지정해 주셔야 합니다.
또한 해당 청산이 발동하면 이후 다음청산의 3개의 진입을 산정하는 코딩이 필요하게 됩니다.
if MaxEntries >= 11 Then
{
if MaxEntries == 11 Then
{
ExitLong("bx11a",AtStop,AE2*1.01,"b11");
ExitLong("bx11b",AtStop,AE2*1.01,"b10");
ExitLong("bx11c",AtStop,AE2*1.01,"b9");
}
if MaxEntries == 12 Then
{
ExitLong("bx12a",AtStop,AE2*1.01,"b12");
ExitLong("bx12b",AtStop,AE2*1.01,"b11");
ExitLong("bx12c",AtStop,AE2*1.01,"b10");
}
if MaxEntries == 13 Then
{
ExitLong("bx13a",AtStop,AE2*1.01,"b13");
ExitLong("bx13b",AtStop,AE2*1.01,"b12");
ExitLong("bx13c",AtStop,AE2*1.01,"b11");
}
............
}
즐거운 하루되세요
> 유경완 님이 쓴 글입니다.
> 제목 : [질문; 77224번] 에 대한 추가 질문 드립니다.
> 질문사항중 77224번에 대한 추가 질문이 있어서 문의 드립니다.
답변자료의 수식을 그데로 복사해서 넣으니까 10회 이후에 분할 매수되는 부분이
매도가 안되고 계속 보유하게 되어 있어서 아래 수식과 같이 //// 체크 부분의 위치에 수식을 추가하여 전량 매도가 가능하도록 하여 실행은 잘 되어 문제는 없어 보이는데,
1. 첨부한 캡쳐 사진 처럼 통합챠트에 bx3가 안나와도 될 위치에서 다른 종목들도 그렇고 bx1의 신호가 나올때 bx3가 섞여서 나옵니다.(어떤종목은 10회이하 분할 매수시에도 bx3가나오고, 어떤종목은 10회 이하에서는 bx1만 나올 때도 있고 그렇습니다.
해결 방법과 이유가 궁굼합니다.
2. 2번째로 첨부한 캡쳐 사진처럼 위의 1번 질문과 같이 bx3가 안나와야 할 위치에서 나올때는 거래내역에 거래수량이 0.000000 이런식으로 표기가 되는데 이것 또한 위의 1번과 같이 해결 방법을 알려 주시면 감사하겠습니다.
------------------------------------------------------------------------------------
var : AE1(0),Vol1(0),sum1(0),sum2(0),Vol2(0),AE2(0),Vol3(0),AE3(0);
var : Xcond1(False),Xcond2(False),Xcond3(False);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
if LatestExitName(0) == "bx3" Then
Xcond3 = true;
}
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
vol1 = CurrentContracts;
}
if Xcond1 == False and Vol1 > 0 Then
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율,"",vol1,1);
if MaxEntries >= 9 and MaxEntries <= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
sum1 = sum1 + (CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
sum2 = sum2 + (CurrentContracts-CurrentContracts[1]);
AE2 = sum1/sum2;
}
}
if MaxEntries >= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
Vol2 = Vol2 + (CurrentContracts-CurrentContracts[1]);
}
if Xcond2 == false Then
ExitLong("bx2",AtLimit,AE2*원하는_평단가요율,"",vol2,1);
}
///////////////////////////////////////////////////////////////////////////
if MaxEntries <= 10 and MaxEntries <= 19 Then
{
AE3 = AvgEntryPrice;
vol3 = CurrentContracts;
}
if Xcond3 == False and Vol3 > 0 Then
ExitLong("bx3",AtLimit,AE3*원하는_평단가요율,"",vol3,1);
/////////////////////////////////////////////////////////////////////////////
}
Else
{
AE1 = 0;
vol1 = 0;
sum1 = 0;
sum2 = 0;
vol2 = 0;
AE2 = 0;
AE3 = 0;
vol3 = 0;
Xcond1 = False;
Xcond2 = False;
Xcond3 = False;
}
자세한 설명 감사드립니다.
설명대로 전량매도 방식으로 하면 손실이 나기 때문에 안되고,
10회 이하는 전량매도 수식으로 적용하는게 맞고,
나머지의 11회 이후의 매도는 vol2로 적용하는게 맞았습니다.
위와같이 적용해보니 bx3가 들어가지 않고 정상적으로 매도가 이루어 지고 있습니다.
감사합니다. 수고하십시요..
------------------------------------------------------------------------------------
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : Re : Re : [질문; 77224번] 에 대한 추가 질문 드립니다.
> 안녕하세요
예스스탁입니다.
1
죄송합니다. 답변에 누락이 있었습니다.
bx1로 전량청산을 했는데도 불구하고 수량이 남아 포지션이 종료되지 않고
bx3을 추가해야 청산이 되는데 이는 부동소숫점오류 떄문입니다.
일반 거래소 종목은 수량에 소숫점이 없어서 해당 부분 문제가 없는데
암호화폐의 경우 수량에 소숫점이 있어 중복진입시에 수량을 합산할 때 발생하게 됩니다.
아시는 부분이겠지만 부동소숫점 오류는 컴퓨터 cpu가 계산시
10진법수를 2진법으로 환산해 계산한 후에 다시 10진법으로 돌려줄때
발생하는 오류로 소숫점 이하에 가비지 값이 붙는 경우를 말합니다.
예를 들어 1.05인데 1.050000000....1이나 1.0499999999....로 리턴되는 경우입니다.
그러므로 신호에서 실제 누적된 수량은 123.12345678이지만
각진입별 수량을 합산할때 부동소숫점오류가 있어
123.1234567799999999...로 저장되면
청산시 미세한 값이 남아버리게 되어 포지션이 끝나지 않고 매수상태가 유지가 됩니다.
만약 123.123456780000000...01로 계산되면 청산함수에 지정된 수량이
진입된 수량보다 크면 진입된 수량만큼만 청산해서 문제가 없게 됩니다.
2
해결하시는 방법은
if Xcond1 == False and Vol1 > 0 Then
{
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율);
}
위와 같이 전량청산 상황에서는 청산함수에 별도로 수량을 지정하지 않고 사용하시거나
혹은 아래와 같이 수량을 소숫점 9자리에서 반올림하여 8자리까지만 산정해 사용하시면 됩니다. 이부분은 종목별로 적당한 소숫점 자리에서 반올림하게 하시면 됩니다.
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
vol1 = round(CurrentContracts,9);
}
if Xcond1 == False and Vol1 > 0 Then
{
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율,"",vol1,1);
}
즐거운 하루되세요
> 유경완 님이 쓴 글입니다.
> 제목 : Re : Re : [질문; 77224번] 에 대한 추가 질문 드립니다.
> 친절한 답변 감사드립니다.
말씀하신 수식을 적용해 보니 10회 이전에는 평단가대비 1% 이익일때 익절을 하는데,
11회 이후에는 이익과 무관하게 무조건 3개의 평단가*1%로 해주셔서 전혀 이익이 나지 않고 있습니다.
1. 따라서 3개를 더해서 10회 이전과 같이 평단가의 1% 익절이 되도록 수정 부탁 드립니다.
2. 그리고 아래에 질문한 당초의 수식에 대한 bx3가 안나와도 될 위치에서 발생하는 이유도 같이 수정 및 이유를 알려 주시면 감사하겠습니다. 아래 당초의 수식도 좋은 수식인것 같아서 이수식도 활용 하고자 합니다.
3. 당초 수식중에 10회 이상 분할매수가 들어갈 경우 최초에 매수한 수량중 일부를 먼저 매도하도록 되어 있는데, 적용해 본 결과 최초1회분과 2회분만 매도가 되는데 그이유가 궁굼합니다.
수고해 주십시요..
------------------------------------------------------------------------------------
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : [질문; 77224번] 에 대한 추가 질문 드립니다.
>
안녕하세요
예스스탁입니다.
1
이전 질문에 대해 잘못 파악하고 작성해 드린부분이 있어
이전 질문기준으로 아래 청산식을 수정해 드립니다.
진입10회까지는 평단가+1%상승하면 전량청산하고
11회 이후에는 최근 3개 진입의 평단가와 수량만 산정해 청산하게 수정해 드립니다.
var : AE1(0),sum1(0),sum2(0),AE2(0);
var : Xcond1(False),Xcond2(False);
var : v3(0),v2(0),v1(0);
var : c3(0),c2(0),c1(0);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
}
if CurrentContracts > CurrentContracts[1] Then
{
V3 = V2;
V2 = V1;
V1 = CurrentContracts-CurrentContracts[1];
C3 = C2;
C2 = C1;
C1 = LatestEntryPrice(0);
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
}
Else
{
sum1 = (v3*C3)+(V2*C2)+(V1+C1);
sum2 = (V3+V2+V1);
AE2 = sum1/Sum2;
Xcond2 = False;
}
}
if Xcond1 == False Then
{
ExitLong("bx1",AtLimit,AE1*1.01);
}
if MaxEntries >= 11 and Xcond2 == False Then
{
ExitLong("bx2",AtLimit,AE2*1.01,"",sum2,1);
}
}
Else
{
AE1 = 0;
sum1 = 0;
sum2 = 0;
AE2 = 0;
Xcond1 = False;
Xcond2 = False;
V1 = 0;
V2 = 0;
V3 = 0;
C1 = 0;
C2 = 0;
c3 = 0;
}
2
수식에서 11회 진입이후 최근 3개의 진입에 대한
평단가와 수량을 산정해 청산함수에 가격과 수량을 지정하지만
청산함수는 단지 특정가격에 도달하면 지정한 수량을 청산하라는 내용일 뿐입니다.
신호상으로는 모두 첫진입부터 수량이 차감해서 가게 됩니다.
이를 최근 3개로 하려면 1~20번 진입까지 모두 이름을 달리하고
청산함수에 진입명을 지정해서 청산을 하게 하셔야 합니다.
청산함수는 청산함수 안에 진입이름을 지정하면 해당 진입신호와 해당 수량만 청산하게 됩니다.
다만 청산함수에 진입명을 지정해도 이는 신호상의 내용일뿐
실제 계좌잔고도 진입별로 수량이나 가격이 있는 것이 아니고 평단가와 수량만 있으므로
실제 계좌에서 시간을 구분해서 수량을 청산하는 것은 아닙니다.
최근 3개의 이름을 지정하고자 하시면 아래 내용 참고하시기 바랍니다.
해당 부분은 모든 케이스 감안해 작성하기에 시간이 많이 소모되어 저희가 작성해 드리기 어렵습니다.
예를들어 이름이 b1~b20이면 아래와 같이
현재 진입횟수에 따라 모두 따로 작성하고 진입명을 지정해 주셔야 합니다.
또한 해당 청산이 발동하면 이후 다음청산의 3개의 진입을 산정하는 코딩이 필요하게 됩니다.
if MaxEntries >= 11 Then
{
if MaxEntries == 11 Then
{
ExitLong("bx11a",AtStop,AE2*1.01,"b11");
ExitLong("bx11b",AtStop,AE2*1.01,"b10");
ExitLong("bx11c",AtStop,AE2*1.01,"b9");
}
if MaxEntries == 12 Then
{
ExitLong("bx12a",AtStop,AE2*1.01,"b12");
ExitLong("bx12b",AtStop,AE2*1.01,"b11");
ExitLong("bx12c",AtStop,AE2*1.01,"b10");
}
if MaxEntries == 13 Then
{
ExitLong("bx13a",AtStop,AE2*1.01,"b13");
ExitLong("bx13b",AtStop,AE2*1.01,"b12");
ExitLong("bx13c",AtStop,AE2*1.01,"b11");
}
............
}
즐거운 하루되세요
> 유경완 님이 쓴 글입니다.
> 제목 : [질문; 77224번] 에 대한 추가 질문 드립니다.
> 질문사항중 77224번에 대한 추가 질문이 있어서 문의 드립니다.
답변자료의 수식을 그데로 복사해서 넣으니까 10회 이후에 분할 매수되는 부분이
매도가 안되고 계속 보유하게 되어 있어서 아래 수식과 같이 //// 체크 부분의 위치에 수식을 추가하여 전량 매도가 가능하도록 하여 실행은 잘 되어 문제는 없어 보이는데,
1. 첨부한 캡쳐 사진 처럼 통합챠트에 bx3가 안나와도 될 위치에서 다른 종목들도 그렇고 bx1의 신호가 나올때 bx3가 섞여서 나옵니다.(어떤종목은 10회이하 분할 매수시에도 bx3가나오고, 어떤종목은 10회 이하에서는 bx1만 나올 때도 있고 그렇습니다.
해결 방법과 이유가 궁굼합니다.
2. 2번째로 첨부한 캡쳐 사진처럼 위의 1번 질문과 같이 bx3가 안나와야 할 위치에서 나올때는 거래내역에 거래수량이 0.000000 이런식으로 표기가 되는데 이것 또한 위의 1번과 같이 해결 방법을 알려 주시면 감사하겠습니다.
------------------------------------------------------------------------------------
var : AE1(0),Vol1(0),sum1(0),sum2(0),Vol2(0),AE2(0),Vol3(0),AE3(0);
var : Xcond1(False),Xcond2(False),Xcond3(False);
if MarketPosition == 1 Then
{
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "bx1" Then
Xcond1 = true;
if LatestExitName(0) == "bx2" Then
Xcond2 = true;
if LatestExitName(0) == "bx3" Then
Xcond3 = true;
}
if MaxEntries <= 10 Then
{
AE1 = AvgEntryPrice;
vol1 = CurrentContracts;
}
if Xcond1 == False and Vol1 > 0 Then
ExitLong("bx1",AtLimit,AE1*원하는_평단가요율,"",vol1,1);
if MaxEntries >= 9 and MaxEntries <= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
sum1 = sum1 + (CurrentContracts-CurrentContracts[1])*LatestEntryPrice(0);
sum2 = sum2 + (CurrentContracts-CurrentContracts[1]);
AE2 = sum1/sum2;
}
}
if MaxEntries >= 11 Then
{
if CurrentContracts > CurrentContracts[1] Then
{
Vol2 = Vol2 + (CurrentContracts-CurrentContracts[1]);
}
if Xcond2 == false Then
ExitLong("bx2",AtLimit,AE2*원하는_평단가요율,"",vol2,1);
}
///////////////////////////////////////////////////////////////////////////
if MaxEntries <= 10 and MaxEntries <= 19 Then
{
AE3 = AvgEntryPrice;
vol3 = CurrentContracts;
}
if Xcond3 == False and Vol3 > 0 Then
ExitLong("bx3",AtLimit,AE3*원하는_평단가요율,"",vol3,1);
/////////////////////////////////////////////////////////////////////////////
}
Else
{
AE1 = 0;
vol1 = 0;
sum1 = 0;
sum2 = 0;
vol2 = 0;
AE2 = 0;
AE3 = 0;
vol3 = 0;
Xcond1 = False;
Xcond2 = False;
Xcond3 = False;
}