Любые вопросы от ПРОФИ к СУПЕРПРОФИ - 1. - страница 41

 
Sergey Dzyublik:

Супер!  Интересный способ.

 
Ihor Herasko:

Супер!  Интересный способ.

https://www.mql5.com/ru/search#!keyword=TOSTRING

Поиск - MQL5.community
Поиск - MQL5.community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 
fxsaber:

https://www.mql5.com/ru/search#!keyword=TOSTRING

Да, я помню, что Вы - гений макросов. Спасибо. Другое дело, что работа почти нигде не описывается. Можете посоветовать источник, который описывает эти тонкости? Понятное дело, для С/С++.

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

 
Благодарю за быстрый и исчерпывающий ответ!
 
Ihor Herasko:

Можете посоветовать источник, который описывает эти тонкости?

Макросы изучил на единственном примере от MQ, который был в анонсе одного из билдов MT5. Там вводились # и ## и хороший пример был. Ссылку не найду.

 
fxsaber:

Макросы изучил на единственном примере от MQ, который был в анонсе одного из билдов MT5. Там вводились # и ## и хороший пример был. Ссылку не найду.

Ясно. Еще раз спасибо.

 
Andrey Khatimlianskii:

Бывают же совпадения... Я ведь как раз в CodeBase отправила на публикацию включаемый файл, который составила на основе этого обсуждения в 2015-м: https://www.mql5.com/ru/forum/63951/page2#comment_1908129

Сами коды в библиотечном файле, что подготовила к публикации - простые. При этом по смыслу - как вас интересовало и примерно как привёл Sergey Dzyublik

P./S.: Как оказалось со временем, именно самое простое стало у меня самым применяемым. Со временем поймала себя на том, что без того включаемого файла - как чего-то не хватает /*при выводе каких-то результатов: при конструировании кодов, работы функций*/ 

 
fxsaber:

Макросы изучил на единственном примере от MQ, который был в анонсе одного из билдов MT5. Там вводились # и ## и хороший пример был. Ссылку не найду.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Список изменений в билдах MetaTrader 5 Client Terminal

MetaQuotes Software Corp., 2014.10.30 06:25

Обновление платформы MetaTrader 5 build 1010: Новые сигналы, маркет и опционы

В пятницу 31-го октября будет опубликовано обновление платформы MetaTrader 5. Обновление будет содержать следующие изменения:

MetaTrader 5 Client Terminal build 1010
  1. MQL5: Добавлено преобразование параметра макроса в строку и конкатенация параметра макроса. Ниже приведен пример, в котором конкатенация макросов позволяет организовать автоматическое удаление экземпляров класса.
  2. //+------------------------------------------------------------------+
    //|                                                     MacroExample |
    //|                        Copyright 2014, MetaQuotes Software Corp. |
    //|                                       http://www.metaquotes.net  |
    //+------------------------------------------------------------------+
    #property script_show_inputs
    input bool InpSecond=true;
    
    #define DEFCLASS(class_name) class class_name:public CBase{public:class_name(string name):CBase(name){}};
    #define TOSTR(x) #x
    #define AUTODEL(obj) CAutoDelete auto_##obj(obj)
    #define NEWOBJ(type,ptr) do { ptr=new type(TOSTR(ptr)); \
                             Print("Create object '",TOSTR(type)," ",TOSTR(ptr),"' by macro NEWOBJ"); } \
                             while(0)
    //+------------------------------------------------------------------+
    //| Базовый класс, необходим для автоудаления объектов               |
    //+------------------------------------------------------------------+
    class CBase
      {
    protected:
       string            m_name;
    
    public:
                         CBase(string name):m_name(name) { }
       string            Name(void) const{ return(m_name); }
    
      };
    //+------------------------------------------------------------------+
    //| Класс автоудаления объектов позволяет не следить за созданными   |
    //| объектами. Он удаляет их в своем деструкторе                     |
    //+------------------------------------------------------------------+
    class CAutoDelete
      {
       CBase            *m_obj;
    
    public:
                         CAutoDelete(CBase *obj):m_obj(obj) { }
                        ~CAutoDelete()
         {
          if(CheckPointer(m_obj)==POINTER_DYNAMIC)
            {
             Print("Delete object '",m_obj.Name(),"' by CAutoDelete class");
             delete m_obj;
            }
         }
      };
    //+------------------------------------------------------------------+
    //| Объявим два новых класса CFoo и CBar                             |
    //+------------------------------------------------------------------+
    DEFCLASS(CFoo);
    DEFCLASS(CBar);
    //+------------------------------------------------------------------+
    //| Основная функция скрипта                                         |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       CFoo *foo;
    //--- создадим объект класса CFoo
       NEWOBJ(CFoo,foo);
    //--- создадим экземпляр класса автоудаления объекта CFoo foo
       AUTODEL(foo);
    //---
       if(InpSecond)
         {
          CBar *bar;
          //---
          NEWOBJ(CBar,bar);
          AUTODEL(bar);
         }
    //--- Удалять foo не нужно, он будет удален автоматически
      }
    //+------------------------------------------------------------------+
 
