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

  • Автор темы Автор темы 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                                                                       |
//+-------------------------------------------------------------------------------------------+
 

Вложения

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

Код:
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);
 
Примеры с реализацией блока автомасштабирования:

gbpusd-h1-roboforex-ltd.png
 

Вложения

А как же ноу-хау?
Всем рассказывать профессиональные секреты, нажитые непосильным трудом и красными глазами? 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 плохо знаю. По мере собственной необходимости только.
 
Скрытый суффикс в кнопках переключения тикеров:

Код:
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
 

Вложения

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

eurusd-h1-roboforex-ltd.png
 

Вложения

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

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

gbpaud-h1-roboforex-ltd.png
 
Последнее редактирование:
Скрипты частичного закрытия ордеров.

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

Вложения

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
 

Вложения

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

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

Блок, если не ошибаюсь, был позаимствован у индикатора 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); }        //--- пропуск отрисовки первых баров        
//+------------------------------------------------------------------+
 

Вложения

Парочка удачных примеров обрезания истории (на минутном графике в терминале во вкладке "эксперты" снова появились предупреждения:
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.
 

Вложения

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

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

Вложения

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

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

Вложения

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