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

Britozavr

Заблокирован
Вот индикатор. Я хочу чтобы с боку была информация о количестве зеленых штрихов после последнего разворота
 

Вложения

  • 2013-08-11_163254.png
    2013-08-11_163254.png
    4,3 КБ · Просмотры: 57

Ugar

Гуру форума
Так в чём проблема? Не знаешь как посчитать, или как циферку нарисовать?
 

Britozavr

Заблокирован
Наверное и то и другое.
Чтобы выводилась цифра допустим 4 зеленым или 10 красным. Хочу потом со всех TF вывести. Знать бы как это посчитать. Вывести наверное сам смогу.
 

Ugar

Гуру форума
Наверное и то и другое.
Чтобы выводилась цифра допустим 4 зеленым или 10 красным. Хочу потом со всех TF вывести. Знать бы как это посчитать. Вывести наверное сам смогу.
Оба буфера красный и зелёный в индикаторе есть. Посчитай столбики с ненулевыми значениями в цикле.
 

Britozavr

Заблокирован
В том то и дело что я не знаю как этот цикл написать. Умения не хватает. Так напишу, что еще и линии индикатора пропадут.
 
Последнее редактирование:

Britozavr

Заблокирован
Код обычный для MACD, - правда он еще использует iCUSTOM и DLL
Индикатор прикольный с опережающим эффектом. Я под него еще индикатор подогнал неказистый, но очень толковый. Они вместе расшифровывают направление тренда. Так что буду крайне благодарен за помощь.
PHP:
#property  indicator_separate_window
#property  indicator_buffers 5
#property  indicator_color1  White
#property  indicator_color2  C'0,45,0'    //bbMacd up
#property  indicator_color3  FireBrick //bbMacd up
#property  indicator_color4  Silver    //Upperband
#property  indicator_color5  Silver     //Lowerband

#property  indicator_width2 3
#property  indicator_width3 3
//---- indicator parameters
extern int FastLen = 38;
extern int SlowLen = 120;
extern int Length = 20;
extern double StDv = 1.1;
extern int LagFast = 38;
extern int LagSlow = 128;
extern int NumberOfComputations =    2;
extern int NumberOfBars         = 2000;


//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];  // bbMacd
double ExtMapBuffer2[];  // bbMacd
double ExtMapBuffer3[];  // Upperband Line
double ExtMapBuffer4[];  // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {

   IndicatorBuffers(8);
   SetIndexBuffer(0, bbMacd);
   SetIndexStyle(0, DRAW_LINE);   
   SetIndexBuffer(1, ExtMapBuffer1); // bbMacd line
   SetIndexStyle(1, DRAW_HISTOGRAM);
   SetIndexBuffer(2, ExtMapBuffer2); // bbMacd line
   SetIndexStyle(2, DRAW_HISTOGRAM);  
   SetIndexBuffer(3, ExtMapBuffer3); // Upperband line
   SetIndexStyle(3, DRAW_LINE);
   SetIndexBuffer(4, ExtMapBuffer4); // Lowerband line
   SetIndexStyle(4, DRAW_LINE);

   SetIndexBuffer(5, Upperband);        
   SetIndexBuffer(6, Lowerband);
   SetIndexBuffer(7, avg);    
   IndicatorShortName("Custom BB_MACD");
   SetIndexLabel(0, "bbMacd");
   SetIndexLabel(1, "Upperband");
   SetIndexLabel(2, "Lowerband");  
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(int i = 0; i < limit; i++)
       bbMacd[i] = iCustom(Symbol(),Period(),"z_SSA of price",LagFast,NumberOfComputations,NumberOfBars,PRICE_CLOSE,0,i) - 
                   iCustom(Symbol(),Period(),"z_SSA of price",LagSlow,NumberOfComputations,NumberOfBars,PRICE_CLOSE,0,i);
//----
   for(i = 0; i < limit; i++)
     {
       avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);
       sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];  // Upperband
       ExtMapBuffer4[i]=Lowerband[i];  // Lowerband
       //----
       if(bbMacd[i] > bbMacd[i+1])
           ExtMapBuffer2[i] = EMPTY_VALUE;
       //----
       if(bbMacd[i] < bbMacd[i+1])
           ExtMapBuffer1[i] = EMPTY_VALUE;
     }
  return(0);
  }
 
Последнее редактирование:

Leonup

Новичок форума
Вопросы по фракталам

Добрый вечер!
Последний фрактал можно определить так:
iFractals(NULL, 0, MODE_UPPER, 3);
iFractals(NULL, 0, MODE_LOWER, 3);

А как можно определить ПРЕДПОСЛЕДНИЙ фрактал?

И еще вопрос. Как определить, какой из последних фракталов самый последний: верхний или нижний?
Спасибо.
 

Ugar

