geek005 发表于 2019-8-10 21:15:32

【宽客EA源码】震荡剥头皮 - MetaTrader 4EA

分享一个震荡剥头皮EA源码。本源码是一个基于MQL4的源码策略。


#property copyright "YANG"
#property version   "1.00"
#property copyright "EA"
#property strict

extern bool   k_g_1 =false;   
extern int    fx_yc =100;       //Abnormal fluctuation
extern double lots=0.02;      //lots
extern floatzhi_s =1;         //stop($)
extern int    zhi_y =15;      //Take profit
extern int   xiao_b =6;         //1 hour profit multiple
extern int   jie_j=10;      //Long position profit multiple
extern int    dian_c=2;         //Spread
extern int    magic =88888888;

int    wei_z =2,
       wei_s =100;   
      
double dian_z=0.01,   
       lots_s;         

int    f_z=0;         
      
int    take;   
datetime time;   
bool   fx_jj =false;      
//+------------------------------------------------------------------+
//                                 |
//+------------------------------------------------------------------+
int OnInit()
{
      datetime tom=0;
      int AA_1=OrdersTotal();
      if(Point < 0.001)
   {
         dian_z=0.00001;
         wei_z=5;
         wei_s=100000;
   }
   else if(Point == 0.001)
   {
         dian_z=0.001;
         wei_z=3;
         wei_s=1000;
   }
   
   EventSetTimer(1);
   for(int AA=0; AA<AA_1; AA++)
   {
         if(!OrderSelect(AA, SELECT_BY_POS, MODE_TRADES))break;
         if(OrderSymbol() != Symbol())continue;
         if(OrderMagicNumber() != magic) continue;
         
         if(OrderOpenTime() > tom)
         {
             take=OrderTicket();
             tom=OrderOpenTime();
             continue;
         }
         
   }
//---
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   
    EventKillTimer();
}

