自制通道交易法.mq4

    xiaoxiao2021-04-15  40

    关于止损点的问题,不建议超出几个固定点就止损。

    价格到达上下轨位,下单的止损为前一高点,高点与轨道线价格差建议不超20点,要以盈亏比设定是否合算。如果超过前期高点,考虑反向开单,开仓时点为突破止损线后回采。 //============原则

    高胜算:

    盈亏的概率(次数亏少盈多)

    盈亏的空间(金额点数上亏少盈多)

    盈亏的频率(时间)(避免频繁交易,适度)

    //===========实施方案

    消息:基本面

    无重大消息,按势走;

    重大消息,按行情EA做;

    势:200日、100日,50日MA,通道线、Chart以4小时及日线为准。1小时Chart进场准备。

    态:实际上在势的关键位置,要考虑Bar的形态组合,如孕线,外包线等。指标的优劣,sdr,macd,rsi,kd

    位:盈亏比,止损与盈利空间是否合适。

     

     

     

     

    //自制通道线买入卖出法.mq4 //+-----------半自动,边测试完善---------------------+ //|                        自制通道线买入卖出法.mq4 | //|                        Copyright 2016, ong. | //|                        https://www.ong.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, ong." #property link      "https://www.ong.com" #property version   "1.00" #property strict //----draw chanel and paste it's name-------- //extern string ChanelnameA="ch_EURUSD"; string ChanelnameA=NULL;

    extern string currency="通道线作用货币名"; extern string Strade="紧急交易关闭";  extern double 保平触发值=100; extern double 利润防守比例=0.7; extern double Lot=0.03;//下单量

    //---S1--if rsi_sell_1<45,can't sell extern double rsi_sell_1=50; extern double rsi_sell_2=70; extern double sto_sell_1=45; //---S2--if rsi_sell extern double rsi_sell_3=30; extern double sto_sell_2=40; //------------------------------------ //---B1--if rsi_sell_1<45,can't buy extern double rsi_buy_1=30; extern double rsi_buy_2=50; extern double sto_buy_1=75; //---B2--if rsi_sellsto_sell_2,cann't buy; extern double rsi_buy_3=75; extern double sto_buy_2=90; //---------- double rsi0=0; double sto0=0; //----------------------------------------------------------------------------------

    double arraya[4];

    int MagicBuyLimit=1101; int MagicSellLimit=1102; int glbOrderType=NULL; int glbOrderTicket=NULL; string glbOrderSymbol=NULL; double glbOrderOpenPrice=NULL; double glbOrderStopLoss=NULL; double glbOrderLots=NULL; double glbOrderTp=NULL; double glbOrderP=NULL; double glbOrderPoint=NULL; double p_sl=0; double glbOrderDigits=NULL; double glbMinlot=NULL; string PH="ph_"+StringSubstr(ChanelnameA,3,0);

    //每一次编写,并不刷新MT窗口中"已经运行的"EA参数设定值。只有在MT中退出EA,再运行"编写"EA,上部的外部参数才生效。 //+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()   {                   return(INIT_SUCCEEDED);

      }

    //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   { //---   }

    //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick()   {

    //----only effect to the order that it's magicnumber is null(无幻号订单,手动单的自动处理)--开始   if (OrderFind(NULL))   {                 //---if the value of  "sl","tp" isn't set,then set that firstly!       if (glbOrderType==0||glbOrderType==2||glbOrderType==4)        {         if (glbOrderType==0)         {         double yldsb=(Bid-glbOrderOpenPrice);//盈利点数         //----          if (yldsb>=80*glbOrderPoint&&glbOrderStopLoss<(glbOrderOpenPrice+yldsb*glbOrderPoint*0.5))            {            double slb=NULL;            if (yldsb==80*glbOrderPoint)  slb=glbOrderOpenPrice;            if (yldsb>150*glbOrderPoint && yldsb<400*glbOrderPoint )  slb=glbOrderOpenPrice+yldsb*0.5;            if (yldsb>400*glbOrderPoint)  slb=glbOrderOpenPrice+yldsb*0.7;            if (OrderModify(glbOrderTicket,glbOrderOpenPrice,slb,glbOrderTp,0,clrRosyBrown)==FALSE)             Print("自选单错误号:",GetLastError());            }          }                            if (glbOrderStopLoss==NULL )            {            if (OrderModify(glbOrderTicket,glbOrderOpenPrice,glbOrderOpenPrice-150*glbOrderPoint,glbOrderOpenPrice+MathAbs(arraya[2]),0,clrRosyBrown)==FALSE)            Print("自选单错误号:",GetLastError());                    }

            }                if (glbOrderType==1||glbOrderType==3||glbOrderType==5)        {        if (glbOrderType==1)         {         double yldss=(glbOrderOpenPrice-Ask);//盈利点数        //----         if (yldss>=80*glbOrderPoint&&glbOrderStopLoss>(glbOrderOpenPrice-yldss*0.5))           {           double sls=NULL;           if (yldss==80*glbOrderPoint)  sls=glbOrderOpenPrice;           if (yldss>150*glbOrderPoint && yldss<400*glbOrderPoint )  sls=glbOrderOpenPrice+yldss*0.5;           if (yldss>400*glbOrderPoint)  sls=glbOrderOpenPrice+yldss*0.7;         

                        if (OrderModify(glbOrderTicket,glbOrderOpenPrice,sls,glbOrderTp,0,clrRosyBrown)==FALSE)            Print("自选单错误号:",GetLastError());           }         }                            if (glbOrderStopLoss==NULL)//未设止损的,设定止损           {           if (OrderModify(glbOrderTicket,glbOrderOpenPrice,glbOrderOpenPrice+150*Point,glbOrderOpenPrice-MathAbs(arraya[2])*0.8,0,clrRosyBrown)==FALSE)            Print("自选单错误号:",GetLastError());                   }         }

       }

    //-----------------手动单处理结束——————————————————————————————————————

    //--- //-在当前"图表Chart"中找物件,找到返回窗口(window)号,主窗为0,其它1,2....否则负数-- // if find the chanel line in the original "currncy" chart of draw the line .  //"if" operator only effect to the next line, not all yet! if you want effcet to muti line,use the {} include it!  if (Strade!="紧急交易关闭")   {    ;    PlaySound("alert.wav");   }   if (Lot>0.1)   {    ;    PlaySound("alert.wav");   }          ChanelnameA="ch_"+Symbol();

    // Print("趋势线名称",ChanelnameA);

       if (ObjectFind(0,ChanelnameA)==0 && Symbol()==StringSubstr(ChanelnameA,3,0)&& Lot<=0.1)       {  //-----------------------------------------------------------  //-----------------------------------------------------      string name=ChanelnameA;     //调动自定义通道函数     chanel(name);        double sl =arraya[0]+ 150*Point;//selllimit's sl     double tp =arraya[1]+ 150*Point;//selllimit's tp        Print("卖单时的sl::",sl);     double slb =arraya[1]- 150*Point;//buylimit's sl     double tpb =arraya[0]- 150*Point;//buylimit's tp          rsi0=iRSI(NULL,0,14,PRICE_CLOSE,0); sto0=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);

     

             //Print("数组高值symbol----",Symbol(),":::",arraya[0]);    //Print("fffffffffffffff",glbOrderSymbol); //   Print("数组低值",arraya[1]); //   Print("数组差值",arraya[2]);

        //%%%%-------order not exist------------------------------------------------------------     //%%%%-------order not exist------------------------------------------------------------        // if order's symbol = the chart's symbol and magicnumber not exist     //---selllimit no exist------------               if (OrderFind( MagicSellLimit)==false &&arraya[3]<1)        {        //-----sell紧急模式,such as "sell_EURUSD"        //Print("操作方向",StringSubstr(Strade,0,4),"商品名",StringSubstr(Strade,5,0));         if (StringSubstr(Strade,0,4)=="sell" && StringSubstr(Strade,5,0)==Symbol())           {            if (OrderSend(Symbol(),OP_SELL,Lot,Ask,3,sl, tp,"",MagicSellLimit,0,Red)==false)                  Print("err(",GetLastError(),")");                           Print("操作方向",StringSubstr(Strade,0,4),"商品名",StringSubstr(Strade,5,0));           }               //-----sell正常模式-----          if (((rsi0>rsi_sell_1&&rsi0                       {             Print("可执行卖","sto0的值",sto0);              if ((arraya[0]-Ask)Ask && Strade=="紧急交易关闭" )               {                 if (OrderSend(Symbol(),OP_SELLLIMIT,Lot,arraya[0]-Point*50,3,sl, tp,"",MagicSellLimit,0,Red)==false)                  Print("err(",GetLastError(),")");               }            }                     }       // ----buylimit no exist ----        if (OrderFind( MagicBuyLimit)==false && arraya[3]<1)        {        //------buy(bull)-紧急模式---such as bull_EURUSD----                if (StringSubstr(Strade,0,4)=="bull" && StringSubstr(Strade,5,0)==Symbol())           {            if (OrderSend(Symbol(),OP_BUY,Lot,Bid,3,slb, tpb,"",MagicBuyLimit,0,Red)==false)                Print("err(",GetLastError(),")");                        Print("操作方向",StringSubstr(Strade,0,4),"商品名",StringSubstr(Strade,5,0));           }               //------buy(bull) 正常模式-------         if (((rsi0>rsi_buy_1&&rsi0sto_buy_1)||rsi0>rsi_buy_3 || sto0>sto_buy_2)==false)                   {            Print("可执行买","sto0的值",sto0);                 if ((Ask-arraya[1])arraya[1]&& Strade=="紧急交易关闭" )            {            if (OrderSend(Symbol(),OP_BUYLIMIT,Lot,arraya[1]+Point*50,3,slb, tpb,"",MagicBuyLimit,0,Red)==false)              Print("err(",GetLastError(),")");            }          }        }     //%%%%-------order not exist------over---------------------------------------------             //@@@@@@-----selllimit--order exist------------------------------------------------------------      if (OrderFind( MagicSellLimit)==true && glbOrderSymbol==Symbol())    {      //-1-modify the trading order---when profit is higher 200 points than openprice,设定盈利25点保平     

              if (glbOrderType==1)         {         Print("dddddddddddddddddddd",glbOrderStopLoss);         double sell_ask=glbOrderOpenPrice-Ask;//即时sell单盈利点数         double sell_slj=glbOrderOpenPrice-sell_ask*利润防守比例;//sell单阶段性步步盈利,追踪止损值         if (sell_ask>保平触发值*Point && sell_ask<200*Point)            {            //tp upto 150 point,保平            double s=glbOrderOpenPrice-50*Point;            Print("ssssssssss",s);            if(OrderModify(glbOrderTicket, glbOrderOpenPrice,(glbOrderOpenPrice-50*Point), tp, 0, Green) == false)               Print("Err (", GetLastError(), ")");            }         if ( sell_ask>200*Point&& glbOrderStopLoss> sell_slj  )            {                       Print("jjjjjjjjjjjj",sell_slj);            if(OrderModify(glbOrderTicket,glbOrderOpenPrice,sell_slj, tp, 0, Green) == false)               Print("Err (", GetLastError(), ")");            }                          //Print("有魔号的订单号",glbOrderTicket);          // Print("订单币种",OrderSymbol());                   }          //-2-modify the pending sell order---      //-when the price of ask or bid  is bigger or sammer then openprice(200 point)         if (glbOrderType==3)         {   

            if (arraya[0]-Ask>200*Point || Ask-arraya[0]>0)            {                   if (OrderDelete(glbOrderTicket)==false)            Print("ERR(",GetLastError(),")");            }                    if ( OrderModify(glbOrderTicket, arraya[0]-50*Point, sl, tp, 0, Green) == false)             Print("Err (", GetLastError(), ")");        //   Print("OPEN_TYPE:",glbOrderType);                  }     }    //@@@@@@@@@-------selllimit----order exist----over-----                //######-----buylimit--order exist------------------      if (OrderFind( MagicBuyLimit)==true && glbOrderSymbol==Symbol())    {      //-1-modify the trading order---when profit is higher 200 points than openprice,设定盈利25点保平      if (glbOrderType==0)         {         double buy_bid=Bid-glbOrderOpenPrice;//即时buy单盈利点数         Print("即时buy单Bid数",Bid,"即时buy单开仓价",glbOrderOpenPrice);         Print("即时buy单盈利点数",buy_bid);         double buy_slj=glbOrderOpenPrice+buy_bid*利润防守比例;//buy单阶段性步步为赢,追踪止损值                               if (buy_bid>保平触发值*Point && buy_bid<200*Point)           {            if(OrderModify(glbOrderTicket, glbOrderOpenPrice,(glbOrderOpenPrice+50*Point), tpb, 0, Green) == false)               Print("Err (", GetLastError(), ")kkkkkkkkk");           }            if (buy_bid>200*Point&& buy_slj>glbOrderStopLoss)           {            if(OrderModify(glbOrderTicket, glbOrderOpenPrice, buy_slj, tpb, 0, Green) == false)               Print("Err (aaa", GetLastError(), ")");           }                    }          //-2-modify the pending buy order---      //-when the price of ask or bid  is bigger or sammer then openprice(200 point)         if (glbOrderType==2&& glbOrderSymbol==Symbol())         {                   Print("挂买单时BID值",Bid);         if (Bid-arraya[1]>200*Point||Bid            {                   if (OrderDelete(glbOrderTicket)==false)            Print("ERRbbb(",GetLastError(),")");            }         if ( OrderModify(glbOrderTicket, arraya[1]+50*Point, slb, tpb, 0, Green) == false)             Print("Errccc (", GetLastError(),")","买单时的止损", slb,"买单时的止盈",tpb);                    //   Print("OPEN_TYPE:",glbOrderType);                  }     }    //#######--------buylimit---order exist----over---------------    }

    //---

      }

    //+----------------------------------------------------------------------+

    //+------------自定义函数chanel()-----start---------------------+ //|求取通道高低值 //|create a funtion the chanel angle is up or down //|when the price of first point is bigger than second one,the chanel line is up! //|暂定两个点的为主线,对线为次线。MT4定义主线上左边点为点1,右边点为点2,对应的次线上的点为点3. //|取得点3时间对应的主线价格,可知两线差。 //|直接取得主线即时价格,可知次线即时价。

    void chanel( string name) { ObjectFind(0,name);

    double pa=ObjectGet(name,OBJPROP_PRICE3); //如果不加(datetime),就会出现possible loss of data due to type conversion提示,说见博客 double pb=ObjectGetValueByTime(0,name, (datetime)ObjectGet(name,OBJPROP_TIME3),0); double pd=NormalizeDouble(pa-pb,Digits);

    //pm is the now price of main line,ps is the now price of secondary line double pm=ObjectGetValueByShift(name,0); double ps=pm+pd; //if pd>0 ,次线价高    double phcn=0;    double plcn=0;   if (pd>0)    {    phcn=NormalizeDouble(ps,Digits);    plcn=NormalizeDouble(pm,Digits);    }   else    {    phcn=NormalizeDouble(pm,Digits);    plcn=NormalizeDouble(ps,Digits);    }

    ArrayInitialize(arraya,NULL); arraya[0]=phcn; arraya[1]=plcn; arraya[2]=pd; //-------------price out chanel---------- //datetime some_time=D'2016.05.13 09:00'; datetime some_time=(datetime)ObjectGet(name,OBJPROP_TIME1); int bars_ct1=iBarShift(Symbol(),PERIOD_CURRENT,some_time);//chanel's TIME point shift number

    int i=NULL; for ( i=0;i   {   Comment("bar's number ",bars_ct1,Symbol()," 未突破! ","突破的位置:---");    double chi=ObjectGetValueByShift(name,i);    double cli=chi+pd;    arraya[3]=0;   if (pd>0)    {     cli=ObjectGetValueByShift(name,i);     chi=cli+pd;    }              if (Close[i]>chi||Close[i]      {           arraya[3]=1;//有突破通道现象       Comment("bar's number ",bars_ct1,Symbol()," 突破!!!! ","突破的位置:::",i);       Print(Symbol(),"有突破通道现象",i);       break;       //comment\print:comment区别       // comment保持最后的状态不变。如上面最后i值为21,如果后面没有条件触发,comment会在主图一直显示21.所以在上面加了一行comment       //而print,如果没有条件触发,则不再输出任何内容。

         }    }   

    //Comment("ww11ww",High[29],High[2]);

    return; } //+------------------chanel()---over---------------------------------+

    //+------------------自定义orderfind()---start-----------------------+ //|find the Order of EA auto place   exist or no? //| //|                                                                  | //+------------------------------------------------------------------+ bool OrderFind(int Magic)   {    glbOrderType = -1;    glbOrderTicket = -1;    int total = OrdersTotal();    bool res = false;    for(int cnt = 0 ; cnt < total ; cnt++)      {               if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==false)        Print("ERR(",GetLastError(),")");        if(OrderMagicNumber() == Magic && OrderSymbol() == Symbol()&& Symbol()==StringSubstr(ChanelnameA,3,0))          {            glbOrderType = OrderType();            glbOrderSymbol=OrderSymbol();            glbOrderTicket = OrderTicket();            glbOrderOpenPrice=OrderOpenPrice();            glbOrderStopLoss=OrderStopLoss();            glbOrderLots=OrderLots();            glbOrderTp=OrderTakeProfit();            glbOrderP=OrderProfit();            glbOrderPoint=Point;            glbOrderDigits=Digits;            glbMinlot  = MarketInfo(OrderSymbol(),MODE_MINLOT);                       Print(Symbol(),"ggggggggggggggggg",glbMinlot,"点值",glbOrderPoint);            res = true;          }      }    return(res);   }

    //------------------orderfind()----over-------------------------------+

     //+------------自定义sl_line()-----start-------------这部分没写完现在无效--------+ //|sl is stopline,find object of "sl_bl","sl_sl" //|line value as the value of sl bool sl_line( string linename)  {  bool res=false;   if (ObjectFind(0,linename)==0 && Symbol()==StringSubstr(linename,5,0))     {         p_sl=NormalizeDouble(ObjectGetDouble(0,linename,OBJPROP_PRICE,0),Digits);      res=true;      Print("找到了!值:",p_sl);     }    else    Print("ERR(",GetLastError(),")没有损线");  return(res);    } //+----------------sl_line()---over---------------------------------+

    转载请注明原文地址: https://ju.6miu.com/read-671949.html

    最新回复(0)