练手MQL5

 

2

 
#property copyright "text"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <shuju.mqh>
#include <jiaoyi.mqh>
input int      magic=888; //魔幻号
input double   lot  =0.1;//手数
input int      tp   =200;//止盈
input int      sl   =300;//止损
input int   盈利多少点=100;
input int   move_SL =50; //移动止损
input int   最近多少根Zg均值 = 11;//用于优化策略
input ENUM_TIMEFRAMES periodH1 = PERIOD_H1;//小时周期K
input ENUM_TIMEFRAMES periodH4 = PERIOD_H1;//大周期K
input int bars = 500;

input int      ExtDepth=12;
input int      ExtDeviation=5;
input int      ExtBackstep=3;
shuju sj;
jiaoyi jy;
int a;
double zigzagdata[11][3];
double zigzag[];
double start_index1;
double start_index2;//记录挂单在高点还是地点的状态
double start_price1;
double start_price2;
double sec_price1;
double sec_price2;
ulong   order_buy = 0; 
ulong   order_sell= 0;
int OnInit()
  {
   a = iCustom(Symbol(),periodH1,"Examples\\ZigZag",ExtDepth,ExtDeviation,ExtBackstep);
    ArraySetAsSeries(zigzag,true);
   EventSetTimer(3600);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
bool market(double &array[][2],double price_ask,double price_bid)
    {
      double  sum1 = 0.0;
      double  sum2 = 0.0;
      double average = 0.0;
      int   a  =0;
      
      
      for(int i = 最近多少根Zg均值-1; i>0 ; i--)
       { 
        if(array[i][0] = 1 && array[i-1][0]>array[i][0])
          {
            sum1 = array[i-1][0] - array[i][0];
          }
         if(array[i][0] = 2 && array[i-1][0]<array[i][0])
          {
            sum2 = array[i][0] - array[i-1][0];
          }
        }
       average = (sum1+sum2)/10;
       if(average > 0.001)
         a = 1;
       return(a);
        
    }
void OnTick()
  {
   double open_buy,open_sell;
   datetime optime_buy,optime_sell;
   double lots;
   int total       = OrdersTotal();
   int posit_total = PositionsTotal();
   double now_pice = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
   double now_pice2= SymbolInfoDouble(Symbol(),SYMBOL_BID);
   //if(market(zigzagdata,now_pice,now_pice2)==true)
//+------------------------------------------------------------------+
//|                     buy                                             |
//+------------------------------------------------------------------+
   //jy.getlasthistory(Symbol(),DEAL_TYPE_SELL ,0,open_buy,optime_buy,lots);//最后一张多单
   if(zigzagdata[1][1] == 1 )   //高点挂多单
           {
             //挂单且记录下挂单号
             double pricebuy = zigzagdata[1][0]+5*_Point;
             if(zigzagdata[1][0]>now_pice)
               {
                 if(total==0)
                  {
                    order_buy = jy.buyguaplus(pricebuy,Symbol(),lot,sl,tp,"挂多单",magic,0); 
                    start_index1 = zigzagdata[1][1];   
                    start_price1 = zigzagdata[1][0];
                    sec_price1   = zigzagdata[2][0];
                    
                  } 
                 if(total>1)
                  {
                    for(int i = 0; i < total;i++)
                      {
                        OrderGetTicket(i);
                        if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP && OrderGetInteger(ORDER_MAGIC)==magic)
                          {
                              break;
                          }
                        if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP && OrderGetInteger(ORDER_MAGIC)==magic && total==1)
                          {
                              order_buy = jy.buyguaplus(pricebuy,Symbol(),lot,sl,tp,"挂多单",magic,0); 
                              start_index1 = zigzagdata[1][1];   
                              start_price1 = zigzagdata[1][0]; 
                              sec_price1   = zigzagdata[2][0];
                          }
                      }
                  }            
               }         
           }  
           
           
           
  //---什么情况下删除定单

    if(start_index1 != zigzagdata[1][1] && start_price1 >now_pice && sec_price1>now_pice)
      {
         for(int i = 0; i <total ;i++)
            {
               OrderGetTicket(i);
               if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP)   
                 { 
                   if(OrdersTotal()>0)
                     jy.delor_one_ders(Symbol(),order_buy,magic);
                 }       
            }
      }
       
//+------------------------------------------------------------------+
//|                buy end ---next sell                                                 |
//+------------------------------------------------------------------+
   //jy.getlasthistory(Symbol(),DEAL_TYPE_BUY ,0,open_sell,optime_sell,lots);//最后一张空单

    if(zigzagdata[1][1] == 2 )   //低点挂空单
        {
       //挂单且记录下挂单号
          double pricesell = zigzagdata[1][0]-5*_Point;
          if(zigzagdata[1][0]<now_pice2)
            { 
              if(total == 0)
                {
                    order_sell = jy.sellguaplus(pricesell,Symbol(),lot,sl,tp,"挂空单",magic,0); 
                    start_index2 = zigzagdata[1][1];
                    start_price2 = zigzagdata[1][0]; 
                    sec_price2   = zigzagdata[2][0];
                } 
              if(total > 1) 
                {
                    for(int i = 0; i < total;i++)
                      {
                        OrderGetTicket(i);
                        if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP && OrderGetInteger(ORDER_MAGIC)==magic)
                          {
                              break;
                          }
                        if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP && OrderGetInteger(ORDER_MAGIC)==magic && total==1)
                          {
                              order_sell = jy.sellguaplus(pricesell,Symbol(),lot,sl,tp,"挂空单",magic,0); 
                              start_index2 = zigzagdata[1][1];
                              start_price2 = zigzagdata[1][0];
                              sec_price2   = zigzagdata[2][0]; 
                          }
                      }
                  }            
                }
            }

       
        
