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

 
goldtrader:

首先,将实数Stochast_和整数75进行比较是不正确的,其次,将它们的差值与零进行比较更为正确。

我认为在这种情况下,小数点后8位的误差不会影响结果。
 

另一个问题出现在平仓 区。我把这个块放在我最喜欢的专家顾问中。它只严格按照趋势的方向打开交易(我为此祝贺它......)。

但是,根据趋势的强度,专家顾问能够(并且做到了!)持续地开出几笔交易,--一笔接一笔!这就是专家顾问。这就是我需要在指标的信号下的平仓块。但问题就在这里!当并且如果在一个趋势中开了几个头寸,并开始对趋势进行修正时,该块中的指标就会发出平仓信号。因为我需要它。

然而,由于某些原因,并非所有开放的职位都被关闭。基本上,只有最早的那一个。那些后来被打开的,对关闭信号没有反应--而是继续运动。还有,--"历史像闹剧一样重演"!每一个平仓信号,只有一个,即最早的开仓被关闭,而其他的继续移动!这就是所谓的平仓。所有职位的地段都是恒定的。

这里是视觉模式图。通过指标的信号收盘,用一个绿色的三角形标记。可以清楚地看到,每次只有一个位置被信号关闭。我希望所有开放的职位都被关闭!请告诉我,这是什么原因?

提醒大家注意代码:

/********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid:

另一个问题出现在闭合块上...

OrdersTotal()的循环在哪里?
 
granit77:
OrdersTotal()的循环在哪里?
即使有,也是从0到OrdersTotal()-1,而应该是反过来的;)
 

不,这里的情况不是这样的。订单的定义--不同。

//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) { for (int jk=0; jk<_OrdersTotal; jk++) {    
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);}

而这个版本的代码对我来说更加舒适!因为我的多头和空头的开仓是相互独立的。

//---------проверяем условие на покупку----------------------------
if (LONG) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,
                                        Ask+TP*Point,NULL,MagicLong,0,CLR_NONE); 
 

然而,它仍然与标准的封闭性相同。 ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid:

然而,它仍然与标准的封闭性相同。 ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

你可能想尝试做一个从OrdersTotal 到0的反向循环,这应该有帮助。
 

如何做到这一点?请写一下,如果不是太大负担的话。 顺便说一下图表--用上述 "标准":一切都一样--只有一个位置在指标的信号上关闭------。

 
rid:

你是如何做到这一点的?

根据komposter和Vinin的说法,而不是。
for (int v=0; v<OrdersTotal(); v++)

写。
for (int v=OrdersTotal()-1; v>0; v--)

这对我来说很有效。
 
granit77:
摆脱

你是如何做到的?

如果komposter和Vinin是可信的,相反。
for (int v=0; v<OrdersTotal(); v++)

写。
for (int v=OrdersTotal()-1; v>0; v--)

这对我来说很有效。

你说得很对。尽管KimV有实现所有这些的脚本和库。也许你应该在他的论坛上找找看。