예스스탁
예스스탁 답변
2024-04-02 10:42:50
안녕하세요
예스스탁입니다.
올려주신 내용은 강제청산함수(SetStopTrailing)로 처리가 되지 않는 내용이라
각 진입별 진입가/최고가/수량을 저장해서 각각의 청산함수로 처리해야 합니다.
아래 추가해드린 내용을 참고하시기 바랍니다.
최대 20회가지 진입하므로 나열해서 20회까지 작성하시면 됩니다.
아래식에는 시간상 3회까지만 작성해 드립니다.
Input : asset(100000000),XT1(150000);
var : PP(0), R1(0),LV(0),cnt(0);
Array : EP[30](00),EH[30](0),EV[30](0);
PP = (DayHigh(1)+DayLow(1)+DayClose(1))/3; # 피벗기준선
R1 = PP * 2 - DayLow(1); # 피벗1차저항
LV = (DayHigh(1)-DayLow(1))/3; #손절폭
If Bdate[1]!=Bdate Then
{
Value68=0;
Value69=0;
Value67=0;
}
If ExitName(1)=="StopLoss" && MarketPosition==1 && CurrentEntries[1]>CurrentEntries Then
Value68=1;
If MarketPosition==0 && entriestoday<1 Then // entriestoday는 거래횟수 사용자함수.
{
Buy("",AtStop,R1,Max(int(E_num(LV,asset,0.01)/20),1));
}
If CurrentEntries[1]!=CurrentEntries Then
Value67=Value67+1;
If MarketPosition==1 && CurrentEntries<Min(E_num(LV,asset,0.01),20) && Value67<Min(E_num(LV,asset,0.01),20) && Value68==0 Then
Buy("매수1",AtStop,Highest(H,BarsSinceEntry+1)+PriceScale,Max(int(E_num(LV,asset,0.01)/20),1));
if MarketPosition == 1 Then
{
#진입별 진입가/최고가/수량 저장
if CurrentContracts > CurrentContracts[1] Then
{
EP[MaxEntries] = LatestEntryPrice(0);
EH[MaxEntries] = H;
EV[MaxEntries] = CurrentContracts-CurrentContracts[1];
}
#진입별 진입이후 최고가 갱신
if MaxEntries >= 1 Then
{
For cnt = 1 to MaxEntries
{
if H > EH[cnt] Then
EH[cnt] = H;
}
}
//청산되었으면 진입가를 0으로 만들어 추가 발생방지
if CurrentContracts < CurrentContracts[1] Then
{
if LatestExitName(0) == "브레이큰1" Then
EP[1] == 0;
if LatestExitName(0) == "브레이큰2" Then
EP[2] == 0;
if LatestExitName(0) == "브레이큰3" Then
EP[3] == 0;
.....
if LatestExitName(0) == "브레이큰20" Then
EP[20] == 0;
}
if MaxEntries >= 1 and EP[1] > 0 and EH[1] > EP[1]+LV*3 Then
ExitLong("브레이큰1",AtStop,EP[1],"",EV[1],1);
if MaxEntries >= 2 and EP[2] > 0 and EH[2] > EP[2]+LV*3 Then
ExitLong("브레이큰2",AtStop,EP[2],"",EV[2],1);
if MaxEntries >= 3 and EP[3] > 0 and EH[3] > EP[3]+LV*3 Then
ExitLong("브레이큰3",AtStop,EP[3],"",EV[3],1);
......
if MaxEntries >= 20 and EP[20] > 0 and EH[20] > EP[20]+LV*3 Then
ExitLong("브레이큰20",AtStop,EP[20],"",EV[20],1);
}
SetStopLoss(LV,PointStop);
If NextBarStime==XT1 Then
ExitLong();
즐거운 하루되세요
> 히익 님이 쓴 글입니다.
> 제목 : 피라미딩 브레이큰스탑
> 안녕하세요 항상 도움 주셔서 감사합니다.
아래는 피라미딩 수식입니다.
///////////////////////////////////////피라미딩 전략////////////////////////
Input : asset(100000000),XT1(150000);
var : PP(0), R1(0);
var : LV(0);
PP = (DayHigh(1)+DayLow(1)+DayClose(1))/3; # 피벗기준선
R1 = PP * 2 - DayLow(1); # 피벗1차저항
LV = (DayHigh(1)-DayLow(1))/3; #손절폭
If Bdate[1]!=Bdate Then
{
Value68=0;
Value69=0;
Value67=0;
}
If ExitName(1)=="StopLoss" && MarketPosition==1 && CurrentEntries[1]>CurrentEntries Then
Value68=1;
If MarketPosition==0 && entriestoday<1 Then // entriestoday는 거래횟수 사용자함수.
{
Buy("",AtStop,R1,Max(int(E_num(LV,asset,0.01)/20),1));
}
If CurrentEntries[1]!=CurrentEntries Then
Value67=Value67+1;
If MarketPosition==1 && CurrentEntries<Min(E_num(LV,asset,0.01),20) && Value67<Min(E_num(LV,asset,0.01),20) && Value68==0 Then
Buy("매수1",AtStop,Highest(H,BarsSinceEntry+1)+PriceScale,Max(int(E_num(LV,asset,0.01)/20),1));
SetStopLoss(LV,PointStop);
If NextBarStime==XT1 Then
ExitLong();
/////////////////////////////////////////////////////////////////////////////
여기서 E_num 은 자금관리 사용자 함수로서, 진입 때마다 계약수가 다르게 설정됩니다.
*E_num 사용자 수식 :
Inputs: N(NumericSimple), Capital(NumericSimple), LossRatio(NumericSimple) ;
E_num = Int( (Capital * LossRatio) / (N * BigPointValue) );
///////////////////////////////////////////////////////////////////
궁금한 점은 각 포지션마다 손절 되게끔 setstoploss 를 걸어놨는데, 또 각 포지션마다 브레이큰스탑도 가능하게 하고 싶습니다. 그 브레이큰의 조건은 다음과 같습니다.
////////////////////////////////////////////////////////////////////////
If MarketPosition==1 && Highest(H,BarsSinceEntry+1)>EntryPrice+LV*3 Then
ExitLong("브레이큰",AtStop,EntryPrice);
/////////////////////////////////////////////////////////////////////////
이게 단일 포지션 거래 때는 잘 작동되지만, 피라미딩 때는 초기 진입가격에 대한 브레이큰 스탑만 적용됩니다.
각각의 포지션 별로 브레이큰 스탑을 하는 방법을 여쭙고 싶습니다.
항상 도움 주셔서 감사합니다. 건강조심하세요