TypeToBytes – library MetaTrader 4

This cross-platform library allows to conveniently perform byte-wise operation with structures and standard data types.

Features:

  • Byte-wise comparison (== and !=) of the structures and standard data types with each other (in MQL, the operators for comparing structures are absent by default).
  • Determining the byte shift of a structure filed by its name.
  • Reading the value of any standard type by the byte shift in the source data.
  • Writing structures and standard types by byte shift to the source data.
  • Converting structures and standard data types into a byte array.
Everything mentioned applies to simple structures.
A script with detailed comments is attached to demonstrate the capabilities of the library
// MQL4&5-code

#property strict

#include <TypeToBytes.mqh>

#define PRINT(A) ::Print(#A + " = " + (string)A);

void OnStart( void )
{  
  MqlTick Tick;
  ::SymbolInfoTick(::Symbol(), Tick);

  MqlTick CloneTick = Tick;

// Operation with structures
  if (_R(Tick) == CloneTick)             // Now the structures can be compared
    ::Print("Equal");

// Get the result of the required type by shift
  PRINT(_R(Tick)[(datetime)0])           // Check the 'datetime' value with the zero shift in the object of the MqlTick structure - Tick.time

// Get the shift of the structure field
  const int Offset = _OFFSET(Tick, bid); // Found the shift in bytes of the bid field in the MqlTick object

  PRINT(Tick.bid)                        // Checked the value of Tick.bid
  _W(Tick, Offset, (double)1.23456);     // Wrote the (double)1.23456 value at the found shift
  PRINT(Tick.bid)                        // Made sure that the Tick.bid is now equal to 1.23456

  PRINT(_R(Tick)[(double)Offset])        // Printed the 'double' value located at the shift Offset - it is Tick.bid again

  PRINT(_R(Tick).Bytes[8])               // Checked the value of byte with the shift of 8 in the object of the MqlTick structure
  PRINT(_R(Tick)[(uchar)8])              // The same, but using a different method

  PRINT(CloneTick.bid)                   // Checked the value of CloneTick.bid
  _W(CloneTick, 0, Tick);                // Wrote the value of the Tick structure object to the CloneTick at the zero shift
  PRINT(CloneTick.bid)                   // Made sure that CloneTick.bid == Tick.bid

// Operation with the standard types
  color Color = C'241,248,255';

  PRINT(_R(Color)[(uchar)1])             // Green component of the color - 248

  _W(Color, 2, (uchar)230);              // Wrote the (uchar)230 value at the shift of 2.
  PRINT(Color)                           // Made sure that Color is now C'241,248,230'

// Simultaneous operation with mixed types
  if (_R(Tick) != Color)                 // It is even possible to compare structures with standard types
    ::Print("Not equal");

  return;
}

 

Alternative:  3 Timeframe Indicator - indicator MetaTrader 4


📈 ROBOTFX MetaTrader Expert Advisors and Indicators to maximize profits and minimize the risks