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

Saigon

Активный участник
Помогите полажуйста доработать вот такой индикатор Кластер - профиль. Этот индикатор считает тики по Аскам и Бидам и выдает:
1-е - Уровни (синего цвета) - на которых больше всего происходит сделок (это объемы);
2-е - Уровни быков (зеленые) и медведей (красные) - на которых больше всего совершили сделки (тики в верх или вниз) быки и медведи, то есть это уровни которые отвечают на вопрос: Кто больше сейчас влили денег в сильный уровень?

Доработать хотелось бы следующее:

1) Нужно сделать так, что бы индикатор стоял на месте от линии открытия периода (вертикальная пунктирная), а не перемещался в след за ценой;
2) Нужно сделать так, что бы индикатор сохранял ту картинку профиля которую он нарисовал к окончанию периода, а в новый период начинал рисовать новый профиль;
3) Нужно, что бы индикатор считал тики и после выключения терминала и компьютера (а то получается разрыв в данных). То есть нужно сделать так, что бы он каким-то образом был подключен к серверу подающему котировки.
4) Необходимо что бы индикатор можно было прогонять в тестере стратегий.
 

Вложения

  • Cluster Profile.jpg
    Cluster Profile.jpg
    179,2 КБ · Просмотры: 48
  • ClusterBox_Histogramm_v2.mq4
    50 КБ · Просмотры: 22

Gnn-life

Местный знаток
Если нужна вся история, сделай так: в строке
PHP:
 limit = bar - IndicatorCounted();
замени bar на Bars, если нужно ограничение по истории, замени на:
PHP:
 limit = MathMin(Bars - IndicatorCounted(),bar);

Саш, ты со мной разговаривал в живую по скайпу, я не верю что такое бывает, а вы? мкл*
 

OlgaSv

Новичок форума
Доброго времени!
Подскажите, пожалуйста, по кешу.
Оптимизация советника с генетическим алгоритмом. Заданы параметры оптимизации.
1-й прогон - одни результаты, 2-й прогон - вторые результаты, 10-й прогон - десятый результат. Параметры не изменяются, но после каждого прогона, получается разный результат.
Советник дергает данные из кеша.
Нормальное ли это поведение? Можно ли как-нибудь в советник вшить обнуление/не использование результатов предыдущего прогона (кеша).
Просто до этого ни разу не видела такое поведение советника/результатов оптимизации.
Куда копать? (копать отсюда не предлагать) :)
 

buguruslan

Новичок форума
Здравствуйте. Пытаюсь освоить виртуальный хостинг, все по инструкции, а советник не открывается. Помогите, плз
 

moafiz

Интересующийся
Оптимизация?

Непонял просто оптимизируеш или визуально просматриваеш торговлю?Что именно неменяется ?Что нужно изменить?
 

buguruslan

Новичок форума
Строго по инструкции миграция на виртуальный хостинг, советник там не работает, пишет : cannot open file
 

Andy200577

Новичок форума
Уважаемые господа. Помогите пожалуйста с таким прозаическим вопросом.
Как грамотно реализовать неперерисовывающийся стрелочный индикатор?
Если индикатор перерисовывается, то всё понятно, ставим в начале цикла перебора баров массивы буферов вида BufferUp = EMPTY_VALUE и BufferDown = EMPTY_VALUE и далее в зависимости от совпадения сигналов, формирующих стрелки, эти данные принимают непустые значения и отвечают за наличие стрелок на графике, если сигнал формирующий пропадает, то пропадают и стрелки.
Но требуется сделать так, чтобы при поступлении формирующего стрелку сигнала, стрелка всегда оставалась на графике независимо от того, пропал ли формирующий сигнал или нет, а при закрытии свечи стрелка также должна передвигаться на предыдущую свечу.
Для этого достаточно не указывать в начале массива пустые значения буферов и все стрелки сдвигаются по умолчанию автоматом при закрытии свечей или при закрытии свечи нужно самостоятельно указывать сдвиг предыдущих значений буферов?
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Уважаемые господа. Помогите пожалуйста с таким прозаическим вопросом.
Как грамотно реализовать неперерисовывающийся стрелочный индикатор?
Если индикатор перерисовывается, то всё понятно, ставим в начале цикла перебора баров массивы буферов вида BufferUp = EMPTY_VALUE и BufferDown = EMPTY_VALUE и далее в зависимости от совпадения сигналов, формирующих стрелки, эти данные принимают непустые значения и отвечают за наличие стрелок на графике, если сигнал формирующий пропадает, то пропадают и стрелки.
Но требуется сделать так, чтобы при поступлении формирующего стрелку сигнала, стрелка всегда оставалась на графике независимо от того, пропал ли формирующий сигнал или нет, а при закрытии свечи стрелка также должна передвигаться на предыдущую свечу.
Для этого достаточно не указывать в начале массива пустые значения буферов и все стрелки сдвигаются по умолчанию автоматом при закрытии свечей или при закрытии свечи нужно самостоятельно указывать сдвиг предыдущих значений буферов?

