10评论

0收藏

EA

avatar 333666 | 3332 人阅读 | 10 人评论 | 2017-03-19

//[EA]MA经修改可赢利的
//写法很标准,多处可借签.

#define MAGICMA 20100604
//+------------------------------------------------------------------+

extern int    检查均线模式     = 1;                                                                      //1~4 种下单方式  1 仅开仓, 2 有止损无止赢, 3 有止赢无止损, 4 有止赢也有止损
extern double 赢利目标         = 150;                                                                    //
extern double 止损             = 30;                                                                     //
extern double 最大风险         = 0.3;                                                                    //资金控制,控制下单量
extern double 跟踪止损         = 25;                                                                     //
extern int    最大开仓次数     = 3;                                                                      //最多开仓次数限制
extern double 最大手数         = 0.1;                                                                    //最多单仓持仓量限制
extern int    是否允许跟踪止赢 = 0;                                                                      //非零就允许跟踪止赢
extern int    小时间框         = 5;
extern int    大时间框         = 15;


int 小均线周期=5,
    大均线周期=30,
    i,
    p2,
    xxx,
    p1,
    res;
double 手数;
datetime 最后时间;                                                                                       //时间控制, 仅当一个时间周期完成才检查条件

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

int init()      
  {
   手数 = 1;
   最后时间 = NULL;
   return(0);
  }

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

int deinit() { return(0); }

//+---------------------主程序---------------------------------------+


int start()
  {
   开仓前检查子();                                                                                       //开仓 平仓 条件检查 和操作

   if (是否允许跟踪止赢>0)   跟踪止损设置子();                                                                      //跟踪止赢
   return(0);
   }

//+-------确定下单量 子函数()----------------------------------------+

double 手数最佳化子()
{
double lot =手数;

//MarketInfo(Symbol(),MODE_MINLOT);     相关信息
//MarketInfo(Symbol(),MODE_MAXLOT);
//MarketInfo(Symbol(),MODE_LOTSTEP);
lot=NormalizeDouble(最大风险 * AccountBalance()/AccountLeverage(),1);                                    //开仓量计算
if(lot<0.1)  lot=0.1;
if(lot>最大手数)  lot=最大手数;
return(lot);
}

//----------平买 单子函数()------------------------------------------+

void 平买子()
{
if (OrdersTotal() > 0 )   
  {
  for(i=OrdersTotal()-1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
    if(OrderType()==OP_BUY)
      {
      OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
      Sleep(5000);
      }
    }
  }
}
//------------平卖 子函数()-------------------------------------------+

void 平卖子()
{
if (OrdersTotal( ) > 0 )   
{
  for(i=OrdersTotal()-1;i>=0;i--)
  {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
  if(OrderType()==OP_SELL)
    {
    OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
    Sleep(5000);
    }
  }
}
}

//-----------------买卖平条件 子函数()------------------------------------------------+

int 买卖平条件子()                                                                                        // 在这个函数时可以更改设置你的交易信号 ( 这里使用MACD 和MA 做例子)
   {
    double 小均线1, 小均线2, 小均线3, 大均线1, 大均线2;

             小均线1= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,1);
             小均线2= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,2);
             小均线3= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,3);
             大均线1= iMA(NULL,大时间框,60,0,MODE_SMA,PRICE_MEDIAN,1);
             大均线2= iMA(NULL,大时间框,60,0,MODE_SMA,PRICE_MEDIAN,2);

   if(大均线1>大均线2  &&小均线2<小均线3  &&小均线1>小均线2)                                              // 买条件 大周期时间Ma在上升,小周期均线向上转折
       return (1);                                                                                        // 返回信号值为1

   if(大均线1<大均线2  &&小均线2>小均线3  &&小均线1<小均线2)                                              // 卖条件
       return (-1);                                                                                       // 卖信号
return (0);                                                                                               // 若上述信号值没有,则返回不交易信号0
}

//+---------------开仓前内容的检查 子函数()-------------------------+

int 现在买卖 = 0;

