Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 465

 
kashi_ann:

Что я делаю не правильно? 

А у этого индикатора нет входных параметров? (я про функцию iCustom(...))

(Надеюсь, у вас закрывающая скобка только здесь пропущена)

И раз вы копируете только 2 элемента, вы их копируете в  статически выделенный буфер?

 
Уважаемые,

открыл код индикатора к NT7
вижу в нём if ( v>=a && v<b)
а мне надо добавить ещё условие: неравно числу 25

правильно ли будет следующее?
if ( v>=a && v<b && v<25 && v>25)
 

Artyom Trishkin
:

1. Можете iMaOnArray()
2. Может не тот моментум смотрели? Индикаторы --> Осцилляторы --> Momentum
3. Странные у вас МАшки в подокне. Где вы всё это берёте? Индикаторы --> Трендовые --> Moving Average

Артём, спасибо за ответ, оказывается это в меню...   Я не там брал индикаторы  :)  В окне "Навигатор" щёлкал  Индикаторы\Momentum, индикатор добавляется каждый раз в новое подокно и какой-то кастрированный.
Подскажите, пожалуйста, что будет меньше нагружать процессор, если процедура повторяется часто:
1) Разместить мой (сложный) индикатор в подокне и брать значения отсюда
или
2)Считать значение индикатора по OnTime(), применяя (MQL4) iCustom.
Если я правильно понял, в случае 2) индикатор не рисуется в окне, а считается по требованию. Правда я не понял, исполняемый код индикатора загружается один раз или каждый раз при вызове ... 
P.S. Через меню второй индикатор всё равно добавляется в новое подокно .. Как же его к уже существующему индикатору в подокно добавить ?

 

Александр:
Уважаемые,

открыл код индикатора к NT7
вижу в нём if ( v>=a && v<b)
а мне надо добавить ещё условие: неравно числу 25

правильно ли будет следующее?
if ( v>=a && v<b && v<25 && v>25)

Никогда не сработает, потому, что: "v<25 && v>25" всегда false.

Нужно как-то так: 

v!=25 

 
Yury Kirillov:

Никогда не сработает, потому, что: "v<25 && v>25" всегда false.

Нужно как-то так: 

v!=25 

спасибо! да:

if ( v>=a && v<b && (v<25 || v>25)) или if ( v>=a && v<b && v!=25) 

 
Александр:
спасибо! на другом форуме подсказали: if ( v>=a && v<b && (v<25 || v>25))

У себя я бы написал так:

{if((v>=a)&&(v<b)&&(v!=25)) 
{
        //разные действия 
}}//if((v>=a)&&(v<b)&&(v!=25)) 

 
 
Oksana Berenko:

А у этого индикатора нет входных параметров? (я про функцию iCustom(...))

(Надеюсь, у вас закрывающая скобка только здесь пропущена)

И раз вы копируете только 2 элемента, вы их копируете в  статически выделенный буфер?

У индикатора куча входных параметров.

Не поняла где скобку пропустила.  

Боюсь, что не понимаю, что значит статичный буфер. Если не сложно, поясните, пожалуйста.

 
Mike:

Артём, спасибо за ответ, оказывается это в меню...   Я не там брал индикаторы  :)  В окне "Навигатор" щёлкал  Индикаторы\Momentum, индикатор добавляется каждый раз в новое подокно и какой-то кастрированный.
Подскажите, пожалуйста, что будет меньше нагружать процессор, если процедура повторяется часто:
1) Разместить мой (сложный) индикатор в подокне и брать значения отсюда
или
2)Считать значение индикатора по OnTime(), применяя (MQL4) iCustom.
Если я правильно понял, в случае 2) индикатор не рисуется в окне, а считается по требованию. Правда я не понял, исполняемый код индикатора загружается один раз или каждый раз при вызове ... 
P.S. Через меню второй индикатор всё равно добавляется в новое подокно .. Как же его к уже существующему индикатору в подокно добавить ?

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

