Доработка ботов (советников, индикаторов) vol. 2

EinsteinE

Новичок форума
Чтобы внести изменения, такие как фиксирование стрелок на графике и отправка email-уведомлений, нужен исходный код
 

EinsteinE

Новичок форума
уважаемые программисты. прошу добавить вторую ма с шифтом. сдвинутую на n баров. тому будет счастье
Я добавил вторую скользящую среднюю (МА) с возможностью указать её период (maPeriod2) и сдвиг (maShift2) на n баров. Если нужно изменить или дополнить что-либо ещё, дайте знать!
Код:
//+------------------------------------------------------------------+
//|                                                    Ticks Volume  |
//|                                                    Version 1.1  |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

#include <MovingAverages.mqh>

//--- input parameters
input int maPeriod1 = 14;     // Период первой MA
input int maPeriod2 = 14;     // Период второй MA
input int maShift2  = 5;      // Сдвиг второй MA на n баров

//--- indicator buffers
double ExtVolumeBuffer[];
double ExtMABuffer1[];
double ExtMABuffer2[];

//--- handles for moving averages
int maHandle1;
int maHandle2;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                        |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- assign buffers
   SetIndexBuffer(0, ExtVolumeBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, ExtMABuffer1, INDICATOR_DATA);
   SetIndexBuffer(2, ExtMABuffer2, INDICATOR_DATA);
  
   //--- set names for legend
   IndicatorShortName("Ticks Volume with Two MAs");
  
   //--- create moving average handles
   maHandle1 = iMA(NULL, 0, maPeriod1, 0, MODE_SMA, PRICE_CLOSE);
   maHandle2 = iMA(NULL, 0, maPeriod2, maShift2, MODE_SMA, PRICE_CLOSE);
  
   if (maHandle1 == INVALID_HANDLE || maHandle2 == INVALID_HANDLE)
   {
      Print("Failed to create MA handles");
      return(INIT_FAILED);
   }
  
   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[])
  {
   int begin = prev_calculated;
   if (begin == 0) begin = maPeriod1 > maPeriod2 ? maPeriod1 : maPeriod2;
  
   for (int i = begin; i < rates_total; i++)
   {
      ExtVolumeBuffer[i] = tick_volume[i];
      ExtMABuffer1[i] = iMA(NULL, 0, maPeriod1, 0, MODE_SMA, PRICE_CLOSE, i);
      ExtMABuffer2[i] = iMA(NULL, 0, maPeriod2, maShift2, MODE_SMA, PRICE_CLOSE, i);
   }
  
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

EinsteinE

Новичок форума
Подскажите, задача сделать, чтоб этот индикатор отображался поверх остальных индикаторов на графике. Возможно ли добавить такое свойство OBJPROP_BACK ?
добавил функцию DrawOverlayObjects, которая создает объекты типа OBJ_TREND с параметром OBJPROP_BACK, установленным в false, чтобы они отображались поверх других индикаторов.
Код:
//+------------------------------------------------------------------+
//|                                                    LineBar2.mq5 |
//|                        Copyright 2024, MetaQuotes Software Corp.|
//|                                       https://www.metaquotes.net|
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

//--- plot 1 settings
#property indicator_label1  "Up Bar"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  Green
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

//--- plot 2 settings
#property indicator_label2  "Down Bar"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  Red
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

//--- indicator buffers
double         UpBuffer[];
double         DownBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- map buffers to plots
   SetIndexBuffer(0,UpBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,DownBuffer,INDICATOR_DATA);

   //--- name for the indicator
   IndicatorSetString(INDICATOR_SHORTNAME,"LineBar2 Green");

   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[])
  {
   //--- check if there is enough data
   if (rates_total < 2)
      return(0);

   //--- main loop
   for (int i = prev_calculated; i < rates_total; i++)
   {
      if (close[i] > open[i])
      {
         UpBuffer[i] = close[i];
         DownBuffer[i] = EMPTY_VALUE;
      }
      else
      {
         DownBuffer[i] = close[i];
         UpBuffer[i] = EMPTY_VALUE;
      }
   }

   //--- draw objects on the chart
   DrawOverlayObjects(rates_total);

   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Draw overlay objects                                             |
//+------------------------------------------------------------------+
void DrawOverlayObjects(const int rates_total)
  {
   for (int i = rates_total - 1; i >= rates_total - 10 && i >= 0; i--)
   {
      string objName = "OverlayLine_" + IntegerToString(i);
      if (ObjectFind(objName) == -1)
      {
         ObjectCreate(0, objName, OBJ_TREND, 0, Time[i], Low[i], Time[i + 1], High[i + 1]);
         ObjectSetInteger(0, objName, OBJPROP_COLOR, clrLime);
         ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1);
         ObjectSetInteger(0, objName, OBJPROP_BACK, false);  // Позиционирование поверх других индикаторов
      }
   }
  }