Первое, это оставить значение буфера без изменений, оно и так пустое, не надо его ещё дополнительно очищать. И в условие сигнала для стрелки добавить условие && BufferUp == EMPTY_VALUE тогда при пропадании сигнала этот буфер останется заполненным. А вот второе не совсем понятно, так ведь можно двигать бесконечно... Условия для перемещения стрелки не корректны, на мой взгляд. Или не полны.
Если что-то не так будет, то можно вставить ещё два расчётных буфера и условие if(BufferUpCalc != EMPTY_VALUE && BufferUp == EMPTY_VALUE) BufferUp = Hight; А BufferUpCalc заполнять по условию сигнала.
 

aleks-fx

Интересующийся
Посоветуйте где можно с 0 научиться строить советников по нескольким индикаторам.
 

Andy200577

Новичок форума
Первое, это оставить значение буфера без изменений, оно и так пустое, не надо его ещё дополнительно очищать. И в условие сигнала для стрелки добавить условие && BufferUp == EMPTY_VALUE тогда при пропадании сигнала этот буфер останется заполненным. А вот второе не совсем понятно, так ведь можно двигать бесконечно... Условия для перемещения стрелки не корректны, на мой взгляд. Или не полны.
Если что-то не так будет, то можно вставить ещё два расчётных буфера и условие if(BufferUpCalc != EMPTY_VALUE && BufferUp == EMPTY_VALUE) BufferUp = Hight; А BufferUpCalc заполнять по условию сигнала.

Ну вот простой формальный пример. Стрелка формируется при пересечении 2-х машек, пересечение произошло, стрелка появилась, но цена пошла обратно и пересечения уже нет, стрелка остаётся на месте, при закрытии свечи точно также её положение сохраняется, но на предыдущей свече. Как реализовать такой пример?
 

AlexeyVik

Программист mql4 mql5
Ну вот простой формальный пример. Стрелка формируется при пересечении 2-х машек, пересечение произошло, стрелка появилась, но цена пошла обратно и пересечения уже нет, стрелка остаётся на месте, при закрытии свечи точно также её положение сохраняется, но на предыдущей свече. Как реализовать такой пример?
Так как я и говорил тебе.
Код:
//+------------------------------------------------------------------+

#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2       // Количество буферов
#property indicator_color1 Blue     // Цвет первой линии
#property indicator_color2 Red      // Цвет второй линии
#property indicator_width1 2
#property indicator_width2 2
double Buf_0[],Buf_1[];             // Объявление массивов (под буферы индикатора)
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, Buf_0);                     // Назначение массива буферу
   SetIndexStyle (0, DRAW_ARROW);   // Стиль линии
   SetIndexArrow(0, 217);
   SetIndexBuffer(1, Buf_1);                     // Назначение массива буферу
   SetIndexStyle (1, DRAW_ARROW);     // Стиль линии
   SetIndexArrow(1, 218);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,   // Количество просчитанных баров 
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  double MaFast, MaSlow, MaFast1, MaSlow1;
   int i, limit = rates_total-prev_calculated;
   while(rates_total-limit < 15)
    {
     limit--;
    }
    for(i = limit; i >= 0; i--)
     {
      MaFast = iMA(_Symbol, PERIOD_CURRENT, 5, 0, MODE_EMA, PRICE_CLOSE, i);
      MaSlow = iMA(_Symbol, PERIOD_CURRENT, 13, 0, MODE_EMA, PRICE_CLOSE, i);
      MaFast1 = iMA(_Symbol, PERIOD_CURRENT, 5, 0, MODE_EMA, PRICE_CLOSE, i+1);
      MaSlow1 = iMA(_Symbol, PERIOD_CURRENT, 13, 0, MODE_EMA, PRICE_CLOSE, i+1);
       if(MaSlow1 > MaFast1 && MaFast > MaSlow && Buf_0[i] == EMPTY_VALUE)
        {
         Buf_0[i] = High[i];
        }
       if(MaFast1 > MaSlow1 && MaSlow > MaFast && Buf_1[i] == EMPTY_VALUE)
        {
         Buf_1[i] = Low[i];
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Надеюсь ты понимаешь что на истории не удавшиеся попытки пересечения не доступны.
 

Вложения

  • 00.png
    00.png
    32,1 КБ · Просмотры: 35
Последнее редактирование:

Andy200577

Новичок форума
Так как я и говорил тебе.
Код:
//+------------------------------------------------------------------+

#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2       // Количество буферов
#property indicator_color1 Blue     // Цвет первой линии
#property indicator_color2 Red      // Цвет второй линии
#property indicator_width1 2
#property indicator_width2 2
double Buf_0[],Buf_1[];             // Объявление массивов (под буферы индикатора)
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, Buf_0);                     // Назначение массива буферу
   SetIndexStyle (0, DRAW_ARROW);   // Стиль линии
   SetIndexArrow(0, 217);
   SetIndexBuffer(1, Buf_1);                     // Назначение массива буферу
   SetIndexStyle (1, DRAW_ARROW);     // Стиль линии
   SetIndexArrow(1, 218);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,   // Количество просчитанных баров 
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  double MaFast, MaSlow, MaFast1, MaSlow1;
   int i, limit = rates_total-prev_calculated;
   while(rates_total-limit < 15)
    {
     limit--;
    }
    for(i = limit; i >= 0; i--)
     {
      MaFast = iMA(_Symbol, PERIOD_CURRENT, 5, 0, MODE_EMA, PRICE_CLOSE, i);
      MaSlow = iMA(_Symbol, PERIOD_CURRENT, 13, 0, MODE_EMA, PRICE_CLOSE, i);
      MaFast1 = iMA(_Symbol, PERIOD_CURRENT, 5, 0, MODE_EMA, PRICE_CLOSE, i+1);
      MaSlow1 = iMA(_Symbol, PERIOD_CURRENT, 13, 0, MODE_EMA, PRICE_CLOSE, i+1);
       if(MaSlow1 > MaFast1 && MaFast > MaSlow && Buf_0[i] == EMPTY_VALUE)
        {
         Buf_0[i] = High[i];
        }
       if(MaFast1 > MaSlow1 && MaSlow > MaFast && Buf_1[i] == EMPTY_VALUE)
        {
         Buf_1[i] = Low[i];
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Надеюсь ты понимаешь что на истории не удавшиеся попытки пересечения не доступны.

Да, конечно понимаю, что на истории видно не будет, но это будет видно в режиме реального времени, когда индикатор сохраняет положения стрелок. Благодарю!
Только хочу сказать, что вариант с дополнением к стрелкам ...&& Buf_0 == EMPTY_VALUE ) имеет существенный недостаток в их расположении на текущей свече.
Т.е. в данном случае в этот буфер может быть записано число лишь один единственный раз (т.е. координата расположения стрелки над или под свечой), а текущая свеча может изменять своё положение и в итоге стрелка может налезать на саму свечу, что выглядит совсем некрасиво. По моему хорошо будет работать и без этого дополнения.
 

CastEt

Активный участник
Люди помогите, вверху делаю глобальный массив double TickLog[1001];
На тиках делаю:
double price= (Bid + Ask)/2;
ArrayCopy(TickLog,TickLog,1,0,1000);
TickLog[0]=price;
ну и потом самое интересное, ради чего весь сыр-бор, несколько машек типа;
P=iMAOnArray(TickLog,0,periP,0,methP,0);

И вот тут вопрос, Что Я Делаю Не Так???
 

AlexeyVik

Программист mql4 mql5
Люди помогите, вверху делаю глобальный массив double TickLog[1001];
На тиках делаю:
double price= (Bid + Ask)/2;
ArrayCopy(TickLog,TickLog,1,0,1000);
TickLog[0]=price;
ну и потом самое интересное, ради чего весь сыр-бор, несколько машек типа;
P=iMAOnArray(TickLog,0,periP,0,methP,0);

И вот тут вопрос, Что Я Делаю Не Так???
Так а что ты хочешь увидеть в результате? И где смотришь?
 

_SERG_

Активный участник
Люди помогите, вверху делаю глобальный массив double TickLog[1001];
На тиках делаю:
double price= (Bid + Ask)/2;
ArrayCopy(TickLog,TickLog,1,0,1000);
TickLog[0]=price;
ну и потом самое интересное, ради чего весь сыр-бор, несколько машек типа;
P=iMAOnArray(TickLog,0,periP,0,methP,0);

И вот тут вопрос, Что Я Делаю Не Так???
Ты после того, как что то сделал, напечатай в журнал, то что у тебя получилось, и сравни с тем что ожидал.
for (int i = 0 ; i < 10; i++){
Print( "[" + DoubleToStr (TickLog,Digits) + "]" );
}
А там и самому понятно станет.

Сыр-бор, так же проверить, ну и машки тож.
Это же, можно и в дебагере сделать, только перед запуском
точку остановки не забыть поставить, иначе плохо видно будет.

Вопрос, "Что я делаю не так ?", подразумевает ответ: Не проверяете,
что получилось, а думаете, что всё так, как и было задумано.
 
Последнее редактирование:

petro_gr81

Новичок форума
Здравствуйте! Подскажите что-нибудь о динамическом тейк профите, по какому принципу строится, на чем основан, может есть у кого в советнике, поделитесь блоком.
 

_SERG_

Активный участник
Здравствуйте! Подскажите что-нибудь о динамическом тейк профите, по какому принципу строится, на чем основан, может есть у кого в советнике, поделитесь блоком.

Это вопрос про трал профита, или динамический лот?
 
Верх