//+------------------------------------------------------------------+
//|                                       |
//+------------------------------------------------------------------+
void OnTick()
{
    static double prof_lr;   
    static double prof_lr_1=0;
    static datetime time_1 =0;
    int    or_d=0;            
    double jj_ok=0;            
    bool   bo=false;         
    int    AA_1=OrdersTotal();
   
    double stop_lr=0;         
    datetime tme=0;
    int   xy=0;

    double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(lots<min_volume)
   {
      Print("交易量小于允许的最小交易量,SYMBOL_VOLUME_MIN=%.2f");
      return;
   }   
    for(int A=0; A < AA_1; A++)
    {
      if(!OrderSelect(A, SELECT_BY_POS, MODE_TRADES))break;
      if(OrderSymbol() != Symbol())continue;
      if(OrderMagicNumber() != magic) continue;
      
      or_d++;
      
      if(OrderProfit() < 0)
               stop_lr +=OrderSwap()+OrderProfit()+OrderCommission();
               
         
      if(TimeCurrent()-14400 <= OrderOpenTime())fx_jj=true;
   
      if(OrderType() == OP_BUY)
      {
            if(OrderClosePrice() - OrderOpenPrice() > zhi_y*dian_z)
            {
                jj_ok=OrderSwap()+OrderProfit()+OrderCommission();
                prof_lr += jj_ok;
                prof_lr_1 +=jj_ok;
               
                if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), dian_c))
                {
                  
                  
                  if(OrderTicket() != take)continue;
                  
                      if(f_z==2 && Close - Open < fx_yc*dian_z && Close - Open > 0)
                      {
                           take=OrderSend(Symbol(), OP_SELL, lots_s, Ask, dian_c, 0, 0, "12", magic);
                           time=Time;
                           continue;
                      }
                      else if(f_z==1)
                      {
                         take=OrderSend(Symbol(), OP_BUY, lots_s, Bid, dian_c, 0, 0, "11", magic);
                        time=Time;
                        continue;
                      }
                      take=0;
                }
            }
         
            if(OrderTicket() != take)continue;
            if(OrderOpenPrice()-OrderClosePrice() > zhi_y*dian_z)
            {
               
                if(f_z==2)
                {
                     take=OrderSend(Symbol(), OP_SELL, lots_s, Ask, dian_c, 0, 0, "10", magic);
                     time=Time;
                     continue;
                }
                else if(f_z==1)
                {
                   take=OrderSend(Symbol(), OP_BUY, lots_s, Bid, dian_c, 0, 0, "9", magic);
                  time=Time;
                  continue;
                }
            }
      }
      else if(OrderType() == OP_SELL)
      {
            if(OrderOpenPrice() - OrderClosePrice() > zhi_y*dian_z)
            {
                jj_ok=OrderSwap()+OrderProfit()+OrderCommission();
                prof_lr += jj_ok;
                prof_lr_1 +=jj_ok;
                if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), dian_c))
                {
                  
                  
                   if(TimeHour(TimeCurrent())==0)continue;
                  if(OrderTicket()!=take)continue;
                   if(f_z==2 && Open - Close < fx_yc*dian_z && Open - Close > 0)
                   {
                        take=OrderSend(Symbol(), OP_BUY, lots_s, Bid, dian_c, 0, 0, "8", magic);
                        time=Time;
                        continue;
                   }
                   else if(f_z==1)
                   {
                      take=OrderSend(Symbol(), OP_SELL, lots_s, Ask, dian_c, 0, 0, "7", magic);
                         time=Time;
                         continue;
                   }
                   take=0;
                     
                }
            }
            if(OrderTicket()!= take)continue;
            if(OrderClosePrice() - OrderOpenPrice() > zhi_y*dian_z)
            {
               
                if(f_z==2)
                {
                     take=OrderSend(Symbol(), OP_BUY, lots_s, Bid, dian_c, 0, 0, "6", magic);
                     time=Time;
                     continue;
                }
                else if(f_z==1)
                {
                   take=OrderSend(Symbol(), OP_SELL, lots_s, Ask, dian_c, 0, 0, "5", magic);
                      time=Time;
                      continue;
                }
            }
      }
    }
   
    if(or_d==0)
    {
      lots_s=lots;
      time=0;
    }
    if(time_1==0 && prof_lr_1 > 0)
   {
       time_1=TimeCurrent()+900;
   }
   
      if(time != Time)
      {
         if(fx_jj)jj_ok=or_ls();
         xy=0;
         for(int AA=0; AA<AA_1; AA++)
         {
               if(!OrderSelect(AA, SELECT_BY_POS, MODE_TRADES))break;
               if(OrderSymbol() != Symbol())continue;
               if(OrderMagicNumber() != magic) continue;
               
               
               if(xy >= 3)
               {
                  bo=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), dian_c);
                  continue;
               }
               if(prof_lr + stop_lr >= zhi_s || prof_lr + stop_lr >= NormalizeDouble(zhi_s/2, 2))
               {
                   bo=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), dian_c);
                   take=0;
                   xy=3;
                   prof_lr=0;
                   continue;
               }
               if(prof_lr_1 + stop_lr >= zhi_s*xiao_b && time_1 < TimeCurrent())
               {
                   bo=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), dian_c);
                   xy=4;
                   take=0;
                   time_1=TimeCurrent()+900;
                   prof_lr_1=0;
                   continue;
               }
               
               if(fx_jj)
               {
                   if(jj_ok <= 0)continue;
                   if(jj_ok + stop_lr >= zhi_s*jie_j)
                   {
                      bo=OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), dian_c);
                      xy=5;
                      continue;
                   }
                     
               }
               
         }
         
         xy=0;
         
          if(or_d > 0 && take > 0)return;
         
         for(int xx=OrdersTotal()-1; xx>=0; xx--)
          {
            if(!OrderSelect(xx, SELECT_BY_POS, MODE_TRADES))break;
            if(OrderSymbol() != Symbol())continue;
            if(OrderMagicNumber() != magic) continue;
            
            if(OrderOpenTime() > tme && OrderType()==OP_BUY)
            {
                  time=OrderOpenTime();
                  xy=1;
            }
            else if(OrderOpenTime() > tme && OrderType()==OP_SELL)
            {
                  time=OrderOpenTime();
                  xy=2;
            }
          }
         
          if(xy==1)
          {
            take=OrderSend(Symbol(), OP_SELL, lots_s, Ask, dian_c, 0, 0, "4", magic);
            if(take > 0)
                time=Time;
          }
          else if(xy==2)
          {
            take=OrderSend(Symbol(), OP_BUY, lots_s, Bid, dian_c, 0, 0, "3", magic);
            if(take > 0)
                time=Time;
          }
          else
          {
            if(Open > Close)
            {
                  take=OrderSend(Symbol(), OP_SELL, lots_s, Ask, dian_c, 0, 0, "2", magic);
               if(take > 0)
                   time=Time;
            }
            else
            {
                  take=OrderSend(Symbol(), OP_BUY, lots_s, Bid, dian_c, 0, 0, "1", magic);
               if(take > 0)
                   time=Time;
            }
          }
          if(take<0) f_z=0;
      
      }
   
}
void OnTimer()
{
      
      int seconds=0;// the left seconds of the current bar
      int h = 0; //Hour
      int m = 0; //Minute
      int s = 0; //Secondhh:mm:ss
      int   xy=0;
      datetime timee=iTime(Symbol(),PERIOD_CURRENT,0),
               tme=0;
      //double   close = iClose(Symbol(),PERIOD_CURRENT,0);
      
      seconds=PeriodSeconds(PERIOD_CURRENT) -(int)(TimeCurrent()-timee);

      h = seconds/3600;
      m = (seconds - h*3600)/60;
      s = (seconds - h*3600 - m*60);
      
      if(m >= 3 && s>=0) f_z=1;
      else if(m < 3)f_z=2;
      
}
double or_ls()
{
    static datetime tim=0;
    double   prof_lr4=0;   
    datetime tome;
    if(!k_g_1)return(0);
    tome=TimeCurrent()-72000;
    for(int x=OrdersHistoryTotal()-1; x>=0; x--)
    {
      if(!OrderSelect(x, SELECT_BY_POS, MODE_HISTORY))
      {
            tim=TimeCurrent()+600;
            break;
      }
      if(OrderSymbol() != Symbol())continue;
      if(OrderMagicNumber() != magic)continue;
      if(OrderOpenTime() > tome)
      {
         prof_lr4 += OrderSwap()+OrderProfit()+OrderCommission();
      }
    }
   
    return(prof_lr4);
}
页: [1]
查看完整版本: 【宽客EA源码】震荡剥头皮 - MetaTrader 4EA