阿强_cqgoY 发表于 2016-6-8 15:35:50

CT_EA_V3.0 效果还不错,就是运行5分线,有时会重复开单。有没高手知道怎么解决?

CT_EA_V3.0 效果还不错,就是5分线,重复开单。
有没高手知道怎么解决重复开单的问题?

陈沫池 发表于 2016-6-8 17:35:49

增一个变量,做为交易的开关

狠赵狠蛇蛇 发表于 2016-6-8 17:41:59

你可以研究下这个

//+------------------------------------------------------------------+
//|                                                    test14_EA.mq4 |
//|                                                         wangyu |
//|                                    http://wangyu204.taobao.com |
//+------------------------------------------------------------------+
//EA 模版功能
//1.同一标识不会重复下单
//2.止损止盈可以设置为0
//3.兼容有些平台 开单不能下止损的问题
//
#property copyright "wangyu"
#property link      "http://wangyu204.taobao.com"

//定义全局变量
double ema10_15M;
double ema20_15M;
double ema10_30M;
double ema20_30M;
double k;
double d;
double prevK;
double prevD;

//+------------------------------------------------------------------+
//| expert initialization function                                 |
//+------------------------------------------------------------------+
int init()
{
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                          |
//+------------------------------------------------------------------+
int start()
{
   int buyTicket=0;
   int sellTicket=0;
   getData();
   
   if(needOpenBuy())
   {
      buyTicket = buy(0.01,250,250,"buy",0);
      if(buyTicket>0)
      {
         Alert("多单下单成功,订单号码是:"+buyTicket);
      }else if(buyTicket<0)
      {
         Alert("多单下单失败");
      }
   }
   if(needOpenSell())
   {
      sellTicket = sell(0.01,300,200,"sell",0);
      if(sellTicket>0)
      {
         Alert("空单下单成功,订单号码是:"+sellTicket);
      }else if(buyTicket<0)
      {
         Alert("空单下单失败");
      }
   }
   
   return(0);
}
//+------------------------------------------------------------------+
//get data
void getData()
{
   //获取均线 数据
ema10_15M = iMA(Symbol(),PERIOD_M15,10,0,MODE_EMA,PRICE_CLOSE,0);//最后一根k线
ema20_15M = iMA(Symbol(),PERIOD_M15,20,0,MODE_EMA,PRICE_CLOSE,0);//最后一根k线
ema10_30M = iMA(Symbol(),PERIOD_M30,10,0,MODE_EMA,PRICE_CLOSE,0);//最后一根k线
ema20_30M = iMA(Symbol(),PERIOD_M30,10,0,MODE_EMA,PRICE_CLOSE,0);//最后一根k线

//获取 kdj 数据
k = iStochastic(Symbol(),PERIOD_M15,8,5,5,MODE_SMA,0,MODE_MAIN,0);//最后一根k线 主线 蓝色
d = iStochastic(Symbol(),PERIOD_M15,8,5,5,MODE_SMA,0,MODE_SIGNAL,0);//最后一根k线 线号线 红色
prevK = iStochastic(Symbol(),PERIOD_M15,8,5,5,MODE_SMA,0,MODE_MAIN,1);//上一根k线 主线 蓝色
prevD = iStochastic(Symbol(),PERIOD_M15,8,5,5,MODE_SMA,0,MODE_SIGNAL,1);//上一根k线 线号线 红色
}


// open sell contidion
bool needOpenSell()
{
bool result = FALSE;
if((ema10_15M<ema20_15M)&&(ema10_30M<ema20_30M))
{
    if((k<d)&&(prevK>prevD))
    {
      result = TRUE;
    }
}
return (result);
}

// open buy contidion
bool needOpenBuy()
{
bool result = FALSE;
if((ema10_15M>ema20_15M)&&(ema10_30M>ema20_30M))
{
   if((k>d)&&(prevK
   {
      result = TRUE;
   }
}
return (result);
}

int buy(double lots,int stopLoss,int stopProfit,string comment,int magic)
{
   int ticket = 0;
   int findBuyNum =0;   
   for(int i=0;i
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if(OrderComment()==comment)
         {
            findBuyNum++;
         }
      }
   }
   
   if(findBuyNum==0)//避免同一标识 重复下单
   {
      ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,30,0,0,comment,magic,0,White);//适应开单不能下止盈止损的平台
      if(ticket>0)
      {
         if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
         {
            int stopLossValue=OrderOpenPrice()-stopLoss*Point;
            int stopProfitValue=OrderOpenPrice()+stopProfit*Point;
            if(stopLoss==0)
            {
               stopLossValue=0;
            }
            if(stopProfit==0)
            {
               stopProfitValue=0;
            }
         
            if(OrderModify(OrderTicket(),OrderOpenPrice(),stopLossValue,stopProfitValue,0,White)==true) //下单成功没问题,修改订单成功后在返回
            {
               return (ticket);
            }
         }
      }
   }
   
   return (0);
}

int sell(double lots,int stopLoss,int stopProfit,string comment,int magic)//magic 暂时没有用到
{
   int ticket = 0;
   int findSellNum =0;   
   for(int i=0;i
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if(OrderComment()==comment)
         {
            findSellNum++;
         }
      }
   }
   
   if(findSellNum==0)//避免同一标识 重复下单
   {
      ticket=OrderSend(Symbol(),OP_SELL,lots,Bid,30,0,0,comment,magic,0,Red);    //适应开单不能下止盈止损的平台
      if(ticket>0)
      {
         if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
         {
            int stopLossValue=OrderOpenPrice()+stopLoss*Point;
            int stopProfitValue=OrderOpenPrice()-stopProfit*Point;
            if(stopLoss==0)
            {
               stopLossValue=0;
            }
            if(stopProfit==0)
            {
               stopProfitValue=0;
            }
         
            if(OrderModify(OrderTicket(),OrderOpenPrice(),stopLossValue,stopProfitValue,0,Red)==true) //下单成功没问题,修改订单成功后在返回
            {
               return (ticket);
            }
         }
      }
      
   }
   
   return (0);
}

2010c 发表于 2016-6-8 17:56:39



intOrdersTotal();


Returned value

Total amount of market and pending orders.

阿强_cqgoY 发表于 2016-6-8 21:31:54

陈沫池 发表于 2016-6-8 17:35
增一个变量,做为交易的开关

谢谢,如果只开一个单,统计总单数,开单判断就可以了,
但我想每个顶点都开一单。最多开三单。
但是,每次达标开单,都是一次开三个单。
没找什么解决方法。

阿强_cqgoY 发表于 2016-6-8 21:33:37

陈沫池 发表于 2016-6-8 17:35
增一个变量,做为交易的开关

谢谢,
能不能用柱子判断?就是开了单,同柱不重复开单?

henaiyun 发表于 2016-6-8 23:20:46

阿强_cqgoY 发表于 2016-6-8 21:33
谢谢,
能不能用柱子判断?就是开了单,同柱不重复开单?

可以实现的

阿强_cqgoY 发表于 2016-6-8 23:34:35

henaiyun 发表于 2016-6-8 23:20
可以实现的

真的吗?有没源码?

henaiyun 发表于 2016-6-9 09:40:19

阿强_cqgoY 发表于 2016-6-8 23:34
真的吗?有没源码?

加Q聊吧,私信你了

smsjk88 发表于 2016-6-9 13:08:52

1
页: [1] 2 3
查看完整版本: CT_EA_V3.0 效果还不错,就是运行5分线,有时会重复开单。有没高手知道怎么解决?