Гуру форума
Добрый вечер!
Последний фрактал можно определить так:
iFractals(NULL, 0, MODE_UPPER, 3);
iFractals(NULL, 0, MODE_LOWER, 3);

А как можно определить ПРЕДПОСЛЕДНИЙ фрактал?

И еще вопрос. Как определить, какой из последних фракталов самый последний: верхний или нижний?
Спасибо.
Так можно определить фрактал на 3 баре только если он там есть.
Если нужно найти последний фрактал нужно перебрать бары в цикле вызывая фрактал, как найдётся нужный прервать цикла. Время бара на котором обнаружен фрактал и есть время фрактала.
for(int f=3; f<bars; f++)
{
//Вызов и подсчёт найденный фракталов по барам
if(если все фракталы найдены)break;
}
 

Dimmitriev

Активный участник
Здравствуйте гуру языка MQL.... Я тут со своими чашками приперся чтоб вы подсказали что не так в индюшке.... Сразу скажу индюк не мой... Когда кидаю на график он мне где объемы рисует полоску и ппц.... Скажите что тут не так???
Код:
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red

extern int FastAvgLen = 7;
extern int SlowAvgLen = 15;
extern int N = 250;
extern int Correction = 2;
double g_ibuf_92[];
double g_ibuf_96[];
double g_ibuf_100[];
int gi_unused_104 = 4;
int g_time_116 = 0;

int init() {
   IndicatorBuffers(3);
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(0, g_ibuf_92);
   SetIndexStyle(1, DRAW_HISTOGRAM);
   SetIndexBuffer(1, g_ibuf_96);
   SetIndexBuffer(2, g_ibuf_100);
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   double l_ima_12;
   double l_ima_20;
   double l_ima_28;
   double l_ima_36;
   int li_44;
   int li_48;
   double ld_52;
   double ld_60;
   double ld_68;
   double ld_76;
   double ld_84;
   double lda_100[];
   double lda_104[];
   double ld_108;
   double lda_116[];

   if (g_time_116 == Time[0]) return (0);
   g_time_116 = Time[0];
   int l_ind_counted_0 = IndicatorCounted();
   int li_4 = Bars - SlowAvgLen;
   ArrayResize(lda_100, Bars);
   ArrayResize(lda_104, Bars);
   ArrayResize(lda_116, Bars);
   ArraySetAsSeries(lda_100, TRUE);
   ArraySetAsSeries(lda_104, TRUE);
   ArraySetAsSeries(lda_116, TRUE);
   ArrayInitialize(lda_100, 0);
   ArrayInitialize(lda_104, 0);
   ArrayInitialize(lda_116, 0);
   for (int li_8 = li_4 - 1; li_8 >= 0; li_8--) {
      l_ima_12 = iMA(Symbol(), 0, FastAvgLen, 0, MODE_EMA, PRICE_CLOSE, li_8);
      l_ima_20 = iMA(Symbol(), 0, FastAvgLen, 0, MODE_EMA, PRICE_CLOSE, li_8 + 1);
      l_ima_28 = iMA(Symbol(), 0, SlowAvgLen, 0, MODE_EMA, PRICE_CLOSE, li_8);
      l_ima_36 = iMA(Symbol(), 0, SlowAvgLen, 0, MODE_EMA, PRICE_CLOSE, li_8 + 1);
      ld_52 = l_ima_12 - l_ima_28;
      ld_60 = l_ima_20 - l_ima_36;
      if (ld_52 >= 0.0) li_44 = 1;
      else li_44 = -1;
      if (ld_60 >= 0.0) li_48 = 1;
      else li_48 = -1;
      ld_68 = Close[li_8] - (Close[li_8 + 1]);
      if (li_44 != li_48) {
         ld_84 = 0;
         lda_100[li_8] = 0;
      } else {
         ld_84 += ld_68 * li_44;
         lda_100[li_8] = ld_84 / 4.0 + 0.75 * (lda_100[li_8 + 1]);
      }
      ld_108 = ld_84 - lda_100[li_8];
      lda_104[li_8] = ld_108 * ld_108;
      if (li_8 <= Bars - N) {
         ld_76 = Correction * MathSqrt(iMAOnArray(lda_104, 0, N, 0, MODE_SMA, li_8));
         if (MathAbs(lda_100[li_8]) + MathAbs(ld_76) > 0.0) lda_116[li_8] = 100.0 * MathAbs(lda_100[li_8]) / (MathAbs(lda_100[li_8]) + MathAbs(ld_76));
         else lda_116[li_8] = lda_116[li_8 + 1];
         if (li_8 <= Bars - N - 4) {
            g_ibuf_100[li_8] = iMAOnArray(lda_116, 0, 3, 0, MODE_EMA, li_8);
            if (li_44 > 0) {
               g_ibuf_92[li_8] = g_ibuf_100[li_8];
               g_ibuf_96[li_8] = EMPTY_VALUE;
               if (li_48 < 0) g_ibuf_92[li_8 + 1] = g_ibuf_100[li_8 + 1];
            } else {
               g_ibuf_96[li_8] = g_ibuf_100[li_8];
               g_ibuf_92[li_8] = EMPTY_VALUE;
               if (li_48 > 0) g_ibuf_96[li_8 + 1] = g_ibuf_100[li_8 + 1];
            }
         }
      }
   }
   return (0);
}
 
