交易危机

 找回密码
 快捷注册(禁q号)

QQ登录

只需一步,快速开始

搜索
广告位
查看: 5772|回复: 22
打印 上一主题 下一主题

[ea和相关说明] EA代码学习探索五---几款EA解说

[复制链接]

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
跳转到指定楼层
楼主
发表于 2016-6-21 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 frlin2003 于 2016-6-21 23:13 编辑
  1. #property copyright "Shawn Yau"  
  2. extern double Lots = 0.1;        //默认交易单位  
  3. extern int StopLoss = 30;        //止损  
  4. extern int TakeProfit = 30;      //止赢  
  5. extern int Magic_Number = 8899;  //Magic_Number是用来标识这个EA的唯一性的,简单来说,就是这个EA的身份证  
  6. extern int FasterMA = 5;    //均线1的周期  
  7. extern int SlowerMA = 25;  //均线2的周期  
  8. extern int Trade_Bar = 0;  //下单的时机,如果为1,表示等待当前的K线完成,下一根K线刚出现的时候才下单;如果为0表示只要当前的价格  
  9.                             //满足条件了就马上下单  
  10. int last_t = 0;            //这个是用来避免重复下单  

  11. int init()          //这个是初始化函数,只会在EA刚加载到图表上的时候运行一次,之后就不起作用了  
  12.   {  
  13.   return(0);  
  14.   }  
  15. int deinit()        //反初始化函数,用处是在删除EA的时候运行一次,做一些清理性的工作,例如把所画的线、箭头等从图表上删除掉  
  16.   {  
  17.   return(0);  
  18.   }  
  19. int start()  
  20.   {  
  21.   //定义几个变量,从名字也可以很容易看出其代表的含义了: FasterMANow表示均线1当前的值、SlowerMANow表示均线2当前的值、  
  22.   ///FasterMAPrevious表示均线1的前值、SlowerMAPrevious表示均线2的前值;均线金叉,其实就是表示当均线1的前值小于均线2的前值,  
  23.   //且均线1的当前值大于均线2的当前值。这样描述我想应该能明白了吧 :-)  
  24.   double FasterMANow, SlowerMANow, FasterMAPrevious, SlowerMAPrevious;  
  25.   //下面是给各个变量赋值,iMA就是均线函数,里面的各个参数可以在我在论坛发的中文文档上查到说明的  
  26.   FasterMANow = iMA(NULL, 0, FasterMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar);  
  27.   SlowerMANow = iMA(NULL, 0, SlowerMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar);  
  28.   FasterMAPrevious = iMA(NULL, 0, FasterMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar+1);  
  29.   SlowerMAPrevious = iMA(NULL, 0, SlowerMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar+1);  
  30.   //下面开始判断是否发生金叉了  
  31.   if ((FasterMANow > SlowerMANow) && (FasterMAPrevious <= SlowerMAPrevious)) {  
  32.       if ((TotalOrders(Magic_Number)==0) && (Time[0]>last_t))  ///如果当前的EA还没有下单  
  33.       {  
  34.         RefreshRates();  ///刷新市场报价  
  35.         ///下单都是用OrderSend()函数来进行的,这是个系统函数,详细说明可以在文档里面查到  
  36.         OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), 3, NormalizeDouble(Ask-StopLoss*Point,Digits),  
  37.             NormalizeDouble(Ask+TakeProfit*Point,Digits), "", Magic_Number, 0, Blue);  
  38.         last_t = Time[0];  
  39.         return (0);   
  40.       }         
  41.   }  
  42.   //如果没有发生金叉,则下面开始判断是否发生死叉  
  43.       else if ((FasterMANow < SlowerMANow) && (FasterMAPrevious >= SlowerMAPrevious)) {  
  44.         if ((TotalOrders(Magic_Number)==0) && (Time[0]>last_t))   
  45.         {  
  46.             RefreshRates();  
  47.             OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid,Digits), 3, NormalizeDouble(Bid+StopLoss*Point,Digits),  
  48.               NormalizeDouble(Bid-TakeProfit*Point,Digits), "", Magic_Number, 0, Blue);  
  49.             last_t = Time[0];  
  50.             return (0);   
  51.         }           
  52.       }   
  53.   return(0);  
  54.   }  
  55. //TotalOrders()函数的作用是返回Magic_Number为magic的EA所下的单子的总数  
  56. int TotalOrders(int magic){  
  57.   int rez=0;  
  58.   for (int i=0;i<OrdersTotal();i++){  ///这里做一个循环,OrderTotal()是系统函数,作用是返回当前帐户下所有尚未平仓的单子总数  
  59.       OrderSelect(i,SELECT_BY_POS);    ///OrderSelect()是系统函数,具体说明可以在文档里面查到  
  60.       if (OrderMagicNumber()==magic){  ///如果这个订单是当前EA所下的单  
  61.         rez++;  
  62.       }  
  63.   }   
  64.   return(rez);    ///返回循环计算后得到的当前EA所下的单子的总数  
  65. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 保留保留

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
沙发
 楼主| 发表于 2016-6-21 22:59 | 只看该作者
------谨慎使用。

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
板凳
 楼主| 发表于 2016-6-21 23:01 | 只看该作者
ime[]开盘时间
datetime Time[]
系列数组包含当前图表的每个柱开盘时间。数据像日期时间一样呈现时间,从1979年1月1日零点开始以秒计算。

系列数组元素被索引入倒序的定单,即从最后一个到第一个。当前最后一个柱在数组中的索引为0。图表中的第一个柱的索引为 Bars-1.

参见 iTime().
示例:
   for(i=Bars-2; i>=0; i--)
     {
      if(High[i+1] > LastHigh) LastHigh = High[i+1];
      if(Low[i+1] < LastLow)   LastLow  = Low[i+1];
      //----
      if(TimeDay(Time[i]) != TimeDay(Time[i+1]))
        {
         P = (LastHigh + LastLow + Close[i+1])/3;
         R1 = P*2 - LastLow;
         S1 = P*2 - LastHigh;
         R2 = P + LastHigh - LastLow;
         S2 = P - (LastHigh - LastLow);
         R3 = P*2 + LastHigh - LastLow*2;
         S3 = P*2 - (LastHigh*2 - LastLow);
         LastLow  = Open[i];
         LastHigh = Open[i];
        }
      //----
      PBuffer[i]  = P;
      S1Buffer[i] = S1;
      R1Buffer[i] = R1;
      S2Buffer[i] = S2;
      R2Buffer[i] = R2;
      S3Buffer[i] = S3;
      R3Buffer[i] = R3;
     }

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
地板
 楼主| 发表于 2016-6-21 23:11 | 只看该作者
#define MAGICMA  20050610 //定义本EA操作的订单的唯一标识号码

extern double Lots               = 0.1;//每单的交易量
extern double MaximumRisk        = 0.02;//作者定义的最大风险参数
extern double DecreaseFactor     = 3;//作者定义的参数,作用要看程序中的用法
extern double MovingPeriod       = 10;//EA中使用的均线的周期
extern double MovingShift        =3;//EA中使用的均线向左的K线偏移量
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)//函数作用,计算当前持仓订单的数量
  {
   int buys=0,sells=0;//定义两个临时变量,准备用于后面的多空订单的个数计算
//----
   for(int i=0;i<OrdersTotal();i++)//循环检测当前的订单队列
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持仓单的每一个订单位置
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根据订单位置,比较是否是当前K线商品 以及订单唯一标识号是否和本程序设置的一致(用于避免EA误操作其他程序控制的持仓单)
        {
         if(OrderType()==OP_BUY)  buys++;//找到符合条件的持仓单后,如果是多单,则临时变量buys增加1
         if(OrderType()==OP_SELL) sells++;//找到符合条件的持仓单后,如果是空单,则临时变量sells增加1
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);//本函数返回查询计算结束时的持仓单的个数。
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()//函数目的,根据要求 计算出订单交易量
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total 历史出场订单的个数
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);//通过风险系数的计算获得当前入场单应该采用的交易量
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循环查询出场单队列
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;//循环计算所有出场亏损单的亏损总和
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果亏损额大于1,则下一入场单的交易量修正为新的计算结果。
     }
