과거에 저는 자동매매 시스템(EA)을 사용해볼까 생각했었습니다. 이번 글에서는 제가 만든 가장 간단한 EA를 소개하고자 합니다. 이 EA는 단일 통화쌍에서 작동하며, 시간 설정, 로트 수, 손절매 및 이익 실현 등을 메뉴 속성에서 조정할 수 있습니다.

extern ENUM_TIMEFRAMES TF = PERIOD_CURRENT;// 시간 프레임 선택 extern int period = 8;// DeMarker 기간 extern double lt = 0.01;// 로트 수 extern int sl = 100;// 손절매 extern int tp = 100;// 이익 실현 extern double OB = 0.7;// 과매도 extern double OS = 0.3;// 과매수 extern bool OPENBAR = false;// 새로운 바의 시작 가격에서 거래
EA의 비밀은 변수를 세 부분으로 나누는 것입니다:
1. 데이터 | 시간 프레임
2. 주문
3. 통화쌍
//+------------------------------------------------------------------+ //-- 시간 프레임 | 지표 double dmrk[5]; int signal =-1;//-- 0.매수 1.매도 int hold = 0; //-- 주문 int ticket =0; double lot =0.0; int typ =-1; //-- 통화쌍 datetime t1=0; bool newbar=false; bool entry =false; //+------------------------------------------------------------------+
OnInit() 함수에서는 DeMarker 지표 배열 변수를 초기화하고 특정 브로커 요구 사항에 따라 최소 거래 로트를 확인합니다.
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnInit() { ArrayInitialize(dmrk,0.0); //--- const double test_lot = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(lt<test_lot) lt = test_lot; }
OnTick() 함수에서는 지표를 계산하고 매수 및 매도 신호를 결정합니다.
//--------------------------------------------------------------------------- signal = -1; //--------------------------------------------------------------------------- //--- 계산 for(int i=0; i<ArraySize(dmrk); i++) { dmrk[i] = iDeMarker(Symbol(),TF,period,i); } //--- if(dmrk[1] > OB) { hold = 1;// 설정 } else if(dmrk[1] < OS) { hold = -1;// 설정 } else { hold = 0;// 초기화 } if(hold == 1) { if(dmrk[0]<OB && dmrk[1]>OB) { signal = OP_SELL; } } if(hold == -1) { if(dmrk[0]>OS && dmrk[1]<OS) { signal = OP_BUY; } }
매수 및 매도 신호를 열기 위해...
//--------------------------------------------------------------------------- if(signal != -1) if(newbar==true) if(entry==false)// 문 열기 { //--- entry =true;// 설정 //--- if(signal == OP_BUY) { ticket = OrderSend(Symbol(),OP_BUY,lt,Ask,(int)((Ask-Bid)/Point, sl>0?Bid-sl*Point:0.0, tp>0?Bid+tp*Point:0.0, EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold), EANumber, 0, clrBlue); signal=-1; //hold =0; }// 초기화 }// 신호 초기화 }
마지막으로 종료를 위해...
if(entry == true) // 종료 { if(OrderSelect(ticket,SELECT_BY_TICKET)) { if(OrderCloseTime() == 0)//-- 주문 활성 거래 { /* 종료 조건 */ //entry = false; } //else if(OrderCloseTime() != 0)//-- 수동 종료 2. 손절매/이익 실현 3. EA { entry = false;// 초기화 } } }


이제 여러분도 DeMarker 지표를 기반으로 한 간단한 MT4 자동매매 시스템을 통해 효과적인 트레이딩을 경험해보시기 바랍니다!