EATC

 找回密码
 立即注册
查看: 510|回复: 2

自制通道交易法

[复制链接]

279

主题

1921

帖子

1079

积分

客服

Rank: 7Rank: 7Rank: 7

积分
1079
发表于 2022-11-29 12:31:31 | 显示全部楼层 |阅读模式
关于止损点的问题,不建议超出几个固定点就止损。

价格到达上下轨位,下单的止损为前一高点,高点与轨道线价格差建议不超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>chi||Close
     {
          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---------------------------------+
回复

使用道具 举报

2289

主题

3822

帖子

2万

积分

交易元老

Rank: 8Rank: 8

积分
26891
发表于 2024-1-25 10:24:37 | 显示全部楼层
分享都值得点赞
回复

使用道具 举报

468

主题

1505

帖子

5037

积分

交易元老

Rank: 8Rank: 8

积分
5037
发表于 2024-3-12 11:30:31 | 显示全部楼层
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

收藏本站|法律声明|Archiver|小黑屋|support@ea198.com|EATC ( 桂ICP备2022005787号 )

风险提示与免责声明:擅自从事外汇保证金交易的双方不受法律保护!社区内展示内容,均为网友自发分享,不构成投资建议,社区无法全面监控由第三方上传至社区的资源,因此不保证资源的合法性、安全性、完整性、真实性或品质等。您下载时,同意自行判断并承担所有风险。社区内的资源,仅限用于学习和研究目的,不得将用于商业或者非法用途,否则,一切后果请用户自负。社区信息来自网络,版权争议与社区无关,您下载后须在24个小时之内进行删除。如果您喜欢该内容,请支持正版。如有侵权请邮件与我们联系处理。