//---- return lot size
   if(lot<0.1) lot=0.1;//如果计算出的交易量小于帐户最小手数0.1,则下一入场单的交易手数使用0.1作为交易量
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()//检查入场条件的情况并作处理
  {
   double ma;
   int    res;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;//如果当前K线持仓量大于1,说明不是K线的开盘时间点,则直接返回 否则是K线第一个价格,则继续下面的过程
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//获得当前的均线数值
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  //如当前K开盘价大于均线,而前一K收盘价小于均线,则发出入场多单
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//---- buy conditions
   if(Open[1]<ma && Close[1]>ma)  //如当前K开盘价小于均线,而前一K收盘价大于均线,则发出入场空单
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()//检查出场条件的情况并作处理
  {
   double ma;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//---- get Moving Average
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //---- check order type
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持仓是多单,则当当前K开盘价小于均线,而前一K收盘价大于均线,则发出平仓指令
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持仓是空单,则当当前K开盘价大于均线,而前一K收盘价小于均线,则发出平仓指令

         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()//主循环过程
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
5
 楼主| 发表于 2016-6-21 23:13 | 只看该作者
我的多货币的均线共振ea已经基本完成 还有最后一个问题 有时间请看看!


按照我的策略 如果符合条件应该四个货币对 每个开一个单子,我的ea不知为何只开三个单子 我设定的是四个货币对每个开一个
eu gu uc 都开了 就是uj不开仓
代码结构都是一样的

//+------------------------------------------------------------------+
//| Designed by AAA, China |
//| Copyright 2007, OKwh & Dxdcn & AAA |
//| THIS EA IS reworded by rosh'indicator |
//+------------------------------------------------------------------+
#property copyright "Copyright 2007,AAA, China."
#property link "http"
#define MAGICMA 200810011231
//+------------------------------------------------------------------+
//| 策略: 在15分钟周期下 eu gu 1周期均线在60周期均线下方 且uc uj的1周期均线在60均线上方|
//| eu gu uc uj 每个货币对顺势开一个仓,同时设置止损、只赢 |
//| 四个条件都不满足 平仓离场 |
//+------------------------------------------------------------------+
//
extern double TakeProfit = 100; //止赢点数
extern double StopLoss = 60; //止损点数
extern double TrailingStop =40; //跟踪止赢点数设置
extern int maxOpen = 4; //最多开仓次数限制
//extern int bb = 0; //非零就允许跟踪止赢
//
extern double lots=0.1; //一次下单手数

int i, p2, xxx,p1, res1,res2,res3,res4; //时间控制, 仅当一个时间周期完成才检查条件
int buyeu=0,selleu=0,buygu=0,sellgu=0,buyuc=0,selluc=0,buyuj=0,selluj=0;
int init() //初始化
{

return(0);
}
int deinit() { return(0); } //反初始化
//主程序
int start()
{
CheckForOpen(); //开仓 平仓 条件检查 和操作
//if (bb>0) CTP(); //跟踪止赢
return(0);
}
//+------下面是各子程序--------------------------------------------+


//平仓持有的买单、、先结束买肥美
void CloseBuy()
{
double Bideu =MarketInfo("EURUSD",MODE_BID);
double Askeu =MarketInfo("EURUSD",MODE_ASK);
//
double Bidgu =MarketInfo("GBPUSD",MODE_BID);
double Askgu =MarketInfo("GBPUSD",MODE_ASK);
//
double Biduc =MarketInfo("USDCHF",MODE_BID);
double Askuc =MarketInfo("USDCHF",MODE_ASK);
//
double Biduj =MarketInfo("USDJPY",MODE_BID);
double Askuj =MarketInfo("USDJPY",MODE_ASK);
if (OrdersTotal( ) > 0 )
{
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()==MAGICMA+1)
{
OrderClose(OrderTicket(),OrderLots(),Bideu,4,White);
}
if(OrderMagicNumber()==MAGICMA+2)
{
OrderClose(OrderTicket(),OrderLots(),Bidgu,4,White);
}
if(OrderMagicNumber()==MAGICMA+3)
{
OrderClose(OrderTicket(),OrderLots(),Askuc,4,White);
}
if(OrderMagicNumber()==MAGICMA+4)
{
OrderClose(OrderTicket(),OrderLots(),Askuj,4,White);
}
if(OrderMagicNumber()==MAGICMA+5) //已开eu空仓
{
selleu=1; //标记
}
if(OrderMagicNumber()==MAGICMA+6) //已开gu空仓
{
sellgu=1;
}
if(OrderMagicNumber()==MAGICMA+7) //已开uc多仓
{
buyuc=1;
}
if(OrderMagicNumber()==MAGICMA+8) //已开uj多仓
{
buyuj=1;
}
}
}
}
//平仓持有的卖单、、先结束卖肥美
void CloseSell()
{
double Bideu =MarketInfo("EURUSD",MODE_BID);
double Askeu =MarketInfo("EURUSD",MODE_ASK);
//
double Bidgu =MarketInfo("GBPUSD",MODE_BID);
double Askgu =MarketInfo("GBPUSD",MODE_ASK);
//
double Biduc =MarketInfo("USDCHF",MODE_BID);
double Askuc =MarketInfo("USDCHF",MODE_ASK);
//
double Biduj =MarketInfo("USDJPY",MODE_BID);
double Askuj =MarketInfo("USDJPY",MODE_ASK);
if (OrdersTotal( ) > 0 )
{
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()==MAGICMA+5)
{
OrderClose(OrderTicket(),OrderLots(),Askeu,4,White);
}
if(OrderMagicNumber()==MAGICMA+6)
{
OrderClose(OrderTicket(),OrderLots(),Askgu,4,White);
}
if(OrderMagicNumber()==MAGICMA+7)
{
OrderClose(OrderTicket(),OrderLots(),Biduc,4,White);
}
if(OrderMagicNumber()==MAGICMA+8)
{
OrderClose(OrderTicket(),OrderLots(),Biduj,4,White);
}
if(OrderMagicNumber()==MAGICMA+1) //已开eu多仓
{
buyeu=1; //标记
}
if(OrderMagicNumber()==MAGICMA+2) //已开gu多仓
{
buygu=1;
}
if(OrderMagicNumber()==MAGICMA+3) //已开uc空仓
{
selluc=1;
}
if(OrderMagicNumber()==MAGICMA+4) //已开uj空仓
{
selluj=1;
}

}
}
}
//判断是否买或卖或平仓
int buyorsell() //在这个函数计算设置你的交易信号
{
double easyeu11,easyeu21,easygu11,easygu21,easyuc11,easyuc21,easyuj11,easyuj21;
//
easyeu11=iMA("EURUSD",PERIOD_M15,1,0,MODE_SMA,PRICE_TYPICAL,0);
easyeu21=iMA("EURUSD",PERIOD_M15,60,0,MODE_SMA,PRICE_TYPICAL,0);
easygu11=iMA("GBPUSD",PERIOD_M15,1,0,MODE_SMA,PRICE_TYPICAL,0);
easygu21=iMA("GBPUSD",PERIOD_M15,60,0,MODE_SMA,PRICE_TYPICAL,0);
easyuc11=iMA("USDCHF",PERIOD_M15,1,0,MODE_SMA,PRICE_TYPICAL,0);
easyuc21=iMA("USDCHF",PERIOD_M15,60,0,MODE_SMA,PRICE_TYPICAL,0);
easyuj11=iMA("USDJPY",PERIOD_M15,1,0,MODE_SMA,PRICE_TYPICAL,0);
easyuj21=iMA("USDJPY",PERIOD_M15,60,0,MODE_SMA,PRICE_TYPICAL,0);
Print(easyeu11,"-01-",easyeu21,"-02-",easygu11,"-03-",easygu21,"-04-",easyuc11,"-05-",easyuc21,"-06-",easyuj11,"-07-",easyuj21,"-08-");
if(easyeu21<easyeu11 && easygu21<easygu11 && easyuc11<easyuc21 && easyuj11<easyuj21 )
return (1); // 买肥美SELL USD
if( easyeu21>easyeu11 && easygu21>easygu11 && easyuc11>easyuc21 && easyuj11>easyuj21 )
return (-1); // 卖肥美 BUY USD
//
return (0); //不交易 NO ANY OPENNING
}
int nowbuyorsell = 0;
void CheckForOpen()
{
//if (Time[0] == lasttime ) return; //每时间周期检查一次 时间控制
//lasttime = Time[0];
nowbuyorsell = buyorsell(); //获取买卖信号

if (nowbuyorsell == 1) //买 先结束卖肥美 CLOSE BUY USD
CloseSell();
if (nowbuyorsell == -1) //卖 先结束买肥美 CLOSE SELL USD
CloseBuy();


if (OrdersTotal( ) > maxOpen) return ;
//如果已持有开仓次数达到最大,不做
if (nowbuyorsell==0) return; //不交易
TradeOK(); //去下单交易
}
void TradeOK() //去下单交易
{
//int error ;
double Bideu =MarketInfo("EURUSD",MODE_BID);
double Askeu =MarketInfo("EURUSD",MODE_ASK);
//
double Bidgu =MarketInfo("GBPUSD",MODE_BID);
double Askgu =MarketInfo("GBPUSD",MODE_ASK);
//
double Biduc =MarketInfo("USDCHF",MODE_BID);
double Askuc =MarketInfo("USDCHF",MODE_ASK);
//
double Biduj =MarketInfo("USDJPY",MODE_BID);
double Askuj =MarketInfo("USDJPY",MODE_ASK);
//

//
if (nowbuyorsell == 1) //买肥美 SELL USD
{
if (buyeu != 1 )
{
res1=OrderSend("EURUSD",OP_BUY,lots,Askeu,4,Askeu-StopLoss*Point,Askeu+TakeProfit*Point,"",MAGICMA+1,0,Blue); Sleep(5000);
}
if (buygu != 1 )
{
res2=OrderSend("GBPUSD",OP_BUY,lots,Askgu,4,Askgu-StopLoss*Point,Askgu+TakeProfit*Point,"",MAGICMA+2,0,Blue); Sleep(5000);
}
if ( selluc != 1)
{
res3=OrderSend("USDCHF",OP_SELL,lots,Biduc,4,Biduc+StopLoss*Point,Biduc-TakeProfit*Point,"",MAGICMA+3,0,Blue); Sleep(5000);
}
if ( selluj != 1)
{
res4=OrderSend("USDJPY",OP_SELL,lots,Biduj,4,Biduj+StopLoss*Point,Biduj-TakeProfit*Point,"",MAGICMA+4,0,Blue); Sleep(5000);
}
Print(" 买肥美short USD ",res1,res2,res3,res4);
//Sleep(5000);
return ;
}
if (nowbuyorsell == -1) //卖肥美 BUY USD
{
if (selleu != 1 && (iMA("EURUSD",PERIOD_M15,60,0,MODE_SMA,PRICE_TYPICAL,0))<= Bideu+20*Point)

{
res1=OrderSend("EURUSD",OP_SELL,lots,Bideu,4,Bideu+StopLoss*Point,Bideu-TakeProfit*Point,"",MAGICMA+5,0,Blue); Sleep(5000);
}
if (sellgu != 1)
{
res2=OrderSend("GBPUSD",OP_SELL,lots,Bidgu,4,Bidgu+StopLoss*Point,Bidgu-TakeProfit*Point,"",MAGICMA+6,0,Blue); Sleep(5000);
}
if (buyuc != 1)
{
res3=OrderSend("USDCHF",OP_BUY,lots,Askuc,4,Askuc-StopLoss*Point,Askuc+TakeProfit*Point,"",MAGICMA+7,0,Blue); Sleep(5000);
}
if (buyuj != 1)
{
res4=OrderSend("USDJPY",OP_BUY,lots,Askuj,4,Askuj-StopLoss*Point,Askuj+TakeProfit*Point,"",MAGICMA+8,0,Blue); Sleep(5000);
}
Print(" 卖肥美long USD ",res1,res2,res3,res4);
//Sleep(5000);
return ;
}
}

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
6
 楼主| 发表于 2016-6-21 23:25 | 只看该作者