//---什么情况下删除定单
    
    if( start_index2 != zigzagdata[1][1] && start_price2 <now_pice && sec_price2<now_pice)
      {
         for(int i = 0; i <total ;i++)
            {
               OrderGetTicket(i);
               if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)   
                 { 
                   if(OrdersTotal()>0)
                     {
                       jy.delor_one_ders(Symbol(),order_sell,magic);
                       start_index2 = 0;
                     }
                 }       
            }
      }
//+------------------------------------------------------------------+
//|                            sell_end                                      |
//+------------------------------------------------------------------+

       /*if(OrdersTotal() == 0 && posit_total == 0)
         {
             if(zigzagdata[1][1] == 1  && zigzagdata[1][0] > now_pice && zigzagdata[2][0] < now_pice2)
                {
                   //挂单且记录下挂单号
                   double pricebuy = zigzagdata[1][0]+5*_Point;
                   double pricesell =zigzagdata[2][0]- 5*_Point;
                   jy.buyguaplus(pricebuy,Symbol(),lot,sl,tp,"挂多单",magic,0);
                   jy.sellguaplus(pricesell,Symbol(),lot,sl,tp,"挂空单",magic,0);
                } 
                    //后加的策略二号
             if(zigzagdata[1][1] == 2  && zigzagdata[1][0] < now_pice && zigzagdata[2][0] > now_pice2)
                {
                   //挂单且记录下挂单号
                    double pricesell = zigzagdata[1][0]-5*_Point;
                    double pricebuy =zigzagdata[2][0]+ 5*_Point;
                   jy.buyguaplus(pricebuy,Symbol(),lot,sl,tp,"挂多单",magic,0);
                   jy.sellguaplus(pricesell,Symbol(),lot,sl,tp,"挂空单",magic,0);
                }                 
          }
        
     if(total == 1)
       {
         for(int i = 0; i < total; i++)
          {
            OrderGetTicket(i);
            jy.delorders(Symbol(),magic);
          }
       }
//--- 遍历挂单成交的情况

     if(posit_total != 0)
       {
         for(int i = 0; i<posit_total ; i++)
            {
              string name =  PositionGetSymbol(i);
              double open = PositionGetDouble( POSITION_PRICE_OPEN);
              //搜索多单且盈利超过10个点时,修改止损到盈利5点
              if(PositionGetInteger(POSITION_MAGIC) ==magic && PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_BUY
                  && (PositionGetDouble( POSITION_PRICE_CURRENT)- PositionGetDouble( POSITION_PRICE_OPEN)) >= 盈利多少点* _Point)
                {
                  double sll_1 = move_SL*_Point+PositionGetDouble( POSITION_PRICE_OPEN);
                  double tpl_1 = tp*_Point+PositionGetDouble( POSITION_PRICE_OPEN);
                  jy.modifysltp(Symbol(),POSITION_TYPE_BUY,sll_1,tpl_1,magic);
                  //jy.modifysltp(Symbol(),POSITION_TYPE_BUY,(move_SL+PositionGetDouble( POSITION_PRICE_OPEN)),(tp*_Point+PositionGetDouble( POSITION_PRICE_OPEN)),magic);
                  //jy.modifysltp(Symbol(),POSITION_TYPE_BUY,1.13484,1.1399,0);
                }
               //搜索空单且盈利超过10个点时,修改止损到盈利5点 
              if(PositionGetInteger(POSITION_MAGIC) ==magic && PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_SELL
                  && (PositionGetDouble( POSITION_PRICE_OPEN)-PositionGetDouble( POSITION_PRICE_CURRENT)) >= 盈利多少点* _Point)
                {
                  double sll = PositionGetDouble( POSITION_PRICE_OPEN)-move_SL*_Point;
                  double tpl = PositionGetDouble( POSITION_PRICE_OPEN)-tp*_Point;
                  jy.modifysltp(Symbol(),POSITION_TYPE_SELL,sll,tpl,magic);
                  //jy.modifysltp(Symbol(),POSITION_TYPE_SELL,move_SL,tp,magic);
                }                
            }
          
       } */   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   double high[];
   ArraySetAsSeries(high,true);
   CopyHigh(Symbol(),0,0,bars,high);
   /*datetime time[];
   ArraySetAsSeries(time,true);
   CopyTime(Symbol(),0,0,bars,time);*/
   CopyBuffer(a,0,0,bars,zigzag);
   int index = 0;
   for(int i = 0; i < bars; i++)
     {
      if(zigzag[i] > 0 && zigzag[i] == high[i] && index < 10)
       {
        zigzagdata[index][0] = zigzag[i];
        zigzagdata[index][1] = 1;
        zigzagdata[index][2] = 6;//记录下高点的下标index
                index ++;
       }
       if(zigzag[i] > 0 && zigzag[i] != high[i] && index < 10)
       {
        zigzagdata[index][0] = zigzag[i];
        zigzagdata[index][1] = 2;
        zigzagdata[index][2] = 9;//记录下地址的时间                
                index ++;     
        }
     }   
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=0.0;
//---

//---
   return(ret);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+
原因: