Author: Copyright ?2008, MQL Service
10piprenko

This script is designed to process and convert standard price movement data into a specialized format known as "Renko bars." Unlike standard charts that create a new bar for every unit of time (e.g., every minute or hour), Renko charts focus exclusively on price movement, creating a new bar only when the price moves by a specific, predefined amount.

Core Functionality

The primary purpose of this script is to analyze historical and live price data from a 1-minute chart and export it into a custom history file. It essentially "reconstructs" a price path based on movement rather than time.

Key Operational Steps:

1. Environment Setup and Validation

  • The script begins by verifying that the user has allowed "DLL imports," which are necessary for it to communicate with the computer's operating system.
  • It checks specific requirements, ensuring it is being run on a 1-minute timeframe.
  • It automatically detects if the broker uses a "5-digit" pricing system (common in modern trading) and adjusts its internal calculations to maintain accuracy.

2. File Creation

  • The script creates a new binary history file specifically for the pair and timeframe being viewed.
  • It prepares this file with a header containing metadata, such as the symbol name, timeframe, and specific technical parameters.

3. Historical Data Processing

  • The script looks back at a large amount of historical data (up to 46,000 bars).
  • It scans these bars to identify price "steps." If the price moves significantly enough to meet the user-defined BarsRange, it marks this as a new Renko bar.
  • While processing, it keeps track of whether the price moved up or down to determine the direction of the bars.

4. Real-Time Monitoring and Exporting

  • Once the historical data is processed, the script enters a continuous loop to monitor live market activity.
  • As new prices come in, it compares them against the last recorded Renko bar.
  • If the price movement exceeds the required threshold, the script:
    • Calculates the new high and low points of that move.
    • Records the timestamp, opening price, closing price, and other technical details.
    • Writes this information immediately into the history file.

5. System Communication

  • The script utilizes a background messaging system (PostMessage) to signal the trading platform that updates are occurring. This ensures that any visual elements or external indicators tied to this history file remain synchronized with the data being written.

Summary for the User

Essentially, this tool acts as a "translator." It takes raw, noisy price movements from a 1-minute chart and filters them into a clean, movement-based Renko history file. This allows you to analyze trends based on pure price progress, removing the "noise" of time-based fluctuations.

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