Ваши вопросы по языку MQL4

ИванМН

Местный знаток
Код:
 if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))/

В этой строке выдает стобщение:
possible use of uninitialized variable 'ticketss' Lavina.mq4 505 17
Замените в объявлении переменной int ticketss на int ticketss = 0;
Использовать (передавать) глобальные переменные в внутрь пользовательских функций это приемлемо?
Что Вы имеете в виду под глобальными переменными? Глобальные переменные программы или терминала? Если первое, то Вам уже ответили, что их не надо передавать в функции, глобальные переменные и без этого видны в любом месте программы, отовсюду. Это касается и внешних переменных типа input и extern. Если второе - а почему нет? Например:

int MyFunction(int a)
{ ... }

int b = MyFunction(int(GlobalVariableGet("MyGlobalVariable")));
 
Последнее редактирование:

fxbo

Активный участник
Надо всего-то проверять стрелку на первом баре, а не нулевом…
проверил, каждый индюк в отдельности работает правильно, установленные индюки в прокладку для совпадение сигналов на одном и том же ТФ стрелка и сигнал почему то появляются раньше времени стрелка мигает, а ордера соответсвенно выставляюся...
 

ИванМН

Местный знаток
Fxbo, не понимаю, в чём проблема-то? Стрелка будет мигать "на границе сигнала" на нулевом баре при активном движении цены, если только индикатор не строит свои показания на ценах Open. Не будет мигать, если индикатор не перерисовывается и если стрелка закрепилась на первом и последующих (вглубь истории) барах. Вам когда позицию открыть надо? При первом появлении стрелки на нулевом баре? Сделайте запрет открытия более, чем одной позиции на одном и том же баре и пусть она мигает сколько влезет. При фиксации стрелки на первом баре? Тут вообще никаких проблем не вижу, там она уже не может мигать.
 

star603

Новичок форума
Да уж, дорогой Стар603, код, конечно, устрашающий (стиль программирования)... но это на вкус и цвет, понимаю.
Вопрос на засыпку: а отчего бы не модифицировать открытые позиции СРАЗУ после их открытия в st1, а не лепить для этого отдельную функцию OrderModifi(), тем более что между вызовами st1 и OrderModifi() никаких событий в OnTick не происходит? И отпадёт необходимость в куче лишних проверок и переборов. Например:

C-подобный:
void st1(double Flot,string swop, double Sl, double Pt)
{
   //bool ticketss;    //НЕПРАВИЛЬНО!!! OrderSend возвращает № позиции, т.е. int
   int ticketss;
   int Magic = 45789632;
   switch(TORGISW)
   {
      case 0:
         if(swop == "buy")
            //ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
            //Не рекомендую ставить стопы и тейки при открытии позиции, лучше делать это сразу же ПОСЛЕ, тогда и отпадает нужда в куче лишних проверок
            ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
            // ........... получить значения Sl и Pt ...........................
            if (ticketss != -1 && OrderSelect(ticketss, SELECT_BY_TICKET))//если открытие прошло успешно, выбрать позицию
               ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),Sl,Pt,0,clrYellow);
            //и все дела, повторить то же самое в других case'ах
            break;
      case 1:
         if(swop == "sell")
            ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
      case 2:
         ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,Sl,Pt,"S1",Magic,clrNONE);
         break;
     }
  }
Вот еще вариант:

