diff --git a/.clang-format b/.clang-format index 3442bc765..d64b4533c 100644 --- a/.clang-format +++ b/.clang-format @@ -2,3 +2,4 @@ Language: Cpp BasedOnStyle: Google ColumnLimit: 120 +IndentPPDirectives: BeforeHash diff --git a/Indicator/Indicator.h b/Indicator/Indicator.h index 53474ff19..ee68fe330 100644 --- a/Indicator/Indicator.h +++ b/Indicator/Indicator.h @@ -687,10 +687,13 @@ class Indicator : public IndicatorData { } if (_LastError != ERR_SUCCESS) { - datetime _bar_dt = (datetime)_bar_time; - Print("Error: Code ", _LastError, " while trying to retrieve entry at shift ", _rel_shift, " (absolute ", - ToAbsShift(_rel_shift), "), mode ", _mode, ", time ", _bar_dt); - DebugBreak(); + if (_LastError != 4806) { + // Error occured and it's not "4806 Requested data not found". + datetime _bar_dt = (datetime)_bar_time; + Print("Error: Code ", _LastError, " while trying to retrieve entry at shift ", _rel_shift, " (absolute ", + ToAbsShift(_rel_shift), "), mode ", _mode, ", time ", _bar_dt); + DebugBreak(); + } } } GetEntryAlter(_entry, _rel_shift); diff --git a/Indicator/IndicatorTf.provider.h b/Indicator/IndicatorTf.provider.h index 63669b218..3318b58da 100644 --- a/Indicator/IndicatorTf.provider.h +++ b/Indicator/IndicatorTf.provider.h @@ -25,8 +25,8 @@ #define INDICATOR_TF_PROVIDER_H #ifndef __MQL__ -// Allows the preprocessor to include a header file when it is needed. -#pragma once + // Allows the preprocessor to include a header file when it is needed. + #pragma once #endif /** @@ -159,9 +159,11 @@ class ItemsHistoryTfCandleProvider : public ItemsHistoryCandleProvider { // Adding candle to the output array. ArrayPushObject(_out_arr, _candle); - --_num_items; } + // Even if we don't form an item (a candle), we assume we've done one item. + --_num_items; + if (_dir == ITEMS_HISTORY_DIRECTION_FORWARD) { _from_time_ms += _candle_length_ms; } else { diff --git a/IndicatorLegacy.h b/IndicatorLegacy.h index 188d02fd7..31ee7226e 100644 --- a/IndicatorLegacy.h +++ b/IndicatorLegacy.h @@ -4,86 +4,138 @@ */ #ifndef __MQL__ -#pragma once + #pragma once #endif +// Includes. +#include "Platform.h" + #ifdef INDICATOR_LEGACY_VERSION_MT4 -#define INDICATOR_LEGACY_VERSION_DEFINED + #define INDICATOR_LEGACY_VERSION_DEFINED #endif #ifdef INDICATOR_LEGACY_VERSION_MT5 -#define INDICATOR_LEGACY_VERSION_DEFINED + #define INDICATOR_LEGACY_VERSION_DEFINED #endif -#ifndef INDICATOR_LEGACY_VERSION_DEFINED -#define INDICATOR_LEGACY_VERSION_MT5 -#define INDICATOR_LEGACY_VERSION_DEFINED +#ifdef INDICATOR_STANDALONE_VERSION_LONG + #define INDICATOR_STANDALONE_VERSION_DEFINED #endif -#ifdef __MQL4__ +#ifdef INDICATOR_STANDALONE_VERSION_SHORT + #define INDICATOR_STANDALONE_VERSION_DEFINED +#endif -#include -#include -#include -#include -#include +#ifdef INDICATOR_STANDALONE_VERSION_DEFINED + +/** + * Wrapper for future OnInit(). We may need to init indicator with candle and + * tick inidicator in the hierarchy. + */ +int OnInit() { + int _result = OnInitOriginal(); + Platform::AddWithDefaultBindings(INDICATOR_STANDALONE_INDI_PTR, Symbol(), (ENUM_TIMEFRAMES)Period()); + return _result; +} + + #define OnInit OnInitOriginal + + // In standalone mode without legacy mode we also need to wrap OnCalculate() as + // we need to call Platform::OnCalculate(). The only difference is that we + // don't need to change buffer's AsSeries flag in MT5. + #ifndef INDICATOR_LEGACY_VERSION_DEFINED + #ifndef INDICATOR_LEGACY_EMIT_ONCALCULATE_WRAPPER + #define INDICATOR_LEGACY_EMIT_ONCALCULATE_WRAPPER + #endif + + // No work required for buffers. + #define INDICATOR_LEGACY_VERSION_ACQUIRE_BUFFER + #define INDICATOR_LEGACY_VERSION_RELEASE_BUFFER + #ifdef INDICATOR_STANDALONE_VERSION_LONG + // We don't want to write two OnCalculate() wrappers. One is enough. + #define INDICATOR_LEGACY_VERSION_LONG + #endif // INDICATOR_STANDALONE_VERSION_LONG + #ifdef INDICATOR_STANDALONE_VERSION_SHORT + // We don't want to write two OnCalculate() wrappers. One is enough. + #define INDICATOR_LEGACY_VERSION_SHORT + #endif // INDICATOR_STANDALONE_VERSION_LONG + #endif // INDICATOR_LEGACY_VERSION_DEFINED + +#endif // INDICATOR_STANDALONE_VERSION_DEFINED #ifndef INDICATOR_LEGACY_VERSION_ACQUIRE_BUFFER -#define INDICATOR_LEGACY_VERSION_ACQUIRE_BUFFER + #define INDICATOR_LEGACY_VERSION_ACQUIRE_BUFFER #endif #ifndef INDICATOR_LEGACY_VERSION_RELEASE_BUFFER -#define INDICATOR_LEGACY_VERSION_RELEASE_BUFFER + #define INDICATOR_LEGACY_VERSION_RELEASE_BUFFER #endif -#ifdef INDICATOR_LEGACY_VERSION_MT5 +#ifdef INDICATOR_LEGACY_EMIT_ONCALCULATE_WRAPPER -#ifndef INDICATOR_LEGACY_VERSION_SHORT + #include + #include + #include + #include + #include + + #ifdef INDICATOR_LEGACY_VERSION_SHORT /** - * Replacement for future OHLC-based OnCalculate(). + * Wrapper for future price-based OnCalculate(). */ -int OnCalculate(const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], - const double& high[], const double& low[], const double& close[], const long& tick_volume[], - const long& volume[], const int& spread[]) { +int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double& price[]) { // We need to call Platform::Tick() and maybe also IndicatorData::EmitHistory() before. Platform::OnCalculate(rates_total, prev_calculated); INDICATOR_LEGACY_VERSION_ACQUIRE_BUFFER; - int _num_calculated = - OnCalculateMT5(rates_total, prev_calculated, time, open, high, low, close, tick_volume, volume, spread); + // NOTE: If compiler sees an error here about 'time' parameter conversion + // then you probably must do: + // #define INDICATOR_LEGACY_VERSION_LONG + // before including IndicatorLegacy.h + int _num_calculated = OnCalculateMT5(rates_total, prev_calculated, begin, price); INDICATOR_LEGACY_VERSION_RELEASE_BUFFER; return _num_calculated; } -#else + #endif // INDICATOR_LEGACY_VERSION_SHORT + + #ifdef INDICATOR_LEGACY_VERSION_LONG /** - * Replacement for future price-based OnCalculate(). + * Wrapper for future OHLC-based OnCalculate(). */ -int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double& price[]) { +int OnCalculate(const int rates_total, const int prev_calculated, const datetime& time[], const double& open[], + const double& high[], const double& low[], const double& close[], const long& tick_volume[], + const long& volume[], const int& spread[]) { // We need to call Platform::Tick() and maybe also IndicatorData::EmitHistory() before. Platform::OnCalculate(rates_total, prev_calculated); - INDICATOR_LEGACY_VERSION_ACQUIRE_BUFFER; - - // NOTE: If compiler sees an error here about parameter conversion then you - // probably must do: + // NOTE: If compiler sees an error here about parameter conversion + // then you probably must do: // #define INDICATOR_LEGACY_VERSION_SHORT // before including IndicatorLegacy.h - int _num_calculated = OnCalculateMT5(rates_total, prev_calculated, begin, price); + INDICATOR_LEGACY_VERSION_ACQUIRE_BUFFER; + + int _num_calculated = + OnCalculateMT5(rates_total, prev_calculated, time, open, high, low, close, tick_volume, volume, spread); INDICATOR_LEGACY_VERSION_RELEASE_BUFFER; return _num_calculated; } -#endif + #endif // INDICATOR_LEGACY_VERSION_LONG -#define OnCalculate OnCalculateMT5 + #define OnCalculate OnCalculateMT5 + +#endif // INDICATOR_LEGACY_EMIT_ONCALCULATE_WRAPPER + +#ifdef __MQL4__ + #ifdef INDICATOR_LEGACY_VERSION_MT5 /** * Wrapper class to be used by MQL4 code to allow calling MQL5's indicator functions like iMA() in MQL4. @@ -188,10 +240,10 @@ int CopyBuffer(int _handle, int _mode, int _start, int _count, double& _buffer[] return _num_copied; } -/** - * Defines wrapper class and global iNAME() indicator function (e.g., iMA(), iATR()). - */ -// Print(#FN_NAME " key = ", _key); \ + /** + * Defines wrapper class and global iNAME() indicator function (e.g., iMA(), iATR()). + */ + // Print(#FN_NAME " key = ", _key); \ #define DEFINE_LEGACY_INDICATOR(FN_NAME, BUILTIN_NAME, TYPED_PARAMS_COMMA, TYPED_PARAMS_NO_UDL_SEMICOLON, UNTYPED_PARAMS_COMMA_KEY, UNTYPED_PARAMS_COMMA_VALUES, ASSIGNMENTS_COMMA, UNTYPED_PARAMS_NO_UDL_COMMA_VALUES) \ class BUILTIN_NAME##Legacy : public IndicatorLegacy { \ TYPED_PARAMS_NO_UDL_SEMICOLON; \ @@ -218,92 +270,95 @@ int FN_NAME(TYPED_PARAMS_COMMA) { \ return PTR_ATTRIB(_indi.Ptr(), GetHandle()); \ } -/** - * 1-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_1(FN_NAME, INDI_NAME, T1, N1) \ - DEFINE_LEGACY_INDICATOR(INDI_NAME, T1 _##N1, T1 N1, _##N1, _##N1, N1(_##N1), N1); - -/** - * 2-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_2(FN_NAME, INDI_NAME, T1, N1, T2, N2) \ - DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2, T1 N1 SEMICOLON T2 N2, _##N1 COMMA _##N2, \ - _##N1 COMMA _##N2, N1(_##N1) COMMA N2(_##N2), N1 COMMA N2); - -/** - * 3-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_3(FN_NAME, INDI_NAME, T1, N1, T2, N2, T3, N3) \ - DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3, \ - T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3, _##N1 COMMA _##N2 COMMA _##N3, \ - _##N1 COMMA _##N2 COMMA _##N3, N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3), \ - N1 COMMA N2 COMMA N3); - -/** - * 4-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_4(FN_NAME, INDI_NAME) \ - DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4, \ - T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4, _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4, \ - N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4), N1 COMMA N2 COMMA N3 COMMA N4); - -/** - * 5-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_5(FN_NAME, INDI_NAME) \ - DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5, \ - T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5, \ - N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5), \ - N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5); - -/** - * 6-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_6(FN_NAME, INDI_NAME) \ - DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, \ - T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5 COMMA T6 _##N6, \ - T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5 SEMICOLON T6 N6, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6, \ - N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5) COMMA N6(_##N6), \ - N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5 COMMA N6); - -/** - * 7-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_7(FN_NAME, INDI_NAME) \ - DEFINE_LEGACY_INDICATOR( \ - FN_NAME, INDI_NAME, \ - T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5 COMMA T6 _##N6 COMMA T7 _##N7, \ - T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5 SEMICOLON T6 N6 SEMICOLON T7 N7, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7, \ - N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5) COMMA N6(_##N6) COMMA N7(_##N7), \ - N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5 COMMA N6 COMMA N7); - -/** - * 8-parameter helper for DEFINE_LEGACY_INDICATOR. - */ -#define DEFINE_LEGACY_INDICATOR_8(FN_NAME, INDI_NAME) \ - DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, \ - T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5 COMMA T6 _##N6 COMMA T7 \ - _##N7 COMMA T8 _##N8, \ - T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5 SEMICOLON T6 N6 \ - SEMICOLON T7 N7 SEMICOLON T8 N8, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7 COMMA _##N8, \ - _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7 COMMA _##N8, \ - N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5) COMMA N6(_##N6) \ - COMMA N7(_##N7) COMMA N8(_##N8), \ - N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5 COMMA N6 COMMA N7 COMMA N8); - -/** - * Replacement for future StringConcatenate(). - */ -#define StringConcatenate StringConcatenateMT5 + /** + * 1-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_1(FN_NAME, INDI_NAME, T1, N1) \ + DEFINE_LEGACY_INDICATOR(INDI_NAME, T1 _##N1, T1 N1, _##N1, _##N1, N1(_##N1), N1); + + /** + * 2-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_2(FN_NAME, INDI_NAME, T1, N1, T2, N2) \ + DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2, T1 N1 SEMICOLON T2 N2, _##N1 COMMA _##N2, \ + _##N1 COMMA _##N2, N1(_##N1) COMMA N2(_##N2), N1 COMMA N2); + + /** + * 3-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_3(FN_NAME, INDI_NAME, T1, N1, T2, N2, T3, N3) \ + DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3, \ + T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3, _##N1 COMMA _##N2 COMMA _##N3, \ + _##N1 COMMA _##N2 COMMA _##N3, N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3), \ + N1 COMMA N2 COMMA N3); + + /** + * 4-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_4(FN_NAME, INDI_NAME) \ + DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4, \ + T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4, _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4, \ + N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4), \ + N1 COMMA N2 COMMA N3 COMMA N4); + + /** + * 5-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_5(FN_NAME, INDI_NAME) \ + DEFINE_LEGACY_INDICATOR(FN_NAME, INDI_NAME, \ + T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5, \ + T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5, \ + N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5), \ + N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5); + + /** + * 6-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_6(FN_NAME, INDI_NAME) \ + DEFINE_LEGACY_INDICATOR( \ + FN_NAME, INDI_NAME, T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5 COMMA T6 _##N6, \ + T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5 SEMICOLON T6 N6, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6, \ + N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5) COMMA N6(_##N6), \ + N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5 COMMA N6); + + /** + * 7-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_7(FN_NAME, INDI_NAME) \ + DEFINE_LEGACY_INDICATOR( \ + FN_NAME, INDI_NAME, \ + T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5 COMMA T6 _##N6 COMMA T7 _##N7, \ + T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5 SEMICOLON T6 N6 SEMICOLON T7 N7, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7, \ + N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5) COMMA N6(_##N6) COMMA N7(_##N7), \ + N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5 COMMA N6 COMMA N7); + + /** + * 8-parameter helper for DEFINE_LEGACY_INDICATOR. + */ + #define DEFINE_LEGACY_INDICATOR_8(FN_NAME, INDI_NAME) \ + DEFINE_LEGACY_INDICATOR( \ + FN_NAME, INDI_NAME, \ + T1 _##N1 COMMA T2 _##N2 COMMA T3 _##N3 COMMA T4 _##N4 COMMA T5 _##N5 COMMA T6 _##N6 COMMA T7 _##N7 COMMA T8 \ + _##N8, \ + T1 N1 SEMICOLON T2 N2 SEMICOLON T3 N3 SEMICOLON T4 N4 SEMICOLON T5 N5 SEMICOLON T6 N6 SEMICOLON T7 N7 \ + SEMICOLON T8 N8, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7 COMMA _##N8, \ + _##N1 COMMA _##N2 COMMA _##N3 COMMA _##N4 COMMA _##N5 COMMA _##N6 COMMA _##N7 COMMA _##N8, \ + N1(_##N1) COMMA N2(_##N2) COMMA N3(_##N3) COMMA N4(_##N4) COMMA N5(_##N5) COMMA N6(_##N6) COMMA N7(_##N7) \ + COMMA N8(_##N8), \ + N1 COMMA N2 COMMA N3 COMMA N4 COMMA N5 COMMA N6 COMMA N7 COMMA N8); + + /** + * Replacement for future StringConcatenate(). + */ + #define StringConcatenate StringConcatenateMT5 /** * MQL4 wrapper of MQL5's StringConcatenate(). @@ -395,66 +450,66 @@ DEFINE_LEGACY_INDICATOR_2(iAD, iAD, string, symbol, int, period); // int iATR(string symbol, ENUM_TIMEFRAMES period, int ma_period); DEFINE_LEGACY_INDICATOR_3(iATR, iATR, string, symbol, int, period, int, ma_period); -// int iRSI(string symbol, ENUM_TIMEFRAMES period, int ma_period, int applied_price); -#define T1 string -#define N1 symbol -#define T2 int -#define N2 period -#define T3 int -#define N3 ma_period -#define T4 int -#define N4 applied_price + // int iRSI(string symbol, ENUM_TIMEFRAMES period, int ma_period, int applied_price); + #define T1 string + #define N1 symbol + #define T2 int + #define N2 period + #define T3 int + #define N3 ma_period + #define T4 int + #define N4 applied_price DEFINE_LEGACY_INDICATOR_4(iRSI, iRSI) -#undef T1 -#undef N1 -#undef T2 -#undef N2 -#undef T3 -#undef N3 -#undef T4 -#undef N4 -#undef T5 -#undef N5 -#undef T6 -#undef N6 - -// int iMA(string symbol, ENUM_TIMEFRAMES period, int ma_period, int ma_shift, ENUM_MA_METHOD ma_method, -#define T1 string -#define N1 symbol -#define T2 int -#define N2 period -#define T3 int -#define N3 ma_period -#define T4 int -#define N4 ma_shift -#define T5 int -#define N5 ma_method -#define T6 int -#define N6 applied_price + #undef T1 + #undef N1 + #undef T2 + #undef N2 + #undef T3 + #undef N3 + #undef T4 + #undef N4 + #undef T5 + #undef N5 + #undef T6 + #undef N6 + + // int iMA(string symbol, ENUM_TIMEFRAMES period, int ma_period, int ma_shift, ENUM_MA_METHOD ma_method, + #define T1 string + #define N1 symbol + #define T2 int + #define N2 period + #define T3 int + #define N3 ma_period + #define T4 int + #define N4 ma_shift + #define T5 int + #define N5 ma_method + #define T6 int + #define N6 applied_price DEFINE_LEGACY_INDICATOR_6(iMA, iMA) -#undef T1 -#undef N1 -#undef T2 -#undef N2 -#undef T3 -#undef N3 -#undef T4 -#undef N4 -#undef T5 -#undef N5 -#undef T6 -#undef N6 - -#endif // INDICATOR_LEGACY_VERSION_MT5 -#endif // __MQL4__ + #undef T1 + #undef N1 + #undef T2 + #undef N2 + #undef T3 + #undef N3 + #undef T4 + #undef N4 + #undef T5 + #undef N5 + #undef T6 + #undef N6 + + #endif // INDICATOR_LEGACY_VERSION_MT5 +#endif // __MQL4__ #ifdef __MQL5__ -#ifdef INDICATOR_LEGACY_VERSION_MT4 + #ifdef INDICATOR_LEGACY_VERSION_MT4 -/** - * Replacement for future StringConcatenate(). - */ -#define StringConcatenate StringConcatenateMT4 + /** + * Replacement for future StringConcatenate(). + */ + #define StringConcatenate StringConcatenateMT4 /** * MQL5 wrapper of MQL4's StringConcatenate(). @@ -522,5 +577,5 @@ string StringConcatenateMT4(string& _result, A _a) { return (string)_a; } -#endif // INDICATOR_LEGACY_VERSION_MT4 -#endif // __MQL5__ + #endif // INDICATOR_LEGACY_VERSION_MT4 +#endif // __MQL5__ diff --git a/Indicators/Indi_Bands.mqh b/Indicators/Indi_Bands.mqh index 9300cb9c5..fcd390dbd 100644 --- a/Indicators/Indi_Bands.mqh +++ b/Indicators/Indi_Bands.mqh @@ -176,33 +176,33 @@ class Indi_Bands : public Indicator { /** * OnCalculate() method for Bands indicator. */ - static int Calculate(INDICATOR_CALCULATE_METHOD_PARAMS_SHORT, ValueStorage &ExtMLBuffer, - ValueStorage &ExtTLBuffer, ValueStorage &ExtBLBuffer, - ValueStorage &ExtStdDevBuffer, int InpBandsPeriod, int InpBandsShift, - double InpBandsDeviations) { + static int Calculate(INDICATOR_CALCULATE_METHOD_PARAMS_SHORT, ValueStorage &_ExtMLBuffer, + ValueStorage &_ExtTLBuffer, ValueStorage &_ExtBLBuffer, + ValueStorage &_ExtStdDevBuffer, int _InpBandsPeriod, int _InpBandsShift, + double _InpBandsDeviations) { int ExtBandsPeriod, ExtBandsShift; double ExtBandsDeviations; int ExtPlotBegin = 0; - if (InpBandsPeriod < 2) { + if (_InpBandsPeriod < 2) { ExtBandsPeriod = 20; PrintFormat("Incorrect value for input variable InpBandsPeriod=%d. Indicator will use value=%d for calculations.", - InpBandsPeriod, ExtBandsPeriod); + _InpBandsPeriod, ExtBandsPeriod); } else - ExtBandsPeriod = InpBandsPeriod; - if (InpBandsShift < 0) { + ExtBandsPeriod = _InpBandsPeriod; + if (_InpBandsShift < 0) { ExtBandsShift = 0; PrintFormat("Incorrect value for input variable InpBandsShift=%d. Indicator will use value=%d for calculations.", - InpBandsShift, ExtBandsShift); + _InpBandsShift, ExtBandsShift); } else - ExtBandsShift = InpBandsShift; - if (InpBandsDeviations == 0.0) { + ExtBandsShift = _InpBandsShift; + if (_InpBandsDeviations == 0.0) { ExtBandsDeviations = 2.0; PrintFormat( "Incorrect value for input variable InpBandsDeviations=%f. Indicator will use value=%f for calculations.", - InpBandsDeviations, ExtBandsDeviations); + _InpBandsDeviations, ExtBandsDeviations); } else - ExtBandsDeviations = InpBandsDeviations; + ExtBandsDeviations = _InpBandsDeviations; if (rates_total < ExtPlotBegin) return (0); //--- indexes draw begin settings, when we've recieved previous begin @@ -221,13 +221,13 @@ class Indi_Bands : public Indicator { //--- main cycle for (int i = pos; i < rates_total && !IsStopped(); i++) { //--- middle line - ExtMLBuffer[i] = Indi_MA::SimpleMA(i, ExtBandsPeriod, price); + _ExtMLBuffer[i] = Indi_MA::SimpleMA(i, ExtBandsPeriod, price); //--- calculate and write down StdDev - ExtStdDevBuffer[i] = StdDev_Func(i, price, ExtMLBuffer, ExtBandsPeriod); + _ExtStdDevBuffer[i] = StdDev_Func(i, price, _ExtMLBuffer, ExtBandsPeriod); //--- upper line - ExtTLBuffer[i] = ExtMLBuffer[i] + ExtBandsDeviations * ExtStdDevBuffer[i].Get(); + _ExtTLBuffer[i] = _ExtMLBuffer[i] + ExtBandsDeviations * _ExtStdDevBuffer[i].Get(); //--- lower line - ExtBLBuffer[i] = ExtMLBuffer[i] - ExtBandsDeviations * ExtStdDevBuffer[i].Get(); + _ExtBLBuffer[i] = _ExtMLBuffer[i] - ExtBandsDeviations * _ExtStdDevBuffer[i].Get(); } //--- OnCalculate done. Return new prev_calculated. return (rates_total); diff --git a/Indicators/Indi_MA.mqh b/Indicators/Indi_MA.mqh index 1af92cd2e..051e8cd29 100644 --- a/Indicators/Indi_MA.mqh +++ b/Indicators/Indi_MA.mqh @@ -25,6 +25,8 @@ #define INDI_MA_MQH // Includes. +#include + #include "../Dict.mqh" #include "../DictObject.mqh" #include "../Indicator/Indicator.h" @@ -33,7 +35,14 @@ #include "../Storage/ValueStorage.h" #include "../String.mqh" -#ifndef __MQL4__ +#ifdef __MQL4__ +// MQL4 version of the method doesn't have last parameter. +int LinearWeightedMAOnBuffer(const int rates_total, const int prev_calculated, const int begin, const int period, + const double &price[], double &buffer[]) { + int _weight_sum; + return LinearWeightedMAOnBuffer(rates_total, prev_calculated, begin, period, price, buffer, _weight_sum); +} +#else // !__MQL__4 // Defines global functions (for MQL4 backward compability). double iMA(string _symbol, int _tf, int _ma_period, int _ma_shift, int _ma_method, int _ap, int _shift) { ResetLastError(); @@ -45,7 +54,7 @@ double iMAOnArray(double &_arr[], int _total, int _period, int _ma_shift, int _m ResetLastError(); return Indi_MA::iMAOnArray(_arr, _total, _period, _ma_shift, _ma_method, _abs_shift, _cache); } -#endif +#endif // __MQL4__ // Structs. struct IndiMAParams : IndicatorParams { diff --git a/Indicators/Tick/Indi_TickMt.mqh b/Indicators/Tick/Indi_TickMt.mqh index 98e33a884..320c3f298 100644 --- a/Indicators/Tick/Indi_TickMt.mqh +++ b/Indicators/Tick/Indi_TickMt.mqh @@ -26,8 +26,8 @@ */ #ifndef __MQL__ -// Allows the preprocessor to include a header file when it is needed. -#pragma once + // Allows the preprocessor to include a header file when it is needed. + #pragma once #endif // Includes. @@ -196,10 +196,10 @@ class Indi_TickMt : public IndicatorTick _tick(_tmp_ticks[i]); -#ifdef __debug_verbose__ + #ifdef __debug_verbose__ Print("Fetched tick at ", TimeToString(_tmp_ticks[i].time, TIME_DATE | TIME_MINUTES | TIME_SECONDS), ": ", _tmp_ticks[i].ask, ", ", _tmp_ticks[i].bid); -#endif + #endif ArrayPushObject(_out_ticks, _tick); } @@ -232,6 +232,9 @@ class Indi_TickMt : public IndicatorTick -#include -#include -#include + #include + #include + #include + #include #endif #ifndef __MQL__ -#define __FUNCSIG__ __FUNCTION__ + #define __FUNCSIG__ __FUNCTION__ #endif #ifdef __MQL__ -#define ASSIGN_TO_THIS(TYPE, VALUE) ((TYPE)this) = ((TYPE)VALUE) + #define ASSIGN_TO_THIS(TYPE, VALUE) ((TYPE)this) = ((TYPE)VALUE) #else -#define ASSIGN_TO_THIS(TYPE, VALUE) ((TYPE&)*this) = ((TYPE&)VALUE) + #define ASSIGN_TO_THIS(TYPE, VALUE) ((TYPE&)*this) = ((TYPE&)VALUE) #endif // Pointers. #ifdef __MQL__ -#define GET_PTR(obj) GetPointer(obj) -#define THIS_ATTR -#define THIS_PTR (&this) -#define THIS_REF this -#define PTR_DEREF . -#define PTR_ATTRIB(O, A) O.A -#define PTR_ATTRIB2(O, A, B) O.A.B -#define PTR_TO_REF(PTR) PTR -#define MAKE_REF_FROM_PTR(TYPE, NAME, PTR) TYPE* NAME = PTR -#define REF_DEREF .Ptr(). -#define int64 long + #define GET_PTR(obj) GetPointer(obj) + #define THIS_ATTR + #define THIS_PTR (&this) + #define THIS_REF this + #define PTR_DEREF . + #define PTR_ATTRIB(O, A) O.A + #define PTR_ATTRIB2(O, A, B) O.A.B + #define PTR_TO_REF(PTR) PTR + #define MAKE_REF_FROM_PTR(TYPE, NAME, PTR) TYPE* NAME = PTR + #define REF_DEREF .Ptr(). + #define int64 long #else -#define GET_PTR(obj) (*obj) -#define THIS_ATTR this-> -#define THIS_PTR (this) -#define THIS_REF (*this) -#define PTR_DEREF -> -#define PTR_ATTRIB(O, A) O->A -#define PTR_ATTRIB2(O, A, B) O->A->B -#define PTR_TO_REF(PTR) (*PTR) -#define MAKE_REF_FROM_PTR(TYPE, NAME, PTR) TYPE& NAME = PTR -#define REF_DEREF .Ptr()-> -#define int64 long long + #define GET_PTR(obj) (*obj) + #define THIS_ATTR this-> + #define THIS_PTR (this) + #define THIS_REF (*this) + #define PTR_DEREF -> + #define PTR_ATTRIB(O, A) O->A + #define PTR_ATTRIB2(O, A, B) O->A->B + #define PTR_TO_REF(PTR) (*PTR) + #define MAKE_REF_FROM_PTR(TYPE, NAME, PTR) TYPE& NAME = PTR + #define REF_DEREF .Ptr()-> + #define int64 long long #endif // References. #ifdef __cplusplus -#define REF(X) (&X) + #define REF(X) (&X) #else -#define REF(X) X& + #define REF(X) X& #endif // Arrays and references to arrays. #define _COMMA , #ifdef __MQL__ -#define ARRAY_DECLARATION_BRACKETS [] + #define ARRAY_DECLARATION_BRACKETS [] #else -// C++'s _cpp_array is an object, so no brackets are needed. -#define ARRAY_DECLARATION_BRACKETS + // C++'s _cpp_array is an object, so no brackets are needed. + #define ARRAY_DECLARATION_BRACKETS #endif #ifdef __MQL__ -/** - * Reference to object. - */ -#define CONST_REF_TO(T) const T + /** + * Reference to object. + */ + #define CONST_REF_TO(T) const T -/** - * Reference to the array. - * - * @usage - * ARRAY_REF(, ) - */ -#define ARRAY_TYPE(T) T[] -#define ARRAY_REF(T, N) REF(T) N ARRAY_DECLARATION_BRACKETS -#define FIXED_ARRAY_REF(T, N, S) ARRAY_REF(T, N) + /** + * Reference to the array. + * + * @usage + * ARRAY_REF(, ) + */ + #define ARRAY_TYPE(T) T[] + #define ARRAY_REF(T, N) REF(T) N ARRAY_DECLARATION_BRACKETS + #define FIXED_ARRAY_REF(T, N, S) ARRAY_REF(T, N) -#define CONST_ARRAY_REF(T, N) const N ARRAY_DECLARATION_BRACKETS + #define CONST_ARRAY_REF(T, N) const N ARRAY_DECLARATION_BRACKETS -/** - * Array definition. - * - * @usage - * ARRAY(, ) - */ -#define ARRAY(T, N) T N[] + /** + * Array definition. + * + * @usage + * ARRAY(, ) + */ + #define ARRAY(T, N) T N[] #else -/** - * Reference to object. - */ -#define CONST_REF_TO(T) const T& + /** + * Reference to object. + */ + #define CONST_REF_TO(T) const T& -/** + /** - * Reference to the array. - * - * @usage - * ARRAY_REF(, ) - */ -#define ARRAY_TYPE(T) _cpp_array -#define ARRAY_REF(T, N) ARRAY_TYPE(T)& N -#define FIXED_ARRAY_REF(T, N, S) T(&N)[S] + * Reference to the array. + * + * @usage + * ARRAY_REF(, ) + */ + #define ARRAY_TYPE(T) _cpp_array + #define ARRAY_REF(T, N) ARRAY_TYPE(T) & N + #define FIXED_ARRAY_REF(T, N, S) T(&N)[S] -#define CONST_ARRAY_REF(T, N) const _cpp_array& N + #define CONST_ARRAY_REF(T, N) const _cpp_array& N -/** - * Array definition. - * - * @usage - * ARRAY(, ) - */ -#define ARRAY(T, N) ::_cpp_array N + /** + * Array definition. + * + * @usage + * ARRAY(, ) + */ + #define ARRAY(T, N) ::_cpp_array N #endif // typename(T) #ifndef __MQL__ -#define typename(T) typeid(T).name() + #define typename(T) typeid(T).name() #endif // C++ array class. @@ -235,19 +235,19 @@ class _cpp_array { void setIsSeries(bool _isSeries) { m_isSeries = _isSeries; } }; -#ifdef EMSCRIPTEN -#include + #ifdef EMSCRIPTEN + #include -#define REGISTER_ARRAY_OF(N, T, D) \ - EMSCRIPTEN_BINDINGS(N) { \ - emscripten::register_vector(D "CppVector"); \ - emscripten::class_<_cpp_array>(D) \ - .constructor() \ - .function("Push", &_cpp_array::push) \ - .function("Size", &_cpp_array::size); \ - } + #define REGISTER_ARRAY_OF(N, T, D) \ + EMSCRIPTEN_BINDINGS(N) { \ + emscripten::register_vector(D "CppVector"); \ + emscripten::class_<_cpp_array>(D) \ + .constructor() \ + .function("Push", &_cpp_array::push) \ + .function("Size", &_cpp_array::size); \ + } -#endif + #endif template class _cpp_array; @@ -270,14 +270,14 @@ class color { // MQL defines. #ifndef __MQL__ -#define WHOLE_ARRAY -1 // For processing the entire array. + #define WHOLE_ARRAY -1 // For processing the entire array. #endif // Converts string into C++-style string pointer. #ifdef __MQL__ -#define C_STR(S) S + #define C_STR(S) S #else -#define C_STR(S) cstring_from(S) + #define C_STR(S) cstring_from(S) inline const char* cstring_from(const std::string& _value) { return _value.c_str(); } #endif @@ -295,19 +295,19 @@ inline bool IsNull(const string& str) { return str == ""; } * STRUCT_ENUM(, ) */ #ifdef __MQL4__ -#define STRUCT_ENUM(S, E) E + #define STRUCT_ENUM(S, E) E #else -#define STRUCT_ENUM(S, E) S::E + #define STRUCT_ENUM(S, E) S::E #endif #ifndef __MQL__ -// Additional enum values for ENUM_SYMBOL_INFO_DOUBLE -#define SYMBOL_MARGIN_LIMIT ((ENUM_SYMBOL_INFO_DOUBLE)46) -#define SYMBOL_MARGIN_MAINTENANCE ((ENUM_SYMBOL_INFO_DOUBLE)43) -#define SYMBOL_MARGIN_LONG ((ENUM_SYMBOL_INFO_DOUBLE)44) -#define SYMBOL_MARGIN_SHORT ((ENUM_SYMBOL_INFO_DOUBLE)45) -#define SYMBOL_MARGIN_STOP ((ENUM_SYMBOL_INFO_DOUBLE)47) -#define SYMBOL_MARGIN_STOPLIMIT ((ENUM_SYMBOL_INFO_DOUBLE)48) + // Additional enum values for ENUM_SYMBOL_INFO_DOUBLE + #define SYMBOL_MARGIN_LIMIT ((ENUM_SYMBOL_INFO_DOUBLE)46) + #define SYMBOL_MARGIN_MAINTENANCE ((ENUM_SYMBOL_INFO_DOUBLE)43) + #define SYMBOL_MARGIN_LONG ((ENUM_SYMBOL_INFO_DOUBLE)44) + #define SYMBOL_MARGIN_SHORT ((ENUM_SYMBOL_INFO_DOUBLE)45) + #define SYMBOL_MARGIN_STOP ((ENUM_SYMBOL_INFO_DOUBLE)47) + #define SYMBOL_MARGIN_STOPLIMIT ((ENUM_SYMBOL_INFO_DOUBLE)48) #endif template @@ -360,14 +360,14 @@ template <> _NULL_VALUE::operator string() const { return _empty_string; } -#define NULL_STRING "" + #define NULL_STRING "" #else -#define NULL_VALUE NULL -#define NULL_STRING NULL + #define NULL_VALUE NULL + #define NULL_STRING NULL #endif #ifndef __MQL__ -#include "Chart.enum.h" + #include "Chart.enum.h" /** * Returns currently selected period for platform. */ @@ -389,9 +389,9 @@ extern ENUM_TIMEFRAMES Period(); #define SET_BUFFER_AS_SERIES_FOR_TARGET(A) ArraySetAsSeries(A, false); #ifdef __MQL4__ -#define SET_BUFFER_AS_SERIES_FOR_HOST(A) ArraySetAsSeries(A, true); + #define SET_BUFFER_AS_SERIES_FOR_HOST(A) ArraySetAsSeries(A, true); #else -#define SET_BUFFER_AS_SERIES_FOR_HOST(A) ArraySetAsSeries(A, false); + #define SET_BUFFER_AS_SERIES_FOR_HOST(A) ArraySetAsSeries(A, false); #endif // Ensures that we do RELEASE_BUFFERx after ACQUIRE_BUFFERx. @@ -427,109 +427,141 @@ struct AsSeriesReleaseEnsurer { #define SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(NUM_BUFFS) _as_series_release_ensurer.done(NUM_BUFFS); // Acquiring buffer is preparing it to be used as in MQL5. -#define ACQUIRE_BUFFER1(A) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ +#define ACQUIRE_BUFFER1_NO_ENSURE(A) SET_BUFFER_AS_SERIES_FOR_TARGET(A); +#define ACQUIRE_BUFFER2_NO_ENSURE(A, B) \ + SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(B); +#define ACQUIRE_BUFFER3_NO_ENSURE(A, B, C) \ + SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(C); +#define ACQUIRE_BUFFER4_NO_ENSURE(A, B, C, D) \ + SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(D); +#define ACQUIRE_BUFFER5_NO_ENSURE(A, B, C, D, E) \ + SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(E); +#define ACQUIRE_BUFFER6_NO_ENSURE(A, B, C, D, E, F) \ + SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(E); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(F); +#define ACQUIRE_BUFFER7_NO_ENSURE(A, B, C, D, E, F, G) \ + SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(E); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(F); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(G); +#define ACQUIRE_BUFFER8_NO_ENSURE(A, B, C, D, E, F, G, H) \ + SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(E); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(F); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(G); \ + SET_BUFFER_AS_SERIES_FOR_TARGET(H); + +#define ACQUIRE_BUFFER1(A) \ + ACQUIRE_BUFFER1_NO_ENSURE(A); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(1); -#define ACQUIRE_BUFFER2(A, B) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ +#define ACQUIRE_BUFFER2(A, B) \ + ACQUIRE_BUFFER2_NO_ENSURE(A, B); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(2); #define ACQUIRE_BUFFER3(A, B, C) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ + ACQUIRE_BUFFER3_NO_ENSURE(A, B, C); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(3); -#define ACQUIRE_BUFFER4(A, B, C, D) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ +#define ACQUIRE_BUFFER4(A, B, C, D) \ + ACQUIRE_BUFFER4_NO_ENSURE(A, B, C, D); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(4); -#define ACQUIRE_BUFFER5(A, B, C, D, E) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(E); \ +#define ACQUIRE_BUFFER5(A, B, C, D, E) \ + ACQUIRE_BUFFER5_NO_ENSURE(A, B, C, D, E); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(5); -#define ACQUIRE_BUFFER6(A, B, C, D, E, F) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(E); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(F); \ +#define ACQUIRE_BUFFER6(A, B, C, D, E, F) \ + ACQUIRE_BUFFER6_NO_ENSURE(A, B, C, D, E, F); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(6); -#define ACQUIRE_BUFFER7(A, B, C, D, E, F, G) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(E); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(F); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(G); \ +#define ACQUIRE_BUFFER7(A, B, C, D, E, F, G) \ + ACQUIRE_BUFFER7_NO_ENSURE(A, B, C, D, E, F, G); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(7); -#define ACQUIRE_BUFFER8(A, B, C, D, E, F, G, H) \ - SET_BUFFER_AS_SERIES_FOR_TARGET(A); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(B); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(C); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(D); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(E); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(F); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(G); \ - SET_BUFFER_AS_SERIES_FOR_TARGET(H); \ +#define ACQUIRE_BUFFER8(A, B, C, D, E, F, G, H) \ + ACQUIRE_BUFFER8_NO_ENSURE(A, B, C, D, E, F, G, H); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_BEGIN(8); // Releasing buffer is setting its AsSeries as the default in the host language. -#define RELEASE_BUFFER1(A) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ +#define RELEASE_BUFFER1_NO_ENSURE(A) SET_BUFFER_AS_SERIES_FOR_HOST(A) +#define RELEASE_BUFFER2_NO_ENSURE(A, B) \ + SET_BUFFER_AS_SERIES_FOR_HOST(A); \ + SET_BUFFER_AS_SERIES_FOR_HOST(B); +#define RELEASE_BUFFER3_NO_ENSURE(A, B, C) \ + SET_BUFFER_AS_SERIES_FOR_HOST(A); \ + SET_BUFFER_AS_SERIES_FOR_HOST(B); \ + SET_BUFFER_AS_SERIES_FOR_HOST(C); +#define RELEASE_BUFFER4_NO_ENSURE(A, B, C, D) \ + SET_BUFFER_AS_SERIES_FOR_HOST(A); \ + SET_BUFFER_AS_SERIES_FOR_HOST(B); \ + SET_BUFFER_AS_SERIES_FOR_HOST(C); \ + SET_BUFFER_AS_SERIES_FOR_HOST(D); +#define RELEASE_BUFFER5_NO_ENSURE(A, B, C, D, E) \ + SET_BUFFER_AS_SERIES_FOR_HOST(A); \ + SET_BUFFER_AS_SERIES_FOR_HOST(B); \ + SET_BUFFER_AS_SERIES_FOR_HOST(C); \ + SET_BUFFER_AS_SERIES_FOR_HOST(D); \ + SET_BUFFER_AS_SERIES_FOR_HOST(E); +#define RELEASE_BUFFER6_NO_ENSURE(A, B, C, D, E, F) \ + SET_BUFFER_AS_SERIES_FOR_HOST(A); \ + SET_BUFFER_AS_SERIES_FOR_HOST(B); \ + SET_BUFFER_AS_SERIES_FOR_HOST(C); \ + SET_BUFFER_AS_SERIES_FOR_HOST(D); \ + SET_BUFFER_AS_SERIES_FOR_HOST(E); \ + SET_BUFFER_AS_SERIES_FOR_HOST(F); +#define RELEASE_BUFFER7_NO_ENSURE(A, B, C, D, E, F, G) \ + SET_BUFFER_AS_SERIES_FOR_HOST(A); \ + SET_BUFFER_AS_SERIES_FOR_HOST(B); \ + SET_BUFFER_AS_SERIES_FOR_HOST(C); \ + SET_BUFFER_AS_SERIES_FOR_HOST(D); \ + SET_BUFFER_AS_SERIES_FOR_HOST(E); \ + SET_BUFFER_AS_SERIES_FOR_HOST(F); \ + SET_BUFFER_AS_SERIES_FOR_HOST(G); +#define RELEASE_BUFFER8_NO_ENSURE(A, B, C, D, E, F, G, H) \ + SET_BUFFER_AS_SERIES_FOR_HOST(A); \ + SET_BUFFER_AS_SERIES_FOR_HOST(B); \ + SET_BUFFER_AS_SERIES_FOR_HOST(C); \ + SET_BUFFER_AS_SERIES_FOR_HOST(D); \ + SET_BUFFER_AS_SERIES_FOR_HOST(E); \ + SET_BUFFER_AS_SERIES_FOR_HOST(F); \ + SET_BUFFER_AS_SERIES_FOR_HOST(G); \ + SET_BUFFER_AS_SERIES_FOR_HOST(H); + +#define RELEASE_BUFFER1(A) \ + RELEASE_BUFFER1_NO_ENSURE(A); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(1); -#define RELEASE_BUFFER2(A, B) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ - SET_BUFFER_AS_SERIES_FOR_HOST(B); \ +#define RELEASE_BUFFER2(A, B) \ + RELEASE_BUFFER2_NO_ENSURE(A, B); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(2); -#define RELEASE_BUFFER3(A, B, C) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ - SET_BUFFER_AS_SERIES_FOR_HOST(B); \ - SET_BUFFER_AS_SERIES_FOR_HOST(C); \ +#define RELEASE_BUFFER3(A, B, C) \ + RELEASE_BUFFER3_NO_ENSURE(A, B, C); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(3); -#define RELEASE_BUFFER4(A, B, C, D) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ - SET_BUFFER_AS_SERIES_FOR_HOST(B); \ - SET_BUFFER_AS_SERIES_FOR_HOST(C); \ - SET_BUFFER_AS_SERIES_FOR_HOST(D); \ +#define RELEASE_BUFFER4(A, B, C, D) \ + RELEASE_BUFFER4_NO_ENSURE(A, B, C, D); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(4); -#define RELEASE_BUFFER5(A, B, C, D, E) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ - SET_BUFFER_AS_SERIES_FOR_HOST(B); \ - SET_BUFFER_AS_SERIES_FOR_HOST(C); \ - SET_BUFFER_AS_SERIES_FOR_HOST(D); \ - SET_BUFFER_AS_SERIES_FOR_HOST(E); \ +#define RELEASE_BUFFER5(A, B, C, D, E) \ + RELEASE_BUFFER5_NO_ENSURE(A, B, C, D, E); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(5); -#define RELEASE_BUFFER6(A, B, C, D, E, F) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ - SET_BUFFER_AS_SERIES_FOR_HOST(B); \ - SET_BUFFER_AS_SERIES_FOR_HOST(C); \ - SET_BUFFER_AS_SERIES_FOR_HOST(D); \ - SET_BUFFER_AS_SERIES_FOR_HOST(E); \ - SET_BUFFER_AS_SERIES_FOR_HOST(F); \ +#define RELEASE_BUFFER6(A, B, C, D, E, F) \ + RELEASE_BUFFER6_NO_ENSURE(A, B, C, D, E, F); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(6); -#define RELEASE_BUFFER7(A, B, C, D, E, F, G) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ - SET_BUFFER_AS_SERIES_FOR_HOST(B); \ - SET_BUFFER_AS_SERIES_FOR_HOST(C); \ - SET_BUFFER_AS_SERIES_FOR_HOST(D); \ - SET_BUFFER_AS_SERIES_FOR_HOST(E); \ - SET_BUFFER_AS_SERIES_FOR_HOST(F); \ - SET_BUFFER_AS_SERIES_FOR_HOST(G); \ +#define RELEASE_BUFFER7(A, B, C, D, E, F, G) \ + RELEASE_BUFFER7_NO_ENSURE(A, B, C, D, E, F, G); \ SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(7); -#define RELEASE_BUFFER8(A, B, C, D, E, F, G, H) \ - SET_BUFFER_AS_SERIES_FOR_HOST(A); \ - SET_BUFFER_AS_SERIES_FOR_HOST(B); \ - SET_BUFFER_AS_SERIES_FOR_HOST(C); \ - SET_BUFFER_AS_SERIES_FOR_HOST(D); \ - SET_BUFFER_AS_SERIES_FOR_HOST(E); \ - SET_BUFFER_AS_SERIES_FOR_HOST(F); \ - SET_BUFFER_AS_SERIES_FOR_HOST(G); \ - SET_BUFFER_AS_SERIES_FOR_HOST(H); \ - SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(8); +#define RELEASE_BUFFER8(A, B, C, D, E, F, G, H) \ + RELEASE_BUFFER8_NO_ENSURE(A, B, C, D, E, F, G, H); \ + SET_BUFFER_AS_SERIES_RELEASE_ENSURER_END(8); \ No newline at end of file