Чтобы индикатор поместить в окно другог индикатора, перетащите его мышкой из окна навигатора в окно нужного индикатора.

Насчёт меньших затрат процессорного времени - не проверял, не знаю.

 

помогите составить условия, закончить идею  ,как проще  поставить метку на графике по условию ?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
  //+------------------------------------------------------------------+
void OnTick()
{
        // скорость тиков
        int nTicksSpeed = TicksSpeed();
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int TicksSpeed()
{
        MqlTick oTicks[5];
        ZeroMemory(oTicks);
        
        int nTicksCopied = CopyTicks(_Symbol, oTicks, COPY_TICKS_TRADE, 0, 5);
        
        int nSpeed = 0;

        if(nTicksCopied > 0)
        {
                // скорость роста
                if(oTicks[0].bid > oTicks[1].bid)
                {
                        if(oTicks[4].bid > 0 && oTicks[0].bid > oTicks[1].bid && oTicks[1].bid > oTicks[2].bid && oTicks[2].bid > oTicks[3].bid && oTicks[3].bid > oTicks[4].bid)
                                nSpeed = 4;
                        else if(oTicks[3].bid > 0 && oTicks[0].bid > oTicks[1].bid && oTicks[1].bid > oTicks[2].bid && oTicks[2].bid > oTicks[3].bid)
                                nSpeed = 3;
                        else if(oTicks[2].bid > 0 && oTicks[0].bid > oTicks[1].bid && oTicks[1].bid > oTicks[2].bid)
                                nSpeed = 2;
                                
                        else if(oTicks[1].bid > 0 && oTicks[0].bid > oTicks[1].bid)
                                nSpeed = 1 ;
                        
                }
        
                // скорость снижения
                if(oTicks[0].bid < oTicks[1].bid)
                {
                        if(oTicks[4].bid > 0 && oTicks[0].bid < oTicks[1].bid && oTicks[1].bid < oTicks[2].bid && oTicks[2].bid < oTicks[3].bid && oTicks[3].bid < oTicks[4].bid)
                                nSpeed = -4;
                        else if(oTicks[3].bid > 0 && oTicks[0].bid < oTicks[1].bid && oTicks[1].bid < oTicks[2].bid && oTicks[2].bid < oTicks[3].bid)
                                nSpeed = -3;
                        else if(oTicks[2].bid > 0 && oTicks[0].bid < oTicks[1].bid && oTicks[1].bid < oTicks[2].bid)
                                nSpeed = -2; 
                        else if(oTicks[1].bid > 0 && oTicks[0].bid < oTicks[1].bid)
                                nSpeed = -1 ; 
                }
        }
        
        return(nSpeed);
}

//+------------------------------------------------------------------+

if( nTickSpeed==-1)  отмечаем это место на графике g_Label.Text("-1 ")

if( nTickSpeed==-2)  отмечаем это место на графике g_Label.Text("-2 ")

if (nTickSpeed==-3)  отмечаем это место на графике g_Label.Text("-3 ")

if( nTickSpeed==-4)  отмечаем это место на графике g_Label.Text("-4 ")




if( nTickSpeed==1)  отмечаем это место на графике g_Label.Text("1 ")

if( nTickSpeed==2)  отмечаем это место на графике g_Label.Text("2 ")

if( nTickSpeed==3)  отмечаем это место на графике g_Label.Text("3 ")

if( nTickSpeed==4)  отмечаем это место на графике g_Label.Text("4 ")
 

Можно if'ы в конце заменить на:

   switch(nTickSpeed)
     {
      case -4:
         g_Label.Text("-4");
         break;
      case -3:
         g_Label.Text("-3");
         break;
      case -2:
         g_Label.Text("-2");
         break;
      case -1:
         g_Label.Text("-1");
         break;
      case 1:
         g_Label.Text("1");
         break;
      case 2:
         g_Label.Text("2");
         break;
      case 3:
         g_Label.Text("3");
         break;
      case 4:
         g_Label.Text("4");
         break;
     }
Причина обращения: