关闭职位。开启指示信号。

 

晚上好!出现了一个问题。

我需要关闭一个头寸。通过指标的信号。此外,我需要能够通过止损或止盈平仓。(以防指标信号来得太晚)。- 这种情况经常发生)。

if                    (... ... ...  )         
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,
                                               NULL,MAGIC ,0,CLR_NONE);

随后,为了关闭未结头寸,我规定。

for (int v=0; v<OrdersTotal(); v++)                          {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))             {           
        if (OrderSymbol()==Symbol()) && OrderMagicNumber()==MAGIC)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY)                   { 
      if (Stochast_1>75 &&  Stochast_0<75)     {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); 
                 return(0); // выходим
                }       
               }   
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { ... .... ....

然而,头寸仍然只在止损或止盈时关闭。(有一个非常罕见的--单一例外!)

尽管图表上的指标 显示--几乎所有未结头寸都应该通过指标的信号来关闭。请告诉我--哪里可能有错误......?

 

我通常会实现这种功能。

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
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);
    }
  }
}
正如你所看到的,所写的函数执行的是相当具体的动作。然后将这些功能结合起来,以实施所需的战术,与职位一起工作。
 
可能是Stochast_1和Stochast_0的问题,其他都很好
 
谢谢你,KIM IV。我会努力想办法的。
 
Integer:
可能是Stochast_1和Stochast_0的问题,其他都很好


No.....随机数很好。(关于开盘价 的工作)

double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
 
买入是以出价结束的。在这种情况下,只有当与指定价差不同的报价恰好出现在最新的报价流中时,才会触发平仓。 如果这样的报价还没有设法(因年老而)离开经纪人审查的报价列表,那么平仓单就有机会被执行。
 

我对你的理解正确吗?买入头寸应该关闭

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green)。

而卖出位置必须关闭。

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); ?
 
rid:

我对你的理解正确吗?

总的来说,你说的很对。

 
正是如此!问题出在问
 

还是不想通过随机指数来平仓!我做得很好!我在外部参数中插入了一个开关。在代码的末尾--单独的区块用于关闭头寸我已经提供了一个绿色的三角形,用于关闭。

战术很简单:跨越由缓慢的MAs形成的通道边界,并有向上和向下的偏差。代码非常简单。下面是一个专家顾问。

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
//********* Закрытие позиций ****************************************
if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNum)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>75 && Stochast_0<75)     {
           OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<25 && Stochast_0>25)    {
                 OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

谁能看一下?并告诉我有什么问题....

也许在开单时,出价和问价的设置不准确? 我一直对此感到困惑。

ticket=OrderSend(Symbol(),.......
附加的文件:
 
我还没有看过这段代码。
但有一点是肯定的:代替 "if(Stochast_1>75 &&Stochast_0<75)",我会做出 "if(Stochast_1>75 &&Stochast_0<=75)"。