什么是MagicNumber?让我们来看一下MT4语言中的定义:
int OrderSend(……, int magic=0, ……)
magic - Order magic number. May be used as user defined identifier
MagicNumber可以作为由用户来指定,作为订单的标识符。有几种场景下需要用到他:
(1)EA和人同时操作一个账户,EA和人需要根据不同的交易策略来入场和平仓
(2)两个不同交易策略的EA同时操作一个账户
(3)多个EA,一个人工交易者,一个仅修改人工开单的移动止损的辅助程序同时操作一个账户

//extern int Expert_ID = 1234;

int start()
{
    double MACD_1 = iMACD( Symbol(), 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1 );
    double MACD_2 = iMACD( Symbol(), 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2 );

    int _GetLastError = 0, _OrdersTotal = OrdersTotal();


  
    //对现有头寸进行处理
    for ( int z = _OrdersTotal - 1; z >= 0; z -- )
    {
        OrderSelect( z, SELECT_BY_POS );

        //if ( OrderMagicNumber() != Expert_ID ) continue;

        if ( OrderType() == OP_BUY ) //如果选中订单为多单
        {  //---- 如果macd下穿0轴则平多单  }
        if ( OrderType() == OP_SELL )   //如果选中订单为空单
        {  //---- 如果macd上穿0轴则平空单  }
    }

    //判断是否符合开仓条件,如果符合则新建头寸
    if ( NormalizeDouble( MACD_1, Digits + 1 ) >  0.0 &&
          NormalizeDouble( MACD_2, Digits + 1 ) <= 0.0    )  //满足多单条件
    {
        OrderSend( Symbol(), OP_BUY, 0.1, Ask, 5, 0.0, 0.0, "MACD_test", 0, 0, Green ) ;
        //OrderSend( Symbol(), OP_BUY, 0.1, Ask, 5, 0.0, 0.0, "MACD_test", Expert_ID, 0, Green ) ;
        return(0);
    }
    if ( NormalizeDouble( MACD_1, Digits + 1 ) <  0.0 &&
          NormalizeDouble( MACD_2, Digits + 1 ) >= 0.0    )   //满足空单条件
    {
        OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5, 0.0, 0.0, "MACD_test", 0, 0, Red );
        //OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5, 0.0, 0.0, "MACD_test", Expert_ID, 0, Red );
        return(0);
    }
    return(0);
}


  
上面代码中没有设置MagicNumber参数,因此将此EA附加到某对货币上运行的时候,如果我们人工开单了,在“//对现有头寸进行处理的代码”过程中就会被平仓,而这个并不是我们想要的,那么按照如下步骤修改代码能够解决这个问题(增加后的代码红色显示):
(1) EA头部增加变量声明:extern int Expert_ID = 1234;
(2) 对现有头寸处理代码部分增加MagicNumber判断语句
if ( OrderMagicNumber() != Expert_ID ) continue;
(3) 开仓语句中增加MagicNumber标识:
OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5, 0.0, 0.0, "MACD_test", Expert_ID, 0, Red )


  
如果一个EA需要在同一个货币对的不同时间周期上同时执行该怎么办呢?此时使用相同的MagicNumber是不行的,很自然可以想到针对不同的时间周期生成不同的MagicNumber。例如:
_MagicNumber = Expert_ID * 10 + Period_ID; (Period_ID可以根据不同周期赋不同的值)

