系统交易 게시글

使用DeMarker指标的简单EA - 适用于MetaTrader 4的交易助手

첨부파일
32418.zip (1.46 KB, 다운로드 0회)

大家好,今天我想和大家分享一个我自己开发的非常简单的交易助手(EA),它是基于DeMarker指标的。之前我一直在考虑如何利用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;// 在新K线开盘价交易

这里有一个小秘密,我把变量分成三部分:
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;
              }//重置
            else
               if(signal == OP_SELL)
                 {
                  ticket = OrderSend(Symbol(),OP_SELL,lt,Bid,(int)((Ask-Bid)/Point,
                                     sl>0?Ask+sl*Point:0.0,
                                     tp>0?Ask-tp*Point:0.0,
                                     EAName+":signal= "+IntegerToString(signal)+":hold= "+IntegerToString(hold),
                                  EANumber,
                                  0,
                                  clrRed);
                  signal=-1;
                  }//重置信号

           }

关于平仓的部分...

   if(entry == true) // 平仓
     {

      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime() == 0)//-- 订单仍在交易中
           {
            /*  待处理的平仓条件  */
            //entry = false;
           }
         //else
            if(OrderCloseTime() != 0)//--  手动平仓 2.止损止盈 3. EA平仓
              {
               entry = false;//重置entry
              }
        }
     }

  



연관 포스트

댓글 (0)