AOEA源码分享(EA部分)

avatar
· Views 7,384

具体设置参数按照默认参数,1000美金;如果小于1000美金需要自行调整开仓手数。感兴趣的可以好好去研究一下,这可以通过2001年到现在为止都没有爆仓并盈利的马丁策略源码,你们且用且珍惜。

#########源码部分
extern double StepLens = 160;
extern double ProfitPoints = 150;
double Lots=0.01;
extern double MaxLots = 0.05;
extern double MinLots = 0.01;
extern int   nMagicNumber = 198815;
extern int    TF          = 200;   
extern double StopK = 0.618;
extern bool  bECN   = false;
bool TrailingStop = false;
string comment = "AOEA_";
double SLSpread     = 0;
double Fee          = 0;
double NetOrderPrice = 0;
int   arrID[255]3;
int   arrK[255]2;
int   nPos = 0;
int   nLayer = 3;
int   nDir = 0;//buy = 1, sell = -1, no = 0
double nLots = 0.01;
double LLV, LLV1, HHV, HHV1;
bool  bReady = false;
//+------------------------------------------------------------------+
//| Init  function                                                   |
//+------------------------------------------------------------------+
   void init ()
   {
      int i = 0;
     
      arrK[i]0 = 1;
      arrK[i + 1]0 = 2;
      arrK[i]1 = 1;
      arrK[i + 1]1 = 2;
      nDir = 0;
      RebuildID();
      for(i = 2; i < nLayer; i++)
      {
         arrK[i]0 = arrK[i-2]0 + arrK[i-1]0;
         arrK[i]1 = arrK[i-1]1 * 2;
      }
     
      if(bECN)
      {
         SLSpread = 25;
         Fee = 3;
      }
     
   }
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double Sl = 0;
   int ticket;
   int k;
   string str;
   if(Bars<100)
     {
      Print("K线少于100根!");
      return(0); 
     }
   if(!bReady)
   {
      k = OrdersTotal();
      nPos = 0;
      for(int i=0; i<k; i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==nMagicNumber)
            {
               if(OrderCloseTime()>0) break;
               arrID[nPos]0 = OrderTicket();
               NetOrderPrice = OrderOpenPrice();
               if(OrderType() == OP_BUY) nDir = 1;
               else nDir = -1;
               Print("n = ",nPos, "   nDir = ", nDir, "  p = ", NetOrderPrice, "  id = ", arrID[nPos]0);
               nPos++;
            }
         }
      }
      Print("Orders =  ", k);
      bReady = true;
   }
  
   LLV = iCustom(NULL, 0, "HLV", TF, 0, 1);
   HHV = iCustom(NULL, 0, "HLV", TF, 1, 1);
   LLV1 = iCustom(NULL, PERIOD_H4, "HLV", TF, 0, 1);
   HHV1 = iCustom(NULL, PERIOD_H4, "HLV", TF, 1, 1);
   double AT = iAlligator(NULL, PERIOD_H4,13,6,8,3,5,3,MODE_SMA,PRICE_MEDIAN,MODE_GATORTEETH,1);
   double AJ = iAlligator(NULL, 0,13,6,8,3,5,3,MODE_SMA,PRICE_MEDIAN,MODE_GATORJAW,1);
   double MA = iMA(NULL,PERIOD_H4,60,0,MODE_SMA,PRICE_CLOSE, 1);
   //开单检查
   if(nDir == 0) //在没有持仓的情况下才能开新仓
     {
      // 检查资金
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("资金不足: ", AccountFreeMargin());
         return(0); 
        }
      // 检查开多单的可能性
      if(Ask <= LLV - Fee * Point() && Ask > LLV1 + (HHV1 - LLV1)*StopK + SLSpread * Point())
        {
         Sl = NormalizeDouble(HHV1 - (HHV1 - LLV1)*StopK, Digits);
         if(Ask < AT || Ask < MA) Lots = MinLots;
         else
           {
               Lots = MaxLots;
           }
         str = comment + "BUY_" + Period();
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,10,Sl,0,str,nMagicNumber,0,Blue);
         if(ticket>0)
           {
            NetOrderPrice = Ask;
            nPos = 0;
            arrID[nPos]0 = ticket;
            nDir = 1;
           }
         else Print("first多单发生错误 : ",GetLastError());
         return(0);
        }
      // 检查开空单的可能性
      if(Bid>= HHV + Fee * Point() && Bid < HHV1 - (HHV1 - LLV1)*StopK - SLSpread * Point())
        {
         Sl = NormalizeDouble(LLV1 + (HHV1 - LLV1)*StopK, Digits);
         if(Bid > AT || Bid > MA) Lots = MinLots;
         else
           {
               Lots = MaxLots;
           }
         str = comment + "SELL_" + Period();
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,10,Sl,0,str,nMagicNumber,0,Red);
         if(ticket>0)
           {
            NetOrderPrice = Bid;
            nPos = 0;
            arrID[nPos]0 = ticket;
            nDir = -1;
           }
         else Print("first空单发生错误 : ",GetLastError());
         return(0);
        }
      return(0);
     }
    else
    {
      TrailingST();
      if(CloseWin())
      {
        nDir = 0;
        nPos = 0;
        NetOrderPrice = 0;
      }
      if(NetOrderPrice != 0)
      {
         if(AJ > NetOrderPrice+arrK[nPos]0*StepLens*Point && Bid < AJ &&  nDir == -1)
         {
            k = nPos + 1;
            if(k >= nLayer) return(0);
            if(nDir == -1)
            {
               nLots = NormalizeDouble(arrK[k]1*Lots, 2);
               str = comment + "SELL_" + Period();
               ticket=OrderSend(Symbol(),OP_SELL,nLots,Bid,10,0,0,str,nMagicNumber,0,Red);
               if(ticket>0)
                 {
                  NetOrderPrice = Bid+arrK[nPos]0*StepLens*Point;
                  arrID[k]0 = ticket;
                  nPos = k;
                 }
               else Print("开空单发生错误 : ",GetLastError());
            }
            return(0);
         }
         if(AJ < NetOrderPrice-arrK[nPos]0*StepLens*Point && Ask > AJ && nDir == 1)
         {
            k = nPos + 1;
            if(k >= nLayer) return(0);
            if(nDir == 1)
            {
               nLots = NormalizeDouble(arrK[k]1*Lots, 2);
               str = comment + "BUY_" + Period();
               ticket=OrderSend(Symbol(),OP_BUY,nLots,Ask,10,0,0,str,nMagicNumber,0,Blue);
               if(ticket>0)
                 {
                  NetOrderPrice = Ask-arrK[nPos]0*StepLens*Point;
                  arrID[k]0 = ticket;
                  nPos = k;
                 }
               else Print("开多单发生错误 : ",GetLastError());
            }
            return(0);
         }
      }
    }
   return(0);
  }