30

主题

1万

积分

0

精华

操盘专家

金钱
13838 美元
权重
1
7
发表于 2016-10-11 10:07 | 只看该作者
F大爷,这个可以行,不同币种好搞一个Symbol就行了,如果再加个不同周期的也可以吧。
不过用订单识别号的改法学习了。

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
8
 楼主| 发表于 2016-10-11 10:09 | 只看该作者
过去了 发表于 2016-10-11 10:07
F大爷,这个可以行,不同币种好搞一个Symbol就行了,如果再加个不同周期的也可以吧。
不过用订单识别号的 ...

代码学习已经停止,下次等明年这个时候,槐花

30

主题

1万

积分

0

精华

操盘专家

金钱
13838 美元
权重
1
9
发表于 2016-10-11 10:14 | 只看该作者
F大爷,这个代码东西,我感觉有空就去学学看,也不一定是学校考试要怎么怎么样,毕竟EA或者半EA是个趋势。
以后学得学JAVA,光MQL4不行了。个人理解……

2128

主题

6万

积分

157

精华

大型投行

金钱
61603 美元
权重
640
10
 楼主| 发表于 2016-10-11 10:19 | 只看该作者
过去了 发表于 2016-10-11 10:14
F大爷,这个代码东西,我感觉有空就去学学看,也不一定是学校考试要怎么怎么样,毕竟EA或者半EA是个趋势。
...

