Индикатор Разные вопросы - страница 2

 

#Объектный порядок

Я создал 3 объекта, и эти объекты пересекают друг друга.

#1 Горизонтальная линия, #2 Вертикальная линия, #3 Линия тренда.

Мне нужно задать их z-позиции.

Как я могу задать им значение z позиции?

Спасибо.

 
Marco vd Heijden:

Вы можете нарисовать все линии в OnInit(), а затем рисовать новые всякий раз, когда время открытия последнего бара изменится, вы будете знать, что был новый бар.

Но я не уверен, что именно вы хотите сделать.

ХОРОШО! Я попробую что-нибудь сделать. Затем я вернусь сюда.

Спасибо.

 

@Marco vd Heijden

Прежде чем я начну исследования по этому поводу. Я действительно хочу спросить, замедляет ли функция start() график (/ платформы MT4)?

p.s Я поместил все коды в специальную функцию start() , этот код работает на линиях периодов- H1, H4, D1, W1, MN1.

Хороших выходных и заранее спасибо.

 
Max Enrik: Мне очень хочется спросить, замедляет ли функция start() график (/ платформы MT4)?
Пока все индикаторы обновляются, терминал больше ничего не делает. Поэтому индикаторы не могут спать, не могут торговать или выполнять веб-запросы.
 
whroeder1:
Пока все индикаторы обновляются, терминал больше ничего не делает. Именно поэтому индикаторы не могут спать, не могут торговать или выполнять веб-запросы.

Спасибо за ваш комментарий. (После вашего комментария я решил, что изменю кое-что в своих индикаторах - потому что почти все свои индикаторы я сделал вфункции start() ).

Я поместил нижеприведенный код в функцию start(), так что не могли бы вы мне помочь, какой способ подойдет для моего индикатора?

На самом деле я понятия не имею, как можно изменить приведенный ниже код, чтобы он перестал постоянно обновляться (без всех кодов start(), помещенных в функцию init()).

//---MN1
int _cnt_MN1 = 11; // 12 lines for a year 24 for two years and etc.
for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ )
{
    if ( _Period < PERIOD_MN1 )
    {
        //---time convert
        datetime _tltpMN1      = TimeToString( iTime( Symbol(), PERIOD_MN1, i_MN ), TIME_DATE );
        datetime _time         = iTime( Symbol(), PERIOD_MN1, i_MN );// + PeriodSeconds( PERIOD_MN1  );
        //---name
        string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );

        ObjectCreate     ( 0, _vlineName_MN, OBJ_VLINE          , 0, _time, 0     );
        ObjectSetString  ( 0, _vlineName_MN, OBJPROP_TOOLTIP    , _tltpMN1        );
        ObjectSetInteger ( 0, _vlineName_MN, OBJPROP_COLOR      , C'180,160,080'  );
        ObjectSet        (    _vlineName_MN, OBJPROP_BACK       , true            );
        ObjectSet        (    _vlineName_MN, OBJPROP_HIDDEN     , true            );
        ObjectSet        (    _vlineName_MN, OBJPROP_SELECTABLE , false           );
        ObjectSet        (    _vlineName_MN, OBJPROP_STYLE      , STYLE_SOLID     );
    }   //---if Close
}   //---for Close

Спасибо!

 

Мне очень нужна помощь, пожалуйста, кто-нибудь ответьте на мой вопрос.