//+------------------------------------------------------------------+
 

oboroten13

Новичок форума
добавил функцию DrawOverlayObjects, которая создает объекты типа OBJ_TREND с параметром OBJPROP_BACK, установленным в false, чтобы они отображались поверх других индикаторов.
Код:
//+------------------------------------------------------------------+
//|                                                    LineBar2.mq5 |
//|                        Copyright 2024, MetaQuotes Software Corp.|
//|                                       https://www.metaquotes.net|
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2

//--- plot 1 settings
#property indicator_label1  "Up Bar"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  Green
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

//--- plot 2 settings
#property indicator_label2  "Down Bar"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  Red
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

//--- indicator buffers
double         UpBuffer[];
double         DownBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   //--- map buffers to plots
   SetIndexBuffer(0,UpBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,DownBuffer,INDICATOR_DATA);

   //--- name for the indicator
   IndicatorSetString(INDICATOR_SHORTNAME,"LineBar2 Green");

   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[])
  {
   //--- check if there is enough data
   if (rates_total < 2)
      return(0);

   //--- main loop
   for (int i = prev_calculated; i < rates_total; i++)
   {
      if (close[i] > open[i])
      {
         UpBuffer[i] = close[i];
         DownBuffer[i] = EMPTY_VALUE;
      }
      else
      {
         DownBuffer[i] = close[i];
         UpBuffer[i] = EMPTY_VALUE;
      }
   }

   //--- draw objects on the chart
   DrawOverlayObjects(rates_total);

   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Draw overlay objects                                             |
//+------------------------------------------------------------------+
void DrawOverlayObjects(const int rates_total)
  {
   for (int i = rates_total - 1; i >= rates_total - 10 && i >= 0; i--)
   {
      string objName = "OverlayLine_" + IntegerToString(i);
      if (ObjectFind(objName) == -1)
      {
         ObjectCreate(0, objName, OBJ_TREND, 0, Time[i], Low[i], Time[i + 1], High[i + 1]);
         ObjectSetInteger(0, objName, OBJPROP_COLOR, clrLime);
         ObjectSetInteger(0, objName, OBJPROP_WIDTH, 1);
         ObjectSetInteger(0, objName, OBJPROP_BACK, false);  // Позиционирование поверх других индикаторов
      }
   }
  }
//+------------------------------------------------------------------+

У меня ошибки показывает компилятор. Сильно ругается. Видимо не прокатывает такой способ.
 

Вложения

  • 2024-12-14_line.jpg
    2024-12-14_line.jpg
    68,6 КБ · Просмотры: 24

marattmb

Гуру форума
Доброго времени суток!
Уважаемые специалисты, просьба озвучить пробой сигнальной линией границ канала(касание).
 

Вложения

  • 2024-12-15_08-13-51.png
    2024-12-15_08-13-51.png
    46,5 КБ · Просмотры: 157
  • vhpchannel.mq4
    vhpchannel.mq4
    15,6 КБ · Просмотры: 43

ale9551

Активный участник
Уважаемые программисты!
Добавьте пожалуйста в советник фильтр работы по времени терминала.
Заранее благодарен!
 

Вложения

Surem

Почетный гражданин
Увадаемые специалисты, прошу обратить ещё раз внимание. Доработка ботов (советников, индикаторов) vol. 2
Немного по другому нужно, буду благодарен за стрелку с алертом. Глаз замыливается и не успевает уследить за визуалом. Нужно когда линия находится ниже ноля и число справа из красного изменится на зелёный (в настройках синий по умолчанию) это стрелка вверх, когда линия индюка выше ноля и число из красного меняется на зелёный это стрелка вниз. Так то вообще сначала число чередуется и так что число сначала зелёное потом красное и снова зелёное. Надо именно учитывать как написал в динамике такой.
 

ale9551

Активный участник
Уважаемые программисты!
Добавьте пожалуйста в советник закрывашку сделок фильтр максимального спреда,при превышении которого советник после наступления заданного времени не должен закрывать сделки,а закрывал бы их после возвращения спреда к заданным значениям. после достижения заданного времени.
Заранее благодарен!
 

Вложения

faustoun

Новичок форума
Добрый день, проблема в советнике, никак не могу решить
нужно чтобы после стоп лосса лот увеличивался в 2 раза, и после тэйкпрофита с увеличенным лотом, лот сбрасывался на стартовый
 

Вложения

  • GNEA.mq4
    GNEA.mq4
    17,1 КБ · Просмотры: 7

erex

Элитный участник
Приветствую. Двойная просьба.
В другой теме всплыли 2 индикатора Ивана Корнилова (сам он не появлялся на мкл5 с 2022 года). Приятные такие индюки, уровни показывают. Но вместе на графике лежать не хотят. Дневным индикатором вытесняется недельный. И еще - нет у них ставших стандартом современного индикаторостроения кнопок вкл/выкл.
Было бы очень замечательно, если бы кто-нибудь помахал волшебной палочкой в предновогодние дни.
1734339645895.png
Дополнительная инфа
 

Вложения

MakarFX

Элитный участник

Вложения

MakarFX

Элитный участник
Добрый день, проблема в советнике, никак не могу решить
нужно чтобы после стоп лосса лот увеличивался в 2 раза, и после тэйкпрофита с увеличенным лотом, лот сбрасывался на стартовый
 

Вложения

  • GNEA.mq4
    GNEA.mq4
    14,9 КБ · Просмотры: 17

S.McDuck

Местный знаток

MakarFX

Давай ещё доработаем советника.
Надо внести параметры.
extern double Point_TP = 0.0;
extern double Point_SL = 0.0;
Если прописать соответствующие значения цены то при его достижении закрываются все ордера.

MakarFX

Посмотри пожалуйста.
Спасибо.
 

MakarFX

Элитный участник
Уважаемые программисты!
Добавьте пожалуйста в советник фильтр работы по времени терминала.
Заранее благодарен!
1734345629001.png

Если sOpenHour < sCloseHour - торгует внутри дня
Если sOpenHour > sCloseHour - торгует через полночь
 

Вложения

faustoun

Новичок форума
круто работает спасибо
а можно по поводу индикатора уточнить
настройка reDraw перестраивает индикатор в зависимости от настройки TF
не могу понять как сделать чтобы индикатор перестраивался на определенное время, например на 23 30
 

Вложения

  • GN4.mq4
    GN4.mq4
    16,3 КБ · Просмотры: 23

MakarFX

Элитный участник

Вложения

MakarFX

Элитный участник
круто работает спасибо
а можно по поводу индикатора уточнить
настройка reDraw перестраивает индикатор в зависимости от настройки TF
не могу понять как сделать чтобы индикатор перестраивался на определенное время, например на 23 30
Индикатор работает по ТФ, какой ТФ в настройках так и уровни строит. autoRedraw - перестраивает на новом баре установленного в настройках ТФ
 
  • Like
Реакции: erex

faustoun

Новичок форума
Индикатор работает по ТФ, какой ТФ в настройках так и уровни строит. autoRedraw - перестраивает на новом баре установленного в настройках ТФ
перестраивает если перейти на график, который указан в настройке и вернуться на рабочий, вот в этом проблема
 

Посмотрели (670) Посмотреть

Смотрят сейчас (6) Посмотреть

Отслеживают (1809) Посмотреть

Верх