TrendMeLeaveMe解析

来源:互联网 发布:零基础学算法 光盘 编辑:程序博客网 时间:2024/06/05 20:22
在启动"TrendMeLeaveMe"EA之前只要画出趋势是向上还是向下. 设置属性, 运行EA,然后就可以去睡觉或者工作了.
1. 本EA不会自动工作. 您必须画出是向上趋势, 向下趋势, 或者水平趋势. 把它称为buystop 或者 sellstop ,设置 BuyStop_StepUpper, BuyStop_StepLower, SellStop_StepUpper和SellStop_StepLower 属性.
2. 当价格进入您的buystop趋势和BuyStop_StepLower之间的区域时,EA将会在价格BuyStop_StepUpper设置止损买入挂单.
当价格进入您的sellstop趋势和SellStop_StepUpper之间的区域时,EA将会在价格SellStop_StepLower设置止损卖出挂单.
3. 当价格在趋势中变动时, EA会一直修改两个订单的建仓价格直到价格移动到之前的区域.
4. 对于buystop, 您可以设置BuyStop_StopLoss , BuyStop_Takeprofit 和BuyStop_Lot.
对于sellstop, 您可以设置 SellStop_StopLoss , SellStop_Takeprofit 和SellStop_Lot.
看一下这个图表就更好解释了:
TrendMeLeaveMe解析

这是另一个例子:

TrendMeLeaveMe解析



 
//+------------------------------------------------------------------+
//|                                        TrendMeLeaveMe.mq4 |
//|                          Copyright?2006, Eng. Waddah Attar |
//|                                   waddahattar@hotmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2007,Eng Waddah Attar"
#property link     "waddahattar@hotmail.com"
//---外部可输入性变量,首先赋默认值,在MT4中可根据个人要求作设置?-
extern string BuyStop_Trend_Info ="_______________________";
extern string BuyStop_TrendName = "buystop";
extern int   BuyStop_TakeProfit = 50;
extern int   BuyStop_StopLoss = 30;
extern double BuyStop_Lot = 0.1;
extern int   BuyStop_StepUpper = 10;
extern int   BuyStop_StepLower = 50;
extern string SellStop_Trend_Info ="_______________________";
extern string SellStop_TrendName = "sellstop";
extern int   SellStop_TakeProfit = 50;
extern int   SellStop_StopLoss = 30;
extern double SellStop_Lot = 0.01;
extern int   SellStop_StepUpper = 50;
extern int   SellStop_StepLower = 10;
//------定义全局变量?
//编程中的「魔数」(magicnumber)是什么意思?
//Magicnumber一般是指硬写到代码里的整数常量,数值是编程者自己指定的,其他人不知道数值有什么具体意义,表示不明觉厉,就称作magicnumber。
//下边的MagicBuyStop、MagicSellStop就是两个自定义变量,并储存自已确定的魔数值。专门指定本EA生成的订单。(用魔数标识),仔细琢磨,与OrderTicket、订单序列号结合使用,有点特殊用处呢!
int MagicBuyStop = 1101;
int MagicSellStop = 1102;
int glbOrderType;
int glbOrderTicket;
//+------------------------------------------------------------------+
//|                                                        |
//+--------------------------初始化,在图的左上角显示内容?-------------------------+
int init()
  {
   Comment("TrendMeLeaveMeby Waddah Attar");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                        |
//+---------------当数据变动时触发,将上步内容“刷空”---------------------------------------------------+
int deinit()
  {
   Comment("");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                        |
//+------------------------------------------------------------------+
int start()
  {
   double vH, vL, vM, sl,tp;
    if(ObjectFind(BuyStop_TrendName)== 0)
    {
//---使用自定义函数,SetObject(string name,datetime T1,double P1,datetimeT2,double P2,color clr)
//因为已经”人工手动“事先划出是向上趋势, 向下趋势, 或者水平趋势. 把它称为buystop 或者 sellstop,
//此处系统自动划出本文开始部分示意图中的buystop_stepupper、buystop_steplower这两条损买的上限(线)及下限(线)
 
//---如果有(如果没有则创建)名为"Highbuystop_trend“的趋势线,即损买的上线、下线,
      SetObject("High" + BuyStop_TrendName,
              ObjectGet(BuyStop_TrendName,OBJPROP_TIME1),
              ObjectGet(BuyStop_TrendName, OBJPROP_PRICE1) +BuyStop_StepUpper*Point,
              ObjectGet(BuyStop_TrendName,OBJPROP_TIME2),
              ObjectGet(BuyStop_TrendName, OBJPROP_PRICE2) +BuyStop_StepUpper*Point,
              ObjectGet(BuyStop_TrendName,OBJPROP_COLOR));
      SetObject("Low" + BuyStop_TrendName,
              ObjectGet(BuyStop_TrendName,OBJPROP_TIME1),
              ObjectGet(BuyStop_TrendName, OBJPROP_PRICE1) -BuyStop_StepLower*Point,
              ObjectGet(BuyStop_TrendName,OBJPROP_TIME2),
              ObjectGet(BuyStop_TrendName, OBJPROP_PRICE2) -BuyStop_StepLower*Point,
              ObjectGet(BuyStop_TrendName,OBJPROP_COLOR));
 
//NormalizeDouble 给出环绕浮点值的确度,计算止损和赢利值,挂单交易交易的开盘价必须正常化。精确值需要在小数点中预定义。
//--ObjectGetValueByShift,函数计算并返回指定柱的值(转移当前相关的柱)
//当前时间(柱)对应损买上、中、下线(限)的价格

//ObjectGetValueByShift("High"+BuyStop_TrendName,0)------获得当前系统自动画的K线柱(0表示当前)所在时间点所对应的自划线的价格。就是自划的趋势线这个函数方程,指定时间(系统K线柱对应的时间),计算出趋势线方程对应的价格。


      vH =NormalizeDouble(ObjectGetValueByShift("High"+BuyStop_TrendName,0),Digits);
      vM =NormalizeDouble(ObjectGetValueByShift(BuyStop_TrendName,0),Digits);
      vL =NormalizeDouble(ObjectGetValueByShift("Low"+BuyStop_TrendName,0),Digits);
//损买对应的止损、止盈价格
      sl = vH - BuyStop_StopLoss*Point;
      tp = vH + BuyStop_TakeProfit*Point;
 
 
------------------------------------------------------------------------
---当前价格运行在在“损买”自划趋势线下方,
if Ask
-----1---可“损买”情况(认为价格将“突破”,并突破后买入)  
      if (rsisjp<65 && kdsjp<65)
         OrderSend(Symbol(), OP_BUYSTOP, BuyStop_Lot, vH, 3, sl, tp,"",MagicBuyStop, 0, Green) < 0);
      if (rsisjp<50 && kdsjp<50)
         OrderSend(Symbol(), OP_BUYSTOP, BuyStop_Lot, vH, 3, sl, tp,"",MagicBuyStop, 0, Green) < 0);
         OrderSend(Symbol(), OP_BUYSTOP, BuyStop_Lot, vH, 3, sl, tp,"",MagicBuyStop, 0, Green) <0);  
      if (rsisjp<30 && kdsjp<30)
         OrderSend(Symbol(), OP_BUYSTOP, BuyStop_Lot*2, vH, 3, sl, tp,"",MagicBuyStop, 0, Green) < 0);
         OrderSend(Symbol(), OP_BUYSTOP, BuyStop_Lot*2, vH, 3, sl, tp,"",MagicBuyStop, 0, Green) <0);                   