Спасибо.

 
Max Enrik: На самом деле я понятия не имею, как я могу отредактировать приведенный ниже код, чтобы остановить постоянное обновление.
  1. Адаптировать новый бар-код для нового месяца.
    Бары ненадежны (обновление/переподключение может изменить количество баров на графике) Объем ненадежен (пропустить тики) Всегда используйте время. Новая свеча - Форум MQL4
    Я не согласен с созданием функции new bar, потому что она может быть вызвана только один раз за тик. Переменная может быть проверена несколько раз.
    void OnTick(){
       static datetime BOMcur=0;                dateTime BOMpre     = BOMcur;  
       BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool     isNewMonth = BOMcur != BOMpre;
       if(isNewMonth){
          DO_UPDATE(); ...
       }

  2. for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ ){ ...
       string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
    Не используйте номера сдвигов в именах объектов. Как только начнется новый бар, все ваши объекты будут названы неправильно, и вы не сможете создать новый "<префикс>0". Вы все правильно сделали в своем первоначальном сообщении (используя время)
    string   _vlineName_MN1 = _prefix + "PERIOD_MN1 - " + TimeToStr( _timeCvrt_MN1, TIME_DATE )    ;
    Или преобразуйте время в int в строку.
 

Пожалуйста, поместите его в эксперт вместо индикатора, это позволит легче использовать его в будущем, когда вы захотите добавить свою торговую стратегию.

Что касается вопроса о барах, храните время открытия бара в переменной datetime и просто сравнивайте записанное время с реальным временем, тогда всякий раз, когда возникает новый бар, он будет срабатывать.

Вот пример:

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(250);

//--- create some things

   CreateLines(); // Function that creates time lines

//--- load open times
   M1=iTime(Symbol(),PERIOD_M1,0);
   M5=iTime(Symbol(),PERIOD_M5,0);
   M15=iTime(Symbol(),PERIOD_M15,0);
   M30=iTime(Symbol(),PERIOD_M30,0);
   H1=iTime(Symbol(),PERIOD_H1,0);
   H4=iTime(Symbol(),PERIOD_H4,0);
   D1=iTime(Symbol(),PERIOD_D1,0);
   W1=iTime(Symbol(),PERIOD_W1,0);
   MN1=iTime(Symbol(),PERIOD_MN1,0);


//--- set timelines
   ObjectMove(0,"Time-M1",0,M1,0);
   ObjectMove(0,"Time-M5",0,M5,0);
   ObjectMove(0,"Time-M15",0,M15,0);
   ObjectMove(0,"Time-M30",0,M30,0);
   ObjectMove(0,"Time-H1",0,H1,0);
   ObjectMove(0,"Time-H4",0,H4,0);
   ObjectMove(0,"Time-D1",0,D1,0);
   ObjectMove(0,"Time-W1",0,W1,0);
   ObjectMove(0,"Time-MN1",0,MN1,0);



//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(M1!=iTime(Symbol(),PERIOD_M1,0))
     {
      M1=iTime(Symbol(),PERIOD_M1,0);  // overwrite old value with new value  
      //Alert("New Bar on M1! ",TimeToString(M1,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M1",0,M1,0);
     }

   if(M5!=iTime(Symbol(),PERIOD_M5,0))
     {
      M5=iTime(Symbol(),PERIOD_M5,0);
      //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M5",0,M5,0);
     }

   if(M15!=iTime(Symbol(),PERIOD_M15,0))
     {
      M15=iTime(Symbol(),PERIOD_M15,0);
      //Alert("New Bar on M15! ",TimeToString(M15,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M15",0,M15,0);
     }

   if(M30!=iTime(Symbol(),PERIOD_M30,0))
     {
      M30=iTime(Symbol(),PERIOD_M30,0);
      //Alert("New Bar on M30! ",TimeToString(M30,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M30",0,M30,0);
     }

   if(H1!=iTime(Symbol(),PERIOD_H1,0))
     {
      H1=iTime(Symbol(),PERIOD_H1,0);
      //Alert("New Bar on H1! ",TimeToString(H1,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-H1",0,H1,0);
     }

   if(H4!=iTime(Symbol(),PERIOD_H4,0))
     {
      H4=iTime(Symbol(),PERIOD_H4,0);
      //Alert("New Bar on H4! ",TimeToString(H4,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-H4",0,H4,0);
     }

   if(D1!=iTime(Symbol(),PERIOD_D1,0))
     {
      D1=iTime(Symbol(),PERIOD_D1,0);
      //Alert("New Bar on D1! ",TimeToString(D1,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-D1",0,D1,0);
     }

   if(W1!=iTime(Symbol(),PERIOD_W1,0))
     {
      W1=iTime(Symbol(),PERIOD_W1,0);
      //Alert("New Bar on W1! ",TimeToString(W1,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-W1",0,W1,0);
     }

   if(MN1!=iTime(Symbol(),PERIOD_MN1,0))
     {
      MN1=iTime(Symbol(),PERIOD_MN1,0);
      //Alert("New Bar on MN1! ",TimeToString(MN1,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-MN1",0,MN1,0);
     }

  }
//+------------------------------------------------------------------+
 
whroeder1:
  1. Адаптируйте новый штрих-код для нового месяца.
    void OnTick(){
       static datetime BOMcur=0;                dateTime BOMpre     = BOMcur;  
       BOMcur = iTime( _Symbol, PERIOD_MN1, 0); bool     isNewMonth = BOMcur != BOMpre;
       if(isNewMonth){
          DO_UPDATE(); ...
       }

  2. for ( int i_MN = 0; i_MN < _cnt_MN1; i_MN++ ){ ...
       string _vlineName_MN = "PERIOD_MN1- " + IntegerToString( i_MN );
    Не используйте номера смен в названиях объектов. Как только начнется новый бар, все ваши объекты будут названы неправильно, и вы не сможете создать новый "<префикс>0". Вы все правильно сделали в своем первоначальном сообщении (используя время)
    string   _vlineName_MN1 = _prefix + "PERIOD_MN1 - " + TimeToStr( _timeCvrt_MN1, TIME_DATE )    ;
    Или преобразуйте время в int в строку.

Спасибо за ваш комментарий.

После вашего комментария я начал пытаться изучить ваш комментарий. (Потому что я никогда не использовал функцию 'Void OnTick()').

Итак, я прочитал нижеприведенную ссылку и понял, что функция 'OnTick()' работает только для советников.

Я уже использую один советник (Trade Panel) на моем графике (мне нужно использовать все мои индикаторы и совет ник в одном окне графика).

Если вы имели в виду, что я могу использовать ваш код в "советнике", то на самом деле я не буду, потому что я буду улучшать свою "торговую панель", также я хочу писать код отдельно. (Возможно, в будущем я объединю ту кучуиндикаторов(которые важны для меня) - но не сейчас).

В любом случае, мистер Уильям, ваш комментарий действительно дал мне идею и также научил меня кое-чему.

(p.s. если я думаю неправильно, пожалуйста, дайте мне знать).

И еще раз большое спасибо!
Event Handling Functions - Functions - Language Basics - MQL4 Reference
Event Handling Functions - Functions - Language Basics - MQL4 Reference
  • docs.mql4.com
Event Handling Functions - Functions - Language Basics - MQL4 Reference
 
Max Enrik(потому что я никогда не использовал функцию 'Void OnTick()').

До сборки 600 (3 февраля2014 года) был только start(). Теперь есть OnTick (советники,) OnCalculate (индикаторы,) и OnStart (скрипты.) Я забыл, что вы говорили об индикаторе.

Начните использовать новые функции обработки событий - Функции - Основы языка - Справочник MQL4. Смотрите Как правильно делать обратный просмотр.

Event Handling Functions - Functions - Language Basics - MQL4 Reference
Event Handling Functions - Functions - Language Basics - MQL4 Reference
  • docs.mql4.com
Event Handling Functions - Functions - Language Basics - MQL4 Reference