Последнее редактирование модератором:

Dimmitriev

Активный участник
И вот еще - перебирал на днях нашел что уже в индюшке нельзя применять функции GetLastSwing, SetPrevSwing и SetSwing. И они должны быть удалены из ex4 файла... Чем можноть их заменить!?! Индюшка по Ганну.
 

Krosst

Прохожий
Здравствуйте!
Не могли бы помочь(проконсультировать) в одном вопросе:
не могу в MQL4 реализовать функцию, чтобы после закрытия ордера командой OrderClose() следующий ордер на открытие позиции OrderSend() не открывался пока не пройдет определенное время, например 15 минут.
У меня сейчас происходит закрытие позиции. т.е. условия для OrderClose() выполняются, ордер закрывается, но потом происходит вновь открытие позиции в убыточною сторону, т.к. условия для OrderSend тоже выполняются и поэтому я хотел бы добавить еще одно условие для открытия позиции - это условие по времени, т.е. должна быть некая временная пауза между OrderClose() и OrderSend()
 

qqmber

Почетный гражданин
Здравствуйте!
Не могли бы помочь(проконсультировать) в одном вопросе:
не могу в MQL4 реализовать функцию, чтобы после закрытия ордера командой OrderClose() следующий ордер на открытие позиции OrderSend() не открывался пока не пройдет определенное время, например 15 минут.
У меня сейчас происходит закрытие позиции. т.е. условия для OrderClose() выполняются, ордер закрывается, но потом происходит вновь открытие позиции в убыточною сторону, т.к. условия для OrderSend тоже выполняются и поэтому я хотел бы добавить еще одно условие для открытия позиции - это условие по времени, т.е. должна быть некая временная пауза между OrderClose() и OrderSend()

Перед открытием ордера надо найти в истории последний закрытый и посчитать, сколько времени прошло. Проще некуда, что именно не получается?
 

ansol

Местный знаток
Есть ли способ выводить текстовую или графическую инфу в окно, отличное, от того, в котором работает советник?
Типа, мультивалютник выводит инфу по сделке в окно пары, по которой сделка произошла?
 

Ugar

Гуру форума
Есть ли способ выводить текстовую или графическую инфу в окно, отличное, от того, в котором работает советник?
Типа, мультивалютник выводит инфу по сделке в окно пары, по которой сделка произошла?
Самое простое это транслировать через GV переменные. Советрик в них пишет что надо отобразить, а в окнах стоят индикаторы отображалки. Они берут из GV данные которые надо отобразить и отображают.
 

ansol

Местный знаток
Не, это какое-то мрачное решение - навешивать индюки на кучу окон, я имел в виду что-то типа:
PHP:
#include <WinUser32.mqh>
...
handle=WindowHandle(Какая-тоПара,Period());
PostMessageA(handle,WM_KEYDOWN,VK_HOME,0);
Посылает код нажатия клавиши в другое окно с тем же периодом произвольной пары,
Там, наверное, это есть (в смысле печать обычная как в операторе "Comment"), просто где бы полное описание найти, а то посимвольно гнать месседж "куплено AUDCHF 0.45 лота в 12:17" будет как-то глупо выглядеть в тексте программы.
 

fair65

Новичок форума
Имя индикатора

Помогите разобрться с именами индикатора в коде.Вот у меня такая строчка
double SAR=iSAR(Symbol(),0,step,maximum,shift); А в терминале индикатор Parabolic / Как все это превести в соответствие?
 

ansol

Местный знаток
PHP:
double iSAR( string symbol, int timeframe, double step, double maximum, int shift) 
Расчет индикатора Parabolic Stop and Reverse system.
Т.е. это встроенный параболик так вызывается в коде. Или в чем вопрос?
 

fair65

Новичок форума
PHP:
double iSAR( string symbol, int timeframe, double step, double maximum, int shift) 
Расчет индикатора Parabolic Stop and Reverse system.
Т.е. это встроенный параболик так вызывается в коде. Или в чем вопрос?
Да спасибо,разобрапся,немного запутался в именах,..
 

Leonup

Новичок форума
Как получить значение уровней SetLevelValue?

Добрый день!
В индикаторе TDI Red Green обозначены 3 уровня:
SetLevelValue(0,50);
SetLevelValue(1,68);
SetLevelValue(2,32);
Как можно получить значения 50, 68 и 32 из этого индикатора?
Спасибо.
 

Вложения

  • TDI Red Green.mq4
    8,6 КБ · Просмотры: 31
Верх