Уголок кодера

Bullra

Новичок
Ковыряя индикаторы, встречаешь полезные и бесполезные функции. Без профессиональной памяти они быстро теряются. Поэтому решил открыть архив готовых блоков, возможно кому-то они тоже будут полезны.
 

Bullra

Новичок
Блок позволяющий автомасштабировать показатели индикатора при увеличении или уменьшении графика:

Код:
bool          Deinitialized;
int           Chart_Scale,Bar_Width;

int init() {

Deinitialized = false;

  //Determine the current chart scale (chart scale number should be 0-5)
  Chart_Scale = ChartScaleGet();

  //Set bar widths                  
        if(Chart_Scale == 0) {Bar_Width = 1;}
  else {if(Chart_Scale == 1) {Bar_Width = 2;}    
  else {if(Chart_Scale == 2) {Bar_Width = 2;}
  else {if(Chart_Scale == 3) {Bar_Width = 3;}
  else {if(Chart_Scale == 4) {Bar_Width = 6;}
  else {Bar_Width = 13;} }}}}

SetIndexStyle(0, DRAW_HISTOGRAM,0,Bar_Width);

   return(0);
}

//+-------------------------------------------------------------------------------------------+
//| Subroutine:  Set up to get the chart scale number                                         |
//+-------------------------------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)                                                   
  {
  Chart_Scale = ChartScaleGet();
  init(); 
  }

//+-------------------------------------------------------------------------------------------+
//| Subroutine:  Get the chart scale number                                                   |
//+-------------------------------------------------------------------------------------------+
int ChartScaleGet()
  {
  long result = -1;
  ChartGetInteger(0,CHART_SCALE,0,result);
  return((int)result);
  }
   
//+-------------------------------------------------------------------------------------------+
//|Custom indicator end                                                                       |
//+-------------------------------------------------------------------------------------------+
 

Вложения

  • Sonic_2 PVA Candles (Black).mq4
    11,4 КБ · Просмотры: 33
Последнее редактирование:

Bullra

Новичок
Триал или блок ограничивающий работу индикатора определенным сроком:

Код:
int start() {

   string Ls_52 = "0000.00.00";
   int str2time_60 = StrToTime(Ls_52);
   if (TimeCurrent() >= str2time_60) {
      Alert("Sorry System Expired");
      return (0);
   }
return (0);
 

Bullra

Новичок
Примеры с реализацией блока автомасштабирования:

gbpusd-h1-roboforex-ltd.png
 

Вложения

  • HOOL.mq4
    7,3 КБ · Просмотры: 34
  • momentum_candles_nmc.mq4
    3,6 КБ · Просмотры: 37

Bullra

Новичок
Еще один пример автомасштабирования:

eurusd-h1-roboforex-ltd.png
 

Вложения

  • Fractal_Candles_SR_v4.mq4
    5,1 КБ · Просмотры: 30
  • Fractal_Candles_SR_v3.mq4
    3,5 КБ · Просмотры: 25

st2050

Гуру форума
А как же ноу-хау?
Всем рассказывать профессиональные секреты, нажитые непосильным трудом и красными глазами? o_O

Автомасштабирование так не будет работать в оффлайне, и даже в онлайне нужно ждать пока придёт новый тик цены.
Три дня спрашивал на mql5.com и тут, в итоге пришлось самому изобретать:

Код:
void SendTick() {
   int message = RegisterWindowMessageW("MetaTrader4_Internal_Message");
   int hwd = WindowHandle(Symbol(), Period());
   PostMessageW(hwd, message, 2, 1);
}

Примеры *:

Допиленное - обычные хейкены - Heiken Ashi auto width st2050
Допиленное - хейкены с отдельным цветом для дожи-свечей, отображаются в режиме Бары - HeikenAshi_DojiSpotter st2050 v1.3
Собственное - просто свечи, отображаются в режиме Свечи - Candles st2050 v2

А родные свечи мне не нравятся т.к. их нельзя поместить между разными индикаторами - только сверху или только снизу, и нельзя скрывать текущую свечу чтобы на нервы не давила. Перфекционизм.

* Как сумел, я MQL плохо знаю. По мере собственной необходимости только.
 

Bullra

Новичок
Скрытый суффикс в кнопках переключения тикеров:

Код:
extern string  Suffix=":)";
int OnInit()
{
  if(StringFind(AccountInfoString(ACCOUNT_COMPANY),"TW",0) >= 0 && StringFind(Symbol(),"i",0) >= 0) { Suffix = "i" ; }  else 
   if(StringFind(AccountInfoString(ACCOUNT_COMPANY),"Gain",0) >= 0) { Suffix = "pro" ; }
return(0);
  }
cadchf-rann-h1-servicecomsvg-limited.png
 

Вложения

  • Buttons.mq4
    5 КБ · Просмотры: 25
  • Buttons.rann.mq4
    5,2 КБ · Просмотры: 24

Bullra

Новичок
Дополнительный пример использования свойства OBJPROP_SELECTABLE, позволяющий избавиться от мискликов и работать только с интерактивными объектами.

eurusd-h1-roboforex-ltd.png
 

Вложения

  • Murrey_Math_Line_v3.mq4
    29,2 КБ · Просмотры: 21
  • Murrey_Math_Line_v2.mq4
    28,4 КБ · Просмотры: 18
Последнее редактирование:

Bullra

Новичок
Довольно варварский, но безотказный способ повесить любой индикатор(осцилятор) из отдельного окна на график:

Документируем // строчку кода #property indicator_separate_window и прописываем #property indicator_chart_window. Компилируем, снимаем слеш перед строчкой #property indicator_chart_window и документируем #property indicator_separate_window, компилируем. Открываем общие настройки индикатора и закрепляем Минимум/Максимум.

gbpaud-h1-roboforex-ltd.png
 
Последнее редактирование:

Bullra

Новичок
Скрипты частичного закрытия ордеров.

Код:
extern double Percent = 50;//процент закрытия ордера
 double LotClose;
 LotClose = OrderLots()*Percent/100;
 if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),LotClose,MarketInfo(OrderSymbol(),MODE_BID),slippage);
 