-------突破买入后,如果以上指标出现反向,要做平仓操作
      if rsisjp>75 && kdsjp>75 &&此货币损买n=OrdersTotal()持仓量>lot 则平此货币n-1倍lot仓位;
      if rsisjp>85 && kdsjp>85 &&此货币损买n=OrdersTotal()持仓量>lot则平引货币全部仓位;      
       if  //平损买仓量lot
      if rsisjp<50 && kdsjp<50 //买入量lot
      if rsisjp>90 && kdsjp90 //平损买仓量lot*3
      OrderClose
      
      
      
-----2---可“限卖”情况(认为价格在“通道”之间震荡)
      if rsisjp>65 && kdsjp>65 //限卖量lot
      if rsisjp>80 && kdsjp>80 //限卖量lot*2
      if rsisjp>90 && kdsjp>90 //限卖量lot*3
      
      
 
 
 
 
 
 ------------------------------------------------------------------------------
      if(Ask <= vM && Ask >= vL&& OrderFind(MagicBuyStop) == false)
   如果:当前货币对窗口的卖价到达了事行自划趋势线中、自划趋势低值之间,
   并且:根据给定的“魔数值”寻找订单失败
   
   (寻单函数:将每一订单数据,其订单魔数与给定的自定义变量“MagicBuyStop”(本例已赋值1101) 比较是否相等,并且选定订单的货币与本窗口货币图表比较是否相等,如果符合,寻单成功,否则失败!(遍历模式))
 
简言:如果价格到达区间,并且没有相应的订单,则执行如下操作:
  
         if(OrderSend(Symbol(), OP_BUYSTOP, BuyStop_Lot,vH, 3, sl, tp,
            "", MagicBuyStop, 0, Green) < 0)
产生一个本窗口货币对,“损买”单,外部输入的手数,以处划趋势线高位线对应的,滑点值设为3,以外部输入值设定止损、止盈,内空为空,以EA首部的自定义变量“MagicBuyStop”的值作为本订单的魔数值,此订单过期值不设定,箭头设置绿色。
 
             Print("Err (", GetLastError(),") Open BuyStop Price= ", vH, " SL= ", 
                  sl," TP= ", tp);
简言:如果价格到达区间,并且存在相应的订单(开仓类型相同),则执行如下操作:
      if(Ask <= vM && Ask >= vL&& OrderFind(MagicBuyStop) == true&& 
         glbOrderType ==OP_BUYSTOP)