fxsaber:

Спасибо. Пойду тем же путем.

Судя по времени публикации (06:25) я эту новость тупо проспал)))

 

Здравствуйте, скинули мне индикатор МА, там сразу все необходимые  для меня уровни. Проблема в том - что при наведении мышки на индикатор (каждый МА) не показывает период данной МА. Как исправить этот момент? Постоянно ошибка синтаксиса при изменении имени IndicatorShortName("MASHKI =)"); Помогите пожалуйста.

//+------------------------------------------------------------------+
//|                                                       ManyMA.mq4 |
//|                                                              VVM |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "VVM"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Gold
#property indicator_color2 Aqua
#property indicator_color3 Blue
#property indicator_color4 Magenta
#property indicator_color5 Red
#property indicator_color6 Green
#property indicator_color7 BurlyWood
#property indicator_color8 DarkViolet

extern int MA1_Period=8;
extern int MA1_Shift=0;
extern int MA1_Method=1;

extern int MA2_Period=13;
extern int MA2_Shift=0;
extern int MA2_Method=0;

extern int MA3_Period=21;
extern int MA3_Shift=0;
extern int MA3_Method=1;

extern int MA4_Period=50;
extern int MA4_Shift=0;
extern int MA4_Method=1;

extern int MA5_Period=50;
extern int MA5_Shift=0;
extern int MA5_Method=0;

extern int MA6_Period=100;
extern int MA6_Shift=0;
extern int MA6_Method=0;

extern int MA7_Period=200;
extern int MA7_Shift=0;
extern int MA7_Method=0;

extern int MA8_Period=350;
extern int MA8_Shift=0;
extern int MA8_Method=1;

extern int MA9_Period=1000;
extern int MA9_Shift=0;
extern int MA9_Method=0;

double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
double ExtMapBuffer9[];

