关于止损点的问题,不建议超出几个固定点就止损。
- 价格到达上下轨位,下单的止损为前一高点,高点与轨道线价格差建议不超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---------------------------------+
复制代码
|