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

ansol

Местный знаток
есть стрелочный индикатор по нему нужно написать советника но как это сделать я не знаю

Попробуйте начать изучение MQL4 с этого:
ObjectFind

Ищет объект с указанным именем. Существует два варианта функции:

int ObjectFind(
long chart_id, // идентификатор графика
string object_name // имя объекта
);
Стрелка на графике - это объект, список объектов доступен по правой кнопке мыши на графике.
Или вам надо, что бы кто-нибудь другой написал?
Тогда индикатор в студию и не в этой теме
 

salco85

Активный участник
Всем здравствуйте!!! просьба подскажите пожалуйста как прописать в коде стандартного индикатора дивергенцию
 

ron2009

Активный участник
Pomogite vstavit vtoroi indicator v exp_icustom v10 shablon.
Odin indicator strelochnii a vtoroi na izmenenie tsveta. Nuzhno shtobi oba uchitivalis na otkritie i na zakritie. Tknite nosom kakuyu shast exp_iCustom Scripta posmotret ili izmenit.
Ja znayu shto tolko rabotaet s odnim indicatorom na otkritie i vtoroi na zakritie.
 

tommy27

Гуру форума
Всем здравствуйте!!! просьба подскажите пожалуйста как прописать в коде стандартного индикатора дивергенцию