Код:
void OnTick()
  {
   if(OrdersTotal()==0)
     {
      st1(fl(),sw(),ST(),PT());
     }
  }
 //************************************************************
 void uy(double &gh[19])
  {
//для использования в дальнейших функциях
   gh[0]  = Lot;//лот
   gh[1]  = Risk;//риск
   gh[2]  = NormalizeDouble(StopLoss*Point,Digits);//убыток
   gh[3]  = NormalizeDouble(TakeProfit*Point,Digits);//профит
   gh[4]  = NormalizeDouble(N*Point,Digits);//трейлинг стопа
   gh[5]  = NormalizeDouble(MarketInfo(Symbol(),13)*Point,Digits);//спред
   gh[6]  = NormalizeDouble(MarketInfo(Symbol(),14)*Point,Digits);//минимальные пункты
   gh[7]  = NormalizeDouble(MarketInfo(Symbol(),18)*Point,Digits);//своп покупок
   gh[8]  = NormalizeDouble(MarketInfo(Symbol(),19)*Point,Digits);//своп продаж
   gh[9]  = NormalizeDouble(MarketInfo(Symbol(),33)*Point,Digits);//дист заморозки
   gh[10] = NormalizeDouble(Bid-StopLoss*Point,Digits);//Стоп для ордера бай фикс
   gh[11] = NormalizeDouble(Ask+StopLoss*Point,Digits);//Стоп для ордера селл фикс
   gh[12] = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);//Стоп для ордера бай мин
   gh[13] = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);//Стоп для ордера селл мин
   gh[14] = NormalizeDouble(Ask+TakeProfit*Point,Digits);//Профит для ордера бай фикс
   gh[15] = NormalizeDouble(Bid-TakeProfit*Point,Digits);//Профит для ордера селл фикс
   gh[16] = NormalizeDouble(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);//Профит для ордера бай мин
   gh[17] = NormalizeDouble(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits);//Профит для ордера селл мин
   gh[18] = NormalizeDouble(N1*0.01,2);//Для прогрессии
  }
  //*****************************************
  string sw()
  {
   string swop = "yes";
   uy(fiks);
   double p = fiks[7];
   double p1 = fiks[8];
   if(p>0.0)
      swop = "buy";
   else
      if(p1>0.0)
         swop = "sell";
   if(p<0.0 && p1<0.0)
      swop = "bouth";
   else
      if(p>0.0 && p1>0.0)
         swop = "test";
   if((p>0.0&& p1<0) ||(p<0.0 && p1>0))
      swop = "doesn't matter";
   return(swop);
  }
//----------------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
double PT()
  {
   double pt =0.0;
   int Magic =456789;
   uy(fiks);
   switch(Profit)//enum список
     {
      case 0://Торгуем без стопов
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        Print("NO2");
                        break;
                     case 1:
                        Print("no2");
                        break;
                    }
                 }
              }
           }
         break;
      case 1://Фиксированные профиты
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        pt=fiks[14];
                        break;
                     case 1:
                        pt=fiks[15];
                        break;
                    }
                 }
              }
           }
         break;
      case 2://Минимальные профиты
         if(OrdersTotal()>0)
           {
            for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
              {
               if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
                 {
                  switch(OrderType())
                    {
                     case 0:
                        pt=fiks[16];
                        break;
                     case 1:
                        pt=fiks[17];
                        break;
                    }
                 }
              }
           }
         break;
     }
   return(pt);
  }
//+------------------------------------------------------------------+
void OrderModifi(double sl,double pt)
  {
   for(int y=0; y<= OrdersTotal()-1; y++)//Начинаем перебор ордеров в истории
     {
      int ticketss;
      int Magic = 456789;
      uy(fiks);
      if(OrderSelect(y, SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderSymbol()==_Symbol)//Выбираем ордер
        {
         switch(OrderType())
           {
            case 0:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()>sl && OrderStopLoss()!= sl) || (OrderOpenPrice()<pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrYellow);
                  break;
                 }
            case 1:
               if(OrderStopLoss()==0 && OrderTakeProfit()==0)
                 {
                  if((OrderOpenPrice()<sl && OrderStopLoss()!= sl) || (OrderOpenPrice()>pt && OrderTakeProfit()!=pt))
                     ticketss = OrderModify(OrderTicket(),OrderOpenPrice(),sl,pt,0,clrWhite);
                  break;
                 }
           }
        }
     }
  }
//+------------------------------------------------------------------+
void st1(double Flot, string swop, double sl, double pt)
  {
   int ticketss;
   int Magic = 456789;
            uo(indikator);
   switch(TORGISW)
     {
      case 0://Если своп положительный у покупок
         if(swop == "buy")
           {
  
            if(indikator[4][1]<0 && indikator[4][2]<0 && indikator[4][3]<0)
              {
               ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
              }
           }
         break;
      case 1://Если своп положительный у продаж
         if(swop == "sell")
           {
      
            if(indikator[4][1]>0 && indikator[4][2]>0 && indikator[4][3]>0)
              {
               ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,sl,pt,"S1",Magic,clrNONE);
              }
           }
         break;
      case 2://Без разницы
        
         if(indikator[4][1]<0 && indikator[4][2]<0 && indikator[4][3]<0)
           {
            ticketss=OrderSend(Symbol(),OP_BUY,Flot,Ask,Slippage,0,0,"S1",Magic,clrNONE);
           }
         if(indikator[4][1]>0 && indikator[4][2]>0 && indikator[4][3]>0)
           {
            ticketss=OrderSend(Symbol(),OP_SELL,Flot,Bid,Slippage,sl,pt,"S1",Magic,clrNONE);
           }
         break;
     }
   OrderModifi(ST(),PT());
  }