容易走火

2

主题

246

积分

0

精华

见习操盘手

金钱
246 美元
权重
0
11
发表于 2017-2-20 16:42 来自手机 | 只看该作者
我非常喜欢,谢啦

2

主题

246

积分

0

精华

见习操盘手

金钱
246 美元
权重
0
12
发表于 2017-2-20 18:21 | 只看该作者
学习了     支持

0

主题

30

积分

0

精华

外汇入门

金钱
30 美元
权重
0
13
发表于 2017-2-21 22:01 | 只看该作者
感谢楼主分享,让我们新人学习一下!

0

主题

114

积分

0

精华

见习操盘手

金钱
114 美元
权重
0
14
发表于 2017-2-26 00:36 | 只看该作者
我非常喜欢,谢啦

0

主题

71

积分

0

精华

外汇入门

金钱
71 美元
权重
0
15
发表于 2017-3-2 17:54 | 只看该作者
感谢楼主分享!学习了!

0

主题

21

积分

0

精华

外汇入门

金钱
21 美元
权重
0
16
发表于 2017-3-3 02:12 | 只看该作者
一起研究一下

1

主题

25

积分

0

精华

外汇入门

金钱
25 美元
权重
0
17
发表于 2017-3-4 12:02 | 只看该作者
惺惺惜惺惺想寻寻

1

主题

25

积分

0

精华

外汇入门

金钱
25 美元
权重
0
18
发表于 2017-3-4 12:02 | 只看该作者
惺惺惜惺惺想寻寻

0

主题

20

积分

0

精华

外汇入门

金钱
20 美元
权重
0
19
发表于 2017-3-20 15:58 | 只看该作者
谢谢共享

0

主题

59

积分

0

精华

外汇入门

金钱
59 美元
权重
0
20
发表于 2017-4-8 13:47 | 只看该作者
看不懂
您需要登录后才可以回帖 登录 | 快捷注册(禁q号)

本版积分规则

QQ|黄金吧|黄金论坛|手机版|指标下载|非农|目录|交易危机

版权所有: ©2014-2021 fx3q.com Powered by Discuz! X3
皖ICP备: 2024050410号-2

风险提示:杠杆风险高,交易要谨慎 声明:坛友发言和回复均为个人观点,不代表论坛立场。
若有侵权请联系fx3q@qq.com删除

快速回复 返回顶部 返回列表