Один из вариантов "моторчика" будет выглядеть вот так:
PHP:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBullishDivergence(int shift)
  {
   if(IsIndicatorTrough(shift) == false)
       return;
   int currentTrough = shift;
   int lastTrough = GetIndicatorLastTrough(shift);
   if(OsMA[currentTrough] > OsMA[lastTrough] && Low[currentTrough] < Low[lastTrough])
     {
      bullishDivergence[currentTrough] = OsMA[currentTrough];
      if(drawDivergenceLines == true)
        {
          DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], Low[currentTrough], 
                             Low[lastTrough], Green, STYLE_SOLID);
          DrawIndicatorTrendLine(Time[currentTrough], Time[lastTrough], OsMA[currentTrough],
                                 OsMA[lastTrough], Green, STYLE_SOLID);
        }
      if(displayAlert == true)
          DisplayAlert("Classical bullish divergence on: ", currentTrough);  
     }
   if(OsMA[currentTrough] < OsMA[lastTrough] && Low[currentTrough] > Low[lastTrough])
     {
      bullishDivergence[currentTrough] = OsMA[currentTrough];
      if(drawDivergenceLines == true)
        {
          DrawPriceTrendLine(Time[currentTrough], Time[lastTrough], Low[currentTrough], 
                             Low[lastTrough], Green, STYLE_DOT);
          DrawIndicatorTrendLine(Time[currentTrough], Time[lastTrough], OsMA[currentTrough],
                                 OsMA[lastTrough], Green, STYLE_DOT);
        }
      if(displayAlert == true)
          DisplayAlert("Reverse bullish divergence on: ", currentTrough);   
     }      
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CatchBearishDivergence(int shift)
  {
   if(IsIndicatorPeak(shift) == false)
       return;
   int currentPeak = shift;
   int lastPeak = GetIndicatorLastPeak(shift);
   
   if(OsMA[currentPeak] < OsMA[lastPeak] && High[currentPeak] > High[lastPeak])
     {
       bearishDivergence[currentPeak] = OsMA[currentPeak];
       if(drawDivergenceLines == true)
         {
           DrawPriceTrendLine(Time[currentPeak], Time[lastPeak], High[currentPeak], 
                              High[lastPeak], Red, STYLE_SOLID);
           DrawIndicatorTrendLine(Time[currentPeak], Time[lastPeak], OsMA[currentPeak],
                                  OsMA[lastPeak], Red, STYLE_SOLID);
         }
       if(displayAlert == true)
           DisplayAlert("Classical bearish divergence on: ", currentPeak);  
     }
   if(OsMA[currentPeak] > OsMA[lastPeak] && High[currentPeak] < High[lastPeak])
     {
       bearishDivergence[currentPeak] = OsMA[currentPeak];
       if(drawDivergenceLines == true)
         {
           DrawPriceTrendLine(Time[currentPeak], Time[lastPeak], High[currentPeak], 
                              High[lastPeak], Red, STYLE_DOT);
           DrawIndicatorTrendLine(Time[currentPeak], Time[lastPeak], OsMA[currentPeak],
                                  OsMA[lastPeak], Red, STYLE_DOT);
         }
       if(displayAlert == true)
           DisplayAlert("Reverse bearish divergence on: ", currentPeak);   
     }   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorPeak(int shift)
  {
   if(OsMA[shift] > 0 && OsMA[shift] > OsMA[shift+1] && OsMA[shift] > OsMA[shift-1])
     {
       for(int i = shift + 1; i < Bars; i++)
         {
           if(OsMA[i] < 0)
              return(true);
           if(OsMA[i] > OsMA[shift])
              break;            
         }
     }   
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsIndicatorTrough(int shift)
  {
   if(OsMA[shift] < 0 && OsMA[shift] < OsMA[shift+1] && OsMA[shift] < OsMA[shift-1])
     {
       for(int i = shift + 1; i < Bars; i++)
         {
           if(OsMA[i] > 0)
               return(true);
           if(OsMA[i] < OsMA[shift])
               break;            
         }
     }   
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastPeak(int shift)
  {
    for(int i = shift + 5; i < Bars; i++)
      {
        if(OsMA[i] >= OsMA[i+1] && OsMA[i] > OsMA[i+2] &&
           OsMA[i] >= OsMA[i-1] && OsMA[i] > OsMA[i-2])
            return(i);
      }
    return(-1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetIndicatorLastTrough(int shift)
  {  
    for(int i = shift + 5; i < Bars; i++)
      {
        if(OsMA[i] <= OsMA[i+1] && OsMA[i] < OsMA[i+2] &&
           OsMA[i] <= OsMA[i-1] && OsMA[i] < OsMA[i-2])
            return(i);
      }
    return(-1);
  }

во вложении индюк из которого это взято.
 

Вложения

  • FX5_Divergence_V2.1.mq4
    11,3 КБ · Просмотры: 30

salco85

Активный участник
Привет!!! я вчера это все проделывал не почучается,дело в том что индикатор ROC и как мне в нем прописать эти условия а тот индюк он то основан на OSME вообщем Вы понимаете!!!
 

tommy27

Гуру форума
Привет!!! я вчера это все проделывал не почучается,дело в том что индикатор ROC и как мне в нем прописать эти условия а тот индюк он то основан на OSME вообщем Вы понимаете!!!
понимаю!!! в коде индюка FX5_Divergence прописываете входные параметры ROCa -если они есть и хотите их потом менять
и далее меняете
PHP:
OsMA[i] = iOsMA(NULL, 0, fastEMA, slowEMA, signal, PRICE_CLOSE, i);
на
PHP:
OsMA[i] =iCustom(NULL,0,"ROC",параметры, i);
ну и если без зачистки следов от осмы то это всё что необходимо сделать!!!
 
Последнее редактирование:

prt

Прохожий
Значение индикатора.

Здравствуйте. Никак не могу достать значение индикатора поданное в таком формате SetIndexBuffer(7, arrA);

При вызове с помощью

L7 = iCustom(NULL,0,"777",5,1,1,7,1);

Выводит результат Print("L7= ", NormalizeDouble(L7,5));

как L7= 2147483647.0

Спасибо.
 

AlexeyVik

Программист mql4 mql5
Здравствуйте. Никак не могу достать значение индикатора поданное в таком формате SetIndexBuffer(7, arrA);

При вызове с помощью

L7 = iCustom(NULL,0,"777",5,1,1,7,1);

Выводит результат Print("L7= ", NormalizeDouble(L7,5));

как L7= 2147483647.0

Спасибо.
На форуме mql4 тебе правильно ответили. Это пустое значение. Посмотри в окне данных показывает-ли значение на этом баре. Если хочешь более детальный ответ выложи индикатор о котором идёт речь.
 

Anna2014

Прохожий
Подскажите пожалуйста как добавить функцию Period() если единственный буфер == Low, и ни каких иных буферов или функций более нет.
 

Anna2014

Прохожий
Господа,

Очень нужна помощь. Имеется индикатор, очень простой и всем, наверное, известный: Trend Magic. Основан на двух стандартных индикаторах: CCI(50) и ATR(5). Рисует очень красивые линии на графике. У меня, как чайника в программировании, имеется вопрос: как из значений CCI и ATR получается значение, которое отображается на графике цены и по которому рисуется эта самая линия? Можете вывести формулу?

Формула индикатора CCI:
Сначала рассчитывается характерная цена (Typical Price):

Рассчитывается простая скользящая средняя от характерной цены:

Рассчитывается вероятное (срединное) отклонение.

где
Формула самого индикатора CCI будет выглядеть следующим образом:

Расчетная формула ATR:

ATR = Moving Average(TRj, n),
где
TRj = максимальному из модулей трех значений
|High - Low|, |High - Closej-1|, |Low - Closej-1|.
 

qqmber

Почетный гражданин
Подскажите пожалуйста как добавить функцию Period() если единственный буфер == Low, и ни каких иных буферов или функций более нет.

Что-то уж очень лаконично вопрос задан. Если нужно узнать Low другого периода, то есть функция iLow().
 

tench72

Интересующийся
Всем привет, подскажите пожалуйста как переделать код индикатора в функцию в коде другого индюка. Я использую iСustom(), там их две функции в одном коде индикатора, а iСustom() ооооочень сильно грузят мой терминал, хотя комп вроде нормальный по параметрам!!!!!!!
 

tench72

Интересующийся
Переделка индикатора в функцию

Совсем забыл нужно переделать во внутреннюю функцию индикатор стохастик Ди Наполи, функция должна возвращать значения нулевого буфера стохастика, не сигнальную линию:)
Код стохастика прикладываю в сообщениии, а в программе я использовал функцию iCustom() c параметрами:
BuferStoh = iCustom(NULL,0,"StochasticDiNapoli",FastK,SlowK,SlowD, 0, i);
И терминал грузится пипец, так как я еще использую внутри кода стандартную функцию iCCI():facepalm:
Помогите плиз кто может :please:
 

Вложения

  • StochasticDiNapoli.mq4
    4,7 КБ · Просмотры: 16

AlexeyVik

Программист mql4 mql5
Совсем забыл нужно переделать во внутреннюю функцию индикатор стохастик Ди Наполи, функция должна возвращать значения нулевого буфера стохастика, не сигнальную линию:)
Код стохастика прикладываю в сообщениии, а в программе я использовал функцию iCustom() c параметрами:
BuferStoh = iCustom(NULL,0,"StochasticDiNapoli",FastK,SlowK, SlowD, 0, i);
И терминал грузится пипец, так как я еще использую внутри кода стандартную функцию iCCI():facepalm:
Помогите плиз кто может :please:

Так в индикаторе 7 внешних параметров, а ты передаёшь только 3. Вот он и не понимает что от него хотят, может потому и грузит терминал попытками пересчёта.
 

tench72

Интересующийся
Я читал что можно не все параметры передавать, главное чтобы порядок следования не нарушать, а так вроде как можно и вообще один указать....
 

tench72

Интересующийся
Пробовал я передавать все параметры, ни чччО не помогло! так все и осталось грузиииит пипец.
 

AlexeyVik

Программист mql4 mql5
Я читал что можно не все параметры передавать, главное чтобы порядок следования не нарушать, а так вроде как можно и вообще один указать....
Если не передавать вообще, то применяются параметры по умолчанию в индикаторе, а вот изменить часть из них... лично я сомневаюсь. Совсем не сложно вставить их даже не переменными, а просто цифрами, но это будет страховка от непоняток MQ... Можешь проверить...
А по сути вопроса, вынести в отдельную функцию, извини мне лениво напрягать свой пьяный мозг. Там ничего сложного нет, требуется только внимательность.
 

oleg93

Активный участник
Всем привет! Подскажите ,знающие, задать время первой точки в TrendLine как конкретное время - например 9:00 ?
 
Верх