int ExtCountedBars=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   int    draw_begin1;
   int    draw_begin2;
   int    draw_begin3;
   int    draw_begin4;
   int    draw_begin5;
   int    draw_begin6;
   int    draw_begin7;
   int    draw_begin8;
   int    draw_begin9;
   
   string short_name;
   SetIndexStyle(0, DRAW_LINE, 0, 2);
   SetIndexStyle(1, DRAW_LINE, 0, 2);   
   SetIndexStyle(2, DRAW_LINE, 0, 2);   
   SetIndexStyle(3, DRAW_LINE, 0, 2);   
   SetIndexStyle(4, DRAW_LINE, 0, 2);   
   SetIndexStyle(5, DRAW_LINE, 0, 3);   
   SetIndexStyle(6, DRAW_LINE, 0, 3);   
   SetIndexStyle(7, DRAW_LINE, 0, 3);   
   SetIndexStyle(8, DRAW_LINE, 0, 4);   
   
   SetIndexShift(0, MA1_Shift);
   SetIndexShift(1, MA2_Shift);
   SetIndexShift(2, MA3_Shift);
   SetIndexShift(3, MA4_Shift);
   SetIndexShift(4, MA5_Shift);
   SetIndexShift(5, MA6_Shift);
   SetIndexShift(6, MA7_Shift);
   SetIndexShift(7, MA8_Shift);
   SetIndexShift(8, MA9_Shift);
   
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   
   draw_begin1=MA1_Period-1;
   draw_begin2=MA2_Period-1;
   draw_begin3=MA3_Period-1;
   draw_begin4=MA4_Period-1;
   draw_begin5=MA5_Period-1;
   draw_begin6=MA6_Period-1;
   draw_begin7=MA7_Period-1;
   draw_begin8=MA8_Period-1;
   draw_begin9=MA9_Period-1;
   
   IndicatorShortName("MASHKI =)");
   
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
   SetIndexDrawBegin(2,draw_begin3);
   SetIndexDrawBegin(3,draw_begin4);
   SetIndexDrawBegin(4,draw_begin5);
   SetIndexDrawBegin(5,draw_begin6);
   SetIndexDrawBegin(6,draw_begin7);   
   SetIndexDrawBegin(7,draw_begin8);
   SetIndexDrawBegin(8,draw_begin9);
   
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexBuffer(4,ExtMapBuffer5);
   SetIndexBuffer(5,ExtMapBuffer6);
   SetIndexBuffer(6,ExtMapBuffer7);
   SetIndexBuffer(7,ExtMapBuffer8);
   SetIndexBuffer(8,ExtMapBuffer9);
   
   
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   ExtCountedBars=IndicatorCounted();
   if (ExtCountedBars<0) return(-1);
   if (ExtCountedBars>0) ExtCountedBars--;
   switch(MA1_Method)
     {
      case 0 : sma(1, MA1_Period);  break;
      case 1 : ema(1, MA1_Period);  
     }
   switch(MA2_Method)
     {
      case 0 : sma(2, MA2_Period);  break;
      case 1 : ema(2, MA2_Period); 
     }
   switch(MA3_Method)
     {
      case 0 : sma(3, MA3_Period);  break;
      case 1 : ema(3, MA3_Period); 
     }
   switch(MA4_Method)
     {
      case 0 : sma(4, MA4_Period);  break;
      case 1 : ema(4, MA4_Period); 
     }
   switch(MA5_Method)
     {
      case 0 : sma(5, MA5_Period);  break;
      case 1 : ema(5, MA5_Period);
     }
   switch(MA6_Method)
     {
      case 0 : sma(6, MA6_Period);  break;
      case 1 : ema(6, MA6_Period);  
     }
   switch(MA7_Method)
     {
      case 0 : sma(7, MA7_Period);  break;
      case 1 : ema(7, MA7_Period);  
     }                  
   switch(MA8_Method)
     {
      case 0 : sma(8, MA8_Period);  break;
      case 1 : ema(8, MA8_Period);  
     }
   switch(MA9_Method)
     {
      case 0 : sma(9, MA9_Period);  
      case 1 : ema(9, MA9_Period);  
     }      

   return(0);
  }

void sma(int MAnum, int MA_period)
  {
   double sum=0;
   int    i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<MA_period) pos=MA_period;
   for(i=1;i<MA_period;i++,pos--)
      sum+=Close[pos];
//---- main calculation loop
   while(pos>=0)
     {
      sum+=Close[pos];
      switch(MAnum)
        {
          case 1 : ExtMapBuffer1[pos]=sum/MA_period; break;
          case 2 : ExtMapBuffer2[pos]=sum/MA_period; break;
          case 3 : ExtMapBuffer3[pos]=sum/MA_period; break;
          case 4 : ExtMapBuffer4[pos]=sum/MA_period; break;
          case 5 : ExtMapBuffer5[pos]=sum/MA_period; break;
          case 6 : ExtMapBuffer6[pos]=sum/MA_period; break;
          case 7 : ExtMapBuffer7[pos]=sum/MA_period; break;
          case 8 : ExtMapBuffer8[pos]=sum/MA_period; break;
          case 9 : ExtMapBuffer9[pos]=sum/MA_period;    
        }        
                       
           sum-=Close[pos+MA_period-1];
           pos--;
     }