//+------------------------------------------------------------------+

Не работает.
 

star603

Новичок форума
Код:
void st1(double Flot,string swop,double sl,double pt)
{
 uy(fiks);
 uo(indikator);
 Comment(indikator[4][4]);
}

Если в комент написать fiks[0] выдает значение лота, а если indikator[4][4] уже критическая ошибка. Почему то.
остальное работает как часы.
 

Вложения

  • Lavina 3.mq4
    34,2 КБ · Просмотры: 12
Последнее редактирование:

fxbo

Активный участник
Fxbo, не понимаю, в чём проблема-то? Стрелка будет мигать "на границе сигнала" на нулевом баре при активном движении цены, если только индикатор не строит свои показания на ценах Open. Не будет мигать, если индикатор не перерисовывается и если стрелка закрепилась на первом и последующих (вглубь истории) барах. Вам когда позицию открыть надо? При первом появлении стрелки на нулевом баре? Сделайте запрет открытия более, чем одной позиции на одном и том же баре и пусть она мигает сколько влезет. При фиксации стрелки на первом баре? Тут вообще никаких проблем не вижу, там она уже не может мигать.
я не программист, пытаюсь учится, прошу сильно не быть )))
Есть два индикатора по отдельности у которых, я так понимаю, в момент закрытия 0 бара появляется стрелка, также в этот момент подается сигнал в буфер индикатора, в этих двух индюках стрелки не мигают на границе сигнала и не перерисовываются. Когда я их ставлю в ботпрокладку где при совпадении двух сигналов двух индикаторов на 0 баре ботпрокладка должен открыть один ордер. В данном случае, стрелка и сигнал в ботпрокладке появляются намного раньше и ботпрокладка выставляет до закрытия свечи целую пачку ордеров. Что и где нужно прописать что бы открылся 1 ордер в момент закрытия свечи ботпрокладки, а не пачка ордеров. Стрелка не так важна, может и до "малинового" цвета мигать )))
 
Последнее редактирование:

Ugar

Гуру форума
Код:
void st1(double Flot,string swop,double sl,double pt)
{
 uy(fiks);
 uo(indikator);
 Comment(indikator[4][4]);
}

Если в комент написать fiks[0] выдает значение лота, а если indikator[4][4] уже критическая ошибка. Почему то.
остальное работает как часы.
Что бы понять что не так с массивом indikator нужно хотя бы увидеть где он объявлен, какой его размер...
 

Cash2020

Активный участник
Код:
void st1(double Flot,string swop,double sl,double pt)
{
 uy(fiks);
 uo(indikator);
 Comment(indikator[4][4]);
}

Если в комент написать fiks[0] выдает значение лота, а если indikator[4][4] уже критическая ошибка. Почему то.
остальное работает как часы.
"...остальное работает как часы...."
Если бы у Вас реально были бы такие часы, скорее всего Вы бы не родились, ну или если так лучше, то сразу же и умерли.
Вот я Вам здесь приложил файл, пример того как нужно программировать. Надеюсь, Вам это пригодиться.
Теперь, если разрешите, пару мыслей вслух.
Замечания по коду:
1. Не устранили грамматические ошибки.
2. Необходимо давать ОСМЫСЛЕННЫЕ имена переменным.
3. Непонятен алгоритм работы функии SwapToString(). Вам необходимо подробно описать, что Вы хотели получить.
4. Нет кода проверки выполнения функций. Не известно функция отработала правильно или нет. У Вас в большинстве случаев указан тип функции void. Этого нужно избегать.

Пробуйте запускать эксперта в тестере. Я там специально поставил заглушку, чтобы он отработал один раз (функция ExpertRemove()). А потом посмотрите что он пишет в журнал.

Удачи.
 

Вложения

  • Lavina 3_corr.mq4
    48,3 КБ · Просмотры: 17

ИванМН

Местный знаток
я не программист, пытаюсь учится, прошу сильно не быть )))
Есть два индикатора по отдельности у которых, я так понимаю, в момент закрытия 0 бара появляется стрелка, также в этот момент подается сигнал в буфер индикатора, в этих двух индюках стрелки не мигают на границе сигнала и не перерисовываются. Когда я их ставлю в ботпрокладку где при совпадении двух сигналов двух индикаторов на 0 баре ботпрокладка должен открыть один ордер. В данном случае, стрелка и сигнал в ботпрокладке появляются намного раньше и ботпрокладка выставляет до закрытия свечи целую пачку ордеров. Что и где нужно прописать что бы открылся 1 ордер в момент закрытия свечи ботпрокладки, а не пачка ордеров. Стрелка не так важна, может и до "малинового" цвета мигать )))
Да не бьёт никто. Просто Вы расплывчато, нечётко формулируете суть запроса. Вы же пытаетесь программировать, значит, должны учиться и привыкать в первую очередь точно описывать проблему.
Я не знаю, что такое "ботпрокладка". У Вас есть советник и два индикатора. Советник при совпадении сигналов с двух индикаторов на нулевом баре должен открыть одну позицию (выставить отложенный ордер). Как-то так:
C-подобный:
void OnTick()
{
    static datetime PreviousTime;//статическая (не обнуляющаяся на каждом тике) переменная контроля одноразового открытия позиции
    if (PreviousTime < Time[0])//если позиция на текущем (0-м) баре ещё не открывалась
    {
        char FirstInd = char(iCustom(...,"1-й индюк",...,0));//снимаем c 0-го бара показание первого индикатора; предположим, что возвращённое значение 0 - Buy, 1 - Sell, -1 - нет сигнала
        if (FirstInd != -1)//если первый индикатор выдал некоторый сигнал,...
        {           
            char SecondInd = char(iCustom(...,"2-й индюк",...,0));//...то снять с 0-го бара показание второго индикатора
            if (SecondInd != -1 && SecondInd == FirstInd)//если второй индикатор выдал некоторый сигнал и он совпал с сигналом первого индикатора
            {
                ...//открыть позицию (выставить отложку)
                PreviousTime = Time[0];//пишем в контрольную переменную время открытия текущего (0-го) бара для блокирования последующих открытий
            }
        }
    }
}

Я всё правильно уловил?
 

fxbo

Активный участник
Да не бьёт никто. Просто Вы расплывчато, нечётко формулируете суть запроса. Вы же пытаетесь программировать, значит, должны учиться и привыкать в первую очередь точно описывать проблему.
Я не знаю, что такое "ботпрокладка". У Вас есть советник и два индикатора. Советник при совпадении сигналов с двух индикаторов на нулевом баре должен открыть одну позицию (выставить отложенный ордер). Как-то так:
C-подобный:
void OnTick()
{
    static datetime PreviousTime;//статическая (не обнуляющаяся на каждом тике) переменная контроля одноразового открытия позиции
    if (PreviousTime < Time[0])//если позиция на текущем (0-м) баре ещё не открывалась
    {
        char FirstInd = char(iCustom(...,"1-й индюк",...,0));//снимаем c 0-го бара показание первого индикатора; предположим, что возвращённое значение 0 - Buy, 1 - Sell, -1 - нет сигнала
        if (FirstInd != -1)//если первый индикатор выдал некоторый сигнал,...
        {         
            char SecondInd = char(iCustom(...,"2-й индюк",...,0));//...то снять с 0-го бара показание второго индикатора
            if (SecondInd != -1 && SecondInd == FirstInd)//если второй индикатор выдал некоторый сигнал и он совпал с сигналом первого индикатора
            {
                ...//открыть позицию (выставить отложку)
                PreviousTime = Time[0];//пишем в контрольную переменную время открытия текущего (0-го) бара для блокирования последующих открытий
            }
        }
    }
}

Я всё правильно уловил?
Почти правильно поняли ))). Это советник использующий сторонние индикаторы, который при совпадении сигналов на индикаторах советник должен выставить один рыночный ордер в момент закрытия бара(свечи).
 
Последнее редактирование:

star603

Новичок форума
"...остальное работает как часы...."
Если бы у Вас реально были бы такие часы, скорее всего Вы бы не родились, ну или если так лучше, то сразу же и умерли.
Вот я Вам здесь приложил файл, пример того как нужно программировать. Надеюсь, Вам это пригодиться.
Теперь, если разрешите, пару мыслей вслух.
Замечания по коду:
1. Не устранили грамматические ошибки.
2. Необходимо давать ОСМЫСЛЕННЫЕ имена переменным.
3. Непонятен алгоритм работы функии SwapToString(). Вам необходимо подробно описать, что Вы хотели получить.
4. Нет кода проверки выполнения функций. Не известно функция отработала правильно или нет. У Вас в большинстве случаев указан тип функции void. Этого нужно избегать.

Пробуйте запускать эксперта в тестере. Я там специально поставил заглушку, чтобы он отработал один раз (функция ExpertRemove()). А потом посмотрите что он пишет в журнал.

Удачи.
Я вот что заметил:
1 Ты полностью переписал код.
2 Ты массивы сначала инициализировал а потом заполнил.
ada_arr[0][0] = High[0]; //Максимальная цена не понятно зачем делать как мне кажется лишнее действие?
3 Я считаю мои название функций тоже информативные.
4 Такой функции у меня вообще нет где ты ее нашел вообще SwapToString(). его не в том файле который посылал.
5 Насчет этого: Нет кода проверки выполнения функций. Не известно функция отработала правильно или нет.
Они были знай как это сделать
6 Вообще не понятно что за строчка: Print(__FUNCTION__, "(): Проверка массива");
7 Насчет войд возьмем на заметку.
8 Согласен орфография и невнимательность имеет место быть.
9 войд у меня в основном в массивах. и в коде стратегий которая st1() какой тип ей еще присвоит разве что только инт, потому что ордерсент иммеет тип возврата именно такой.
 
Последнее редактирование:

Aksio33

Прохожий
Здравствуйте, подскажите, пожалуйста, индикатор выводит алерт при появлении прямоугольника или при его сдвиге. но также сигналит при смене имени, без сдвига. Как сделать, чтобы он сигналил только при сдвиге и не реагировал на смену имени? Заранее спасибо!

Код:
{

if(ObjectType(ObjectName(i)) == OBJ_RECTANGLE)

{

double pr1 = NormalizeDouble(ObjectGetDouble(0,ObjectName(i),OBJPROP_PRICE1), Digits);

double pr2 = NormalizeDouble(ObjectGetDouble(0,ObjectName(i),OBJPROP_PRICE2), Digits);

datetime tm1 = ObjectGetInteger(0,ObjectName(i),OBJPROP_TIME1);

datetime tm2 = ObjectGetInteger(0,ObjectName(i),OBJPROP_TIME2);

//double pr3 = ObjectGetInteger (0,ObjectName(i),OBJPROP_COLOR);

//double pr4 = ObjectGetString (0,ObjectName(i),OBJPROP_TEXT);

//ObjectSetString(0, nameOfBuyLine,OBJPROP_TEXT,Period());



string name1 = ObjectName(i) + "|High Lable";

//if (pr3 == clrOliveDrab)

//if (pr4 == 0)

if(ObjectFind(0,name1) != -1)



{

if(MathMax(pr1,pr2) != ObjectGetDouble(0,name1,OBJPROP_PRICE) || tm1 != ObjectGetInteger(0,name1,OBJPROP_TIME)) ObjectDelete(0,name1);

}

else

{

//Print(tm2);

int whichBar = 1;

static datetime time1 = 0;

static string mess1 = "";

int anc=ANCHOR_LEFT_LOWER;

if(tm2 < tm1) anc=ANCHOR_RIGHT_LOWER;

DrawLable(tm1,MathMax(pr1,pr2),name1,color_high,anc); //MathMax(pr1,pr2)

doAlert(time1,mess1,whichBar,"resist_verified");



}
 

star603

Новичок форума
Что бы понять что не так с массивом indikator нужно хотя бы увидеть где он объявлен, какой его размер...
Вот такую ошибку выдает:
2023.02.16 23:07:39.164 2004.01.01 00:26:00 Lavina 3 GBPCHF,Daily: array out of range in 'Lavina 3.mq4' (123,51)

Я тот участок удалил. Вот он:
Код:
void st1(double Flot,string swop,double sl,double pt)
{
 uy(fiks);
 uo(indikator);
 Comment(indikator[4][4]);
}
Код:
 

Вложения

  • Lavina 3.mq4
    34,2 КБ · Просмотры: 16

ИванМН

Местный знаток
Почти правильно поняли ))). Это советник использующий сторонние индикаторы, который при совпадении сигналов на индикаторах советник должен выставить один рыночный ордер в момент закрытия бара(свечи).
Если нужно провести проверку совпадения показаний индикаторов только в момент закрытия бара (открытия нового) и в любом случае до открытия следующего бара проверок не проводить, то 13-ю строку надо сделать 16-й, то есть блокировать дальнейшие заходы в блок открытия позиций независимо от того, открылась позиция или нет.
Здравствуйте, подскажите, пожалуйста, индикатор выводит алерт при появлении прямоугольника или при его сдвиге. но также сигналит при смене имени, без сдвига. Как сделать, чтобы он сигналил только при сдвиге и не реагировал на смену имени? Заранее спасибо!

