Как сохранить значение строки таким же, когда буфер индикатора больше не дает значение?

Я закодировал базовый советник, чтобы он запускал сделку, когда параметры верны. Однако в этом случае код никогда не будет соответствовать всем требованиям, потому что строковое значение не дает значения, когда индикаторный буфер не дает значения.

Мне нужна помощь, чтобы строковое значение для 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, 0 );
 double saidn = iCustom( Symbol(), PERIOD_H1, "super-arrow-indicator", 1, 0 );
 double osma1 =   iOsMA( Symbol(), PERIOD_H1, 12, 26, 9, PRICE_OPEN, 1 );
 double osma0 =   iOsMA( Symbol(), PERIOD_H1, 12, 26, 9, PRICE_OPEN, 0 );
 double stup  = iCustom( Symbol(), PERIOD_H1, "super-trend", 0, 0 );
 double stdn  = iCustom( Symbol(), PERIOD_H1, "super-trend", 1, 0 );
 double sar   =    iSAR( Symbol(), PERIOD_H1, 0.02, 0.2, 0 );
 double ma    =     iMA( Symbol(), PERIOD_H1, 20, 0, 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,SELECT_BY_POS,MODE_TRADES))
      {
        if(OrderSymbol()==Symbol())
          {
            if(OrderType()==OP_BUY)
              {
                if(OrderStopLoss() < Ask - (150*_Point))
                  {
                    OrderModify(OrderTicket(),OrderOpenPrice(),Ask-(150*_Point),OrderTakeProfit(),0,CLR_NONE);
                  }
              }
            if(OrderType()==OP_SELL)
              {
                if(OrderStopLoss() > Bid + (150*_Point))
                  {
                    OrderModify(OrderTicket(),OrderOpenPrice(),Bid+(150*_Point),OrderTakeProfit(),0,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,3,Ask-150*_Point,0,NULL,0,0,CLR_NONE);
                  }
              }
          }
      }
  }

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

person vinny9592    schedule 08.11.2020    source источник


Ответы (1)


Вопрос : Как сохранить неизменное строковое значение...?

Эта проблема имеет одну причину и пару доступных шагов для решения:

Код OnTick(){...} как есть для каждой записи создает пустые строки. Это надо заменить в любом случае.

Но тогда мы должны как-то где-то объявить эти строки.

First option

По-прежнему пусть они объявляются внутри области действия ( {...} ) блока кода OnTick(){...}, но объявляют их как static string saisignal = ""; // STATIC modifier is key here, так как в этом случае static заставляет компилятор сохранять фактическое значение таких объявленных переменная из одного вызова OnTick(){...} в другой (поэтому никогда не повторяйте повторное объявление и повторное сохранение значения инициализатора (здесь пустой (string)"") каждый раз.

    #property strict
    ...
    void OnTick(){
         ...
         static string saisignal  = "";
         static string osmasignal = "";
         static string stsignal   = "";
         static string sarsignal  = "";
         static string masignal   = "";
         ...
    }

Second option

Переместите такое объявление переменной в область верхнего уровня (для глобально видимых переменных), что заставляет компилятор резервировать постоянную ячейку памяти для хранения и доступа к любым таким глобально объявленным/видимым переменным.

    #property strict

    string saisignal  = "";
    string osmasignal = "";
    string stsignal   = "";
    string sarsignal  = "";
    string masignal   = "";
    ...
    void OnTick(){
         ...
    }
person user3666197    schedule 09.11.2020
comment
Большое спасибо - person vinny9592; 09.11.2020
comment
Всегда добро пожаловать, @vinny9592. Рад слышать, что вы сочли ответ полезным. курсор мыши в течение небольшого промежутка времени над этим треугольником UpVote появится легенда, говорящая Этот ответ полезен), так как это также помогает другим членам сообщества искать ответы и переходить к ним. , которые уже были полезны другим участникам, так что не стесняйтесь делать это способом StackOverflow - person user3666197; 09.11.2020