Вложения

  • PERCENT_CLOSE_BUY.mq4
    1,9 КБ · Просмотры: 33
  • PERCENT_CLOSE_SELL.mq4
    1,9 КБ · Просмотры: 33

Bullra

Новичок
MarginCallStopOutIndicator - доработка индикатора MarginStopOutIndicator c добавлением новой линии Маржин Колл. Хотя МК само по себе понятие устаревшее, я решил добавить уровень повышенного внимания, когда депозит находится в нескольких шагах от стоп аута. Линия Маржин Колл считается в процентах от уровня стоп аута. Если допустим у вашего брокера стоп аут 50% то 50% будет ровно половина от уровня.

Код:
//--------------------------------------------------------------------------------------------//
//рисование уровня % до "Margin Call"
//---------------------------------------------------------------------------------------------//       


int shift_p;       
shift_p = Ld_24 - Ld_24*Procent/100;
                  ObjectDelete("ZeroLevel3");
         ObjectCreate("ZeroLevel3", OBJ_HLINE, 0, 0, Bid - shift_p*Point);
         ObjectSet("ZeroLevel3", OBJPROP_COLOR, Colour_ZM);
         ObjectSet("ZeroLevel3", OBJPROP_STYLE, Style_ZM);
         ObjectSet("ZeroLevel3", OBJPROP_WIDTH, Width_ZM);

Блок был позаимствован у индикатора i-UrovenZero-1.4

gbpusd-mn1-roboforex-ltd.png
 

Вложения

  • MarginCallStopOutIndicator.mq4
    13,8 КБ · Просмотры: 20
  • MarginCallStopOutIndicator.ex4
    15,2 КБ · Просмотры: 16
  • MarginStopOutIndicator.mq4
    12,1 КБ · Просмотры: 17
  • MarginStopOutIndicator.ex4
    13,4 КБ · Просмотры: 15
  • i-UrovenZero-v.1.4.mq4
    10,5 КБ · Просмотры: 19
  • i-UrovenZero-v.1.4.ex4
    8 КБ · Просмотры: 15

Bullra

Новичок
Кошерное обрезание от камрада Танка. 🧙‍♂️

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

Блок, если не ошибаюсь, был позаимствован у индикатора BWMFI Bars MFI +TT (Но это не точно) и успешно внедрен в привыкший к издевательствам индикатор HOOL, а также более менее удачно в Ultimate oscillator (На минутном графике надо курить ошибку).