Код:
{

if(ObjectType(ObjectName(i)) == OBJ_RECTANGLE)

{

double pr1 = NormalizeDouble(ObjectGetDouble(0,ObjectName(i),OBJPROP_PRICE1), Digits);

double pr2 = NormalizeDouble(ObjectGetDouble(0,ObjectName(i),OBJPROP_PRICE2), Digits);

datetime tm1 = ObjectGetInteger(0,ObjectName(i),OBJPROP_TIME1);

datetime tm2 = ObjectGetInteger(0,ObjectName(i),OBJPROP_TIME2);

//double pr3 = ObjectGetInteger (0,ObjectName(i),OBJPROP_COLOR);

//double pr4 = ObjectGetString (0,ObjectName(i),OBJPROP_TEXT);

//ObjectSetString(0, nameOfBuyLine,OBJPROP_TEXT,Period());



string name1 = ObjectName(i) + "|High Lable";

//if (pr3 == clrOliveDrab)

//if (pr4 == 0)

if(ObjectFind(0,name1) != -1)



{

if(MathMax(pr1,pr2) != ObjectGetDouble(0,name1,OBJPROP_PRICE) || tm1 != ObjectGetInteger(0,name1,OBJPROP_TIME)) ObjectDelete(0,name1);

}

else

{

//Print(tm2);

int whichBar = 1;

static datetime time1 = 0;

static string mess1 = "";

int anc=ANCHOR_LEFT_LOWER;

if(tm2 < tm1) anc=ANCHOR_RIGHT_LOWER;

DrawLable(tm1,MathMax(pr1,pr2),name1,color_high,anc); //MathMax(pr1,pr2)

doAlert(time1,mess1,whichBar,"resist_verified");



}
Опять задача поставлена нечётко или приведён не весь отрывок текста программы. В отрывке я не вижу команд на создание или перемещение объекта на графике. Блок включает поиск производного объекта с именем, включающим имя родительского объекта. Если производный объект существует, то он при определённых условиях удаляется, если не существует, то, как я понимаю, на родительском объекте рисуется некоторая текстовая метка и выдаётся алёрт. Где здесь создание объекта или его сдвиг? Если это происходит вне приведённого в вопросе отрывка кода, то ответ очевиден: надо вызов функции doAlert вынести из блока else в тот блок, где происходит изменение родительского объекта.
 

Ugar

Гуру форума
Вот такую ошибку выдает:
2023.02.16 23:07:39.164 2004.01.01 00:26:00 Lavina 3 GBPCHF,Daily: array out of range in 'Lavina 3.mq4' (123,51)

Я тот участок удалил. Вот он:
Код:
void st1(double Flot,string swop,double sl,double pt)
{
 uy(fiks);
 uo(indikator);
 Comment(indikator[4][4]);
}
Код:
Где объявлен массив indikator и задан его размер там и ошибка.
 

star603

Новичок форума
Где объявлен массив indikator и задан его размер там и ошибка.
Код:
double indi[2];
/********************************************************************
void OnTick()
  {
   st1(fl(),sw(),ST(),PT());
  }
/********************************************************************
void uk(double &gh2[2])
  {
//для использования в дальнейших функциях
   gh2[0]  = High[5];//Максимальная цена
   gh2[1]  = Low[5];//Минимальная цена
  }
/********************************************************************
void st1(double Flot,string swop,double sl,double pt)
  {
     uk(indi);
     Comment(indi[1]);
  }

Почему то с одномерным массивом все хорошо. А с двумерным не прокатывает.
 
Верх