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

 

在我的例子中,它是"<=",但随机数值的变化非常强烈,甚至每一个刻度 - 还有四个小数位,即在一个刻度上,数值可能从(例如)75.0003变化到74.0900。

所以,符号"="可以省略,不用担心。但当然,为了不思考--我想我会的。

 
看了看专家--一切似乎都是正确的。无法检查它--没有指示器。
试着在OrderClose 之前加入Print,看看是否出现平仓信号。
 

完成了。已添加。不,.....!结案通知书并没有出现在日志中。

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

我不明白!我把这个块放在另一个EA中。还有第三个......。.但情况并没有改变!职位 没有关闭。虽然很少,但很少(历史上一次或两次=1年),并且在视觉图上闪烁着绿色三角形的收盘。但它不应该是这样的!位置,从代码来看,应该像缝纫机的梭子一样关闭!

NOnLagMA指标已上传

附加的文件:
 

也许这个区块不应该工作?毕竟,我们在开盘时的代码中有止损:-止损和止盈。也许所有其他的结束条件都因为这个原因而被忽略了?

ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point, NULL,MagicNum, 0,CLR_NONE)。

我将不得不以其他方式处理它。

 
rid:

我什么都不懂!

位置关闭块在 "if(OrdersTotal() == 0) "子句内
你应该更细心一些)。

下面是测试变体的start()函数(没有SL和TP,有正确的信息,没有不必要的滑动)。
int start()
  {
 
 if(Time[0] <= prevtime) 
       return(0);
 prevtime = Time[0];
  if (UseTrailing) TrailPositions();   
//----
   double NLg_Signal_0 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,0); 
   double NLg_Signal_1 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,1); 
   double NLg_long0    =iCustom(NULL,0,"NonLagMA_v5",0,NLg_buy,0,0,0,0,DV_buy,0,0);
   double NLg_short0   =iCustom(NULL,0,"NonLagMA_v5",0,NLg_sell,0,0,0,0,DV_sell,0,0);
 
  if (OrdersTotal()   == 0)//если нет открытых позиций
  { 
//---------проверяем условие на покупку-----------------      
       if   ( 
              (NLg_Signal_1<=NLg_long0)  &&
              (NLg_Signal_0>NLg_long0)  )
       { 
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера BUY" ); prevtime = Time[1]; }
       }
    //---------проверяем условие на продажу----------------- 
         if  (   
              (NLg_Signal_1>=NLg_short0)  &&
              (NLg_Signal_0<NLg_short0)  )
       { 
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера SELL" ); prevtime = Time[1]; }
       }
   }
//------------------------------------------------------------------
//********* Закрытие позиций ****************************************
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_ 
 //****************************************************************************   
   return(0);
      }



但如果我是你,我不会在真实账户上使用这个EA。应该按部就班,或者说 "准备就绪",如果你喜欢的话;)
 

是的,当然了。谢谢你的帮助!我理解你对我的错误的评论。

并已注意到你的建议。距离真正的交易还有很长的路要走...

p.s/ 一切都是工作....!以及它是如何工作的!

 
可以理解的是,利润不会因为这种关闭而增加。但缩减.....往往显著减少。
 
komposter:
我还没有看过这段代码。
但有一点是肯定的:代替 "if(Stochast_1>75 &&Stochast_0<75)",我会做出 "if(Stochast_1>75 &&Stochast_0<=75)"。

更好的方法是:if(Stochast_1-75.0>0 && Stochast_0-75.0<=0),以避免int 和double类型的 不必要的转换。
 
以及我们如何避免不必要的int和double。?此外,我们可以用外部参数代替数字--extern int Up_lim = 80;extern int Low_lim = 20。
 
rid:
以及我们如何避免不必要的int和double。?我搞不清楚。此外,我们可以使用外部参数代替数字,extern int Up_lim = 80;extern int Low_lim = 20。

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

'实数的比较'。