//[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());
}
}
}
}
}
//+------------------------------------------------------------------+
|