微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当指标缓冲区不再提供值时,如何保持字符串值相同?

如何解决当指标缓冲区不再提供值时,如何保持字符串值相同?

我编写了一个基本的EA交易,以在参数为真时触发交易。但是,在这种情况下,代码将永远无法满足所有要求,因为当指示符缓冲区不提供值时,字符串值不提供值。

我需要帮助的是,在条形图通过箭头指示符之后,使指示符缓冲区触发的saisignal的字符串值保持不变,以便其他信号最终指示交易时,它可以触发交易。

double closeAllTradesThisPair()
{
  for (int i=OrdersTotal();i>=0;i--)
   {
    OrderSelect(i,SELECT_BY_POS,MODE_TradES);
    if(OrderSymbol()==Symbol())
    {
     OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3,clrNONE);
    }
   }
 }

void OnTick()
{
 double saiup = iCustom( Symbol(),PERIOD_H1,"super-arrow-indicator",0 );
 double saidn = iCustom( Symbol(),1,0 );
 double osma1 =   iOsMA( Symbol(),12,26,9,PRICE_OPEN,1 );
 double osma0 =   iOsMA( Symbol(),0 );
 double stup  = iCustom( Symbol(),"super-trend",0 );
 double stdn  = iCustom( Symbol(),0 );
 double sar   =    iSAR( Symbol(),0.02,0.2,0 );
 double ma    =     iMA( Symbol(),20,MODE_SMA,PRICE_CLOSE,0 );

 string saisignal  = "";
 string osmasignal = "";
 string stsignal   = "";
 string sarsignal  = "";
 string masignal   = "";

 if(saiup < 1000)
  {
    saisignal = "123";
  }
 if(saidn < 1000)
  {
    saisignal = "321";
  }
  
 if(osma1 < osma0)
   {
    osmasignal = "123";
  }
 if(osma1 > osma0)
  {
    osmasignal = "321";
  }

if(stup < 1000)
  {
    stsignal = "123";
  }
if(stdn < 1000)
  {
    stsignal = "321";
  }
 
if(sar < Bid)
  {
    sarsignal = "123";
  }
if(sar > Bid)
  {
    sarsignal = "321";
  }

if(ma < Bid)
  {
    masignal = "123";
  }
if(ma > Bid)
  {
    masignal = "321";
  } 

for(int b=OrdersTotal()-1;b>=0;b--)
  {
    if(OrderSelect(b,MODE_TradES))
      {
        if(OrderSymbol()==Symbol())
          {
            if(OrderType()==OP_BUY)
              {
                if(OrderStopLoss() < Ask - (150*_Point))
                  {
                    OrderModify(OrderTicket(),OrderOpenPrice(),Ask-(150*_Point),OrderTakeProfit(),CLR_NONE);
                  }
              }
            if(OrderType()==OP_SELL)
              {
                if(OrderStopLoss() > Bid + (150*_Point))
                  {
                    OrderModify(OrderTicket(),Bid+(150*_Point),CLR_NONE);
                  }
              }
          }
      }
  }
                   
if(saisignal == "123")
  {
    if(osmasignal == "123")
      {
        if(stsignal == "123")
          {
            if(sarsignal == "123")
              {
                if(masignal == "123")
                  {
                    double buyticket = OrderSend(Symbol(),OP_BUY,0.01,Ask,Ask-150*_Point,NULL,CLR_NONE);
                  }
              }
          }
      }
  }

if(saisignal == "321")
  {
    if(osmasignal == "321")
      {
        if(stsignal == "321")
          {
            if(sarsignal == "321")
              {
                if(masignal == "321")
                  {
                    double sellticket = OrderSend(Symbol(),OP_SELL,Bid+150*_Point,CLR_NONE);
                  }
              }
          }
      }
  }
Comment("   sai: ",saisignal,"   osma: ",osmasignal,"   st: ",stsignal,"   sar: ",sarsignal,"   ma: ",masignal);
}  

解决方法

Q “如何保持字符串值相同...?”

此问题有一个原因,并且有一对可用的解决方案步骤:

每个条目的account_manager代码都按原样创建空字符串。无论如何都必须更换它。

但是随后我们必须以某种方式声明这些字符串。


一个选项

,它仍然允许它们在with ad as ( select row_number() over (order by code) as seqnum,replace(rtrim(replace(code,'0',' ')),' ','0') as new_code from anc_documents ),cte as ( select seqnum,new_code,0 as offset,0 as lev from ad union all select seqnum,stuff(new_code,offset + 3,'-'),lev + 1 from cte where offset + 3 < len(new_code) ) select * from (select max(lev) over (partition by seqnum) as max_lev,cte.* from cte ) cte where max_lev = lev; 代码块的“作用域”(OnTick(){...})中声明,但将它们声明为 {...} OnTick(){...},因为在这种情况下,static使编译器将这样声明的变量的实际值保留为一个{{ 1}}每次都调用另一个(因此永远不要重新声明和存储初始化值(此处为空string saisignal = ""; // STATIC modifier is key here)。

static

第二选项

,用于将此类变量声明移至“顶级”范围(用于全局可见的变量),这使编译器将永久性存储器位置保留给存储和访问任何此类“全局声明/可见”变量。

OnTick(){...}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。