选择这个订单
        {
         OrderSelect(glbOrderTicket, SELECT_BY_TICKET,MODE_TRADES);
如果这个的订单的价格不等于策略的开仓价(损买价)
          if(vH !=OrderOpenPrice())
 
为本订单按策略值修改开仓价、止损、止盈、不过期、绿箭头。
             if(OrderModify(glbOrderTicket,vH, sl, tp, 0, Green) == false)
如果修改失败,提示错误信息!
                Print("Err (", GetLastError(), ") Modify BuyStopPrice= ", vH, 
                     " SL= ", sl, " TP= ", tp);
        }
    }
 
//自动划出损卖的上线、下线
  if(ObjectFind(SellStop_TrendName) == 0)
    {
      SetObject("High" + SellStop_TrendName,
              ObjectGet(SellStop_TrendName,OBJPROP_TIME1),
              ObjectGet(SellStop_TrendName, OBJPROP_PRICE1) +SellStop_StepUpper*Point,
              ObjectGet(SellStop_TrendName,OBJPROP_TIME2),
              ObjectGet(SellStop_TrendName, OBJPROP_PRICE2) +SellStop_StepUpper*Point,
              ObjectGet(SellStop_TrendName,OBJPROP_COLOR));
      SetObject("Low" + SellStop_TrendName,ObjectGet(SellStop_TrendName, OBJPROP_TIME1),
              ObjectGet(SellStop_TrendName, OBJPROP_PRICE1) -SellStop_StepLower*Point,
              ObjectGet(SellStop_TrendName,OBJPROP_TIME2),
              ObjectGet(SellStop_TrendName, OBJPROP_PRICE2) -SellStop_StepLower*Point,
              ObjectGet(SellStop_TrendName,OBJPROP_COLOR));
      vH = NormalizeDouble(ObjectGetValueByShift("High"+ SellStop_TrendName, 0), Digits);
      vM =NormalizeDouble(ObjectGetValueByShift(SellStop_TrendName, 0),Digits);
      vL = NormalizeDouble(ObjectGetValueByShift("Low"+SellStop_TrendName, 0), Digits);
      sl = vL + SellStop_StopLoss*Point;
      tp = vL - SellStop_TakeProfit*Point;
      
if(Bid >= vM && Bid <= vH &&OrderFind(MagicSellStop) == false)
         if(OrderSend(Symbol(), OP_SELLSTOP, SellStop_Lot,vL, 3, sl, tp, "", 
            MagicSellStop, 0, Red) < 0)
             Print("Err (", GetLastError(),") Open SellStop Price= ", vL, " SL= ", sl, 
                  " TP= ", tp);
      if(Bid >= vM && Bid <= vH&& OrderFind(MagicSellStop) == true&& 
         glbOrderType ==OP_SELLSTOP)
        {
         OrderSelect(glbOrderTicket, SELECT_BY_TICKET,MODE_TRADES);
          if(vL !=OrderOpenPrice())
             if(OrderModify(glbOrderTicket,vL, sl, tp, 0, Red) == false)
                Print("Err (", GetLastError(), ") Modify SellPrice= ", vL, " SL= ", sl, 
                     " TP= ", tp);
        }
    }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                        |
//+------------------------------------------------------------------+
bool OrderFind(int Magic)
  {
   glbOrderType = -1;
   glbOrderTicket =-1;
   int total =OrdersTotal();
   bool res = false;
   for(int cnt = 0 ; cnt< total ; cnt++)
    {
      OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber() == Magic &&OrderSymbol() == Symbol())
        {
         glbOrderType = OrderType();
         glbOrderTicket = OrderTicket();
          res =true;
        }
    }
   return(res);
  }
//+------------------------------------------------------------------+
//|                                                        |
//-----------------自定义函数setobject?--------------------------------------+
//函数相当于y=f(x),输入参数值X,经过此函数运算,加工出对应的Y值!
//setobject函数的意义,输入name、T1、P1、T2等值,输出结果:
//如果存在名称为name的趋势线,则用T1、P1、T2、P2对其相应属性赋值
//如果趋势线name不存在,创建并用变量用T1、P1、T2、P2对其相应属性赋值
//T1、P1、T2、P2对应属性值为锚点1的时间和价格、锚点2的时间和价格
//-------------
 void SetObject(string name,datetimeT1,double P1,datetime T2,double P2,color clr)
  {
   if(ObjectFind(name) ==-1)
    {
      ObjectCreate(name, OBJ_TREND, 0, T1, P1, T2,P2);
      ObjectSet(name, OBJPROP_COLOR, clr);
      ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
    }
   else
    {
      ObjectSet(name, OBJPROP_TIME1, T1);
      ObjectSet(name, OBJPROP_PRICE1, P1);
      ObjectSet(name, OBJPROP_TIME2, T2);
      ObjectSet(name, OBJPROP_PRICE2, P2);
      ObjectSet(name, OBJPROP_COLOR, clr);
      ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
    
  }
//+------------------------------------------------------------------+

0 0