//---- zero initial bars
      if(ExtCountedBars<1)
      switch(MAnum)
        {
          case 1 : for(i=1;i<MA_period;i++) ExtMapBuffer1[Bars-i]=0; break;
          case 2 : for(i=1;i<MA_period;i++) ExtMapBuffer2[Bars-i]=0; break;
          case 3 : for(i=1;i<MA_period;i++) ExtMapBuffer3[Bars-i]=0; break;
          case 4 : for(i=1;i<MA_period;i++) ExtMapBuffer4[Bars-i]=0; break;
          case 5 : for(i=1;i<MA_period;i++) ExtMapBuffer5[Bars-i]=0; break;
          case 6 : for(i=1;i<MA_period;i++) ExtMapBuffer6[Bars-i]=0; break;
          case 7 : for(i=1;i<MA_period;i++) ExtMapBuffer7[Bars-i]=0; break;
          case 8 : for(i=1;i<MA_period;i++) ExtMapBuffer8[Bars-i]=0; break;
          case 9 : for(i=1;i<MA_period;i++) ExtMapBuffer9[Bars-i]=0;
        }                 
  }
  
  void ema(int MAnum, int MA_Period)
  {
   double pr=2.0/(MA_Period+1);
   int    pos=Bars-2;
   if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
   while(pos>=0)
     {
      switch(MAnum)
        {
          case 1 : if(pos==Bars-2) ExtMapBuffer1[pos+1]=Close[pos+1]; break;
          case 2 : if(pos==Bars-2) ExtMapBuffer2[pos+1]=Close[pos+1]; break;
          case 3 : if(pos==Bars-2) ExtMapBuffer3[pos+1]=Close[pos+1]; break;
          case 4 : if(pos==Bars-2) ExtMapBuffer4[pos+1]=Close[pos+1]; break;
          case 5 : if(pos==Bars-2) ExtMapBuffer5[pos+1]=Close[pos+1]; break;
          case 6 : if(pos==Bars-2) ExtMapBuffer6[pos+1]=Close[pos+1]; break;
          case 7 : if(pos==Bars-2) ExtMapBuffer7[pos+1]=Close[pos+1]; break;
          case 8 : if(pos==Bars-2) ExtMapBuffer8[pos+1]=Close[pos+1]; break;
          case 9 : if(pos==Bars-2) ExtMapBuffer9[pos+1]=Close[pos+1];
        }     
      switch(MAnum)
        {
          case 1 : ExtMapBuffer1[pos]=Close[pos]*pr+ExtMapBuffer1[pos+1]*(1-pr); break;
          case 2 : ExtMapBuffer2[pos]=Close[pos]*pr+ExtMapBuffer2[pos+1]*(1-pr); break;
          case 3 : ExtMapBuffer3[pos]=Close[pos]*pr+ExtMapBuffer3[pos+1]*(1-pr); break;
          case 4 : ExtMapBuffer4[pos]=Close[pos]*pr+ExtMapBuffer4[pos+1]*(1-pr); break;
          case 5 : ExtMapBuffer5[pos]=Close[pos]*pr+ExtMapBuffer5[pos+1]*(1-pr); break;
          case 6 : ExtMapBuffer6[pos]=Close[pos]*pr+ExtMapBuffer6[pos+1]*(1-pr); break;
          case 7 : ExtMapBuffer7[pos]=Close[pos]*pr+ExtMapBuffer7[pos+1]*(1-pr); break;
          case 8 : ExtMapBuffer8[pos]=Close[pos]*pr+ExtMapBuffer8[pos+1]*(1-pr); break;
          case 9 : ExtMapBuffer9[pos]=Close[pos]*pr+ExtMapBuffer9[pos+1]*(1-pr);
        }             
           pos--;
     }
  }

Не показывает период, а просто название Mashki =))