bool CloseWin()
{
   int i;
   double A = Ask;
   double B = Bid;
   int flag = 0;
   if(CalProfit() == 0)
   {
      return(false);
   }
   for(i = nPos; i >=0; i--)
   {
      if(arrID[i]0== -1) continue;
     
      do{    
      if(OrderSelect(arrID[i]0,SELECT_BY_TICKET,MODE_TRADES))
      {
         if(OrderType() == OP_SELL && OrderMagicNumber() == nMagicNumber)
         {
            OrderClose(OrderTicket(),OrderLots(),A,10,Green);
            arrID[i]0 = -1;
         }
         if(OrderType() == OP_BUY && OrderMagicNumber() == nMagicNumber)
         {
            OrderClose(OrderTicket(),OrderLots(),B,10,Violet);
            arrID[i]0 = -1;
         }
      }
      while (!IsTradeAllowed()) Sleep(1000);
      RefreshRates();
      }while(arrID[i]0 != -1);
   }
  
   RebuildID();
  
   return(true);
}
void TrailingST()
{
   double Sl = 0;
  
   if(OrderSelect(arrID00,SELECT_BY_TICKET,MODE_TRADES))
   {
      if(OrderType() == OP_SELL && OrderMagicNumber() == nMagicNumber)
      {
         Sl = NormalizeDouble(LLV1 + (HHV1 - LLV1)*StopK, Digits);
         if(Sl < OrderStopLoss())
         {
            OrderModify(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(), 0, Red);
         }
      }
      if(OrderType() == OP_BUY && OrderMagicNumber() == nMagicNumber)
      {
         Sl = NormalizeDouble(HHV1 - (HHV1 - LLV1)*StopK, Digits);
         if(Sl > OrderStopLoss())
         {
            OrderModify(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(), 0, Red);
         }
      }
   }
}
int CalProfit()
{
   int i;
   double dProfit =0;
   int flag = 0;
   int n = 0;
   for(i = 0; i < nLayer; i++)
   {
      if(arrID[i]0== -1) continue;
      if(OrderSelect(arrID[i]0,SELECT_BY_TICKET,MODE_TRADES))
      {
         if(OrderCloseTime() != 0) return(2);
         dProfit += OrderProfit() + OrderCommission();
      }
   }
  
   for(i = OrdersTotal()-1; i>=0;i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == nMagicNumber)
         {
            if(OrderTicket() == arrID00)
            {
               n = nPos + 1;
               break;
            }
            else
            {
               n++;
            }
         }
      }
   }
  
   if(n != nPos +1)
   {
      flag = 1;
   }
  
   double AT = iAlligator(NULL, PERIOD_H4,13,6,8,3,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,1);
  
   bool bCon = (Bid > AT && nDir == -1) || (Ask < AT && nDir == 1);
   if(!bCon && dProfit >= Lots * ProfitPoints)
   {
      flag = 1;
   }
   else if(bCon && dProfit >= Lots * ProfitPoints / 3)
   {
      flag = 1;
   }
   return(flag);
}

void RebuildID()
{
    for(int i = 0; i < nLayer; i++)
    {
       {
          arrID[i]0 = -1;
       }
    }
}

Tuyên bố miễn trừ trách nhiệm: Quan điểm được trình bày hoàn toàn là của tác giả và không đại diện cho quan điểm chính thức của Followme. Followme không chịu trách nhiệm về tính chính xác, đầy đủ hoặc độ tin cậy của thông tin được cung cấp và không chịu trách nhiệm cho bất kỳ hành động nào được thực hiện dựa trên nội dung, trừ khi được nêu rõ bằng văn bản.

Bạn thích bài viết này? Hãy thể hiện sự cảm kích của bạn bằng cách gửi tiền boa cho tác giả.
avatar
Trả lời 0

Tải thất bại ()

  • tradingContest