[存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. - 页 288

 

下午好,谁能帮助解决一个问题,也许我做错了什么。

我有一个Klima块,在takei返回最后一个头寸的平仓标志,对停止也是如此。

//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}

但我是这样使用它的。

bool Buystop=isCloseLastPosByStop(NULL,OP_BUY,MagBuy);
bool BuyTake=isCloseLastPosByTake(NULL,OP_BUY,MagBuy);
bool Sellstop=isCloseLastPosByStop(NULL,OP_SELL,MagBuy);
bool SellTake=isCloseLastPosByTake(NULL,OP_SELL,MagBuy);

//--------------------------------------------------------------------------------+
if(total==1) 
  {
   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }

起初,一切都按计划进行,在第4批开出了我需要的一个,这个也是。

if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   } 

我搞不清楚它是干什么用的。

为清晰起见

时间 类型 秩序 卷宗 价格 S / L T / P 盈利 平衡
1 2011.01.03 00:00 购买 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 出售 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 出售 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 出售 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 购买 5 1.00 1.2946 1.2746 1.3046

 
FoxUA:

我不知道它是用来干什么的


这就对了。

第一次检查(总数==1)发生在订单仍为1的时候。在该区块内,你发现最后关闭的卖出->打开,最后关闭的买入->再次打开。这使得3个订单。

 
Figar0:


是的,这就对了。

第一次检查(总数==1)发生在订单仍为1的时候。在该区块内,你可以找到最后一次关闭的卖出->打开,最后一次关闭的买入->再次打开。这已经导致了3个订单。


是的,但如何使它是只有2个订单,所以它不打开一个订单下的数字6。

时间 类型 秩序 卷宗 价格 S / L T / P 盈利 平衡
1 2011.01.03 00:00 购买 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 出售 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 出售 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 出售 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 购买 5 1.00 1.2946 1.2746 1.3046

 

最简单的方法是检查是否存在买入或卖出类型的未结订单。以此为例(变量BuyOrders, SellOrders, TotalOrders是程序中的全局变量;它们必须在start()函数中声明为int BuyOrders, SellOrders, TotalOrders;):

void OrdersRecount()
{
  BuyOrders=0; SellOrders=0; TotalOrders=0;
  if (OrdersTotal()>0)
  {
    for (int j = 0; j < OrdersTotal(); j++) 
    {
      if (OrderSelect(j, SELECT_BY_POS)) 
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagBuy)
        {
          if (OrderType() == OP_BUY) BuyOrders++;
          if (OrderType() == OP_SELL) SellOrders++;        
          TotalOrders++;
        }
      }
    } 
  }
}
 
Figar0:

有很多选择,最简单的是检查是否有开放的买入或卖出订单。就拿这个来说吧。


我不知道如何使用它,请帮助我。

 
FoxUA:


我不明白如何使用它,所以如果你能帮助我。


我会的,但我还是不明白你的代码的逻辑。

   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }
你确定它能打开买入三箱,卖出一箱吗?这不是对称的...
 
Figar0:


我会帮助你,但我还不明白你的代码的逻辑。

你确定在三种情况下你开的是卖出头寸,而在一种情况下是买入头寸吗?这不是对称的...


我想让它在市场上没有头寸时打开,如果其中一个值是正确的,那么就打开1个订单并等待头寸关闭。

bool totalBuy=ExistPositions(NULL,OP_BUY,MagBuy) ;
bool totalSell=ExistPositions(NULL,OP_SELL,MagBuy) ;


if(totalBuy==False||totalSell==False) 
 
FoxUA:

我希望它只在市场上没有头寸的情况下打开,如果选择的数值之一是正确的,则打开1个订单,然后等待头寸关闭。

所以,事实证明你可能有2个买单 而没有卖单?
 

Figar0:

Т.е. получается что возможна ситуация когда у вас будет 2 ордера на покупку и не одного на продаж

不,恰恰相反,应该只有2个头寸,包括没有止损和跟踪的卖出,报表显示了它是如何发生的。一切都正确,但在6号下面的一个额外头寸打开。
 
FoxUA:
不,反之亦然,仓位应该只有2个,包括没有止损和保值的卖出,报表显示了它是如何运作的。 对,但在6号下开了一个额外的仓位。


那么,一切都将变得更加复杂。 用文字描述一下算法应该如何工作,我将尝试帮助你,同时我也会帮助你)

- 同时可以有2个位置。

- 首先开设2个仓位:买入和卖出。

下一个?

原因: