查看完整版本: 重复下单 请版主进来指导

tongljuly 2008-2-13 16:53

重复下单 请版主进来指导

小弟潜水,学识浅,不敢乱问。
      初步设想了个系统,以不同周期均线交叉点密度判断盘整、单边。盘整高抛低吸,单边顺势加码。
      先完成单边的顺势加码部分,但遇到重复下单问题,原码如下:
      l=MathFloor((MarketInfo(Symbol(),MODE_ASK)-Benchmark)/(Step* MarketInfo(Symbol(),MODE_POINT)));
      m=MathCeil((MarketInfo(Symbol(),MODE_BID)-Benchmark)/(Step* MarketInfo(Symbol(),MODE_POINT)));
      buycnt1=0;
      buycnt2=0;
      sellcnt1=0;
      sellcnt2=0;
      for(cnt=total;cnt>=0;cnt--)
         {
          OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
          if((OrderType()==OP_SELL || OrderType()==OP_SELLSTOP)&&
             OrderSymbol()==Symbol())
             {
              atRate1=Benchmark+(l-1)*Step*MarketInfo(Symbol(),MODE_POINT);
              atRate2=Benchmark+(m-6)*Step*MarketInfo(Symbol(),MODE_POINT);
              if (MathAbs( OrderOpenPrice() - atRate1) < inRange) {sellcnt1+=1;}
              if (MathAbs( OrderOpenPrice() - atRate2) < inRange) {sellcnt2+=1;}
             }
          if((OrderType()==OP_BUY || OrderType()==OP_BUYSTOP)&&
             OrderSymbol()==Symbol())
             {   
              atRate3=Benchmark+(m+1)*Step*MarketInfo(Symbol(),MODE_POINT);
              atRate4=Benchmark+(l+6)*Step*MarketInfo(Symbol(),MODE_POINT);
              if (MathAbs( OrderOpenPrice() - atRate3) < inRange) {buycnt1+=1;}
              if (MathAbs( OrderOpenPrice() - atRate4) < inRange) {buycnt2+=1;}
             }
         }
         Print("s1=",sellcnt1);
           Print("s2=",sellcnt2);
             Print("b1=",buycnt1);
               Print("b2=",buycnt2);
         if(sellcnt1<1) {OrderSend(Symbol(),OP_SELLSTOP,Lots,Benchmark+(l-1)*Step*MarketInfo(Symbol(),MODE_POINT),3,0,0,"",0,0,Green);}
         if(sellcnt2<1) {OrderSend(Symbol(),OP_SELLSTOP,Lots,Benchmark+(m-6)*Step*MarketInfo(Symbol(),MODE_POINT),3,0,0,"",0,0,Green);}   
         if(buycnt1<1) {OrderSend(Symbol(),OP_BUYSTOP,Lots,Benchmark+(m+1)*Step*MarketInfo(Symbol(),MODE_POINT),3,0,0,"",0,0,Red);}  
         if(buycnt2<1) {OrderSend(Symbol(),OP_BUYSTOP,Lots,Benchmark+(l+6)*Step*MarketInfo(Symbol(),MODE_POINT),3,0,0,"",0,0,Red);}

这段是想在某一固定价位atRate1,atRate2,atRate3,atRate4已有成交单或是挂单,就不再挂单了。否则就补一单。但程序会一直判断没有。。一直补单。。望赐教,不胜感激。
       最后祝大家鼠年行大运,赚钱赚开心。

tongljuly 2008-2-13 16:56

其中inRange是滑点值。。外面变量。。一般设为3个点差。

tongljuly 2008-2-13 17:00

辛苦版主了。

[[i] 本帖最后由 tongljuly 于 2008-2-15 00:50 编辑 [/i]]

xfxyldj 2008-2-13 21:18

首先下面三个语句MT4中已经定义了系统变量。不需要用MarketInfo()函数求的。
1、Ask=  MarketInfo(Symbol(),MODE_ASK)
2、Bid=  MarketInfo(Symbol(),MODE_BID)
3、Point=MarketInfo(Symbol(),MODE_POINT)
还有建议你研究下。OrderSend()函数的int magic=0参数。用它来标记订单。效果会更好。
错误的地方。
n=MathFloor((MarketInfo(Symbol(),MODE_BID)-Benchmark)/(Step* MarketInfo(Symbol(),MODE_POINT)));
l=MathFloor((MarketInfo(Symbol(),MODE_ASK)-Benchmark)/(Step* MarketInfo(Symbol(),MODE_POINT)));
m=MathCeil((MarketInfo(Symbol(),MODE_BID)-Benchmark)/(Step* MarketInfo(Symbol(),MODE_POINT)));
这三个语句的运算结果绝对不是你想要的。你用欧元的价格带入就知道了。
还有你挂单语句中的价格计算也有问题。首要问题就是价格的计算你把所有涉及价格的语句都检查下。
你先修改看看吧。太乱不好读。

tongljuly 2008-2-14 02:06

谢谢版主解答。。我这个初版只针对美日。。n,l,m的求法我认为是正确的。。
我把这部分想实现的目标在下面的帖子说下。

tongljuly 2008-2-14 02:29

以美日为例,先设基准点Benchmark=100.00,固定网格距离step=10point,
从基准点到当前价位 共有n个格,当ask bid都在n n+1之间时挂单,上挂买 下挂卖。
当bid<n时 即sellstop n 成交 检查n+1的买单有无成交单或挂单,没有则补挂单;检查n—6或是更下面有无卖单(保证有固定数量的sellstop挂单,此例为6),无则补之。
当ask>n+1时,即 buystop(n+1)成交,检查n有无卖单挂单或成交单,无则补之;检查n+7
上有无买单,无则补之。
其中n 代表 第n格的价格=100+0.1n.

tongljuly 2008-2-14 02:31

magic的建议提得非常好,我试着看看。。再争取把我的代码写得简洁些。

xfxyldj 2008-2-14 10:53

if (MathAbs( OrderOpenPrice() - atRate1) < inRange) {sellcnt1+=1;}
if (MathAbs( OrderOpenPrice() - atRate2) < inRange) {sellcnt2+=1;}
if (MathAbs( OrderOpenPrice() - atRate3) < inRange) {buycnt1+=1;}
if (MathAbs( OrderOpenPrice() - atRate4) < inRange) {buycnt2+=1;}

仔细检查你的价格计算吧。
这四个语句,当有订单成交后如果价格只有1~2个点的波动的时候IF语句一直都不成立。
所以后面的追加订单语句一直都可以执行。
atRate1=Benchmark+(l-1)*Step*MarketInfo(Symbol(),MODE_POINT);
atRate2=Benchmark+(m-6)*Step*MarketInfo(Symbol(),MODE_POINT);
atRate3=Benchmark+(m+1)*Step*MarketInfo(Symbol(),MODE_POINT);
atRate4=Benchmark+(l+6)*Step*MarketInfo(Symbol(),MODE_POINT);
这四个语句与i没有任何关系。可以放在For循环外面。在循环里面增加运算量。

tongljuly 2008-2-14 22:04

谢谢版主答复。。问题解决了。。确实l,m,n也有问题,很乱。是用maigc 解决的。
还想问版主一个问题:假若有几个单同时止损在同一价位,现在价位到止损位了,那几个单是同时止损吗? 假若价格飞速变化,出数据时,是不是会出现有的单不会止损?

xfxyldj 2008-2-15 10:29

订单的止损价格是存在于服务器的。
同样的止损价格同一个账户一定会在同时止损。
页: [1]
查看完整版本: 重复下单 请版主进来指导