예스스탁
예스스탁 답변
2025-03-11 11:15:45
안녕하세요
예스스탁입니다.
첨부된 그림은 var6값을 메세지로그로 출력한 그림입니다.
02/21 09:15에 청산 발생했지만
var6은 진입시점에만 값이 저장되므로 해당값이 유지됩니다
이후 0221 10:45에 4차 매수가 다시 발생했지만
이전과 진입가격 수량 동일하므로 평단가 값이 동일하므로 var6값 변동이 없고
2/24 09:05에 5차 매수가 발생하면 var6값이 또 변경이 됩니다.
즐거운 하루되세요
> 맴맴잉 님이 쓴 글입니다.
> 제목 : 시스템 식 요청 드립니다.
> 안녕하세요 지난번에 도움을 주셔서 제가 생각한 시스템식을 작성하게
되었습니다.
그리고 분할매도 되었을때 평단에 대한 궁금증이 해소되지 않아
주말에 시스템식을 수정하였는데, 어려움이 있어 글을 남기게 되었습니다.
먼저 그림 1을 보시면, 중간에 분할익절된 후에 평단이 진입시점의 평단으로 올라가는 것을
볼수 있었습니다. 예를들어 4차 분할익절을 하였는데, 4차 익절 후 평단이 그대로
있어야 하는데 3차 진입 평단으로 올라가는것이였습니다.
그래서 아래와 같이 시스템식을 수정하였고,
VAR9에 평단을 작성해서 넣어놨습니다. 수량이 늘었을때는 평단과 수량이 제대로 나오는데
그림 2번을 보시면 수량이 줄었을때는 평단이 안나오더라구요
수량이 늘었을때와 줄었을때 내부변수 VAR9가 서로 연동이 안되는 것 같았습니다
시스템식 수정 부탁드리겠습니다.
--------------------------------------------
input : N(14),금액(2000000);
input : 시작날짜 (20250109);
Input : 기준선기간(120);
Var : 기준선(0);
var : cntt(0),H1(0),L1(0);
var : cnt(0),sum(0),mav(0),DD(0);
var : AP(0),TT(0),entry(False);
var : LL(0),RR(0),rate(0);
var : 저항(0), B1(0) ;
Var : day(0),EntryDay(0),ddd(0),ED(0);
var : sum1(0),sum2(0),sum3(0),avg4(0),avg5(0),avg6(0);
#-------------------------------------
if sDate >= 시작날짜 Then
{
if Bdate != Bdate[1] Then
{
entry = true;
day = day+1;
dd = dd+1;
}
}
if TotalTrades > TotalTrades[1] Then
entry = False;
#-------------------------------------
#-------------------------------------
sum = 0;
For cnt = 0 to N-1
{
sum = sum + DayClose(cnt);
}
mav = (sum/N);
#-------------------------------------
#---------------------------------------
if (MarketPosition == 0) and (entry == true) and L > mav Then
Buy("1차매수",AtLimit,mav,Floor(금액/min(NextBarOpen,mav)));
if MarketPosition == 1 and L > EntryPrice*0.95 and CurrentEntries == 1 Then
Buy("2차매수",AtLimit,EntryPrice*0.95,Floor(금액*1.15/min(NextBarOpen,mav)));
if MarketPosition == 1 and L > EntryPrice*0.90 and CurrentEntries == 2 Then
Buy("3차매수",AtLimit,EntryPrice*0.90,Floor(금액*1.2/min(NextBarOpen,mav)));
if MarketPosition == 1 and L > EntryPrice*0.85 and CurrentEntries == 3 Then
Buy("4차매수",AtLimit,EntryPrice*0.85,Floor(금액*1.25/min(NextBarOpen,mav)));
if MarketPosition == 1 and L > EntryPrice*0.80 and CurrentEntries == 4 Then
Buy("5차매수",AtLimit,EntryPrice*0.80,Floor(금액*1.3/min(NextBarOpen,mav)));
if MarketPosition == 1 and L > EntryPrice*0.75 and CurrentEntries == 5 Then
Buy("6차매수",AtLimit,EntryPrice*0.75,Floor(금액*1.35/min(NextBarOpen,mav)));
#-----------------------------------
if MarketPosition == 1 Then
{
#전봉대비 수량 감소(일부 청산발생을 위미)
if CurrentContracts < CurrentContracts[1] Then
{
#최근 청산가 저장
var1 = LatestExitPrice(0);
if LatestExitName(0) == "3%익절" Then
Condition1 = true;
if LatestExitName(0) == "4%익절" Then
Condition2 = true;
if LatestExitName(0) == "5%익절" Then
Condition3 = true;
if LatestExitName(0) == "7%익절" Then
Condition4 = true;
Var5 = CurrentContracts;
Var6 = AvgEntryPrice;
#Var8은 평단임 수량이 줄면 전에 평단 가져다 써야지.
var9 = AvgEntryPrice[1];
}
#전봉대비 수량 증가(진입발생)
if CurrentContracts > CurrentContracts[1] Then
{
#Condition1~4는 False로 초기화
Condition1 = False;
Condition2 = False;
Condition3 = False;
Condition4 = False;
#진입횟수가 3회이하일때
#수량과 평단가
if CurrentEntries <= 3 Then
{
Var3 = CurrentContracts;
Var4 = AvgEntryPrice;
}
#최근 진입시점까지의 수량과 평단가
#현재 수식에서는 사용되는 부분이 없습니다. 필요하실따봐 변수로 남겨드립니다.
Var5 = CurrentContracts;
Var6 = AvgEntryPrice;
#Var9
Var9 = ((AvgEntryPrice[1]*CurrentContracts[1])+(LatestEntryPrice(0)*(CurrentContracts - CurrentContracts[1])))/ (CurrentContracts) ;
}
#현재 진입횟수가 3회 이하이고(1,2,3차 매수만 남은 상태)
#3,4,5,7% 청산중 하나가 발생했으면
#종가가 3차매수까지의 평단가 이하로 내려오면 청산
if CurrentEntries <= 3 and
(Condition1 == true or Condition2 == true or Condition3 == true or Condition4 == true) and
C < Var4*1.007 then
ExitLong("bx");
if Condition1 == False AND CurrentEntries <= 3 Then
ExitLong("3%익절",AtLimit,Var6*1.03,"",Floor(Var3*0.2),1);
if Condition2 == False AND CurrentEntries <= 3 Then
ExitLong("4%익절",AtLimit,Var6*1.04,"",Floor(Var3*0.3),1);
if Condition3 == False AND CurrentEntries <= 3 Then
ExitLong("5%익절",AtLimit,Var6*1.05,"",Floor(Var3*0.4),1);
if Condition4 == False AND CurrentEntries <= 3 Then
ExitLong("7%익절",AtLimit,Var6*1.07,"",Floor(Var3*0.1),1);
ExitLong("10%익절",AtLimit,Var6*1.10);
//4차 이상 진입
if CurrentEntries >= 4 Then
{
//4차 이후의 평균
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "4차매수" Then
{
avg4 = LatestEntryPrice(0);
}
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "5차매수" Then
{
avg5 = LatestEntryPrice(0);
}
if CurrentContracts > CurrentContracts[1] and LatestEntryName(0) == "6차매수" Then
{
avg6 = LatestEntryPrice(0);
}
if CurrentEntries >= 4 Then
ExitLong("4차매수익절",AtLimit,avg4*1.045,"4차매수");
if CurrentEntries >= 5 Then
ExitLong("5차매수익절",AtLimit,avg5*1.045,"5차매수");
if CurrentEntries >= 6 Then
ExitLong("6차매수익절",AtLimit,avg6*1.045,"6차매수");
}
Else
{
avg4 = 0;
avg5 = 0;
avg6 = 0;
}
}
Else#매수진입중이 아니면
{
#변수 0으로 초기화
var1 = 0;
Var2 = 0;
}
-------------------------------------------------