간단한 이평선 매매로직 코드에서 추적손절매를 추가하려고 하는데, 시스템트레이딩에서 구동시키면 추적손절매 시작하고 얼마지나지 않아, 무한루프에 걸린 것처럼 렉이 걸리면서 돌아가질않네요. 코드에서 어느부분이 문제인걸까요ㅠㅠ..
파일도 같이 첨부합니다.
extern int MagicNo = 1234; //외부변수 값 설정
extern double Lots = 1.0; //랏사이즈 설정
extern int ShortMA = 50; //단기이동평균선 기간
extern int LongMA = 200; //장기이동평균선 기간
extern double TakeProfit = 50; //이익실현 핍
extern double StopLoss = 50; //손절매 핍
extern double TrailingStop = 20; //추적손절 시작(수익)핍
extern double TStopLoss = 30; //추적손절매 핍
//extern double TTakeProfit = 100;
//+------------------------------------------------------------------+
int start()
{
double SMACur,SMAPre,LMACur,LMAPre; //double 타입의 변수 선언
int i,ticket,total;
bool ticketM;
SMACur=iMA(NULL,0,ShortMA,0,MODE_SMA,PRICE_OPEN,0); //현재봉의 단기이동평균선 값
SMAPre=iMA(NULL,0,ShortMA,0,MODE_SMA,PRICE_OPEN,1); //직전봉의 단기이동평균선 값
LMACur=iMA(NULL,0,LongMA,0,MODE_SMA,PRICE_OPEN,0); //현재봉의 장기이동평균선 값
LMAPre=iMA(NULL,0,LongMA,0,MODE_SMA,PRICE_OPEN,1); //직전봉의 장기이동평균선 값
//SMACur,SMAPre,LMACur,LMAPre 변수안에 이동평균선 값을 넣어줌
//--------------------------------------------------------------------
total=OrdersTotal(); //변수 total에 현재 오픈포지션의 개수를 입력
if(total<1) //현재 오픈포지션의 개수가 1보다 작다면, 즉 현재 오픈 포지션이 없다면
{
if(SMACur > LMACur && SMAPre < LMAPre)
//현재봉의 단기이평선이 현재봉의 장기이평선보다 위에 있고, 직전봉의 단기이평선이 직전봉의 장기이평선보다 아래에 있을 때
//즉, 이동평균선 골드크로스 발생시
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"MA",MagicNo,0,Blue);
//매수포지션 오픈
return(0);
}
if(SMACur < LMACur && SMAPre > LMAPre) //이평선 데드드크로스 발생시
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"MA",MagicNo,0,Red);
return(0);
}
return(0);
}
//-------------------------------------------------------------------------------
//아래구문에서 해당 오더에 대한 손절/익절값을 넣어 줌
for(i=0;i<OrdersTotal();i++)//현재 오픈되어 있는 전체 오더를 대상으로 for구문을 돌림
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)== true)
//OrderSelect함수로 개별 오더를 잡아줌
{
if(OrderMagicNumber()==MagicNo && OrderSymbol()==Symbol())
{
if(OrderType() == OP_BUY)
{
if(OrderStopLoss()==0 && OrderTakeProfit() == 0)
//해당 오더의 손절과 익절값이 0이라면
{
ticketM=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-StopLoss*Point*10,Bid+TakeProfit*Point*10,0,Blue);
//새로운 속성으로 해당 오더를 변경함
return(0);
}
if (Bid - OrderOpenPrice() > TrailingStop*Point*10)
{
if (OrderStopLoss() < Bid - TrailingStop*Point*10)
{
ticketM = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TStopLoss*Point*10, OrderTakeProfit(), Red);
return(0);
}
}
}
if(OrderType() == OP_SELL)
{
if(OrderStopLoss()==0 && OrderTakeProfit() == 0)
//해당 오더의 손절과 익절값이 0이라면
{
ticketM=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+StopLoss*Point*10,Ask-TakeProfit*Point*10,0,Blue);
//새로운 속성으로 해당 오더를 변경함
return(0);
}
if (OrderOpenPrice() - Ask > TrailingStop*Point*10)
{
if (OrderStopLoss() > Ask + TrailingStop*Point*10)
{
ticketM = OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TStopLoss*Point*10, OrderTakeProfit(), Red);
return(0);
}
}
}
}
}
}
return(0);
}
포럼에도 트레이더 뿐만 아니라 프로그래머로 활동하는 분들도 계시니. 곧 좋은 답변 주실껄로 기대합니다..^^
실제로 돌렸을때 원하지 않는 증상이나, 문제가 있어보이면 디버깅을 해보시면 됩니다.
디버깅은 문제가 되는지 하나씩 찍어보아, 문제를 해결하는 과정인데요..
이부분이 잘 되면, 앞으로 좀 더 복잡한 EA도 문제없이 만드실 수 있으리라 생각이 듭니다.
--
먼저, 트레일링 스탑이 걸릴만한 차트를 검색하셔서, (예: EURSUD 5분, 몇월 몇일 몇분..)
EA 첫상단에 날짜체크 하셔서, 해당 시간에 바로 EA가 동작되도록 세팅하시고
//예: 2시 15분부터 로직 체크
if ((Hour() >= 2) && (Min() >= 15))
{
}
OrderSend 또는 OrderModify 등등.. 의심이 가는 부분에 Print 함수로 로그를 찍습니다.
//예
Print("■ 로그 : " + OrderOpenPrice);
그러면, EA구동시 로그로 해당되는 값을 순서대로 확인할 수 있기 때문에.. 왜 어디서 문제가 있는지
확인이 가능합니다.
한번 원인을 잘 찾아보시길 바랍니다 ^^
답변주신대로 로그를 확인해보니 제가 원하는 조건(, 현재가격이 추적손절매시작가격보다 크고, 손절가격이 추적손절매가격보다 낮을때,)이 아님에도 손절가가 바뀌는 것을 보고 해당 조건을 자세히보니
if (Bid - OrderOpenPrice() > TrailingStop*Point*10)
{
if (OrderStopLoss() < Bid - TrailingStop*Point*10) // Bid - TrailingStop*Point*10가 아닌 Bid - TStopLoss*Point*10 로 바꿨어야 했습니다.
{
ticketM = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TStopLoss*Point*10, OrderTakeProfit(), Red);
return(0);
}
간단한 코딩인데도 막혀서 우울했었는데, 가을님 덕분에 날아갈 것 같네요..!
네이버 까페에서 뵌 적 있었는데 여기서도 활동하시나 봅니다! 다시한번 진심으로 감사드립니다
포럼이 굉장히 발전하고 있는거 같아서 기분이 좋네용 ㅎ
전 무슨말인지 못알아들으니 가만있겠습니다 ㅋㅋ
도협님이 암호화폐 얘기하면 또 그게 신기할 겁니다 ^^
포럼이 발전할 수 있도록 활동 많이 하겠습니다~ 물론 질문을 많이 올리겠지만요..ㅎㅎ
저는 그럴 능력이 안되니 투꿈무님이 제 몫까지 활동을 좀 ~ ㅋ;;