333666 发表于 2017-3-19 13:34:48

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

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

   if (单总数子(魔术号码)>0)                                                               // 当有单子时
      {
      if (Time>最后价2)                                                                   // 则在当前开盘时间时
         {
          跟踪止损子(魔术号码);                                                            // 修改订单止损
          最后价2 = Time;
         }
      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<Low && (Ask-Low)>默认止损*Point)                                    // 如果前二低<前一低 且现在价格-前二低>默认止损
         return (Low);                                                                  // 则返回前二低
      else
      if (Ask>(Low+默认止损*Point))                                                       // 否则如果 现在价格>前一低+默认止损
         return (Low);                                                                  // 则返回前一低
      else
         return (NormalizeDouble(Ask-默认止损*Point, Digits));                               // 否则返回现在价格-默认止损
      }

   else if (买卖类型==OP_SELL)                                                               // 当为卖时
      {
      if (High>High && (High-Bid)>默认止损*Point)
         return (High);
      else
      if ((High-Bid)>默认止损*Point)
         return (High);
      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());
            }
         }
       }
}
}

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


3天下卡 发表于 2018-8-30 16:22:22

谢谢,赞一个

steven917 发表于 2020-11-14 20:41:43

{:1_181:}

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

{:1_189:}

麻辣书生 发表于 2024-3-26 11:15:15

{:1_194:}
页: [1]
查看完整版本: EA