Переменные продолжают сбрасываться до начальных объявленных значений

интересно, может ли кто-нибудь указать, что я делаю неправильно здесь.

Просто для фона я очень новичок в MQL4 (или вообще в программировании)

Я написал следующий код, который действует как виртуальный трейлинг-стоп.

Я пытаюсь зафиксировать HH (самый высокий максимум) и LL (самый низкий минимум) на основе приведенного ниже цикла. Однако, когда я печатаю, похоже, что и HH, и LL сбрасываются как на Bid, так и на Ask на каждом тике, а не блокируются.

У меня было три вопроса:

  1. Что я делаю не так?!
  2. Сбрасываются ли HH и LL в ноль постоянно из-за того, где были объявлены переменные?
  3. Будут ли HH и LL уникальными для каждого заказа? Если нет, то есть ли способ установить это?

(Пока ~ это просто заполнители - можно игнорировать, я исправлю это)

Большое спасибо!

double      HH = 0;
double      LL = 0;
int orderstotal = OrdersTotal();
int orders = 0;
int ordticket[90][2];
for (int i = 0; i < orderstotal; i++)
{
     if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
     if (OrderSymbol() != Symbol() || OrderMagicNumber() != ~OrderId~)
     {
         continue;
     }
     ordticket[orders][0] = OrderOpenTime();
     ordticket[orders][1] = OrderTicket();
     orders++;
}
if (orders > 1)
{
    ArrayResize(ordticket,orders);
    ArraySort(ordticket);
}
for (i = 0; i < orders; i++)
{
    if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == ~OrderId~)
        {
            if (Ask > HH)
            {
                HH = Ask;
                Print("Print(HH)=",HH);
            }
            if (Bid < LL)
            {
                LL = Bid;
                Print("Print(LL)=",LL);
            }
            if ((OrderType() == OP_BUY && HH - OrderOpenPrice() > ~TrailingStartGap~*PipValue*Point) ||
                (OrderType() == OP_SELL && OrderOpenPrice() - LL > ~TrailingStartGap~*PipValue*Point))
            {
                if ((OrderType() == OP_BUY && HH - Ask > ~TrailingStop~*PipValue*Point) ||
                    (OrderType() == OP_SELL && Bid - LL > ~TrailingStop~*PipValue*Point))
                {
                   bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), ~Slippage~, ~Color~);

                   if (ret == true)
                   {
                        int error = GetLastError();
                        if (ret == false && error > 0)
                        Print("OrderClose() error - ", ErrorDescription(error));
                   }
                }
            }
        }
    }
}


person Intelis    schedule 04.03.2021    source источник
comment
где вы объявляете переменные аск и бид?   -  person theCreator    schedule 04.03.2021
comment
Разве Ask и Bid не встроены в MQL4 функции, которые не нужно объявлять?   -  person Intelis    schedule 04.03.2021
comment
Я также попытался объявить HH и LL ниже этой строки - if (OrderSymbol() == Symbol() && OrderMagicNumber() == ~OrderId~) - но тот же результат! {   -  person Intelis    schedule 05.03.2021
comment
Весь код, который вы разместили, находится внутри функции OnTick()?   -  person tomgny    schedule 09.03.2021


Ответы (2)


Объявите HH и LL как глобальные переменные вне функции OnTick(), чтобы избежать их повторной инициализации на каждом тике.

person tomgny    schedule 18.03.2021

tomgyn - это действительно была проблема, он был помещен внутри OnTick(), и поэтому переменные инициализировались при каждом новом тике.

Это была ошибка новичка, я не понимал в тот момент, что код будет выполняться сверху вниз на каждом тике, когда он находится там.

Проблема решена. Спасибо за указатель и правки - очень признателен!

person Intelis    schedule 16.03.2021
comment
Хорошо, я публикую этот ответ ниже, поэтому, пожалуйста, отметьте его как принятый. - person tomgny; 18.03.2021