Код:
//----
extern int                History  =  100; //максимальное количество баров для расчета индикатора (-1 - все бары)
//----
int MAX;
//------------------------------
   
 int  i;
   int CountedBars=IndicatorCounted();
   if(CountedBars<0) return(-1);
   if(CountedBars>0) CountedBars--;
   
   int limit=fmin(Bars-CountedBars,Bars-2);  //+MAX*10*TFK
   if (History>MAX) limit=fmin(History,Bars-2);   //limit+=MAX;   Comment(limit);
   //------
   for (i=0; i<=12; i++) { 
        SetIndexEmptyValue(i,0.0);                         //--- значение 0 отображаться не будет 
        if (History>MAX)  SetIndexDrawBegin(i,Bars-History); //--- пропуск отрисовки первых баров
        if (History<=MAX) SetIndexDrawBegin(i,MAX*1); }        //--- пропуск отрисовки первых баров        
//+------------------------------------------------------------------+
 

Вложения

  • HOOL.mq4
    7,3 КБ · Просмотры: 26
  • HOOL cut.mq4
    8,6 КБ · Просмотры: 29
  • Ultimate_Oscillator.mq4
    3,1 КБ · Просмотры: 28
  • Ultimate_Oscillator Cut.mq4
    7,7 КБ · Просмотры: 27

Bullra

Новичок
Парочка удачных примеров обрезания истории (на минутном графике в терминале во вкладке "эксперты" снова появились предупреждения:
2020.01.28 18:56:07.408 negative_volume_index cut EURUSD,M1: zero divide in 'negative_volume_index cut.mq4' (94,77)
2020.01.28 18:56:07.408 positive_volume_index cut EURUSD,M1: zero divide in 'positive_volume_index cut.mq4' (97,77)
Однако, когда история подгрузилась все заработало).

gbpusd-m1-dukascopy-bank-sa.png


ЗЫ Для избежания критических ошибок и предупреждений при компиляции, переменные limit, i внедряемого блока были переименованы на nlimit, g.
 

Вложения

  • negative_volume_index cut.mq4
    3,6 КБ · Просмотры: 21
  • negative_volume_index.mq4
    2,7 КБ · Просмотры: 22
  • positive_volume_index cut.mq4
    3,7 КБ · Просмотры: 22
  • positive_volume_index.mq4
    2,8 КБ · Просмотры: 18

rms

Местный житель
Вопрос, если можно. Есть ли способ реинициализировать индикатор по таймеру, напр. позвать init(), или использовать WindowRedraw() ,чтобы, так сказать, 'поставить на своё место' рисующие индикаторы .
 

Bullra

Новичок
Вопрос, если можно. Есть ли способ реинициализировать индикатор по таймеру, напр. позвать init(), или использовать WindowRedraw() ,чтобы, так сказать, 'поставить на своё место' рисующие индикаторы .
С этим вопросом лучше в ветку: https://forexsystemsru.com/threads/vashi-voprosy-po-jazyku-mql4.65289/, так как здесь выкладываю все с чем приходится сталкиваться, чтобы не запамятовать.
 

Bullra

Новичок
MTF_Smart - индюкатор из CodeBase mql5 показывающий перекупленную-перепроданность MFI, RSI, Stoch. Когда троица заходит за уровни, то индикатор подкрашивает область основного графика. Вывел в настройки переменные для изменения периодов и уровней ПК-ПП.

eurusd-h1-dukascopy-bank-sa-2.png
 

Вложения

  • MTF_Smart-1.0.mq4
    3,1 КБ · Просмотры: 45

Bullra

Новичок
MFI - Собственно индюк оказался случайной поделкой, решил вместо деления применить умножение. Понравилась мысль автора о прибавлении к повышающимся и приседающим столбикам, столбиков с борьбой быков и медведей (золотой столбик), а также столбиков, которые указывают на то, что цену двигают маркет мейкеры (серый столбик). В общем получился необычный ATR c периодом 1.

euraud-h1-dukascopy-bank-sa-2.png
 

Вложения

  • MFI.mq4
    10,8 КБ · Просмотры: 41
Последнее редактирование:
Верх