关闭职位。开启指示信号。 - 页 5

 
komposter:
摆脱

结果还是一样!在最后一个变体中,只有最后一个开仓的位置被关闭!

现在,在OrderClose 之后删除return,并观察结果;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
我按照指示做了。而奇迹发生了。所有未平仓的头寸都被指标的信号所关闭!但为什么呢?
 
rid:
康帕斯
摆脱

结果还是一样!在最后一个变体中,只有最后一个开仓的位置被关闭!

现在,在OrderClose 之后删除return,并观察结果;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
我按照指示做了。而奇迹发生了。所有未结头寸都根据指标信号进行了平仓!但为什么呢?
你的返回打断了处理周期。
 
明白了。感谢每个人的回应
 
KimIV:

我通常会实现这种功能。

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions() {
  double sl=0, tp=0;
  int    ms[2];
 
  ArrayInitialize(ms, 0);
  GetTradeSignal(ms);
  if (ExistPositions("", -1, Magic)) {
    if (ms[1]>0) ClosePositions("", OP_BUY , Magic);
    if (ms[1]<0) ClosePositions("", OP_SELL, Magic);
  } else {
    if (ms[0]>0) {
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      OpenPosition(OP_BUY, sl, tp, Magic);
    }
    if (ms[0]<0) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      OpenPosition(OP_SELL, sl, tp, Magic);
    }
  }
}
正如你所看到的,所写的函数执行的是相当具体的动作。然后以这样的方式将这些功能结合起来,以实施所需的职位工作策略。
请伊戈尔把你的功能描述得更详细一些。 我想了解它,但由于我的知识不多,一开始就失去了思路。
 
rid писал (а):
伊戈尔,请更详细地描述你的职能。我想了解它,但由于我的知识不多,我可能在一开始就失去了我的思路。

这是一个从工作的EA中提取的例子。功能分配。

  1. 函数GetTradeSignal()将交易信号填充到数组ms[]中。当然,每个专家都有自己的GetTradeSignal()函数的填料。
  2. 函数ExistPositions()返回位置存在的标志。
  3. 函数ClosePositions()在ms[]阵列中存在相应信号的情况下关闭一个或多个位置。在关闭之前,通过条件if(ExistPositions("", -1, Magic))检查位置的存在。
  4. 函数OpenPosition()在ms[]数组中存在相应信号的情况下,以当前价格打开一个位置。只有在没有信号的情况下才能开仓。

战术。

  1. 如果有头寸并且有平仓信号,那么就平仓
  2. 如果没有头寸,而有开仓的信号,那么就开仓。

你看这有多简单?:-)

 
是的,谢谢你。我看看我能想出什么办法。
 

大家好!圣诞快乐

另一个问题也出现了。我已经看了一遍理论,但还没有找到出路。出于某些原因,我需要在我的专家顾问中使用该功能关闭已开仓位,而不是使用止损(止损和止盈)。我已经做到了。它成功了!然而......。

当我试图将计算手数(B-lot)的库插入专家顾问时,我发现它以一种未知的方式开始工作!这就是所谓的 "手数"。如果我没有使用MM,平衡曲线(优化后)稳步上升,几乎没有明显的下降,加入MM后,我得到了一个急剧的暴跌!如果我没有使用MM,平衡曲线(优化后)稳步上升。此外!即使我们删除B-lot库,只是将手数从0.1增加到0.2,我们也会再次看到一个急剧的下拉。即使最初的存款分几次增加.....。也就是说,既不是图书馆的问题,也不是存款规模的问题--缩水开始时就很惨......。.我是这样进入市场的。

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if (Long)    {  //выключатель вкл   
if (!ExpertOrder( MagicLong ))     {//если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicLong,0,Blue); 
    if(ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError());return(0);}
              }
              }
这里的一切都很清楚,可以理解。然后我用OrderClose(...)函数关闭头寸。像这样。
for (int v=0; v<OrdersTotal(); v++)               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))  {           
        if (OrderSymbol()==Symbol() )                   { 
//-----------------------------------------------------             
if (ExpertOrder( MagicLong ))  {
  if(OrderProfit() > tp)   { OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); return(0);}
  if(OrderProfit() <= -sl) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); return(0);}
                               }
}}}
当我最初设置lot=0.1时,设计工作正常!当我试图改变lot大小(增加)或试图启用MM库时,操作就中断了我不能理解为什么?我用 "Lots "代替了OrderLots(),但没有任何变化。请告诉我。
 
rid:
在初始手数=0.1的情况下,设计工作正常!当我试图改变手数大小(增加)或试图启用MM库时--操作被破坏了!为什么?我不能理解为什么?我用 "Lots "代替了OrderLots(),但没有任何变化。请指教?
我们必须看一下EA的行为 方式是否不同。
订单的开启/关闭时间与以前相同吗?
 

不,通过将手数从0.1增加到0.2,交易开始更频繁地发生,超过两倍的频率!在相同的外部参数下...这很奇怪,但我不太懒惰!我不知道为什么。我是这样做的。

我取消了使用OrderClose 函数的平仓,并在ticket=OrderSend(......)函数中通过止损和止盈规定了正常平仓。在这种情况下,MM块的工作应该是这样的!看来这都是关于功能的问题

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
也许在增加批量时,"tp "的值应该相应改变?
 
我们应该用手指着天空吗?;)

错误在代码中。在哪里--我不知道,因为甚至没有一个代码。呼叫下一个分支的千里眼;)