Author: Copyright ?2008, MQL Service
5piprenko

This script is designed to transform standard M1 (1-minute) price chart data into a specialized format known as Renko bars. Unlike standard charts where each bar represents a fixed amount of time, Renko bars represent a fixed amount of price movement. This allows traders to filter out "market noise" and see clearer trends based purely on price action.

Core Functional Logic

1. Environment Setup and Requirements The script begins by checking the trading environment to ensure it can operate correctly. It specifically requires:

  • DLL Permissions: The script uses external Windows system files (DLLs) to communicate with the platform's window system.
  • Timeframe Restriction: It is designed to run specifically on a 1-minute (M1) chart. If placed on any other timeframe, it will prompt the user to switch.
  • Broker Compatibility: It automatically detects if your broker uses "5-digit" pricing (common in modern forex markets) and scales its internal calculations accordingly to maintain accuracy.

2. Historical Data Processing Once activated, the script looks backward through the historical 1-minute price data. It processes this history to identify every instance where the price moved by a specific amount (the BarsRange).

  • It calculates the "path" of the price.
  • It identifies exactly when a movement was large enough to constitute a new Renko bar.
  • It records these movements chronologically, capturing the open, high, low, and close prices for each generated Renko block.

3. Real-Time Monitoring and File Export The script does not just analyze the past; it stays active in real-time. It continuously monitors the live price feed.

  • Dynamic Bar Creation: As the live price moves, the script calculates whether the movement has reached the threshold to complete a new Renko bar.
  • Data Logging: Every time a new Renko bar is formed, the script writes this information into an external file (a .hst file). This creates a custom history file on your computer.
  • Continuous Updates: The script remains in a loop, constantly checking the latest price ticks and updating the log file until the script is manually stopped or the platform is closed.

4. System Communication The script includes a mechanism to communicate with the MetaTrader 4 interface. It sends internal messages to the chart window, which helps the platform recognize the data being processed and ensures that the interaction between the script and the trading software remains stable during high-frequency price updates.

Summary of User Experience

For a user, this script acts as a data converter. You run it on your 1-minute chart, and it works in the background to "sieve" through all the 1-minute fluctuations. It then produces a structured history of Renko bars by saving them into a file, effectively providing you with a cleaner, movement-based view of the market trends.

Price Data Components
Series array that contains tick volumes of each bar Series array that contains open prices of each barSeries array that contains close prices for each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
Miscellaneous
It issuies visual alerts to the screenIt writes information to fileIt writes information to fileIt writes information to fileIt opens Message Boxes to the userIt writes information to file
14 Views
0 Downloads
0 Favorites
5piprenko
/*
   Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
   Website: http://purebeam.biz
   E-mail : purebeam@gmail.com
*/
#property copyright "Copyright ?2008, MQL Service"
#property link      "http://www.mqlservice.net"
#property show_inputs

#include <WinUser32.mqh>

#import "user32.dll"
   int RegisterWindowMessageA(string a0);
#import

extern int BarsRange = 5;
extern int TimeFrame = 2;
extern int MaxBars = 46000;
int g_file_88 = -1;

double LocalPoint;
int LotDigit;


double volume(int ai_0) {
   return (iVolume(Symbol(), PERIOD_M1, ai_0));
}

double open(int ai_0) {
   return (iOpen(Symbol(), PERIOD_M1, ai_0));
}

double close(int ai_0) {
   return (iClose(Symbol(), PERIOD_M1, ai_0));
}

double high(int ai_0) {
   return (iHigh(Symbol(), PERIOD_M1, ai_0));
}

double low(int ai_0) {
   return (iLow(Symbol(), PERIOD_M1, ai_0));
}

int time(int ai_0) {
   return (ai_0);
}


int init() {

   
  LocalPoint = Point*MathPow(10,Digits%2);
  LotDigit=MarketInfo( Symbol(), MODE_DIGITS );
  
  return (0);
}

