Author: Copyright ?2008, MQL Service
10piprenko

This script is designed to transform standard time-based market data into a specialized format known as "Renko" bars. Unlike standard charts where every new minute or hour creates a new candle, Renko charts focus purely on price movement. This tool automates the calculation of those movements and saves the resulting data into a historical file for use in trading analysis.

Core Functionality

1. Price Movement Filtering The primary logic of this script is to ignore minor market "noise." It looks for significant price changes based on a user-defined range (the BarsRange). A new bar is only generated or recorded when the price moves enough to satisfy this specific distance requirement, rather than simply moving forward in time.

2. Real-Time Conversion and Logging The script operates in real-time, constantly monitoring the live feed of a currency pair or asset.

  • It tracks the highest and lowest prices reached during a movement.
  • When a price move meets the required threshold, it "locks in" that bar.
  • Every completed bar is then written to an external history file on your computer.

3. Automated Data Export One of the key features of this script is its ability to create a new .hst (history) file. It automatically identifies the symbol and timeframe you are currently viewing and generates a corresponding file. This allows for a seamless transition from standard price action to a Renko-style historical record without needing manual data entry.

4. Broker Compatibility Adjustments The script includes an intelligent check for different types of brokers. For example, it detects if a broker uses "5-digit" pricing (common in modern forex markets) and automatically scales the calculation parameters. This ensures that the "BarsRange" remains consistent regardless of how many decimal places your broker displays.

5. System Integration To ensure the platform stays responsive while the script performs these heavy calculations, it utilizes specific Windows messages. This allows the script to communicate with the trading interface efficiently, ensuring that the data processing happens smoothly in the background.

Summary for the User

In simple terms, this tool acts as a translator. It takes the chaotic, minute-by-minute price fluctuations of the live market and translates them into clean, organized blocks of movement (Renko bars). It then saves those clean blocks into a file so you can study price trends based on actual movement rather than just the passage of time.

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
10piprenko
/*
   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 = 10;
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