TrendMeLeaveMe解析

在启动"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;
//------ 定义全局变量?
//编程中的「魔数」(magic number)是什么意思?
//Magic number一般是指硬写到代码里的整数常量,数值是编程者自己指定的,其他人不知道数值有什么具体意义,表示不明觉厉,就称作magic number。
//下边的MagicBuyStop、MagicSellStop就是两个自定义变量,并储存自已确定的魔数值。专门指定本EA生成的订单。(用魔数标识),仔细琢磨,与OrderTicket、订单序列号结合使用,有点特殊用处呢!
int MagicBuyStop = 1101;
int MagicSellStop = 1102;
int glbOrderType;
int glbOrderTicket;
//+------------------------------------------------------------------+
//|                                                                   |
//+-------------------------- 初始化,在图的左上角显示内容?-------------------------+
int init()
  {
    Comment("TrendMeLeaveMe by 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,datetime T2,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 BuyStop Price= ", 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 Sell Price= ", 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,datetime T1,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);
     
  }
//+------------------------------------------------------------------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值