MQLplus/lib_addons/math_simple/lib_math_simple_main.mqh
super.admin 466f9ca5c5 convert
2025-05-30 16:09:52 +02:00

1517 lines
77 KiB
MQL5

#ifndef LIB_MATH_SIMPLE_IMPLEMENTATION_MQH_INCLUDED
#define LIB_MATH_SIMPLE_IMPLEMENTATION_MQH_INCLUDED
#property version "1.9";
/**********************************************************************************
* Copyright (C) 2010-2022 Dominik Egert <info@freie-netze.de>
*
* This file is the simple math main functions include file.
*
* MQLplus, including this file may not be copied and/or distributed
* without explecit permit by the author.
* Author Dominik Egert / Freie Netze UG.
**********************************************************************************
*
* Version: 1.9
* State: production
*
* File information
* ================
*
* Use: A collection of math functions
*
*
*
*
*/
#ifdef DBG_MSG_TRACE_FILE_LOADER
DBG_MSG_TRACE_FILE_LOADER;
#endif
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Setup function macros
//
#define mqp_MathMinNN LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathMinNN))
#define mqp_MathRoot LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRoot))
#define mqp_MathRange LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRange))
#define mqp_MathRangeX LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRangeX))
#define mqp_MathRangeMatch LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRangeMatch))
#define mqp_MathRangeOverlap LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRangeOverlap))
#define mqp_MathDigits LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathDigits))
#define mqp_MathNeg LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathNeg))
#define mqp_MathRandN LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRandN))
#define mqp_MathRandX LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRandX))
#define mqp_MathZero LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathZero))
#define mqp_MathGreaterThan LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathGreaterThan))
#define mqp_MathLessThan LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathLessThan))
#define mqp_MathCompare LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathCompare))
#define mqp_MathRoundPow2 LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathRoundPow2))
#define mqp_MathFiboLevel LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathFiboLevel))
#define mqp_MathUID LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_MathUID))
#define mqp_RTCdeltaMilliseconds LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_RTCdeltaMilliseconds))
#define mqp_RTCdeltaMicroseconds LIB_NAMESPACE_ADD(LIB_NAMESPACE(numbers, _mqlplus_RTCdeltaMicroseconds))
//
/////////////////////////////////////////////////////////////////////////////////////////////////////
/*********************************************************************************************************************************************************/
/* */
/* MQLplus overloaded functions and add ons */
/* */
/*********************************************************************************************************************************************************/
#ifndef __MQL4_COMPATIBILITY_CODE__
namespace LIB_MQLPLUS_LIBRARY_PREFIX {
namespace numbers {
#endif
//+------------------------------------------------------------------+
//| MathMax |
//+------------------------------------------------------------------+
const float LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const float value1,
const float value2,
const float value3,
const float value4 = M_CONST_FLT_MAX_NEG,
const float value5 = M_CONST_FLT_MAX_NEG,
const float value6 = M_CONST_FLT_MAX_NEG,
const float value7 = M_CONST_FLT_MAX_NEG,
const float value8 = M_CONST_FLT_MAX_NEG,
const float value9 = M_CONST_FLT_MAX_NEG,
const float value10 = M_CONST_FLT_MAX_NEG) LIB_MQLPLUS_LIB_EXPORT
{
float val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
// Multi input function
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const double value1,
const double value2,
const double value3,
const double value4 = M_CONST_DBL_MAX_NEG,
const double value5 = M_CONST_DBL_MAX_NEG,
const double value6 = M_CONST_DBL_MAX_NEG,
const double value7 = M_CONST_DBL_MAX_NEG,
const double value8 = M_CONST_DBL_MAX_NEG,
const double value9 = M_CONST_DBL_MAX_NEG,
const double value10 = M_CONST_DBL_MAX_NEG) LIB_MQLPLUS_LIB_EXPORT
{
double val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
// Multi input function
const char LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const char value1,
const char value2,
const char value3,
const char value4 = CHAR_MIN,
const char value5 = CHAR_MIN,
const char value6 = CHAR_MIN,
const char value7 = CHAR_MIN,
const char value8 = CHAR_MIN,
const char value9 = CHAR_MIN,
const char value10 = CHAR_MIN) LIB_MQLPLUS_LIB_EXPORT
{
char val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
// Multi input function
const short LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const short value1,
const short value2,
const short value3,
const short value4 = SHORT_MIN,
const short value5 = SHORT_MIN,
const short value6 = SHORT_MIN,
const short value7 = SHORT_MIN,
const short value8 = SHORT_MIN,
const short value9 = SHORT_MIN,
const short value10 = SHORT_MIN) LIB_MQLPLUS_LIB_EXPORT
{
short val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
// Multi input function
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const int value1,
const int value2,
const int value3,
const int value4 = INT_MIN,
const int value5 = INT_MIN,
const int value6 = INT_MIN,
const int value7 = INT_MIN,
const int value8 = INT_MIN,
const int value9 = INT_MIN,
const int value10 = INT_MIN) LIB_MQLPLUS_LIB_EXPORT
{
int val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
// Multi input function
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const color value1,
const color value2,
const color value3,
const color value4 = INT_MIN,
const color value5 = INT_MIN,
const color value6 = INT_MIN,
const color value7 = INT_MIN,
const color value8 = INT_MIN,
const color value9 = INT_MIN,
const color value10 = INT_MIN) LIB_MQLPLUS_LIB_EXPORT
{
color val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
// Multi input function
const long LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const long value1,
const long value2,
const long value3,
const long value4 = LONG_MIN,
const long value5 = LONG_MIN,
const long value6 = LONG_MIN,
const long value7 = LONG_MIN,
const long value8 = LONG_MIN,
const long value9 = LONG_MIN,
const long value10 = LONG_MIN) LIB_MQLPLUS_LIB_EXPORT
{
long val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
// Multi input function
const long LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMax)( const datetime value1,
const datetime value2,
const datetime value3,
const datetime value4 = LONG_MIN,
const datetime value5 = LONG_MIN,
const datetime value6 = LONG_MIN,
const datetime value7 = LONG_MIN,
const datetime value8 = LONG_MIN,
const datetime value9 = LONG_MIN,
const datetime value10 = LONG_MIN) LIB_MQLPLUS_LIB_EXPORT
{
long val_a = inline_MathMax(value1, value2);
val_a = inline_MathMax(val_a, value3);
val_a = inline_MathMax(val_a, value4);
val_a = inline_MathMax(val_a, value5);
val_a = inline_MathMax(val_a, value6);
val_a = inline_MathMax(val_a, value7);
val_a = inline_MathMax(val_a, value8);
val_a = inline_MathMax(val_a, value9);
val_a = inline_MathMax(val_a, value10);
return(val_a);
}
//+------------------------------------------------------------------+
//| MathMin |
//+------------------------------------------------------------------+
// Multi input function
const float LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const float value1,
const float value2,
const float value3,
const float value4 = FLT_MAX,
const float value5 = FLT_MAX,
const float value6 = FLT_MAX,
const float value7 = FLT_MAX,
const float value8 = FLT_MAX,
const float value9 = FLT_MAX,
const float value10 = FLT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
float val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
// Multi input function
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const double value1,
const double value2,
const double value3,
const double value4 = DBL_MAX,
const double value5 = DBL_MAX,
const double value6 = DBL_MAX,
const double value7 = DBL_MAX,
const double value8 = DBL_MAX,
const double value9 = DBL_MAX,
const double value10 = DBL_MAX) LIB_MQLPLUS_LIB_EXPORT
{
double val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
// Multi input function
const char LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const char value1,
const char value2,
const char value3,
const char value4 = CHAR_MAX,
const char value5 = CHAR_MAX,
const char value6 = CHAR_MAX,
const char value7 = CHAR_MAX,
const char value8 = CHAR_MAX,
const char value9 = CHAR_MAX,
const char value10 = CHAR_MAX) LIB_MQLPLUS_LIB_EXPORT
{
char val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
// Multi input function
const short LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const short value1,
const short value2,
const short value3,
const short value4 = SHORT_MAX,
const short value5 = SHORT_MAX,
const short value6 = SHORT_MAX,
const short value7 = SHORT_MAX,
const short value8 = SHORT_MAX,
const short value9 = SHORT_MAX,
const short value10 = SHORT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
short val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
// Multi input function
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const int value1,
const int value2,
const int value3,
const int value4 = INT_MAX,
const int value5 = INT_MAX,
const int value6 = INT_MAX,
const int value7 = INT_MAX,
const int value8 = INT_MAX,
const int value9 = INT_MAX,
const int value10 = INT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
int val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
// Multi input function
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const color value1,
const color value2,
const color value3,
const color value4 = INT_MAX,
const color value5 = INT_MAX,
const color value6 = INT_MAX,
const color value7 = INT_MAX,
const color value8 = INT_MAX,
const color value9 = INT_MAX,
const color value10 = INT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
color val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
// Multi input function
const long LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const long value1,
const long value2,
const long value3,
const long value4 = LONG_MAX,
const long value5 = LONG_MAX,
const long value6 = LONG_MAX,
const long value7 = LONG_MAX,
const long value8 = LONG_MAX,
const long value9 = LONG_MAX,
const long value10 = LONG_MAX) LIB_MQLPLUS_LIB_EXPORT
{
long val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
// Multi input function
const long LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMin)( const datetime value1,
const datetime value2,
const datetime value3,
const datetime value4 = LONG_MAX,
const datetime value5 = LONG_MAX,
const datetime value6 = LONG_MAX,
const datetime value7 = LONG_MAX,
const datetime value8 = LONG_MAX,
const datetime value9 = LONG_MAX,
const datetime value10 = LONG_MAX) LIB_MQLPLUS_LIB_EXPORT
{
long val_a = inline_MathMin(value1, value2);
val_a = inline_MathMin(val_a, value3);
val_a = inline_MathMin(val_a, value4);
val_a = inline_MathMin(val_a, value5);
val_a = inline_MathMin(val_a, value6);
val_a = inline_MathMin(val_a, value7);
val_a = inline_MathMin(val_a, value8);
val_a = inline_MathMin(val_a, value9);
val_a = inline_MathMin(val_a, value10);
return(val_a);
}
//+------------------------------------------------------------------+
//| MathMinNN not null |
//+------------------------------------------------------------------+
// Multi input function, ingore zeros
const float LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)( const float value1,
const float value2,
const float value3 = FLT_MAX,
const float value4 = FLT_MAX,
const float value5 = FLT_MAX,
const float value6 = FLT_MAX,
const float value7 = FLT_MAX,
const float value8 = FLT_MAX,
const float value9 = FLT_MAX,
const float value10 = FLT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? FLT_MAX : value1),
((value2 == NULL) ? FLT_MAX : value2),
((value3 == NULL) ? FLT_MAX : value3),
((value4 == NULL) ? FLT_MAX : value4),
((value5 == NULL) ? FLT_MAX : value5),
((value6 == NULL) ? FLT_MAX : value6),
((value7 == NULL) ? FLT_MAX : value7),
((value8 == NULL) ? FLT_MAX : value8),
((value9 == NULL) ? FLT_MAX : value9),
((value10 == NULL) ? FLT_MAX : value10)) );
}
// Multi input function, ingore zeros
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)(const double value1,
const double value2,
const double value3 = DBL_MAX,
const double value4 = DBL_MAX,
const double value5 = DBL_MAX,
const double value6 = DBL_MAX,
const double value7 = DBL_MAX,
const double value8 = DBL_MAX,
const double value9 = DBL_MAX,
const double value10 = DBL_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? DBL_MAX : value1),
((value2 == NULL) ? DBL_MAX : value2),
((value3 == NULL) ? DBL_MAX : value3),
((value4 == NULL) ? DBL_MAX : value4),
((value5 == NULL) ? DBL_MAX : value5),
((value6 == NULL) ? DBL_MAX : value6),
((value7 == NULL) ? DBL_MAX : value7),
((value8 == NULL) ? DBL_MAX : value8),
((value9 == NULL) ? DBL_MAX : value9),
((value10 == NULL) ? DBL_MAX : value10)) );
}
// Multi input function, ingore zeros
const char LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)( const char value1,
const char value2,
const char value3 = CHAR_MAX,
const char value4 = CHAR_MAX,
const char value5 = CHAR_MAX,
const char value6 = CHAR_MAX,
const char value7 = CHAR_MAX,
const char value8 = CHAR_MAX,
const char value9 = CHAR_MAX,
const char value10 = CHAR_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? CHAR_MAX : value1),
((value2 == NULL) ? CHAR_MAX : value2),
((value3 == NULL) ? CHAR_MAX : value3),
((value4 == NULL) ? CHAR_MAX : value4),
((value5 == NULL) ? CHAR_MAX : value5),
((value6 == NULL) ? CHAR_MAX : value6),
((value7 == NULL) ? CHAR_MAX : value7),
((value8 == NULL) ? CHAR_MAX : value8),
((value9 == NULL) ? CHAR_MAX : value9),
((value10 == NULL) ? CHAR_MAX : value10)) );
}
// Multi input function, ingore zeros
const short LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)( const short value1,
const short value2,
const short value3 = SHORT_MAX,
const short value4 = SHORT_MAX,
const short value5 = SHORT_MAX,
const short value6 = SHORT_MAX,
const short value7 = SHORT_MAX,
const short value8 = SHORT_MAX,
const short value9 = SHORT_MAX,
const short value10 = SHORT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? SHORT_MAX : value1),
((value2 == NULL) ? SHORT_MAX : value2),
((value3 == NULL) ? SHORT_MAX : value3),
((value4 == NULL) ? SHORT_MAX : value4),
((value5 == NULL) ? SHORT_MAX : value5),
((value6 == NULL) ? SHORT_MAX : value6),
((value7 == NULL) ? SHORT_MAX : value7),
((value8 == NULL) ? SHORT_MAX : value8),
((value9 == NULL) ? SHORT_MAX : value9),
((value10 == NULL) ? SHORT_MAX : value10)) );
}
// Multi input function, ingore zeros
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)( const int value1,
const int value2,
const int value3 = INT_MAX,
const int value4 = INT_MAX,
const int value5 = INT_MAX,
const int value6 = INT_MAX,
const int value7 = INT_MAX,
const int value8 = INT_MAX,
const int value9 = INT_MAX,
const int value10 = INT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? INT_MAX : value1),
((value2 == NULL) ? INT_MAX : value2),
((value3 == NULL) ? INT_MAX : value3),
((value4 == NULL) ? INT_MAX : value4),
((value5 == NULL) ? INT_MAX : value5),
((value6 == NULL) ? INT_MAX : value6),
((value7 == NULL) ? INT_MAX : value7),
((value8 == NULL) ? INT_MAX : value8),
((value9 == NULL) ? INT_MAX : value9),
((value10 == NULL) ? INT_MAX : value10)) );
}
// Multi input function, ingore zeros
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)( const color value1,
const color value2,
const color value3 = INT_MAX,
const color value4 = INT_MAX,
const color value5 = INT_MAX,
const color value6 = INT_MAX,
const color value7 = INT_MAX,
const color value8 = INT_MAX,
const color value9 = INT_MAX,
const color value10 = INT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? INT_MAX : value1),
((value2 == NULL) ? INT_MAX : value2),
((value3 == NULL) ? INT_MAX : value3),
((value4 == NULL) ? INT_MAX : value4),
((value5 == NULL) ? INT_MAX : value5),
((value6 == NULL) ? INT_MAX : value6),
((value7 == NULL) ? INT_MAX : value7),
((value8 == NULL) ? INT_MAX : value8),
((value9 == NULL) ? INT_MAX : value9),
((value10 == NULL) ? INT_MAX : value10)) );
}
// Multi input function, ingore zeros
const long LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)( const long value1,
const long value2,
const long value3 = LONG_MAX,
const long value4 = LONG_MAX,
const long value5 = LONG_MAX,
const long value6 = LONG_MAX,
const long value7 = LONG_MAX,
const long value8 = LONG_MAX,
const long value9 = LONG_MAX,
const long value10 = LONG_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? LONG_MAX : value1),
((value2 == NULL) ? LONG_MAX : value2),
((value3 == NULL) ? LONG_MAX : value3),
((value4 == NULL) ? LONG_MAX : value4),
((value5 == NULL) ? LONG_MAX : value5),
((value6 == NULL) ? LONG_MAX : value6),
((value7 == NULL) ? LONG_MAX : value7),
((value8 == NULL) ? LONG_MAX : value8),
((value9 == NULL) ? LONG_MAX : value9),
((value10 == NULL) ? LONG_MAX : value10)) );
}
// Multi input function, ingore zeros
const long LIB_NAMESPACE_DEF(numbers, _mqlplus_MathMinNN)( const datetime value1,
const datetime value2,
const datetime value3 = LONG_MAX,
const datetime value4 = LONG_MAX,
const datetime value5 = LONG_MAX,
const datetime value6 = LONG_MAX,
const datetime value7 = LONG_MAX,
const datetime value8 = LONG_MAX,
const datetime value9 = LONG_MAX,
const datetime value10 = LONG_MAX) LIB_MQLPLUS_LIB_EXPORT
{
return( LIB_NAMESPACE(numbers, _mqlplus_MathMin)(((value1 == NULL) ? LONG_MAX : value1),
((value2 == NULL) ? LONG_MAX : value2),
((value3 == NULL) ? LONG_MAX : value3),
((value4 == NULL) ? LONG_MAX : value4),
((value5 == NULL) ? LONG_MAX : value5),
((value6 == NULL) ? LONG_MAX : value6),
((value7 == NULL) ? LONG_MAX : value7),
((value8 == NULL) ? LONG_MAX : value8),
((value9 == NULL) ? LONG_MAX : value9),
((value10 == NULL) ? LONG_MAX : value10)) );
}
//+------------------------------------------------------------------+
//| MathGreaterThan() |
//+------------------------------------------------------------------+
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathGreaterThan)( const double reference,
const double value1,
const double value2,
const double value3 = M_CONST_DBL_MAX_NEG,
const double value4 = M_CONST_DBL_MAX_NEG,
const double value5 = M_CONST_DBL_MAX_NEG,
const double value6 = M_CONST_DBL_MAX_NEG,
const double value7 = M_CONST_DBL_MAX_NEG,
const double value8 = M_CONST_DBL_MAX_NEG,
const double value9 = M_CONST_DBL_MAX_NEG,
const double value10 = M_CONST_DBL_MAX_NEG) LIB_MQLPLUS_LIB_EXPORT
{
const double v1_diff = value1 - reference;
const double v2_diff = value2 - reference;
const double v3_diff = value3 - reference;
const double v4_diff = value4 - reference;
const double v5_diff = value5 - reference;
const double v6_diff = value6 - reference;
const double v7_diff = value7 - reference;
const double v8_diff = value8 - reference;
const double v9_diff = value9 - reference;
const double v10_diff = value10 - reference;
return(reference + LIB_NAMESPACE(numbers, _mqlplus_MathMin)( (v1_diff < NULL) ? DBL_MAX : v1_diff,
(v2_diff < NULL) ? DBL_MAX : v2_diff,
(v3_diff < NULL) ? DBL_MAX : v3_diff,
(v4_diff < NULL) ? DBL_MAX : v4_diff,
(v5_diff < NULL) ? DBL_MAX : v5_diff,
(v6_diff < NULL) ? DBL_MAX : v6_diff,
(v7_diff < NULL) ? DBL_MAX : v7_diff,
(v8_diff < NULL) ? DBL_MAX : v8_diff,
(v9_diff < NULL) ? DBL_MAX : v9_diff,
(v10_diff < NULL) ? DBL_MAX : v10_diff));
}
const float LIB_NAMESPACE_DEF(numbers, _mqlplus_MathGreaterThan)( const float reference,
const float value1,
const float value2,
const float value3 = M_CONST_FLT_MAX_NEG,
const float value4 = M_CONST_FLT_MAX_NEG,
const float value5 = M_CONST_FLT_MAX_NEG,
const float value6 = M_CONST_FLT_MAX_NEG,
const float value7 = M_CONST_FLT_MAX_NEG,
const float value8 = M_CONST_FLT_MAX_NEG,
const float value9 = M_CONST_FLT_MAX_NEG,
const float value10 = M_CONST_FLT_MAX_NEG) LIB_MQLPLUS_LIB_EXPORT
{
const float v1_diff = value1 - reference;
const float v2_diff = value2 - reference;
const float v3_diff = value3 - reference;
const float v4_diff = value4 - reference;
const float v5_diff = value5 - reference;
const float v6_diff = value6 - reference;
const float v7_diff = value7 - reference;
const float v8_diff = value8 - reference;
const float v9_diff = value9 - reference;
const float v10_diff = value10 - reference;
return(reference + LIB_NAMESPACE(numbers, _mqlplus_MathMin)( (v1_diff < NULL) ? FLT_MAX : v1_diff,
(v2_diff < NULL) ? FLT_MAX : v2_diff,
(v3_diff < NULL) ? FLT_MAX : v3_diff,
(v4_diff < NULL) ? FLT_MAX : v4_diff,
(v5_diff < NULL) ? FLT_MAX : v5_diff,
(v6_diff < NULL) ? FLT_MAX : v6_diff,
(v7_diff < NULL) ? FLT_MAX : v7_diff,
(v8_diff < NULL) ? FLT_MAX : v8_diff,
(v9_diff < NULL) ? FLT_MAX : v9_diff,
(v10_diff < NULL) ? FLT_MAX : v10_diff));
}
//+------------------------------------------------------------------+
//| MathLessThan() |
//+------------------------------------------------------------------+
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathLessThan)( const double reference,
const double value1,
const double value2,
const double value3 = DBL_MAX,
const double value4 = DBL_MAX,
const double value5 = DBL_MAX,
const double value6 = DBL_MAX,
const double value7 = DBL_MAX,
const double value8 = DBL_MAX,
const double value9 = DBL_MAX,
const double value10 = DBL_MAX) LIB_MQLPLUS_LIB_EXPORT
{
const double v1_diff = reference - value1;
const double v2_diff = reference - value2;
const double v3_diff = reference - value3;
const double v4_diff = reference - value4;
const double v5_diff = reference - value5;
const double v6_diff = reference - value6;
const double v7_diff = reference - value7;
const double v8_diff = reference - value8;
const double v9_diff = reference - value9;
const double v10_diff = reference - value10;
return(reference - LIB_NAMESPACE(numbers, _mqlplus_MathMin)( (v1_diff < NULL) ? DBL_MAX : v1_diff,
(v2_diff < NULL) ? DBL_MAX : v2_diff,
(v3_diff < NULL) ? DBL_MAX : v3_diff,
(v4_diff < NULL) ? DBL_MAX : v4_diff,
(v5_diff < NULL) ? DBL_MAX : v5_diff,
(v6_diff < NULL) ? DBL_MAX : v6_diff,
(v7_diff < NULL) ? DBL_MAX : v7_diff,
(v8_diff < NULL) ? DBL_MAX : v8_diff,
(v9_diff < NULL) ? DBL_MAX : v9_diff,
(v10_diff < NULL) ? DBL_MAX : v10_diff));
}
const float LIB_NAMESPACE_DEF(numbers, _mqlplus_MathLessThan)( const float reference,
const float value1,
const float value2,
const float value3 = FLT_MAX,
const float value4 = FLT_MAX,
const float value5 = FLT_MAX,
const float value6 = FLT_MAX,
const float value7 = FLT_MAX,
const float value8 = FLT_MAX,
const float value9 = FLT_MAX,
const float value10 = FLT_MAX) LIB_MQLPLUS_LIB_EXPORT
{
const float v1_diff = reference - value1;
const float v2_diff = reference - value2;
const float v3_diff = reference - value3;
const float v4_diff = reference - value4;
const float v5_diff = reference - value5;
const float v6_diff = reference - value6;
const float v7_diff = reference - value7;
const float v8_diff = reference - value8;
const float v9_diff = reference - value9;
const float v10_diff = reference - value10;
return(reference - LIB_NAMESPACE(numbers, _mqlplus_MathMin)( (v1_diff < NULL) ? FLT_MAX : v1_diff,
(v2_diff < NULL) ? FLT_MAX : v2_diff,
(v3_diff < NULL) ? FLT_MAX : v3_diff,
(v4_diff < NULL) ? FLT_MAX : v4_diff,
(v5_diff < NULL) ? FLT_MAX : v5_diff,
(v6_diff < NULL) ? FLT_MAX : v6_diff,
(v7_diff < NULL) ? FLT_MAX : v7_diff,
(v8_diff < NULL) ? FLT_MAX : v8_diff,
(v9_diff < NULL) ? FLT_MAX : v9_diff,
(v10_diff < NULL) ? FLT_MAX : v10_diff));
}
const char LIB_NAMESPACE_DEF(numbers, _mqlplus_MathLessThan)( const char reference,
const char value1,
const char value2,
const char value3 = CHAR_MAX,
const char value4 = CHAR_MAX,
const char value5 = CHAR_MAX,
const char value6 = CHAR_MAX,
const char value7 = CHAR_MAX,
const char value8 = CHAR_MAX,
const char value9 = CHAR_MAX,
const char value10 = CHAR_MAX) LIB_MQLPLUS_LIB_EXPORT
{
const char v1_diff = reference - value1;
const char v2_diff = reference - value2;
const char v3_diff = reference - value3;
const char v4_diff = reference - value4;
const char v5_diff = reference - value5;
const char v6_diff = reference - value6;
const char v7_diff = reference - value7;
const char v8_diff = reference - value8;
const char v9_diff = reference - value9;
const char v10_diff = reference - value10;
return(reference - LIB_NAMESPACE(numbers, _mqlplus_MathMin)( (v1_diff < NULL) ? CHAR_MAX : v1_diff,
(v2_diff < NULL) ? CHAR_MAX : v2_diff,
(v3_diff < NULL) ? CHAR_MAX : v3_diff,
(v4_diff < NULL) ? CHAR_MAX : v4_diff,
(v5_diff < NULL) ? CHAR_MAX : v5_diff,
(v6_diff < NULL) ? CHAR_MAX : v6_diff,
(v7_diff < NULL) ? CHAR_MAX : v7_diff,
(v8_diff < NULL) ? CHAR_MAX : v8_diff,
(v9_diff < NULL) ? CHAR_MAX : v9_diff,
(v10_diff < NULL) ? CHAR_MAX : v10_diff));
}
//+------------------------------------------------------------------+
//| MathDigits |
//+------------------------------------------------------------------+
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathDigits)(const float value, const int max_digits = 9) LIB_MQLPLUS_LIB_EXPORT
{
if(value > (1.0 - DBL_MIN))
{ return((int)(::MathFloor(::MathLog10(::MathAbs((double)value)))) + 1); }
// Return
return((int)(::MathRound(::MathAbs(::MathLog10((double)value)))));
}
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathDigits)(const double value, const int max_digits = 16) LIB_MQLPLUS_LIB_EXPORT
{
if(value > (1.0 - DBL_MIN))
{ return((int)(::MathFloor(::MathLog10(::MathAbs(value)))) + 1); }
// Return
return(inline_MathDigits(value));
}
//+------------------------------------------------------------------+
//| MathCompare |
//+------------------------------------------------------------------+
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathCompare)(const double value1, const double value2, const int digits) LIB_MQLPLUS_LIB_EXPORT
{
// Local init
static int c_digits = NULL;
static double digit_f[];
// Update cache
if(c_digits <= digits)
{
ArrayResize(digit_f, digits + 1);
for(int cnt = c_digits; (cnt <= digits) && !_StopFlag; cnt++)
{ digit_f[cnt] = MathPow(10.0, cnt); }
c_digits = digits + 1;
}
// Convert input
const long v_1 = (long)(::MathRound(value1 * digit_f[digits]));
const long v_2 = (long)(::MathRound(value2 * digit_f[digits]));
// Return
return((v_1 != v_2) * ((v_1 > v_2) ? 1 : -1));
}
//+------------------------------------------------------------------+
//| MathInverseSqrt |
//+------------------------------------------------------------------+
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathInverseSqrt)(const double value)
{
union l_d_i32 { ulong ui; double f; } i;
i.f = value;
i.ui = 0x5FE6Eb50C7B537A9 - (i.ui >> 0x01);
return((i.f * (1.5 - ((value * 0.5) * i.f * i.f))));
}
//+------------------------------------------------------------------+
//| MathRoundPow2 |
//+------------------------------------------------------------------+
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathRoundPow2)(const int in) LIB_MQLPLUS_LIB_EXPORT
{
int result = in;
result--;
result |= result >> 1;
result |= result >> 2;
result |= result >> 4;
result |= result >> 8;
result |= result >> 16;
// Return
return(result + 1);
}
//+------------------------------------------------------------------+
//| MathFiboLevel() |
//+------------------------------------------------------------------+
const int LIB_NAMESPACE_DEF(numbers, _mqlplus_MathFiboLevel)(const double value, const bool fx_lvl = true) LIB_MQLPLUS_LIB_EXPORT
{
// Local init
const static double digit_f = 1.0 / (Point());
static double fib_lvls[];
static double fx_lvls[];
static int lvl_size = NULL;
int cnt = NULL;
int retval = NULL;
// Check input
if(value <= NULL)
{ return(NULL); }
// Initialize array
if(lvl_size == NULL)
{
// FX levels
::ArrayResize(fx_lvls, 10);
for(cnt = NULL; (cnt < 10) && !_StopFlag; cnt++)
{ fx_lvls[cnt] = LIB_NAMESPACE(numbers, _mqlplus_MathFiboLevel)(cnt); }
// Fibonacci levels
lvl_size = ::ArrayResize(fib_lvls, 20);
for(cnt = 3; (cnt < 20) && !_StopFlag; cnt++)
{ fib_lvls[cnt] = LIB_NAMESPACE(numbers, _mqlplus_MathFiboLevel)(cnt, NULL, 1.0) * digit_f; }
}
// Extend array as needed
if(fib_lvls[lvl_size -1] < value)
{
::ArrayResize(fib_lvls, lvl_size, (int)(::MathPow(value, M_CONST_M_DIV1_GR)));
while( (fib_lvls[lvl_size - 1] < value)
&& (!_StopFlag) )
{
lvl_size = ::ArrayResize(fib_lvls, lvl_size + 1);
fib_lvls[lvl_size - 1] = LIB_NAMESPACE(numbers, _mqlplus_MathFiboLevel)(lvl_size, NULL, 1.0);
}
}
// Match input value to fx levels
if(fx_lvl)
{
// Precheck input
if(value > fx_lvls[9])
{ return(9); }
while( (fx_lvls[retval] < value)
&& (!_StopFlag) )
{ retval++; }
// Check closest level
return((retval - ((::MathAbs(fx_lvls[retval - 1] - value)) < (fx_lvls[retval] - value))) + 1);
}
// Match input value to fibo level
while( (fib_lvls[retval] < value)
&& (!_StopFlag) )
{ retval++; }
// Return
return((retval - ((::MathAbs(fib_lvls[retval - 1] - value)) < (fib_lvls[retval] - value))) + 1);
}
//+------------------------------------------------------------------+
//| MathFiboLevel() |
//+------------------------------------------------------------------+
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathFiboLevel)(const int level) LIB_MQLPLUS_LIB_EXPORT
{ return(LIB_NAMESPACE(numbers, _mqlplus_MathFiboLevel)(level, NULL, 1.0, false, true)); }
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathFiboLevel)(const int level, const double range_start, const double range_end, const bool ratio_levels = false, const bool fx_levels = false) LIB_MQLPLUS_LIB_EXPORT
{
// Cache init
static double _point = Point();
static int _count = -1;
static bool fx_init = false;
static double fx_r[10];
static double _levels[];
static double _ratios[];
static int fib_sequence[];
bool _fx_levels = (fx_levels) && (level < 10);
// Local init
const double _range = ::MathAbs(range_start - range_end);
const int _level = (fx_levels) ? 11 : level;
int cnt = NULL;
// Fibonacci sequence
if(_count <= _level)
{
// Fib sequence
for(cnt = LIB_NAMESPACE(numbers, _mqlplus_MathMax)(0, _count); (cnt <= _level) && !_StopFlag; cnt++)
{
_count = ::ArrayResize(fib_sequence, cnt + 1, level + 1);
fib_sequence[cnt] = (_count < 3) ? (_count > 1) : fib_sequence[cnt - 2] + fib_sequence[cnt - 1];
}
// Fib levels
::ArrayResize(_levels, _count);
for(cnt = (::ArraySize(_levels)); (cnt < _count) && !_StopFlag; cnt++)
{ _levels[cnt] = fib_sequence[cnt] * _point; }
}
// Fib ratios
if(ratio_levels)
{
::ArrayResize(_ratios, _count);
for(cnt = (::ArraySize(_ratios)); (cnt < _count) && !_StopFlag; cnt++)
{ _ratios[(_count - 1) - cnt] = (fib_sequence[_count - 1] == NULL) ? NULL : ((double)fib_sequence[(_count - 1) - cnt] / (double)fib_sequence[_count - 1]); }
}
// FX fib levels
if(_fx_levels)
{
if(!fx_init)
{
fx_r[0] = NULL;
fx_r[1] = LIB_NAMESPACE(numbers, _mqlplus_MathRound)(((double)fib_sequence[8]) / ((double)fib_sequence[11]) * 100.0, 1);
fx_r[2] = LIB_NAMESPACE(numbers, _mqlplus_MathRound)(((double)fib_sequence[9]) / ((double)fib_sequence[11]) * 100.0, 1);
fx_r[3] = 50.0;
fx_r[4] = LIB_NAMESPACE(numbers, _mqlplus_MathRound)(((double)fib_sequence[10]) / ((double)fib_sequence[11]) * 100.0, 1);
fx_r[5] = 100.0 - fx_r[1];
fx_r[6] = 100.0;
fx_r[7] = 100.0 + fx_r[4];
fx_r[8] = 200.0 + fx_r[4];
fx_r[9] = 400.0 + fx_r[1];
fx_init = true;
}
// Return fx_fibo levels
return((level < 10) ? fx_r[level] : NULL);
}
// Calculate levels
if(ratio_levels)
{ return((range_start < range_end) ? range_start + (_range * _ratios[level]) : range_start - (_range * _ratios[level])); }
// Return
return((range_start <= range_end) ? range_start + _levels[level] : range_start - _levels[level]);
}
//+------------------------------------------------------------------+
//| MathUID() |
//+------------------------------------------------------------------+
// Microsecond unix timestamp as uID.
const ulong LIB_NAMESPACE_DEF(numbers, _mqlplus_MathUID)() LIB_MQLPLUS_LIB_EXPORT
{
// Local init
union _64bit { ulong ul; uchar uc[8]; _64bit(const ulong p_in) : ul(p_in) {}; };
const datetime _tm = ::TimeGMT();
const ulong _ms = ::GetTickCount();
const ulong _mc = ::GetMicrosecondCount();
const _64bit uid = (ulong)_tm + _ms + _mc;
uchar result[];
uchar key[4];
// Time based UUID
if(CryptEncode(CRYPT_HASH_SHA1, uid.uc, key, result) > NULL)
{
_64bit cnv = NULL;
ArrayCopy(cnv.uc, result, 0, 0, 8);
return(cnv.ul);
}
// Return
return(-1);
}
//+------------------------------------------------------------------+
//| Can given value be evaluated to be zero |
//+------------------------------------------------------------------+
const bool LIB_NAMESPACE_DEF(numbers, _mqlplus_MathZero)(const float value) LIB_MQLPLUS_LIB_EXPORT
{
return( ((value <= M_CONST_FLT_NULL_P) && (value >= M_CONST_FLT_NULL_N))
|| (value == (float)EMPTY_VALUE)
|| !(::MathIsValidNumber((double)value)) );
}
//+------------------------------------------------------------------+
//| Can given value be evaluated to be zero |
//+------------------------------------------------------------------+
const bool LIB_NAMESPACE_DEF(numbers, _mqlplus_MathZero)(const double value) LIB_MQLPLUS_LIB_EXPORT
{
return( ((value <= M_CONST_DBL_NULL_P) && (value >= M_CONST_DBL_NULL_N))
|| (value == EMPTY_VALUE)
|| !(::MathIsValidNumber(value)) );
}
//+------------------------------------------------------------------+
//| RTCdeltaMilliseconds() |
//+------------------------------------------------------------------+
const ulong LIB_NAMESPACE_DEF(numbers, _mqlplus_RTCdeltaMilliseconds)(const bool recalibrate = false) LIB_MQLPLUS_LIB_EXPORT
{
// Static init
static bool is_init = false;
static ulong _delta = NULL;
// Check state
if( (is_init)
&& (!recalibrate) )
{ return(_delta); }
// Local init
const bool live = !( (::MQLInfoInteger(MQL_DEBUG))
|| (::MQLInfoInteger(MQL_PROFILER))
|| (::MQLInfoInteger(MQL_TESTER))
|| (::MQLInfoInteger(MQL_FORWARD))
|| (::MQLInfoInteger(MQL_OPTIMIZATION))
|| (::MQLInfoInteger(MQL_VISUAL_MODE))
|| (::MQLInfoInteger(MQL_FRAME_MODE))
);
const long init_ts = ::TimeLocal();
// Calibrate
while( (live)
&& (::TimeLocal() == init_ts) )
{ _delta = GetMicrosecondCount(); }
// Save results
is_init = true;
_delta /= 1000;
_delta %= 1000;
// Return
return(_delta);
}
//+------------------------------------------------------------------+
//| RTCdeltaMicroseconds() |
//+------------------------------------------------------------------+
const ulong LIB_NAMESPACE_DEF(numbers, _mqlplus_RTCdeltaMicroseconds)(const bool recalibrate = false) LIB_MQLPLUS_LIB_EXPORT
{
// Static init
static bool is_init = false;
static ulong _delta = NULL;
// Check state
if( (is_init)
&& (!recalibrate) )
{ return(_delta); }
// Local init
const bool live = !( (::MQLInfoInteger(MQL_DEBUG))
|| (::MQLInfoInteger(MQL_PROFILER))
|| (::MQLInfoInteger(MQL_TESTER))
|| (::MQLInfoInteger(MQL_FORWARD))
|| (::MQLInfoInteger(MQL_OPTIMIZATION))
|| (::MQLInfoInteger(MQL_VISUAL_MODE))
|| (::MQLInfoInteger(MQL_FRAME_MODE))
);
const long init_ts = ::TimeLocal();
// Calibrate
while( (live)
&& ((::TimeLocal()) == init_ts) )
{ _delta = ::GetMicrosecondCount(); }
// Save results
is_init = true;
_delta %= 1000000;
// Return
return(_delta);
}
/*********************************************************************************************************************************************************/
/* */
/* Simple math helper functions */
/* */
/*********************************************************************************************************************************************************/
/*
*********************************************************************************************************
* Pseudo random generator *
*********************************************************************************************************
*/
//+------------------------------------------------------------------+
//| Generate a random byte array |
//+------------------------------------------------------------------+
const double LIB_NAMESPACE_DEF(numbers, _mqlplus_MathRandN)() LIB_MQLPLUS_LIB_EXPORT
{ return(LIB_NAMESPACE(numbers, random)()); }
const uint LIB_NAMESPACE_DEF(numbers, _mqlplus_MathRand)() LIB_MQLPLUS_LIB_EXPORT
{
// Local init
_32_bit rnd = 0x00;
LIB_NAMESPACE_DEF(numbers, _mqlplus_MathRand)(rnd.uc, 4);
// Return
return(rnd.ui);
}
void LIB_NAMESPACE_DEF(numbers, _mqlplus_MathRand)(uchar& out[], const uint bytes, const uint start = NULL) LIB_MQLPLUS_LIB_EXPORT
{
// Local init
if(::ArraySize(out) < ((int)(bytes + start)))
{ ::ArrayResize(out, (bytes + start)); }
////////////////////////////////////////////////////////////////////////
//
// Fill array
//
// Insert here ->quantum random number generator<-
// Polling mechanism for data from
// https://qrng.anu.edu.au/API/jsonI.php?length=1024&type=uint8
//
// Local init
static bool qrnd = true;
static int rnd_full_size = LIB_NAMESPACE(numbers, _mqlplus_MathRoundPow2)(MathMax(bytes, 1024));
static uchar rnd_cache[];
char body[];
char result[];
string result_hdr;
// Precheck cache size
if(rnd_full_size < LIB_NAMESPACE(numbers, _mqlplus_MathRoundPow2)(bytes))
{ rnd_full_size = LIB_NAMESPACE(numbers, _mqlplus_MathRoundPow2)(bytes); }
// Try access quantum random generator
if( (qrnd)
&& (::ArraySize(rnd_cache) < (int)bytes) )
{
// Init loop
int r_sz = NULL;
uchar char_bin[];
int cnt = NULL;
int next = NULL;
// Loop request to fill cache
while( (qrnd)
&& (::ArraySize(rnd_cache) < (int)(rnd_full_size + bytes))
&& (!_StopFlag) )
{
// Query data from server
::ResetLastError();
if(::WebRequest("GET", "https://qrng.anu.edu.au/wp-content/plugins/colours-plugin/get_block_hex.php", NULL, NULL, 10000, body, NULL, result, result_hdr) != 200)
{
int err_no = ::GetLastError();
qrnd = false;
switch(err_no)
{
#ifndef __MQL4_COMPATIBILITY_CODE__
case ERR_FUNCTION_NOT_ALLOWED:
printf("%s", "WebRequests cannot be used from within an indicator or tester environment.");
#endif
case ERR_WEBREQUEST_INVALID_ADDRESS:
case ERR_WEBREQUEST_CONNECT_FAILED:
case ERR_WEBREQUEST_TIMEOUT:
case ERR_WEBREQUEST_REQUEST_FAILED:
printf("%s", "Add URL to allowed list: https://qrng.anu.edu.au");
printf("%s", "Warning: Quantum source random number generator disabled.");
}
break;
}
// Convert hex to binary
cnt = NULL;
next = NULL;
r_sz = ::ArraySize(result);
r_sz -= (r_sz & 0x01);
::ArrayResize(char_bin, r_sz / 2);
while( (cnt < r_sz)
&& (!_StopFlag) )
{
char_bin[next] = ((result[cnt] - ((result[cnt] < 58) ? 48 : 87)) << 4) + result[cnt + 1] - ((result[cnt + 1] < 58) ? 48 : 87);
next++;
cnt += 2;
}
// Add result to cache
::ArrayCopy(rnd_cache, char_bin, ::ArraySize(rnd_cache), NULL, next);
}
}
// Check quantum results
if(qrnd)
{
::ArrayCopy(out, rnd_cache, 0, ::ArraySize(rnd_cache) - bytes, bytes);
::ArrayResize(rnd_cache, ::ArraySize(rnd_cache) - bytes);
return;
}
// Local pseudo random generator
uint tmp = NULL;
::ArrayResize(out, (start + bytes) + (4 - ((start + bytes) % 4)));
for(uint cnt2 = start; cnt2 < (bytes + start); cnt2 += 4)
{
tmp = LIB_NAMESPACE(numbers, random_max)();
out[cnt2] = (uchar)tmp;
out[cnt2 + 1] = (uchar)(tmp >> 8);
out[cnt2 + 2] = (uchar)(tmp >> 16);
out[cnt2 + 3] = (uchar)(tmp >> 24);
}
::ArrayResize(out, (start + bytes));
// Return
return;
}
//+------------------------------------------------------------------+
//| Generate a random byte |
//+------------------------------------------------------------------+
const uchar LIB_NAMESPACE_DEF(numbers, random_byte)()
{
// Squish random result to range of 8 bit
return((uchar)(LIB_NAMESPACE(numbers, random)() * 256.0));
}
//+------------------------------------------------------------------+
//| Generate a random integer with a max |
//+------------------------------------------------------------------+
const uint LIB_NAMESPACE_DEF(numbers, random_max)(uint max = UINT_MAX)
{ return((uint)(LIB_NAMESPACE(numbers, random)() * ((double)max))); }
//+------------------------------------------------------------------+
//| Unified 32 bit random source function |
//+------------------------------------------------------------------+
const double LIB_NAMESPACE_DEF(numbers, random)(const ulong seed = NULL, const ulong sequence = NULL)
{
//////////////////////////////////////////////////////////////////
//
// PCG Random Number Generation, Minimal C Edition
//
// http://www.pcg-random.org
//
// Copyright 2014 Melissa O'Neill <oneill@pcg-random.org>
//
// Local init
static bool is_init = false;
static ulong state = NULL;
static ulong increment = 0xDA3E39CB94B95BDB;
// Initi state
is_init = (seed == sequence) && is_init;
if(!is_init)
{
state = NULL;
increment = (sequence << 1) | 1;
is_init = true;
LIB_NAMESPACE(numbers, random)(increment, increment);
state += (seed == NULL) ? 0x853C49E6748FEA9B : seed;
LIB_NAMESPACE(numbers, random)(NULL, NULL);
}
// Calculate
const ulong oldstate = state;
state = (oldstate * 0x5851F42D4C957F2D) + increment;
const uint xorshifted = (uint)(((oldstate >> 18) ^ oldstate) >> 27);
const uint rot = (uint)(oldstate >> 59);
// Return
const uint tmp = ((xorshifted >> rot) | (xorshifted << ((0 - rot) & 31)));
const double tmp2 = ((double)(((xorshifted >> rot) | (xorshifted << ((0 - rot) & 31))) / (double)UINT_MAX));
return((double)(((xorshifted >> rot) | (xorshifted << ((0 - rot) & 31))) / (double)UINT_MAX));
}
/*
{
// Static init
static int random_seed = (int)(::GetTickCount());
// Local init
int k = random_seed / 127773;
// Calculate random seed
random_seed = 16807 * ( random_seed - k * 127773 ) - k * 2836;
// Push random value into positive range
if( random_seed < NULL )
{ random_seed = random_seed + 2147483647; }
// Squish random result to range between 0.0 and 1.0
return((((double)random_seed) * 4.656612875E-10) / 0.999999999481554269);
}
*/
//+------------------------------------------------------------------+
//| flt_compare |
//+------------------------------------------------------------------+
const bool LIB_NAMESPACE_DEF(numbers, flt_cmp_invalid)(const float in, const uint ref)
{
const _32_bit cmp = in;
return(cmp.ui == ref);
}
//+------------------------------------------------------------------+
//| dbl_compare |
//+------------------------------------------------------------------+
const bool LIB_NAMESPACE_DEF(numbers, dbl_cmp_invalid)(const double in, const ulong ref)
{
const _64_bit cmp = in;
return(cmp.ul == ref);
}
#ifndef __MQL4_COMPATIBILITY_CODE__
}; // END Namespace numbers
}; // END Namespace LIB_MQLPLUS_LIBRARY_PREFIX
#endif
//
// END Simple math functions */
//*********************************************************************************************************************************************************/
#endif // LIB_MATH_SIMPLE_IMPLEMENTATION_MQH_INCLUDED