void 开仓前检查子()
{
if (Time[0] == 最后时间 ) return;                                                                         // 如果现在开盘时间与最后时间不同,则将现在的开盘时间赋给最后时间
最后时间 = Time[0];
现在买卖 = 买卖平条件子();                                                                                //将变量赋为 获取买卖条件子函数的信号值

if (现在买卖 == 1)                                                                                        //买 先结束已卖的
    平卖子();
if (现在买卖 == -1)                                                                                       //卖 先结束已买的
    平买子();

if (TimeDayOfWeek( TimeCurrent() )==1)                                                                    //如果 服务器时间的星期数为周一
  {
  if (TimeHour( TimeCurrent() ) <3 ) return;                                                              //且服务器的时间小时数在3点前,则不进行交易
  }
if (TimeDayOfWeek( TimeCurrent() )==5)
  {
  if (TimeHour( TimeCurrent() )>19 ) return;                                                              //周五晚19点后不做(服务器时间)
  }

if (OrdersTotal() >= 最大开仓次数) return ;                                                               //如果已持有开仓次数达到最大,不做  

if (现在买卖==0) return;                                                                                  //如果交易信号值为0,不交易

TradeOK();                                                                                                //去下单交易
}

//+------------------去下单交易 子函数()------------------------------+

void TradeOK()
{
int 错误 ;
if (现在买卖 == 1)                                                                                        //买信号
  {
    switch (检查均线模式)
    {
    case 1:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0,              0,                  "",MAGICMA,0,Blue);break;
    case 2:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, Ask-止损*Point, 0,                  "",MAGICMA,0,Blue);break;
    case 3:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0,              Ask+赢利目标*Point, "",MAGICMA,0,Blue);break;
    case 4:   res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, Ask-止损*Point, Ask+赢利目标*Point, "",MAGICMA,0,Blue);break;

    default : res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0,              0,                  "",MAGICMA,0,Blue);break;
    }
    if (res <=0)
    {
    错误=GetLastError();
    if(错误==134) Print("错误134 :没钱了!! ");
    if(错误==135) RefreshRates();   // 价格已发生变化
    }
    Sleep(5000);
    return ;   
  }
if (现在买卖 == -1)                                                                                       //卖信号出现
  {
    switch (检查均线模式)
    {
    case 1:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0,              0,                 "",MAGICMA,0,Red); break;
    case 2:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, Bid+止损*Point, 0,                 "",MAGICMA,0,Red); break;
    case 3:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0,              Bid-赢利目标*Point,"",MAGICMA,0,Red); break;
    case 4:   res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, Bid+止损*Point, Bid-赢利目标*Point,"",MAGICMA,0,Red); break;

    default : res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0,              0,                 "",MAGICMA,0,Red); break;
    }
    if (res <=0)
    {
    错误=GetLastError();
    if(错误==134) Print("错误134 :没钱了!!!! ");
    if(错误==135) RefreshRates();                                                                         // 价格已发生变化,再刷新一下数据
    }
    Sleep(5000);                                                                                          //等待5秒                  
    return ;   
  }
}

//+---------------------//跟踪止损 子函数---------------------------------------------+

void 跟踪止损设置子()   
{
bool 修改 = false;
for (int i=0; i<OrdersTotal(); i++)
  {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
  if (OrderType()==OP_BUY)
    {
    if ((Bid -OrderOpenPrice()) > (跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT)))                       //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置
       {
      if (OrderStopLoss() < Bid -跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT))
         {
          修改 = OrderModify(OrderTicket(),
                           OrderOpenPrice(),
                           Bid - 跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT),
                           OrderTakeProfit(),
                           0,
                           Green);
         }
       }
    }
  else if (OrderType()==OP_SELL)
    {
    if ((OrderOpenPrice() -Ask) > (跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT)))                       //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置
       {
        if ((OrderStopLoss()) > (Ask + 跟踪止损*MarketInfo(OrderSymbol(), MODE_POINT)))
           {     
            修改 = OrderModify(OrderTicket(),
                             OrderOpenPrice(),
                             Ask + 跟踪止损*MarketInfo(OrderSymbol(),MODE_POINT),
                             OrderTakeProfit(),
                             0,
                             Tan);
           }
       }
    }
  }
}
//+----------------------------------------------+

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

评论|共 10 个

苍老师学外汇

发表于 2020-7-15 17:24:24 | 显示全部楼层

谢谢楼主分享

point

发表于 2020-8-5 13:47:06 | 显示全部楼层

帮你顶下哈!!

Elise

发表于 2020-9-6 13:21:05 | 显示全部楼层

帮你顶下哈!!

西点

发表于 2020-9-9 16:26:31 | 显示全部楼层

谢谢楼主分享

tnfgzezj

发表于 2020-11-12 18:38:57 | 显示全部楼层

mvwz

发表于 2021-7-4 13:00:03 | 显示全部楼层

emgpmr

发表于 2021-7-6 17:57:11 | 显示全部楼层

jansonqi

发表于 2021-8-8 14:01:13 | 显示全部楼层

godenbird312

发表于 2021-8-11 21:00:40 | 显示全部楼层

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

EA之家评论守则