加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

关于同双向挂单EA

(2013-01-05 06:18:26)
标签:

杂谈



各位高人,问题如下,我想编写一个在阻力和支撑位同时挂单EA,阻力位为和支撑位在属性里输入,首先取消阻力位和支撑位置间的所有挂单,然后,当一张订单处于开仓状态(挂单价格被触发),就取消另一张反方向的挂单。可是我发现,每次都是所有订单全部被取消,经过反复查看,我认为是OrderTicket()的确定问题,就是不能正确的分配订单号,因此一取消,就全取消了。我的代码如下,希望高人帮忙看一下,能帮忙改好最好,如果过太麻烦,给指条明路,给个思路,或者告诉一个例子,我自己去阅读理解,我实在是没办法了,各种方法都是过了,觉得自己已经走进了死胡同,希望高人帮忙,万分感激。
  1. //+------------------------------------------------------------------+
  2. //|                                          Two Direction Order.mq4 |
  3. //|                       Copyright ?2010, MetaQuotes Software Corp. |
  4. //|                                        http://www.metaquotes.net |
  5. //+------------------------------------------------------------------+
  6. #define Magic 020909 //
  7. extern int Slippage=3;//滑点
  8. extern double R=1.4200;//Zone 的阻力位
  9. extern double S=1.4100;//Zone 的支撑位

  10. //----全局变量===================

  11. int OrderTotal;//持仓总单数
  12. int TickLong;//突破挂单单号
  13. int TickShort;//突破空单挂单单号
  14. int TickOther;

  15. double LongOpenPrice;
  16. double ShortOpenPrice;
  17. double OtherOpenPrice;
  18.                
  19. int TypeLong; //突破多单订单类型
  20. int TypeShort;//突破空单订单类型
  21. int TypeOther;//区间订单类型

  22. double StopLost;



  23. //+------------------------------------------------------------------+
  24. //| expert initialization function                                   |
  25. //+------------------------------------------------------------------+
  26. int init()//初始化函数,负责程序变量及数据初始输入;只在程序调入时执行一次,一般不用重写内容。
  27.   {
  28.    

  29.   
  30. //----
  31.    return(0);
  32.   }
  33. //+------------------------------------------------------------------+
  34. //| expert deinitialization function                                 |
  35. //+------------------------------------------------------------------+
  36. int deinit()//反初始化函数,负责程序退出时,将数据从内存中清除;只在程序退出时,执行一次,一般不用重写内容。
  37.   {

  38.    
  39. //----
  40.    return(0);
  41.   }
  42. //+------------------------------------------------------------------+
  43. //| expert start function                                            |
  44. //+------------------------------------------------------------------+
  45. int start()
  46.   {
  47.    int Ticket; //自定义局部变量Ticket 用于记录每次下单后的状态,用于判断下单动作是否成功,如果不成功则做相应处理和提示
  48.    int Ticket1;

  49.    int OrderTotal=GetOrderTypeHolding();
  50.    
  51.    if(OrderTotal==0)//完全没有订单的情况
  52.      {//1
  53.        Ticket=OrderSend( Symbol(), OP_BUYSTOP, 0.1, R, Slippage,R-50*Point, 0, "Long", 020909, 0, Lime) ;
  54.        Ticket1=OrderSend( Symbol(), OP_SELLSTOP, 0.1, S, Slippage,S+50*Point, 0, "Short", 020909, 0, Red) ;
  55.          
  56.             if(Ticket<0)
  57.               {
  58.                Print("挂单失败"+GetLastError()); //打印挂单失败
  59.                return(0); //退出本次start函数的执行
  60.               }
  61.             if(Ticket1<0)
  62.               {
  63.                Print("挂单失败"+GetLastError()); //打印挂单失败
  64.                return(0); //退出本次start函数的执行
  65.                   
  66.          
  67.      }//1
  68.      
  69.    else //有订单情况
  70.      {//2  
  71.      OrderDelete(TickOther, Yellow);//消区间空单挂单      
  72.       if(LongOpenPrice>=R||ShortOpenPrice<=S)//如果开仓位置为突破交易位置
  73.         {//2-1
  74.         if(LongOpenPrice>=R&&TypeLong==OP_BUY)//突破多单已经开仓情况
  75.           {//2-1-1
  76.            OrderDelete(TickShort, Yellow);//消突破空单挂单
  77.           }//2-1-1
  78.         if(ShortOpenPrice>=R&&TypeShort==OP_SELL)//突破空单已经开仓情况
  79.           {//2-1-2
  80.            OrderDelete(TickLong, Yellow);//消突破多单挂单
  81.           }//2-1-2
  82.         }//2-1         
  83.      }//2
  84.      
  85.    return(0);
  86.    }
  87. //====================自定义函数部分================================================  
  88. //+------------------------------------------------------------------+
  89. //|自定义判断持仓情况                                                |
  90. //+------------------------------------------------------------------+
  91. int GetOrderTypeHolding()//从最近持仓单提取订单类型
  92.   {//1
  93.    OrderTotal=OrdersTotal();
  94.    
  95.    for(int i=OrdersTotal()-1;i>=0;i--)//循环条件
  96.      {//1-1
  97.       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);//查找订单函数
  98.       if(OrderSymbol()==Symbol())//如果仓单货币=目前的货币
  99.         {//1-2
  100.          StopLost=OrderStopLoss(); //自定义止损变量=返回的订单止损
  101.          if(OrderOpenPrice( )>=R)
  102.            {//1-2-1
  103.                TickLong=OrderTicket();//突破多单挂单单号
  104.                LongOpenPrice=OrderOpenPrice();
  105.                TypeLong=OrderType();
  106.            }//1-2-1
  107.          if(OrderOpenPrice( )<=S)
  108.            {//1-2-2
  109.                TickShort=OrderTicket();//突破空单挂单单号
  110.                ShortOpenPrice=OrderOpenPrice();
  111.                TypeShort=OrderType();
  112.            }//1-2-2
  113.          if(S<OrderOpenPrice()<R)//区间内挂单单号
  114.            {//1-2-3
  115.            TickOther=OrderTicket();
  116.            OtherOpenPrice=OrderOpenPrice();
  117.            TypeOther=OrderType();
  118.            }//1-2-3  
  119.         }//1-2
  120.      }//1-1
  121.    return(OrderTotal);//返回OrderTotal值
  122.   }//1

 