int start() {
   int li_16;
   int li_28;
   double ld_80;
   int lia_124[13];
   double ld_144;
   if (_invalid(BarsRange, 0, "BarsRange")) return (0);
   if (_invalid(TimeFrame, 1, "TimeFrame")) return (0);
   if (!IsDllsAllowed()) {
      Alert(WindowExpertName(), ": Please Allow DLL imports to run this script");
      Comment(WindowExpertName(), " aborted due to disabled DLL calls");
      return (-1);
   }
   int li_0 = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   string ls_4 = Symbol();
   int li_96 = 0;
   int l_count_100 = 0;
   int li_104 = 400;
   int li_116 = TimeFrame;
   int l_digits_120 = Digits;
   for (int li_12 = StringFind(ls_4, ".", 0); li_12 > 0; li_12 = StringFind(ls_4, ".", 0)) ls_4 = StringSubstr(ls_4, 0, li_12) + StringSubstr(ls_4, li_12 + 1);
   g_file_88 = FileOpenHistory(ls_4 + li_116 + ".hst", FILE_BIN|FILE_WRITE);
   if (g_file_88 < 0) {
      Alert(WindowExpertName(), ": Cannot create ", ls_4 + TimeFrame + ".hst");
      Comment(WindowExpertName(), " aborted: Cannot create ", ls_4 + TimeFrame + ".hst");
      return (-1);
   }
   Print("$Id: //mqlservice/mt4files/experts/scripts/s-Renko bars.mq4#7 $");
   string ls_108 = "(C)opyright 2008, MQL Service";
   FileWriteInteger(g_file_88, li_104, LONG_VALUE);
   FileWriteString(g_file_88, ls_108, 64);
   FileWriteString(g_file_88, ls_4, 12);
   FileWriteInteger(g_file_88, li_116, LONG_VALUE);
   FileWriteInteger(g_file_88, l_digits_120, LONG_VALUE);
   FileWriteInteger(g_file_88, 0, LONG_VALUE);
   FileWriteInteger(g_file_88, 0, LONG_VALUE);
   FileWriteArray(g_file_88, lia_124, 0, 13);
   FileFlush(g_file_88);
   int li_36 = 60 * li_116;
   int li_20 = MathMin(MaxBars, iBars(Symbol(), PERIOD_M1) - 1);
   if (li_20 <= 0)
      if (MessageBox("No 1M bars available, there will be no history bars!\n\nContinue?", WindowExpertName(), MB_YESNO|MB_ICONQUESTION) == IDNO) return (0);
   if (Period() != PERIOD_M1)
      if (MessageBox("It should be run on 1M chart!\n\nContinue?", WindowExpertName(), MB_YESNO|MB_ICONQUESTION) == IDNO) return (0);
   int li_128 = 1;
   if (Digits == 3 || Digits > 4) {
      if (MessageBox("5 digits broker detected!\n\nRescale BarsRange?", WindowExpertName(), MB_YESNO|MB_ICONQUESTION) == IDYES) {
         BarsRange = 10 * BarsRange;
         li_128 = 10;
      }
   }
   int li_24 = time(iTime(Symbol(), PERIOD_M1, li_20));
   Print("Starting from ", TimeToStr(li_24, TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   int li_32 = FileTell(g_file_88);
   double ld_48 = close(li_20);
   double ld_56 = ld_48;
   double ld_72 = 1.0;
   double ld_64 = ld_48;
   double ld_40 = ld_48;
   double ld_88 = ld_48;
   int li_132 = 1;
   int li_136 = 1;
   int li_140 = 1;
   for (li_12 = li_20 - 1; li_12 >= 0; li_12--) {
      li_28 = time(iTime(Symbol(), PERIOD_M1, li_12));
      if (Volume[li_12] > 0.0) li_140 = MathMax(li_128, MathCeil((high(li_12) - low(li_12)) / Point / Volume[li_12]));
      else li_140 = li_128;
      li_140 = MathRound(li_140 / li_128) * li_128;
      if (open(li_12) > close(li_12)) {
         li_16 = high(li_12) / Point;
         while (li_16 >= low(li_12) / Point) {
            ld_144 = NormalizeDouble(li_16 * Point, Digits);
            ld_48 = MathMin(ld_48, ld_144);
            ld_56 = MathMax(ld_56, ld_144);
            ld_72 += MathRound(MathAbs(ld_64 - ld_144) / Point);
            ld_64 = ld_144;
            while (MathRound((ld_56 - ld_88) / Point) >= li_132 * BarsRange || MathRound((ld_88 - ld_48) / Point) >= li_136 * BarsRange) {
               li_32 = FileTell(g_file_88);
               if (MathRound((ld_88 - ld_48) / Point) >= li_136 * BarsRange) {
                  if (li_136 == 2) ld_88 -= BarsRange * Point;
                  ld_64 = ld_88 - BarsRange * Point;
                  ld_48 = ld_64;
                  ld_40 = ld_88;
                  ld_56 = ld_88;
                  li_136 = 1;
                  li_132 = 2;
               }
               if (MathRound((ld_56 - ld_88) / Point) >= li_132 * BarsRange) {
                  if (li_132 == 2) ld_88 += BarsRange * Point;
                  ld_64 = ld_88 + BarsRange * Point;
                  ld_56 = ld_64;
                  ld_40 = ld_88;
                  ld_48 = ld_88;
                  li_132 = 1;
                  li_136 = 2;
               }
               FileWriteInteger(g_file_88, li_24, LONG_VALUE);
               FileWriteDouble(g_file_88, ld_40, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_48, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_56, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_64, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_72, DOUBLE_VALUE);
               li_24++;
               FileFlush(g_file_88);
               l_count_100++;
               ld_88 = ld_64;
               li_24 = MathMax(li_28, li_24);
               ld_40 = ld_64;
               ld_48 = MathMin(ld_144, ld_64);
               ld_56 = MathMax(ld_144, ld_64);
               ld_64 = ld_144;
               ld_72 = 1.0;
            }
            li_16 -= li_140;
         }
      } else {
         li_16 = low(li_12) / Point;
         while (li_16 <= high(li_12) / Point) {
            ld_144 = NormalizeDouble(li_16 * Point, Digits);
            ld_48 = MathMin(ld_48, ld_144);
            ld_56 = MathMax(ld_56, ld_144);
            ld_72 += MathRound(MathAbs(ld_64 - ld_144) / Point);
            ld_64 = ld_144;
            while (MathRound((ld_56 - ld_88) / Point) >= li_132 * BarsRange || MathRound((ld_88 - ld_48) / Point) >= li_136 * BarsRange) {
               li_32 = FileTell(g_file_88);
               if (MathRound((ld_88 - ld_48) / Point) >= li_136 * BarsRange) {
                  if (li_136 == 2) ld_88 -= BarsRange * Point;
                  ld_64 = ld_88 - BarsRange * Point;
                  ld_48 = ld_64;
                  ld_40 = ld_88;
                  ld_56 = ld_88;
                  li_136 = 1;
                  li_132 = 2;
               }
               if (MathRound((ld_56 - ld_88) / Point) >= li_132 * BarsRange) {
                  if (li_132 == 2) ld_88 += BarsRange * Point;
                  ld_64 = ld_88 + BarsRange * Point;
                  ld_56 = ld_64;
                  ld_40 = ld_88;
                  ld_48 = ld_88;
                  li_132 = 1;
                  li_136 = 2;
               }
               FileWriteInteger(g_file_88, li_24, LONG_VALUE);
               FileWriteDouble(g_file_88, ld_40, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_48, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_56, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_64, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_72, DOUBLE_VALUE);
               li_24++;
               FileFlush(g_file_88);
               l_count_100++;
               ld_88 = ld_64;
               li_24 = MathMax(li_28, li_24);
               ld_40 = ld_64;
               ld_48 = MathMin(ld_144, ld_64);
               ld_56 = MathMax(ld_144, ld_64);
               ld_64 = ld_144;
               ld_72 = 1.0;
            }
            li_16 += li_140;
         }
      }
   }
   li_32 = FileTell(g_file_88);
   ld_64 = Close[0];
   FileWriteInteger(g_file_88, TimeCurrent(), LONG_VALUE);
   FileWriteDouble(g_file_88, ld_40, DOUBLE_VALUE);
   FileWriteDouble(g_file_88, ld_48, DOUBLE_VALUE);
   FileWriteDouble(g_file_88, ld_56, DOUBLE_VALUE);
   FileWriteDouble(g_file_88, ld_64, DOUBLE_VALUE);
   FileWriteDouble(g_file_88, ld_72, DOUBLE_VALUE);
   FileFlush(g_file_88);
   Print(l_count_100, " record(s) written");
   if (li_96 == 0) {
      li_96 = WindowHandle(ls_4, li_116);
      if (li_96 != 0) Print("Chart window detected");
   }
   _postMessage(li_96, li_0);
   li_24 = MathMax(TimeCurrent(), li_24);
   while (IsStopped() == FALSE) {
      if (RefreshRates()) {
         FileSeek(g_file_88, li_32, SEEK_SET);
         ld_48 = MathMin(ld_48, Close[0]);
         ld_56 = MathMax(ld_56, Close[0]);
         ld_72 += MathRound(MathAbs(ld_64 - close(0)) / Point);
         if (MathRound((ld_56 - ld_88) / Point) < li_132 * BarsRange && MathRound((ld_88 - ld_48) / Point) < li_136 * BarsRange) {
            ld_80 = volume(0);
            ld_64 = close(0);
         } else {
            while (MathRound((ld_56 - ld_88) / Point) >= li_132 * BarsRange || MathRound((ld_88 - ld_48) / Point) >= li_136 * BarsRange) {
               if (MathRound((ld_88 - ld_48) / Point) >= li_136 * BarsRange) {
                  if (li_136 == 2) ld_88 -= BarsRange * Point;
                  ld_64 = ld_88 - BarsRange * Point;
                  ld_48 = ld_64;
                  ld_40 = ld_88;
                  ld_56 = ld_88;
                  li_136 = 1;
                  li_132 = 2;
               }
               if (MathRound((ld_56 - ld_88) / Point) >= li_132 * BarsRange) {
                  if (li_132 == 2) ld_88 += BarsRange * Point;
                  ld_64 = ld_88 + BarsRange * Point;
                  ld_56 = ld_64;
                  ld_40 = ld_88;
                  ld_48 = ld_88;
                  li_132 = 1;
                  li_136 = 2;
               }
               FileWriteInteger(g_file_88, li_24, LONG_VALUE);
               FileWriteDouble(g_file_88, ld_40, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_48, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_56, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_64, DOUBLE_VALUE);
               FileWriteDouble(g_file_88, ld_72, DOUBLE_VALUE);
               li_32 = FileTell(g_file_88);
               li_24++;
               li_24 = MathMax(li_24, TimeCurrent());
               ld_88 = ld_64;
               li_24 = MathMax(li_28, li_24);
               ld_40 = ld_64;
               ld_48 = MathMin(Close[0], ld_64);
               ld_56 = MathMax(Close[0], ld_64);
               ld_64 = Close[0];
               ld_72 = 1.0;
            }
         }
         FileWriteInteger(g_file_88, li_24, LONG_VALUE);
         FileWriteDouble(g_file_88, ld_40, DOUBLE_VALUE);
         FileWriteDouble(g_file_88, ld_48, DOUBLE_VALUE);
         FileWriteDouble(g_file_88, ld_56, DOUBLE_VALUE);
         FileWriteDouble(g_file_88, ld_64, DOUBLE_VALUE);
         FileWriteDouble(g_file_88, ld_72, DOUBLE_VALUE);
         FileFlush(g_file_88);
         if (li_96 == 0) {
            li_96 = WindowHandle(ls_4, li_116);
            if (li_96 != 0) Print("Chart window detected");
         }
         _postMessage(li_96, li_0);
      } else Sleep(100);
   }
   return (0);
}

void _postMessage(int ai_0, int ai_4) {
   if (ai_0 != 0) {
      PostMessageA(ai_0, WM_COMMAND, 33324, 1);
      PostMessageA(ai_0, ai_4, 2, 1);
   }
}

void deinit() {
   if (g_file_88 >= 0) {
      FileClose(g_file_88);
      g_file_88 = -1;
   }
}

bool _invalid(int ai_0, int ai_4, string as_8) {
   if (ai_0 <= ai_4) {
      Alert(WindowExpertName() + " " + Symbol() + Period() + " invalid parameter ", as_8, ": ", ai_0, ". Must be grater than ", ai_4);
      return (TRUE);
   }
   return (FALSE);
}

Comments