7评论

0收藏

EA

avatar 333666 | 2773 人阅读 | 7 人评论 | 2017-03-19

//[EA]海豚小弟EA带SAR止损
//以中价与均线对比 KD穿越为策略,加入以日线或四时线或参数为止损,跟踪止损以SAR

extern double 手数 = 0.1;
extern int 四小时止损 = 30;
extern int 日线止损 = 60;
extern int 滑点 = 3;

extern int 均线周期 = 208;
extern int KD高分界线 = 55;
extern int KD低分界线 = 45;

extern int 魔术号码 = 1314;

int 最后价1 = 0;
int 最后价2 = 0;


//+----------------------------初始化---------------------------------+

int init()
  {
   ObjectCreate("", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("", "海豚小弟", 10, "宋体", SteelBlue);
   ObjectSet("", OBJPROP_XDISTANCE, 10);
   ObjectSet("", OBJPROP_YDISTANCE, 20);

   ObjectCreate("", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("", "12345", 10, "宋体", SteelBlue);
   ObjectSet("", OBJPROP_XDISTANCE, 10);
   ObjectSet("", OBJPROP_YDISTANCE, 40);      
   return(0);
  }

//+----------------------反初始化------------------------------------+

int deinit()
  {
   GetLastError();   
   return(0);
  }

//+-----------------------主函数-------------------------------------+

int start()
   {
   double 均线,
          KDJ主0,
          KDJ信0,
          KDJ主1,
          KDJ信1;

   均线 = iMA(Symbol(), 0, 均线周期, 0, MODE_EMA, PRICE_MEDIAN, 1);
   KDJ主0 = iStochastic(Symbol(), 0, 80, 5, 3, MODE_SMA, 0, MODE_MAIN, 1);
   KDJ信0 = iStochastic(Symbol(), 0, 80, 5, 3, MODE_SMA, 0, MODE_SIGNAL, 1);
   KDJ主1 = iStochastic(Symbol(), 0, 80, 5, 3, MODE_SMA, 0, MODE_MAIN, 2);
   KDJ信1 = iStochastic(Symbol(), 0, 80, 5, 3, MODE_SMA, 0, MODE_SIGNAL, 2);

   if ((High[1]+Low[1])/2>均线 && KDJ主0>KDJ信0 && KDJ信0<=KD低分界线 && Time[0]>最后价1)     // 中价大于均线 且KD中主线在上方 且信号线小于55 且当前开盘时间大于最后时间
      {
      if (KDJ主1< KDJ信1)                                                                    // 当KD的主线小于信号线时,即发生交叉
         {
         OrderSend(Symbol(),
                   OP_BUY,                                                                   // 发送买单
                   手数,
                   Ask,
                   滑点,
                   获得止损子(OP_BUY),
                   0,
                   "",
                   魔术号码,
                   0,
                   Blue);
         最后价1 = Time[0];                                                                   // 将最后时间赋为当前开盘价时间
         return (0);
         }
      }

   else if ((High[1]+Low[1])/2<均线 && KDJ主0<KDJ信0 && KDJ信0>=KD高分界线 && Time[0]>最后价1)
      {
      if (KDJ主1>KDJ信1)
         {
         OrderSend(Symbol(),
                   OP_SELL,                                                                  // 开卖
                   手数,
                   Bid,
                   滑点,
                   获得止损子(OP_SELL),
                   0,
                   "",
                   魔术号码,
                   0,
                   Red);
         最后价1 = Time[0];
         return (0);   
         }
      }

   if (单总数子(魔术号码)>0)                                                                 // 当有单子时
      {
      if (Time[0]>最后价2)                                                                   // 则在当前开盘时间时
         {
          跟踪止损子(魔术号码);                                                              // 修改订单止损
          最后价2 = Time[0];
         }
      for (int i=0; i<OrdersTotal(); i++)
         {
         OrderSelect(i, SELECT_BY_POS);
         if (OrderMagicNumber()==魔术号码) break;                                            // (未理解)
         }
      if (OrderType()==OP_BUY)                                                               // 如果为买单时
         {
         if (KDJ主0<KDJ信0 && KDJ信0>=80 && KDJ主1>KDJ信1)                                   // 当现在的KD主线在当前信号线下方,且当前信号线在80以下,且前一主线》前一信号线
            OrderClose(OrderTicket(),                                                        // 平仓(编:原来编号
                       OrderLots(),                                                          // 手: 原来订单手数
                       Bid,                                                                  // 价:  叫买价???
                       滑点,                                                                 // 滑:
                       Pink);                                                                // 色:
         }
      if (OrderType()==OP_SELL)
         {
         if (KDJ主0>KDJ信0 && KDJ信0<=20 && KDJ主1<KDJ信1)
            OrderClose(OrderTicket(),
                       OrderLots(),
                       Ask,
                       滑点,
                       Pink);
         }
      }
//----
   return(0);
  }

//+---------------------统计单总数 子函数()--------------------------+

int 单总数子(int 魔术号)
{
   int 总数=0;
   for (int i=0; i<OrdersTotal(); i++){
      OrderSelect(i,SELECT_BY_POS);
      if (OrderMagicNumber()==魔术号){
         总数++;
         }
      }   
   return(总数);
}

//+---------------------获得止损 子函数()----------------------------+

double 获得止损子(int 买卖类型)
  {
   int 默认止损;

   if (Period()==PERIOD_H4) 默认止损=四小时止损;
    else 默认止损=日线止损;

   if (买卖类型==OP_BUY)                                                                     // 当买时
      {
      if (Low[2]<Low[1] && (Ask-Low[2])>默认止损*Point)                                      // 如果前二低<前一低 且现在价格-前二低>默认止损
         return (Low[2]);                                                                    // 则返回前二低
      else
      if (Ask>(Low[1]+默认止损*Point))                                                       // 否则如果 现在价格>前一低+默认止损
         return (Low[1]);                                                                    // 则返回前一低
      else
         return (NormalizeDouble(Ask-默认止损*Point, Digits));                               // 否则返回现在价格-默认止损
      }

   else if (买卖类型==OP_SELL)                                                               // 当为卖时
      {
      if (High[2]>High[1] && (High[2]-Bid)>默认止损*Point)
         return (High[2]);
      else
      if ((High[1]-Bid)>默认止损*Point)
         return (High[1]);
      else
         return (NormalizeDouble(Bid+默认止损*Point, Digits));
      }
  }

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

void 跟踪止损子(int 魔术号){  
  for (int k=0; k<OrdersTotal(); k++){
    OrderSelect(k,SELECT_BY_POS);
    if (OrderMagicNumber()==魔术号){        
      if (   OrderType()==OP_BUY                                                             // 如是为买单
         && OrderStopLoss()<iSAR(Symbol(), 0, 0.02, 0.2, 1)                                  // 且订单止损价<前一抛物线
         && Ask>iSAR(Symbol(), 0, 0.02, 0.2, 1)) {                                           // 且现在价格>前一抛物线
         if (!OrderModify(OrderTicket(),                                                     // 跟踪修改 (编:
                          OrderOpenPrice(),                                                  // 价:
                          iSAR(Symbol(), 0, 0.02, 0.2, 1),                                   // 损:前一抛物线值
                          0,                                                                 // 赢:
                          0,                                                                 // 效:
                          Blue)){                                                            // 色:
            Print("Buy跟踪止损修改出错 :"+GetLastError());
            }   
         }
      if (  OrderType()==OP_SELL
         && OrderStopLoss()>iSAR(Symbol(), 0, 0.02, 0.2, 1)
         && Bid<iSAR(Symbol(), 0, 0.02, 0.2, 1)) {
         if (!OrderModify(OrderTicket(),
                          OrderOpenPrice(),
                          iSAR(Symbol(), 0, 0.02, 0.2, 1),
                          0,
                          0,
                          Red)){
            Print("Sell单跟踪止损修改出错 :"+GetLastError());  
            }
         }
       }
  }
}

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


""
还没有人打赏,支持一下

评论|共 7 个

3天下卡

发表于 2018-8-30 16:22:22 | 显示全部楼层

谢谢,赞一个

steven917

发表于 2020-11-14 20:41:43 | 显示全部楼层

doayzkem

发表于 2021-8-8 20:19:48 | 显示全部楼层

支持下

孤峰上人

发表于 2023-6-1 18:06:37 | 显示全部楼层

支持下

古力

发表于 2023-8-6 15:56:13 | 显示全部楼层

顶下

落叶

发表于 2024-1-18 13:15:39 | 显示全部楼层

麻辣书生

发表于 2024-3-26 11:15:15 | 显示全部楼层

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则