发表于 2010-2-3 22:57 只看该作者

首先的是你需要判断当前订单的类型,如果为空,则取消多头挂单。如果为多,则取消空头挂单
在else后面加上
if(OrderTotal==1)
OrderDelete(Tick0, Yellow);//

if(OrderTotal==0)
OrderDelete(Tick1, Yellow);//
你总共只有两个不同类型的订单,所很好判断
 
谢谢回复先,可是,我的情况是同时挂两个反方向的单,并且先把区间里的地其他挂单都取消,等待一个方向的订单已经执行(就是说已经不再是挂单状态),再取消另一个方向的挂单。如果为空就取消多单,那么这个时候并不知道多单的挂单是否已经执行,不知道我说明白了吗?继续等待指点
 
只能从magic入手 设置 magic全局 在send后面进行运算magic++; 这样先前的挂单的 magic肯定小于当前magic 比较magic,删除挂单
明白了 。
 
首先你使用 根据持仓单的数量进行两类状态分别处理时正确的。
其次,在持仓单=0的第一状态下,要先判断挂单个数是否为0 ,如果为0 再进行挂单入场动作。(道理自己想想)
第三、在持仓单>0的时候,要去的挂单的Ticket号码(这个可以写自定义函数,函数输出-1-表示没有挂单了,输出非-1数值为实际Ticket) 根据这个自定义函数的输出决定是删除Ticket对应的挂单 还是已经没挂单了不做任何处理。
大致就是这样流程。
 
搞定了,谢谢朋友们的帮忙,问题出在这里if(S<OrderOpenPrice()<R),改成if(S<OrderOpenPrice()&&OrderOpenPrice()&&<R),问题就解决了。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有