EA-Setka-2/logic/defines.mqh
super.admin a4b861dd93 convert
2025-05-30 14:50:44 +02:00

1407 lines
No EOL
122 KiB
MQL5

#ifndef DEFINES_MQH
#define DEFINES_MQH
#define DEFAULT_SET_NAME "default"
#define BUILD __MQLBUILD__
#include "setting.mqh"
#include "scheduler.mqh"
#include "..\Libs\Price_Compare.mqh"
#define conv_expression(exp) \
ext_string::replace( ext_string::replace( ext_string::replace( ext_string::replace( exp, "!=", SRC_DEFINES_NOT_EQUALLY ), "==", SRC_DEFINES_EQUALLY ), "||", SRC_DEFINES_OR ), "&&", SRC_DEFINES_AND )
#ifdef FOR_OPTIMIZATION
#define def_to_str_from_int( value ) EXT_STRING_EMPTY
#define valid_tboo(field) ( true )
#define valid_tint(field) ( true )
#define valid_tdou(field) ( true )
#define valid_tenu(field) ( true )
#define valid_tstr(field) ( true )
//--- elavr 190926
#define valid_tfrm(field) ( true )
//--- elavr 190926
#define valid_bool(field, expression) ( expression )
#define valid_inte(field, expression) ( expression )
#define valid_doub(field, expression) ( expression )
#define valid_enum(field, expression) ( expression )
#else
#define def_to_str_from_int( value ) StringFormat("%s = %s", #value, IntegerToString( value ) )
#define valid_tboo(field) \
defines_validate( true,\
EXT_STRING_EMPTY,\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, ( field ? "true" : "false" ) ) )
#define valid_tint(field) \
defines_validate( true,\
EXT_STRING_EMPTY,\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, IntegerToString ( field ) ) )
#define valid_tdou(field) \
defines_validate( true,\
EXT_STRING_EMPTY,\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, DoubleToString ( field ) ) )
#define valid_tenu(field) \
defines_validate( true,\
EXT_STRING_EMPTY,\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, EnumToString ( field ) ) )
#define valid_tstr(field) \
defines_validate( true,\
EXT_STRING_EMPTY,\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, field ) )
//--- elavr 190926
#define valid_tfrm(field) \
defines_validate(check_timeframe(field),\
StringFormat ( SRC_DEFINES_ENUM_ERROR_MSG, field, #field, "ENUM_TIMEFRAMES"),\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, EnumToString ( field ) ) )
//--- elavr 190926
#define valid_bool(field, expression) \
defines_validate( expression,\
StringFormat ( SRC_DEFINES_ERROR_MSG, #field, conv_expression(#expression) ),\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, ( field ? "true" : "false" ) ) )
#define valid_inte(field, expression) \
defines_validate( expression,\
StringFormat ( SRC_DEFINES_ERROR_MSG, #field, conv_expression(#expression) ),\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, IntegerToString ( field ) ) )
#define valid_doub(field, expression) \
defines_validate( expression,\
StringFormat ( SRC_DEFINES_ERROR_MSG, #field, conv_expression(#expression) ),\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, DoubleToString ( field ) ) )
#define valid_enum(field, expression) \
defines_validate( expression,\
StringFormat ( SRC_DEFINES_ERROR_MSG, #field, conv_expression(#expression) ),\
StringFormat ( SRC_DEFINES_VALID_MSG, #field, EnumToString ( field ) ) )
//--- elavr 190926
// Проверка значения таймфрейма на валидность
bool check_timeframe(ENUM_TIMEFRAMES value){
ResetLastError();
EnumToString(value);
int err=GetLastError();
if ((err==0) && (value!=PERIOD_CURRENT))
return true;
ResetLastError();
return false;
}
//--- elavr 190926
bool defines_validate ( bool value, string not_valid_msg, string valid_msg )
{
_IN1("");
log_info ( valid_msg );
if ( value ) {
_IN2("");
return true;
}
log_error ( not_valid_msg );
MessageBox ( not_valid_msg, SRC_DEFINES_ERROR_INPUT, MB_OK );
return false;
}
#endif
#ifdef NODE
#define INPUT
#define SINPUT
input int Iterator = 0;
#else
#define INPUT input
#define SINPUT sinput
#endif
#define DEFINES_LABEL_NAME_V( label_name,MJR,MNR ) SINPUT string label_name##_##MJR##_##MNR
#ifdef MQL5
#define DEFINES_LABEL_NAME(label_name, text) INPUT group TOS(text)
#else
#define DEFINES_LABEL_NAME(label_name,text) DEFINES_LABEL_NAME_V(label_name, MAJOR_VER, MINOR_VER)=TOS(text)
#endif
#define B2S(B) B?"True":"False"
DEFINES_LABEL_NAME ( set_info, "Информация о сете и авторе"); //===== Информация о сете
// Имя сета
SINPUT string set_name = DEFAULT_SET_NAME; // Название сета
// Пара сета
SINPUT string set_pair = EXT_STRING_EMPTY; // Валютная пара
// Автор сета
SINPUT string set_author = EXT_STRING_EMPTY; // Автор сета
// Версия сета
SINPUT string set_version = EXT_STRING_EMPTY; // Версия сета
// Основные (общие) настройки
DEFINES_LABEL_NAME ( main_settings, "Общие настройки и управление торгами" ) ; //===== Общие настройки
// (true|false)(1|0) - разрешить|запретить открывать Sell ордера. Применяется немедленно и действует пока вы не прикажете противоположное.
SINPUT bool TradeSell = true;
// (true|false)(1|0) - разрешить|запретить открывать Buy ордера. Применяется немедленно и действует пока вы не прикажете противоположное.
SINPUT bool TradeBuy = true;
// (true|false)(1|0) - разрешить|запретить боту самому открывать первый ордер Sell сетки. Если хоть 1 ордер(-а) открыт, сетка строится согласно настроек.
SINPUT bool S_OpenFirstOrder = true;
// (true|false)(1|0) - разрешить|запретить боту самому открывать первый ордер Buy сетки. Если хоть 1 ордер(-а) открыт, сетка строится согласно настроек.
SINPUT bool B_OpenFirstOrder = true;
SINPUT double LevelNoFirstOrderSell = 0;
SINPUT double LevelNoFirstOrderBuy = 0;
// (false|true)(0|1) - когда вы зададите =true, по текущим ценам будут закрыты все Sell ордера и удалены все SellStop отложки. Дефолтно и всегда =false.
SINPUT bool S_CloseAllOrders = false;
// (false|true)(0|1) - когда вы зададите =true, по текущим ценам будут закрыты все Buy ордера и удалены все BuyStop отложки. Дефолтно и всегда =false.
SINPUT bool B_CloseAllOrders = false;
// минут паузы после закрытия сответствующей сетки ордеров
SINPUT int S_PauseOnClose = 0;
SINPUT int B_PauseOnClose = 0;
// Магик (технический - групповой фиксированный №) всех ордеров Sell и Buy сеток данной копии бота.
SINPUT int MagicNumber = 1110;
SINPUT string AddComment = EXT_STRING_EMPTY;
// Применять настройки Sell сеток в Buy сетках - симметричные настройки. Вам надо вводить настройки только для Sell сеток.
SINPUT bool ReflectSellSettingsToBuy = true;
DEFINES_LABEL_NAME ( filters_part, "Фильтры спрэда и одновременно торгуемых пар и валют"); // ===== Фильтры, часть 1
// (=0 - отключено) Предельный спрэд. Если текущий спрэд превысит MaxSpread, включается запрет открытия ордеров - пока текущий спрэд больше MaxSpread
INPUT float MaxSpread = 3.0;
INPUT int MaxSpreadStopTradingTimining = 45;
SINPUT int MinLeverage = 0;
INPUT int MinTimeStep = 0;
SINPUT int MaxTradePairs = 0;
SINPUT int CurrencyBlock = 0;
// Настройки для полуавтоматической торговли от уровней
DEFINES_LABEL_NAME ( levels_settings,"Настройки параметров полуавтоматической работы от уровней" ); //===== Работа в полуавтоматическом режиме
// Уровень открытия ордеров
SINPUT double LevelForSell = 0;
SINPUT int LevelForSell_MoveKoafInPercentByTP = 0;
SINPUT double LevelForBuy = 0;
SINPUT int LevelForBuy_MoveKoafInPercentByTP = 0;
DEFINES_LABEL_NAME ( trade_control_by_drawdown,"Управление торгами в зависимости от просадки" ); // ===== Контроль просадки
INPUT double NotUsedBalance = 0;
// Размер не используемого баланса
INPUT int No1Order_ByDrawdownPercent = 20;
INPUT int No1Order_ByDrawdownPercent_Off = 1;
// (=0 - отключено) Запрет открытия ордеров (в той сетке, которая в просадке) по достижении просадки в % от депо
INPUT int StopTrade_ByDrawdownPercent = 0;
INPUT int StopTrade_ByDrawdownPercent_Off = 0;
// (=0 - откл) Запрет открытия ордеров (в той сетке, которая в просадке) по достижении просадки, равной указанной сумме в валюте счета
INPUT int StopTrade_ByDrawdownMoney = 0;
INPUT int StopTrade_ByDrawdownMoney_Off = 0;
// (=0 - отключено) Закрытие всех Buy и Sell ордеров по достижении прибыли в % от депо.
INPUT double CloseAllOrders_ByProfitPercent = 0;
//(=0 - отключено) Закрытие всех Buy и Sell ордеров по достижении прибыли, равной указанной сумме в валюте счета.
INPUT double CloseAllOrders_ByProfitMoney = 0;
// (=0 - отключено) Закрытие всех Buy и Sell ордеров по достижении просадки в % от депо.
INPUT double CloseAllOrders_ByDrawdownPercent = 0;
//(=0 - отключено) Закрытие всех Buy и Sell ордеров по достижении просадки, равной указанной сумме в валюте счета.
INPUT double CloseAllOrders_ByDrawdownMoney = 0;
INPUT double S_CloseOrders_ByDrawdown_For001Lot=0;
INPUT double B_CloseOrders_ByDrawdown_For001Lot=0;
INPUT double S_CloseOrders_ByDrawdown_TPRatio=0;
INPUT double B_CloseOrders_ByDrawdown_TPRatio=0;
SINPUT bool CloseAllOrders_ByDrawdown_StopTrade = false;
DEFINES_LABEL_NAME ( money_management, "Управление лотностью" ) ; // ===== Управление лотностью
// (=true) Расчет лота 1го ордера сетки от баланса (=true) или от эквити (=false), данные опции применяются только при B(S)_CurrencyFor001Lot > 0
INPUT bool UseBalanceForMM =true;
// Бонус ДЦ и всё, исключаемое из расчета лота 1го ордера сетки от баланса/эквити, в валюте счета,данные опции применяются только при B(S)_CurrencyFor001Lot > 0
INPUT double NotUsedCurrency = 0;
// (=100 ) Часть баланса/эквити счета, выделяемая для расчета лота 1го ордера сетки,в процентах от 1 до 100,данные опции применяются только при B(S)_CurrencyFor001Lot > 0
INPUT int UsedCurrencyPercent=100;
// (=true) Открывать каждый последующий первый ордер сетки обьемом не меньше, чем предыдущий, данные опции применяются только при B(S)_CurrencyFor001Lot > 0
INPUT bool OnlyGrowLot = false;
// Найстройки шага сетки для коротких позиций
DEFINES_LABEL_NAME ( sell_step_settings,"SELL сетки - настройки шагов, количества колен и длины" ); //===== SELL сетки - шаг и поправки в 4-хзначных пипсах
// Максимальное количество SELL ордеров (колен), которое вы разрешаете боту открыть в SELL сетке
INPUT int S_MaxOpenOrders = 15;
// Начальный шаг SELL сетки в пипсах
INPUT int S_GridStep = 16;
// № п/п ордера (колена) SELL сетки, начиная с которого (включительно) текущий шаг SELL сетки будет корректироваться на S_GridStep_AddPips пипсов (на каждым колене)
INPUT int S_GridLevel = 6;
// Количество пипсов, на которое будет корректироваться текущий шаг SELL сетки на каждом колене, начиная с колена S_GridLevel. М.б. =0, >0 и даже <0.
INPUT int S_GridStep_AddPips = 1;
INPUT int S_GridStep_Level2 = 10;
INPUT int S_GridStep_Level2_AddPips = 6;
INPUT int S_Grid3 = 0;
INPUT int S_Grid3Add = 0;
INPUT int S_GridStop = 0;
// Настройки лота для коротких позиций
DEFINES_LABEL_NAME ( sell_lot_settings, "SELL сетки - min ордер и множители лота всех колен" ); //===== SELL сетки - настройки лотов ордеров всех колен
SINPUT enum_calc_lot_type S_CalcLotType = calc_lot_type_last_order;
// Кол-во средств на ордер размера S_MinLot
INPUT int S_CurrencyFor001Lot = 0;
// лот 1-го (первого) минимального ордера сетки
INPUT double S_MinLot = 0.01;
// Начальный множитель лота для ордеров SELL сетки. Чаще всего лот очередного открываемого ордера сетки = лоту последнего ордера SELL сетки * S_Mult (с или без коррекции)
INPUT double S_Mult = 1.4;
// № п/п ордера (колена) SELL сетки, начиная с которого начинает применяться S_Mult. До округления лот ордера S_MultStart колена = S_MinLot * S_Mult
INPUT int S_MultStart = 3;
// № п/п ордера (колена) SELL сетки, начиная с которого (включительно) S_Mult корректируется на величину S_MultCorr (на каждом колене)
INPUT int S_MultLevel2 = 11;
// Величина коррекции (на каждом колене) текущего/расчетного значения множителя лота SELL сетки, начиная с колена S_MultLevel2 включительно
INPUT double S_MultCorr = 0.02;
INPUT int S_MultLevel3 = 0;
INPUT double S_MultСorrLevel3 = 0;
INPUT int S_Mult3 = 0;
INPUT double S_Mult3Add = 0.0;
INPUT int S_MultStop = 0;
INPUT double S_MaxLotCoef = 0.0;
SINPUT double S_TestMinLot = 0.0;
// Настройки ТР для коротких позиций
DEFINES_LABEL_NAME ( sell_tp_settings,"SELL сетки: настройки TP (чистая прибыль) ==> [уровень_БУ]+ТР" ); //===== SELL сетки - TP и поправка в 4-хзначных пипсах
// Тип рассчета ТР ( tp_avg - по среднему взвешенному, tp_level_without_loss - относительно уровня безубытка)
INPUT enum_take_profit_calc_type S_TakeProffitType = tp_level_without_loss;
// Начальное количество пипсов ТР - прибыли от сетки. Прибавляется (с минусом) к уровню безубытка или среднеарифметическому взвешенному SELL сетки.
INPUT int S_TakeProffit = 14;
// № п/п ордера (колена) SELL сетки, начиная с которого S_TakeProffit будет корректироваться на S_TakeProffit_Level1Corr (на каждом колене)
INPUT int S_TakeProffit_Level1 = 6;
// Количество пипсов, на которое корректируется текущее/расчетное значение ТР, начиная с S_TakeProffit_Level1 колена. Может быть >0 или <0.
INPUT int S_TakeProffit_Level1Corr = 1;
INPUT int S_TakeProffit_Level1_5 = 11;
INPUT int S_TakeProffit_Level1_5Corr = 0;
// № п/п ордера (колена) SELL сетки, начиная с которого уровень ТР сетки жестко выставляется на уровень безубытка - S_TakeProffit_Level2FixPips
INPUT int S_TakeProffit_Level2 = 0;
// Количество пипсов отступа в плюс (прибыли) от уровня безубытка SELL сетки, фиксированно выставляемого начиная с S_TakeProffit_Level2 колена
INPUT int S_TakeProffit_Level2FixPips = 0;
uint S_TakeProfitChannelHeight = 0; // Ширина зоны ТП (5-ти знак!!!)
ushort S_TakeProfitChannelLevel = 0; // Колено начала зоны ТП(0 - выключено)
// Найстройки шага сетки для длинных позиций
DEFINES_LABEL_NAME ( buy_step_settings,"BUY сетки - настройки шагов, количества колен и длины" ); //===== BUY сетки - шаг и поправки в 4-хзначных пипсах
INPUT int B_MaxOpenOrders = 15;
INPUT int B_GridStep = 16;
INPUT int B_GridLevel = 6;
INPUT int B_GridStep_AddPips = 1;
INPUT int B_GridStep_Level2 = 10;
INPUT int B_GridStep_Level2_AddPips = 6;
INPUT int B_Grid3 = 0;
INPUT int B_Grid3Add = 0;
INPUT int B_GridStop = 0;
// Настройки лота для длинных позиций
DEFINES_LABEL_NAME ( buy_lot_settings, "BUY сетки - min ордер и множители лота всех колен" ); //===== BUY сетки - настройки лотов ордеров всех колен
SINPUT enum_calc_lot_type B_CalcLotType = calc_lot_type_last_order;
INPUT int B_CurrencyFor001Lot = 0;
// лот 1-го (первого) минимального ордера сетки
INPUT double B_MinLot = 0.01;
INPUT double B_Mult = 1.4;
INPUT int B_MultStart = 3;
INPUT int B_MultLevel2 = 11;
INPUT double B_MultCorr = 0.02;
INPUT int B_MultLevel3 = 0;
INPUT double B_MultСorrLevel3 = 0;
INPUT int B_Mult3 = 0;
INPUT double B_Mult3Add = 0.0;
INPUT int B_MultStop = 0;
INPUT double B_MaxLotCoef = 0.0;
SINPUT double B_TestMinLot = 0.0;
// Настройки ТР для длинных позиций
DEFINES_LABEL_NAME ( buy_tp_settings,"BUY сетки: настройки TP (прибыль) ==> [уровень_БУ]+ТР" ) ; //===== BUY сетки - TP и поправка в 4-хзначных пипсах
INPUT enum_take_profit_calc_type B_TakeProffitType = tp_level_without_loss;
INPUT int B_TakeProffit = 14;
INPUT int B_TakeProffit_Level1 = 6;
INPUT int B_TakeProffit_Level1Corr = 1;
INPUT int B_TakeProffit_Level1_5 = 11;
INPUT int B_TakeProffit_Level1_5Corr = 0;
INPUT int B_TakeProffit_Level2 = 0;
INPUT int B_TakeProffit_Level2FixPips = 0;
uint B_TakeProfitChannelHeight = 0; // Ширина зоны ТП (5-ти знак!!!)
ushort B_TakeProfitChannelLevel = 0; // Колено начала зоны ТП(0 - выключено)
//--- Capteen 190322
//--- Indicator filters
#ifdef USE_FILTERS
#include "filters/def_adx_imp.mqh"
#endif
#ifdef RSI_CCI
#include "rsi_cci/definesRC.mqh"
#endif //USE_RSI_CCI
enum_position_signal PositionSignal = enum_position_signal_simple;
// Настройки безиндикаторного входа
DEFINES_LABEL_NAME ( without_indicator_settings,"Настройки параметров и фильтров безиндикаторного входа" ); //===== Фильтры - безиндикаторный вход 1-м ордером
// Таймфрэйм, на котором бот принимает решение об открытии первого ордера Buy или Sell сетки (при безындикаторном входе)
INPUT enum_time_frames OpenFirstOrderTF = M1_;
INPUT int CandlesToOpen1Order = 3;
INPUT bool CandlesToOpen1Order_OpenClose = true;
INPUT int CandlesToOpen1Order_MinPips = 4;
INPUT int CandlesToOpen1Order_MaxPips = 12;
INPUT bool ReversSignalToOpen1Order = true;
INPUT bool CandlesToOpen1Order_OneWay = true;
// Настройки фильтра волатильности №1
DEFINES_LABEL_NAME ( vol_filter1_settings, "Фильтры - фильтр волатильности №1" ); //===== Фильтр - Запрет открывать ордера, если волотильность больше определенного уровня №1
INPUT int VolFromLevel=1;
INPUT int VolEndLevel=0;
INPUT enum_time_frames VolCandleTF = M1_;
INPUT int VolCandles = 1;
INPUT bool VolNullBar = true;
INPUT bool VolCandles_OneWay = false;
INPUT bool VolCandle_OpenClose = false;
INPUT int VolCandleMaxSize = 10;
INPUT int VolStopTradeTimining = 72;
INPUT bool VolBlockBothDirection = true;
// Настройки фильтра волатильности №2
DEFINES_LABEL_NAME ( vol_filter2_settings, "Фильтры - фильтр волатильности №2" ); //===== Фильтр - Запрет открывать ордера, если волотильность больше определенного уровня №2
INPUT int Vol2FromLevel=0;
INPUT int Vol2EndLevel=0;
INPUT enum_time_frames Vol2CandleTF = M5_;
INPUT int Vol2Candles = 5;
INPUT bool Vol2NullBar = true;
INPUT bool Vol2Candles_OneWay = false;
INPUT bool Vol2Candle_OpenClose = true;
INPUT int Vol2CandleMaxSize = 20;
INPUT int Vol2StopTradeTimining = 150;
INPUT bool Vol2BlockBothDirection = true;
// Настройки фильтра волатильности №3
DEFINES_LABEL_NAME ( vol_filter3_settings, "Фильтры - фильтр волатильности №3" ); //===== Фильтр - Запрет открывать ордера, если волотильность больше определенного уровня №3
INPUT int Vol3FromLevel=0;
INPUT int Vol3EndLevel=0;
INPUT enum_time_frames Vol3CandleTF = M5_;
INPUT int Vol3Candles = 5;
INPUT bool Vol3NullBar = true;
INPUT bool Vol3Candles_OneWay = false;
INPUT bool Vol3Candle_OpenClose = true;
INPUT int Vol3CandleMaxSize = 20;
INPUT int Vol3StopTradeTimining = 150;
INPUT bool Vol3BlockBothDirection = true;
// Настройки прочих фильтров
DEFINES_LABEL_NAME ( other_filter_settings, "Прочие фильтры" ); //===== Фильтры - прочие фильтры
INPUT int S_NoFirstCounterOrder_FromLevel =0;
INPUT int B_NoFirstCounterOrder_FromLevel =0;
// Настройки гэп контроля
DEFINES_LABEL_NAME ( gap_settings, "Настройки блока выявления и обработки гэпов" ); //===== Фильтры, часть 4 - обработка мартин-гэпов
INPUT enum_gap_control_type GapControl = op_stop;
INPUT int GapMaxStopOrders = 3;
INPUT int GapMinDistanceFromMarket = 4;
INPUT int S_GapMinPips = 10;
INPUT int S_GapMinPercent = 0;
INPUT double S_GapLotKoef = 0.5;
INPUT double S_GapLastOrderKoef = 2.0;
INPUT int B_GapMinPips = 10;
INPUT int B_GapMinPercent = 0;
INPUT double B_GapLotKoef = 0.5;
INPUT double B_GapLastOrderKoef = 2.0;
INPUT enum_gap_control_delete_pending_orders FarPendingOrdersDelete=delete_none;
// Настройки планировщика
DEFINES_LABEL_NAME ( sheduler_settings, "Настройки планировщиков торговли - их 5 разных" ); //===== Фильтры, часть 6 - фильтры времени торговли
DEFINES_LABEL_NAME ( sheduler_trade_week_settings,"№1 Еженедельно: можно открывать 1-е ордера со Start_дня|время по End_день|время" ); //===№1 Еженедельно: можно открывать 1-е ордера - начало/конец интервала
INPUT day_of_week_t TradeStartDay = day_of_week_t_sunday;
INPUT int TradeStartHour = 0;
INPUT int TradeStartMinute = 0;
INPUT day_of_week_t TradeEndDay = day_of_week_t_saturday;
INPUT int TradeEndHour = 12;
INPUT int TradeEndMinute = 0;
DEFINES_LABEL_NAME ( sheduler_new_positio_pause_settings,"№2 Однократно: от и до - запрещено открывать любые новые позиции" ); //===№2 Ежедневно - Периоды запрета открывать любые новые позиции
#define input_new_position_pause(number) \
SINPUT datetime NewPositionPause##number##Start = MIN_DATE; \
SINPUT datetime NewPositionPause##number##End = MIN_DATE;
input_new_position_pause ( 1 );
input_new_position_pause ( 2 );
input_new_position_pause ( 3 );
input_new_position_pause ( 4 );
input_new_position_pause ( 5 );
input_new_position_pause ( 6 );
input_new_position_pause ( 7 );
input_new_position_pause ( 8 );
input_new_position_pause ( 9 );
input_new_position_pause ( 10 );
SINPUT char NewPositionPauseNewYearDayStart = 0; // NewPositionPauseNewYearDayStart (December)
SINPUT char NewPositionPauseNewYearDayEnd = 0; // NewPositionPauseNewYearDayEnd (January)
DEFINES_LABEL_NAME ( sheduler_trade_day_settings,"№3 Ежедневно: можно открывать 1-е ордера сеток - 10 интервалов" ); //===№3 Ежедневно: можно открывать 1-е ордера - 5 интервалов
#define input_intraday(number) \
INPUT ushort IntraDay##number##StartHour = 0; \
INPUT ushort IntraDay##number##StartMinute = 0; \
INPUT ushort IntraDay##number##EndHour = 0; \
INPUT ushort IntraDay##number##EndMinute = 0
input_intraday ( 1 );
input_intraday ( 2 );
input_intraday ( 3 );
input_intraday ( 4 );
input_intraday ( 5 );
input_intraday ( 6 );
input_intraday ( 7 );
input_intraday ( 8 );
input_intraday ( 9 );
input_intraday ( 10 );
DEFINES_LABEL_NAME ( sheduler_trade_pause_settings,"№4 Однократно: от и до - запрещено открывать любые ордера" ); //===№4 Однократно - запрет открывать любые ордера
#define input_tradepause(number) \
SINPUT datetime TradePause##number##Start = MIN_DATE; \
SINPUT datetime TradePause##number##End = MIN_DATE
input_tradepause ( 1 );
input_tradepause ( 2 );
input_tradepause ( 3 );
input_tradepause ( 4 );
input_tradepause ( 5 );
input_tradepause ( 6 );
input_tradepause ( 7 );
input_tradepause ( 8 );
input_tradepause ( 9 );
input_tradepause ( 10 );
DEFINES_LABEL_NAME ( sheduler_trade_stop_settings,"№5 Ежедневно - до 10 интервалов запрета открывать любые ордера" ); //===№5 Ежедневно - Периоды запрета открывать любые ордера
#define input_stoptrade(number) \
INPUT ushort IntraDayStopTrade##number##StartHour = 0; \
INPUT ushort IntraDayStopTrade##number##StartMinute = 0; \
INPUT ushort IntraDayStopTrade##number##EndHour = 0; \
INPUT ushort IntraDayStopTrade##number##EndMinute = 0
input_stoptrade ( 1 );
input_stoptrade ( 2 );
input_stoptrade ( 3 );
input_stoptrade ( 4 );
input_stoptrade ( 5 );
input_stoptrade ( 6 );
input_stoptrade ( 7 );
input_stoptrade ( 8 );
input_stoptrade ( 9 );
input_stoptrade ( 10 );
DEFINES_LABEL_NAME ( sheduler_close_all_order_settings,"№6 Ежедневно - закрытие обеих сеток в одно время" ); //===№6 Ежедневно - закрытие обеих сеток в одно время
INPUT int CloseAllOrders_EveryDay_Hour = 0;
INPUT int CloseAllOrders_EveryDay_Minute = 0;
// Прочие настройки
DEFINES_LABEL_NAME ( other_settings,"Прочие общие настройки" ); //===== Прочие общие настройки
// ( 0 = выкл, >0 - вкл) Кол-во секунд через которые перепроверяется и корректируется ТР сеток
SINPUT int TakeProffitControlTiming = 90;
// Кол-во пипсов для S_TakeProffitControlTiming. ТР сетки будет установлен на Б/У - TakeProffitNoLossControlFixPips
INPUT int TakeProffitControlNoLossFixPips = 3;
//Остановить торговлю - запрет открытиия новых сеток
SINPUT datetime FinalGridDate = D'2029.12.30 00: 00: 00';
// Кол-во секунд для таймера обновления глобальных параметров
SINPUT int GlobalParamsUpdateTiming = 60;
// ( 0 = выкл, 1 = ошибки, 2 = мелкая информация, 3 = более детальная информация, 4 = отладочная информация ) Отображение лога
SINPUT int LogVerbose = 2;
SINPUT enum_ctrl_panel ShowComments = cp_none; // Панель управления
SINPUT string ShowCommentsParam = EXT_STRING_EMPTY; // Параметры панели управления
// Настройки управления тестированием
DEFINES_LABEL_NAME (tester_settings,"Настройки управления тестированием" ); //===== Настройки управления тестированием
//Если просадка от первоначального баланса (на момент запуска тестера) будет больше, чем указанное значения, то OnTester будет равен -1
SINPUT double OnTester_Max_DD_Percent = 0;
//Если сделок будет меньше, чем указанное значение, то OnTester будет равен -2
SINPUT int OnTester_Min_Trade = 0;
//Если количество стопов подряд будет больше заданного, то это значение будет также учитываться в расчете OnTester
SINPUT int OnTester_Max_Conloss_Trades = 0;
//Если же эти фильтры не сработают, то расчет идет по Рекавери Фактору, как написал выше,
//из него вычитается максимальное количество убыточных сделок подряд / 100.
//Если проще - то чем больше значение будет, тем лучше результаты прогона.
#define check_new_position_pause(number) \
(valid_tint ( NewPositionPause##number##Start ) \
&& valid_inte ( NewPositionPause##number##End, \
NewPositionPause##number##Start == MIN_DATE \
|| NewPositionPause##number##End > NewPositionPause##number##Start ))
#define check_trade_pause(number) \
(valid_tint ( TradePause##number##Start ) \
&& valid_inte ( TradePause##number##End, \
TradePause##number##Start == MIN_DATE \
|| TradePause##number##End > TradePause##number##Start ))
#define check_intrade(number) \
(valid_inte ( IntraDay##number##StartHour, \
IntraDay##number##StartHour >= 0 \
&& IntraDay##number##StartHour <= 23 ) \
&& valid_inte ( IntraDay##number##StartMinute, \
IntraDay##number##StartMinute >= 0 \
&& IntraDay##number##StartMinute <= 59 ) \
&& valid_inte ( IntraDay##number##EndHour, \
IntraDay##number##EndHour >= 0 \
&& IntraDay##number##EndHour <= 23 \
&& IntraDay##number##EndHour >= IntraDay##number##StartHour ) \
&& valid_inte ( IntraDay##number##EndMinute, \
IntraDay##number##EndMinute >= 0 \
&& IntraDay##number##EndMinute <= 59 \
&& ( IntraDay##number##StartHour != IntraDay##number##EndHour \
|| ( IntraDay##number##StartHour == IntraDay##number##EndHour \
&& IntraDay##number##StartMinute <= IntraDay##number##EndMinute ) ) ))
#define check_intraday_stop_trade(number) \
(valid_inte ( IntraDayStopTrade##number##StartHour, \
IntraDayStopTrade##number##StartHour >= 0 \
&& IntraDayStopTrade##number##StartHour <= 23 ) \
&& valid_inte ( IntraDayStopTrade##number##StartMinute, \
IntraDayStopTrade##number##StartMinute >= 0 \
&& IntraDayStopTrade##number##StartMinute <= 59 ) \
&& valid_inte ( IntraDayStopTrade##number##EndHour, \
IntraDayStopTrade##number##EndHour >= 0 \
&& IntraDayStopTrade##number##EndHour <= 23 \
&& IntraDayStopTrade##number##EndHour >= IntraDayStopTrade##number##StartHour ) \
&& valid_inte ( IntraDayStopTrade##number##EndMinute, \
IntraDayStopTrade##number##EndMinute >= 0 \
&& IntraDayStopTrade##number##EndMinute <= 59 \
&& ( IntraDayStopTrade##number##StartHour != IntraDayStopTrade##number##EndHour \
|| ( IntraDayStopTrade##number##StartHour == IntraDayStopTrade##number##EndHour \
&& IntraDayStopTrade##number##StartMinute <= IntraDayStopTrade##number##EndMinute ) ) ))
bool defines_validate()
{
_IN1("");
return valid_tboo ( TradeSell )
&& valid_tboo ( TradeBuy )
&& valid_tboo ( S_OpenFirstOrder )
&& valid_tboo ( B_OpenFirstOrder )
&& valid_tboo ( S_CloseAllOrders )
&& valid_tboo ( B_CloseAllOrders )
&& valid_doub ( NotUsedCurrency,
NotUsedCurrency >= 0.0)
&& valid_doub ( UsedCurrencyPercent,
UsedCurrencyPercent > 0.0 && UsedCurrencyPercent <=100)
&& valid_tboo ( UseBalanceForMM )
&& valid_tboo ( OnlyGrowLot )
&& valid_inte ( No1Order_ByDrawdownPercent,
No1Order_ByDrawdownPercent >= 0
&& No1Order_ByDrawdownPercent <= 100 )
&& valid_inte ( No1Order_ByDrawdownPercent_Off,
No1Order_ByDrawdownPercent_Off == 0
|| ( No1Order_ByDrawdownPercent_Off > 0
&& No1Order_ByDrawdownPercent_Off < No1Order_ByDrawdownPercent ) )
&& valid_inte ( StopTrade_ByDrawdownPercent,
StopTrade_ByDrawdownPercent >= 0
&& StopTrade_ByDrawdownPercent <= 100 )
&& valid_inte ( StopTrade_ByDrawdownPercent_Off,
StopTrade_ByDrawdownPercent_Off == 0
|| ( StopTrade_ByDrawdownPercent_Off > 0
&& StopTrade_ByDrawdownPercent_Off < StopTrade_ByDrawdownPercent ) )
&& valid_inte ( StopTrade_ByDrawdownMoney,
StopTrade_ByDrawdownMoney >= 0 )
&& valid_inte ( StopTrade_ByDrawdownMoney_Off,
StopTrade_ByDrawdownMoney_Off == 0
|| ( StopTrade_ByDrawdownMoney_Off > 0
&& StopTrade_ByDrawdownMoney_Off < StopTrade_ByDrawdownMoney ) )
&& valid_doub ( CloseAllOrders_ByProfitPercent,
CloseAllOrders_ByProfitPercent >= 0.0
&& CloseAllOrders_ByProfitPercent <= 100.0 )
&& valid_doub ( CloseAllOrders_ByProfitMoney,
CloseAllOrders_ByProfitMoney >= 0.0 )
&& valid_doub ( CloseAllOrders_ByDrawdownPercent,
CloseAllOrders_ByDrawdownPercent >= 0.0
&& CloseAllOrders_ByDrawdownPercent <= 100.0 )
&& valid_doub ( CloseAllOrders_ByDrawdownMoney,
CloseAllOrders_ByDrawdownMoney >= 0 )
&& valid_inte ( S_PauseOnClose, S_PauseOnClose >= 0 )
&& valid_inte ( B_PauseOnClose, B_PauseOnClose >= 0 )
&& valid_doub ( MaxSpread,
MaxSpread == 0
|| ( MaxSpread > 0 && MaxSpreadStopTradingTimining >= 30 ) )
&& valid_inte ( MaxSpreadStopTradingTimining,
MaxSpread == 0
|| ( MaxSpread > 0 && MaxSpreadStopTradingTimining >= 30 ) )
&& valid_inte ( MinLeverage,
MinLeverage >= 0 )
&& valid_inte ( MinTimeStep,
MinTimeStep >= 0 )
&& valid_inte ( MaxTradePairs,
MaxTradePairs >= 0 )
&& valid_inte ( CurrencyBlock,
CurrencyBlock >= 0 && CurrencyBlock < 100 )
&& valid_tint ( MagicNumber )
&& valid_tstr ( AddComment )
&& valid_tboo ( ReflectSellSettingsToBuy )
// Найстройки шага сетки для коротких позиций
&& valid_inte ( S_MaxOpenOrders,
S_MaxOpenOrders > 0 )
&& valid_inte ( S_GridStep, S_GridStep > 0 )
&& valid_inte ( S_GridLevel,
S_GridLevel == 0
|| ( S_GridLevel > 1
&& S_GridLevel <= S_MaxOpenOrders ) )
&& valid_tint ( S_GridStep_AddPips )
&& valid_inte ( S_GridStep_Level2,
S_GridStep_Level2 == 0
|| ( S_GridLevel > 0
&& S_GridStep_Level2 > S_GridLevel
&& S_GridStep_Level2 <= S_MaxOpenOrders ) )
&& valid_tint ( S_GridStep_Level2_AddPips )
&& valid_inte ( S_Grid3,
S_Grid3 == 0
|| ( S_GridStep_Level2 > 0
&& S_Grid3 > S_GridStep_Level2
&& S_Grid3 <= S_MaxOpenOrders ) )
&& valid_tint ( S_Grid3Add )
&& valid_inte ( S_GridStop,
S_GridStop >= 0
&& S_GridStop <= S_MaxOpenOrders )
// Настройки лота для коротких позиций
&& valid_tint ( S_CalcLotType )
&& valid_inte ( S_CurrencyFor001Lot,
S_CurrencyFor001Lot >= 0 )
&& valid_tdou ( S_MinLot )
&& valid_doub ( S_Mult,
S_Mult > 0.00 )
&& valid_inte ( S_MultStart,
S_MultStart > 1
&& S_MultStart <= S_MaxOpenOrders )
&& valid_inte ( S_MultLevel2,
S_MultLevel2 == 0
|| ( S_MultStart > 0
&& S_MultLevel2 > S_MultStart
&& S_MultLevel2 <= S_MaxOpenOrders ) )
&& valid_tdou ( S_MultCorr )
&& valid_inte ( S_MultLevel3,
S_MultLevel3 == 0
|| ( S_MultLevel2 > 0
&& S_MultLevel3 > S_MultLevel2
&& S_MultLevel3 <= S_MaxOpenOrders ) )
&& valid_tdou ( S_MultСorrLevel3 )
&& valid_inte ( S_Mult3,
S_Mult3 == 0
|| ( S_MultLevel3 > 0
&& S_Mult3 > S_MultLevel3
&& S_Mult3 <= S_MaxOpenOrders ) )
&& valid_tdou ( S_Mult3Add )
&& valid_inte ( S_MultStop,
S_MultStop >= 0
&& S_MultStop <= S_MaxOpenOrders )
&& valid_doub ( S_MaxLotCoef,
S_MaxLotCoef == 0
|| S_MaxLotCoef >= S_MaxLotCoef )
&& valid_doub ( S_TestMinLot,
S_TestMinLot == 0.0 || S_TestMinLot >= 0.01 )
// Настройки ТР для коротких позиций
&& valid_tint ( S_TakeProffitType )
&& valid_doub ( S_TakeProffit,
S_TakeProffit > 0.0 )
&& valid_inte ( S_TakeProffit_Level1,
S_TakeProffit_Level1 == 0
|| ( S_TakeProffit_Level1 > 1
&& S_TakeProffit_Level1 <= S_MaxOpenOrders ) )
&& valid_tint ( S_TakeProffit_Level1Corr )
&& valid_inte ( S_TakeProffit_Level1_5,
S_TakeProffit_Level1_5 == 0
|| ( S_TakeProffit_Level1_5 > S_TakeProffit_Level1
&& S_TakeProffit_Level1_5 <= S_MaxOpenOrders ) )
&& valid_tint ( S_TakeProffit_Level1_5Corr )
&& valid_inte ( S_TakeProffit_Level2,
S_TakeProffit_Level2 == 0
|| ( S_TakeProffit_Level2 > S_TakeProffit_Level1
&& S_TakeProffit_Level2 <= S_MaxOpenOrders ) )
&& valid_inte ( S_TakeProffit_Level2FixPips,
S_TakeProffit_Level2 == 0
|| S_TakeProffit_Level2FixPips >= TakeProffitControlNoLossFixPips )
&& valid_doub ( S_CloseOrders_ByDrawdown_For001Lot,
S_CloseOrders_ByDrawdown_For001Lot >= 0.0 )
&& valid_doub ( S_CloseOrders_ByDrawdown_TPRatio,
S_CloseOrders_ByDrawdown_TPRatio >= 0.0 )
// Найстройки шага сетки для длинных позиций
&& ( ReflectSellSettingsToBuy
|| ( valid_inte ( B_MaxOpenOrders,
B_MaxOpenOrders > 0 )
&& valid_inte ( B_GridStep, B_GridStep > 0 )
&& valid_inte ( B_GridLevel,
B_GridLevel == 0
|| ( B_GridLevel > 1
&& B_GridLevel <= B_MaxOpenOrders ) )
&& valid_tint ( B_GridStep_AddPips )
&& valid_inte ( B_GridStep_Level2,
B_GridStep_Level2 == 0
|| ( B_GridLevel > 0
&& B_GridStep_Level2 > B_GridLevel
&& B_GridStep_Level2 <= B_MaxOpenOrders ) )
&& valid_tint ( B_GridStep_Level2_AddPips )
&& valid_inte ( B_Grid3,
B_Grid3 == 0
|| ( B_GridStep_Level2 > 0
&& B_Grid3 > B_GridStep_Level2
&& B_Grid3 <= B_MaxOpenOrders ) )
&& valid_tint ( B_Grid3Add )
&& valid_inte ( B_GridStop,
B_GridStop >= 0
&& B_GridStop <= B_MaxOpenOrders ) ) )
// Настройки лота для длинных позиций
&& ( ReflectSellSettingsToBuy
|| ( valid_tint ( B_CalcLotType )
&& valid_inte ( B_CurrencyFor001Lot,
B_CurrencyFor001Lot >= 0 )
&& valid_tdou ( B_MinLot )
&& valid_doub ( B_Mult,
B_Mult > 0.00 )
&& valid_inte ( B_MultStart,
B_MultStart > 1
&& B_MultStart <= B_MaxOpenOrders )
&& valid_inte ( B_MultLevel2,
B_MultLevel2 == 0
|| ( B_MultStart > 0
&& B_MultLevel2 > B_MultStart
&& B_MultLevel2 <= B_MaxOpenOrders ) )
&& valid_tdou ( B_MultCorr )
&& valid_inte ( B_MultLevel3,
B_MultLevel3 == 0
|| ( B_MultLevel2 > 0
&& B_MultLevel3 > B_MultLevel2
&& B_MultLevel3 <= B_MaxOpenOrders ) )
&& valid_tdou ( B_MultСorrLevel3 )
&& valid_inte ( B_Mult3,
B_Mult3 == 0
|| ( B_MultLevel3 > 0
&& B_Mult3 > B_MultLevel3
&& B_Mult3 <= B_MaxOpenOrders ) )
&& valid_tdou ( B_Mult3Add )
&& valid_inte ( B_MultStop,
B_MultStop >= 0
&& B_MultStop <= B_MaxOpenOrders )
&& valid_doub ( B_MaxLotCoef,
B_MaxLotCoef == 0
|| B_MaxLotCoef >= B_MinLot )
&& valid_doub ( B_TestMinLot,
B_TestMinLot == 0.0 || B_TestMinLot >= 0.01 ) ) )
// Настройки ТР для длинных позиций
&& ( ReflectSellSettingsToBuy
|| ( valid_tint ( B_TakeProffitType )
&& valid_doub ( B_TakeProffit,
B_TakeProffit > 0.0 )
&& valid_inte ( B_TakeProffit_Level1,
B_TakeProffit_Level1 == 0
|| ( B_TakeProffit_Level1 > 1
&& B_TakeProffit_Level1 <= B_MaxOpenOrders ) )
&& valid_tint ( B_TakeProffit_Level1Corr )
&& valid_inte ( B_TakeProffit_Level1_5,
B_TakeProffit_Level1_5 == 0
|| ( B_TakeProffit_Level1_5 > B_TakeProffit_Level1
&& B_TakeProffit_Level1_5 <= B_MaxOpenOrders ) )
&& valid_tint ( S_TakeProffit_Level1_5Corr )
&& valid_inte ( B_TakeProffit_Level2,
B_TakeProffit_Level2 == 0
|| ( B_TakeProffit_Level2 > B_TakeProffit_Level1
&& B_TakeProffit_Level2 <= B_MaxOpenOrders ) )
&& valid_inte ( B_TakeProffit_Level2FixPips,
B_TakeProffit_Level2 == 0
|| B_TakeProffit_Level2FixPips >= TakeProffitControlNoLossFixPips )
&& valid_doub ( B_CloseOrders_ByDrawdown_For001Lot,
B_CloseOrders_ByDrawdown_For001Lot >= 0.0 )
&& valid_doub ( B_CloseOrders_ByDrawdown_TPRatio,
B_CloseOrders_ByDrawdown_TPRatio >= 0.0 )))
// Настройки безиндикаторного входа
&& valid_tfrm ( custom_tf_to_tf(OpenFirstOrderTF) )
&& valid_inte ( CandlesToOpen1Order,
CandlesToOpen1Order >= 0 )
&& valid_tboo ( CandlesToOpen1Order_OpenClose )
&& valid_inte ( CandlesToOpen1Order_MinPips,
CandlesToOpen1Order_MinPips == 0
|| CandlesToOpen1Order_MinPips > 0 )
&& valid_inte ( CandlesToOpen1Order_MaxPips,
CandlesToOpen1Order_MaxPips == 0
|| ( CandlesToOpen1Order_MinPips == 0 && CandlesToOpen1Order_MaxPips > 0 )
|| ( CandlesToOpen1Order_MinPips > 0 && CandlesToOpen1Order_MaxPips > CandlesToOpen1Order_MinPips ) )
&& valid_tboo ( ReversSignalToOpen1Order )
&& valid_tboo ( CandlesToOpen1Order_OneWay )
&& valid_doub ( LevelForSell,
LevelForSell >=0 || LevelForSell==-1 )
&& valid_doub ( LevelForBuy,
LevelForBuy >= 0 || LevelForBuy==-1 )
&& valid_inte ( LevelForSell_MoveKoafInPercentByTP,
LevelForBuy_MoveKoafInPercentByTP >= 0)
&& valid_inte ( LevelForSell_MoveKoafInPercentByTP,
LevelForBuy_MoveKoafInPercentByTP >= 0)
&& valid_doub ( LevelNoFirstOrderSell,
LevelNoFirstOrderSell >=0 )
&& valid_doub ( LevelNoFirstOrderBuy,
LevelNoFirstOrderBuy >=0 )
// Настройки гэп контроля
&& valid_tint ( GapControl )
&& valid_inte ( FarPendingOrdersDelete, FarPendingOrdersDelete>=0 && FarPendingOrdersDelete<=3 )
&& valid_inte ( GapMaxStopOrders,
GapMaxStopOrders >= 0 )
&& valid_tint ( GapMinDistanceFromMarket )
&& valid_inte ( S_GapMinPips,
S_GapMinPips == 0
|| ( S_GapMinPips > 0 && S_GapMinPercent == 0 ) )
&& valid_inte ( S_GapMinPercent,
S_GapMinPercent == 0
|| ( S_GapMinPercent > 0 && S_GapMinPips == 0 ) )
&& valid_doub ( S_GapLotKoef,
S_GapLotKoef <= 1 )
&& valid_doub ( S_GapLastOrderKoef,
S_GapLastOrderKoef >= 0.00 )
&& ( ReflectSellSettingsToBuy
|| ( valid_inte ( B_GapMinPips,
B_GapMinPips == 0
|| ( B_GapMinPips > 0 && B_GapMinPercent == 0 ) )
&& valid_inte ( B_GapMinPercent,
B_GapMinPercent == 0
|| ( B_GapMinPercent > 0 && B_GapMinPips == 0 ) )
&& valid_doub ( B_GapLotKoef,
B_GapLotKoef <= 1 )
&& valid_doub ( B_GapLastOrderKoef,
B_GapLastOrderKoef >= 0.00 ) ) )
//--- elavr 210316
// Проверка параметров фильтров
#ifdef USE_FILTERS
&&filters_defines_validate()
#endif
#ifdef RSI_CCI
&&rc_defines_validate()
#endif
#ifdef SL_MOD
&&sl_mod_defines_validate()
#endif
// Настройки фильтра волатильности
&& valid_inte ( VolFromLevel, VolFromLevel >= 0 )
&& valid_inte ( VolEndLevel, (VolFromLevel==0) || (VolFromLevel > 0 && ((VolEndLevel==0)||(VolEndLevel > VolFromLevel))))
&& valid_tfrm ( custom_tf_to_tf(VolCandleTF) )
&& valid_inte ( VolCandles, (VolFromLevel==0) || (VolFromLevel > 0 && VolCandles>0))
&& valid_tboo ( VolNullBar )
&& valid_tboo ( VolCandles_OneWay )
&& valid_tboo ( VolCandle_OpenClose )
&& valid_inte ( VolCandleMaxSize, VolCandleMaxSize >= 0 )
&& valid_inte ( VolStopTradeTimining,VolStopTradeTimining == 0 || VolStopTradeTimining >= 30 )
&& valid_tboo ( VolBlockBothDirection )
// настройки фильтра волатильности №2
&& valid_inte ( Vol2FromLevel, Vol2FromLevel >= 0 )
&& valid_inte ( Vol2EndLevel, (Vol2FromLevel==0) || (Vol2FromLevel > 0 && ((Vol2EndLevel==0)||(Vol2EndLevel > Vol2FromLevel))))
&& valid_tfrm ( custom_tf_to_tf(Vol2CandleTF) )
&& valid_inte ( Vol2Candles, (Vol2FromLevel==0) || (Vol2FromLevel > 0 && Vol2Candles>0))
&& valid_tboo ( Vol2NullBar )
&& valid_tboo ( Vol2Candles_OneWay )
&& valid_tboo ( Vol2Candle_OpenClose )
&& valid_inte ( Vol2CandleMaxSize, Vol2CandleMaxSize >= 0 )
&& valid_inte ( Vol2StopTradeTimining,Vol2StopTradeTimining == 0 || Vol2StopTradeTimining >= 30 )
&& valid_tboo ( Vol2BlockBothDirection )
// настройки фильтра волатильности №3
&& valid_inte ( Vol3FromLevel,Vol3FromLevel >= 0 )
&& valid_inte ( Vol3EndLevel, (Vol3FromLevel==0) || (Vol3FromLevel > 0 && ((Vol3EndLevel==0)||(Vol3EndLevel > Vol3FromLevel))))
&& valid_tfrm ( custom_tf_to_tf(Vol3CandleTF) )
&& valid_inte ( Vol3Candles, (Vol3FromLevel==0) || (Vol3FromLevel > 0 && Vol3Candles>0))
&& valid_tboo ( Vol3NullBar )
&& valid_tboo ( Vol3Candles_OneWay )
&& valid_tboo ( Vol3Candle_OpenClose )
&& valid_inte ( Vol3CandleMaxSize,Vol3CandleMaxSize >= 0 )
&& valid_inte ( Vol3StopTradeTimining,Vol3StopTradeTimining == 0 || Vol3StopTradeTimining >= 30 )
&& valid_tboo ( Vol3BlockBothDirection )
//Прочие фильтры
&& valid_inte ( S_NoFirstCounterOrder_FromLevel, S_NoFirstCounterOrder_FromLevel >= 0 && S_NoFirstCounterOrder_FromLevel <= (ReflectSellSettingsToBuy?S_MaxOpenOrders:B_MaxOpenOrders))
&& ( ReflectSellSettingsToBuy
|| ( valid_inte ( B_NoFirstCounterOrder_FromLevel, B_NoFirstCounterOrder_FromLevel >= 0 && B_NoFirstCounterOrder_FromLevel <= S_MaxOpenOrders)))
// Настройки планировщика
&& valid_bool ( CloseAllOrders_ByDrawdown_StopTrade,
!CloseAllOrders_ByDrawdown_StopTrade
|| ( CloseAllOrders_ByDrawdown_StopTrade
&& ( CloseAllOrders_ByDrawdownPercent > 0
|| CloseAllOrders_ByDrawdownMoney > 0 ) ) )
&& valid_inte ( TradeStartDay,
TradeStartDay <= TradeEndDay
&& TradeStartDay >= day_of_week_t_sunday )
&& valid_inte ( TradeStartHour,
TradeStartHour >= 0
&& TradeStartHour <= 23
&& ( TradeStartDay != TradeEndDay
|| ( TradeStartDay == TradeEndDay
&& TradeStartHour <= TradeEndHour ) ) )
&& valid_inte ( TradeStartMinute,
TradeStartMinute >= 0
&& TradeStartMinute <= 59
&& ( TradeStartDay != TradeEndDay
|| ( TradeStartDay == TradeEndDay
&& ( TradeStartHour < TradeEndHour
|| ( TradeStartHour == TradeEndHour
&& TradeStartMinute < TradeEndMinute ) ) ) ) )
&& valid_inte ( TradeEndDay,
TradeEndDay >= TradeStartDay
&& TradeEndDay <= day_of_week_t_saturday )
&& valid_inte ( TradeEndHour,
TradeEndHour >= 0
&& TradeEndHour <= 23 )
&& valid_inte ( TradeEndMinute,
TradeEndMinute >= 0
&& TradeEndMinute <= 59 )
&& check_new_position_pause ( 1 )
&& check_new_position_pause ( 2 )
&& check_new_position_pause ( 3 )
&& check_new_position_pause ( 4 )
&& check_new_position_pause ( 5 )
&& check_new_position_pause ( 6 )
&& check_new_position_pause ( 7 )
&& check_new_position_pause ( 8 )
&& check_new_position_pause ( 9 )
&& check_new_position_pause ( 10 )
&& valid_inte ( NewPositionPauseNewYearDayStart,NewPositionPauseNewYearDayStart >= 0 && NewPositionPauseNewYearDayStart <= 31 )
&& valid_inte ( NewPositionPauseNewYearDayEnd,NewPositionPauseNewYearDayEnd >= 0 && NewPositionPauseNewYearDayEnd <= 31 )
&& check_trade_pause ( 1 )
&& check_trade_pause ( 2 )
&& check_trade_pause ( 3 )
&& check_trade_pause ( 4 )
&& check_trade_pause ( 5 )
&& check_trade_pause ( 6 )
&& check_trade_pause ( 7 )
&& check_trade_pause ( 8 )
&& check_trade_pause ( 9 )
&& check_trade_pause ( 10 )
&& check_intrade ( 1 )
&& check_intrade ( 2 )
&& check_intrade ( 3 )
&& check_intrade ( 4 )
&& check_intrade ( 5 )
&& check_intrade ( 6 )
&& check_intrade ( 7 )
&& check_intrade ( 8 )
&& check_intrade ( 9 )
&& check_intrade ( 10 )
&& check_intraday_stop_trade ( 1 )
&& check_intraday_stop_trade ( 2 )
&& check_intraday_stop_trade ( 3 )
&& check_intraday_stop_trade ( 4 )
&& check_intraday_stop_trade ( 5 )
&& check_intraday_stop_trade ( 6 )
&& check_intraday_stop_trade ( 7 )
&& check_intraday_stop_trade ( 8 )
&& check_intraday_stop_trade ( 9 )
&& check_intraday_stop_trade ( 10 )
&& valid_inte ( CloseAllOrders_EveryDay_Hour,
CloseAllOrders_EveryDay_Hour >= 0
&& CloseAllOrders_EveryDay_Hour <= 23 )
&& valid_inte ( CloseAllOrders_EveryDay_Minute,
CloseAllOrders_EveryDay_Minute >= 0
&& CloseAllOrders_EveryDay_Minute <= 57 )
// Прочие настройки
&& valid_inte ( TakeProffitControlTiming,
TakeProffitControlTiming == 0
|| TakeProffitControlTiming >= 30 )
&& valid_tint ( TakeProffitControlNoLossFixPips )
&& valid_inte ( GlobalParamsUpdateTiming,
GlobalParamsUpdateTiming == 0
|| GlobalParamsUpdateTiming >= 30 )
&& valid_inte ( LogVerbose,
LogVerbose >= 0
&& LogVerbose <= 4 );
}
string param_vol_filter_to_hash(setting_t *result){
str_builder b;
b.append(itos(result.vol_filter.from_level));
b.append(itos(result.vol_filter.end_level));
b.append(EnumToString(result.vol_filter.candle_tf));
b.append(itos(result.vol_filter.candles));
b.append(itos(result.vol_filter.null_bars));
b.append(itos(result.vol_filter.candles_one_way));
b.append(itos(result.vol_filter.candle_open_close));
b.append(itos(result.vol_filter.candle_max_size));
b.append(itos(result.vol_filter.stop_trade_timing));
b.append(itos(result.vol_filter.block_both_direction));
#define param_vol_filter_to_str(number) \
b.append(itos(result.vol_filter##number.from_level)); \
b.append(itos(result.vol_filter##number.end_level)); \
b.append(EnumToString(result.vol_filter##number.candle_tf)); \
b.append(itos(result.vol_filter##number.candles)); \
b.append(itos(result.vol_filter##number.null_bars)); \
b.append(itos(result.vol_filter##number.candles_one_way)); \
b.append(itos(result.vol_filter##number.candle_open_close)); \
b.append(itos(result.vol_filter##number.candle_max_size)); \
b.append(itos(result.vol_filter##number.stop_trade_timing)); \
b.append(itos(result.vol_filter##number.block_both_direction)); \
param_vol_filter_to_str(2)
param_vol_filter_to_str(3)
return tool_global_var::generate_hash_var_name(b.to_str());
}
setting_t *defines_create ( bool is_buy, int lot_exp )
{
_IN1("");
#ifndef FOR_OPTIMIZATION
//TODO: нужно перенести вниз и сделать все это через reflect
if ( is_buy && ReflectSellSettingsToBuy ) {
_IN2("");
log_info ( SRC_DEFINES_REFLECT_SELL_SETTINGS_TO_BUY );
valid_tint ( S_MaxOpenOrders );
valid_tint ( S_GridStep );
valid_tint ( S_GridLevel );
valid_tint ( S_GridStep_AddPips );
valid_tint ( S_GridStep_Level2 );
valid_tint ( S_GridStep_Level2_AddPips );
valid_tint ( S_Grid3 );
valid_tint ( S_Grid3Add );
valid_tint ( S_GridStop );
valid_tint ( S_CalcLotType );
valid_tint ( S_CurrencyFor001Lot );
valid_tdou ( S_MinLot );
valid_tdou ( S_Mult );
valid_tint ( S_MultStart );
valid_tint ( S_MultLevel2 );
valid_tdou ( S_MultCorr );
valid_tint ( S_MultLevel3 );
valid_tdou ( S_MultСorrLevel3 );
valid_tint ( S_Mult3 );
valid_tdou ( S_Mult3Add );
valid_tint ( S_MultStop );
valid_tdou ( S_MaxLotCoef );
valid_tdou ( S_TestMinLot );
valid_tint ( S_TakeProffitType );
valid_tdou ( S_TakeProffit );
valid_tint ( S_TakeProffit_Level1 );
valid_tint ( S_TakeProffit_Level1Corr );
valid_tint ( S_TakeProffit_Level1_5 );
valid_tint ( S_TakeProffit_Level1_5Corr );
valid_tint ( S_TakeProffit_Level2 );
valid_tint ( S_TakeProffit_Level2FixPips );
valid_tint ( S_GapMinPips );
valid_tint ( S_GapMinPercent );
valid_tdou ( S_GapLotKoef );
valid_tdou ( S_GapLastOrderKoef );
}
#endif
#define bs( name ) ( is_buy ? B_##name : S_##name )
#define bs_reflect( name ) ( is_buy && !ReflectSellSettingsToBuy ? B_##name : S_##name )
int bit_multiplier = layer_account::bit_multiplier();
setting_t *result = new setting_t();
result.magic_number = MagicNumber;
result.max_spread = MaxSpread * bit_multiplier;
result.close_all_orders = bs ( CloseAllOrders );
result.open_positions = is_buy ? TradeBuy : TradeSell;
result.open_first_order = bs ( OpenFirstOrder );
result.max_open_orders = bs_reflect ( MaxOpenOrders );
result.pause_on_close_in_sec = 60 * bs ( PauseOnClose );
result.position_signal = PositionSignal;
result.time_frame = custom_tf_to_tf(OpenFirstOrderTF);
result.candles_for_open_first_order = CandlesToOpen1Order;
result.candles_for_open_first_order_open_close = CandlesToOpen1Order_OpenClose;
result.candles_for_open_first_order_min_pips = CandlesToOpen1Order_MinPips * bit_multiplier;
result.candles_for_open_first_order_max_pips = CandlesToOpen1Order_MaxPips * bit_multiplier;
result.revers_signal_to_open_first_order = ReversSignalToOpen1Order;
result.candles_for_open_first_order_one_way = CandlesToOpen1Order_OneWay;
result.lvl_open_first_order = is_buy ? LevelForBuy : LevelForSell;
result.lvl_open_move_koaf = is_buy ? LevelForBuy_MoveKoafInPercentByTP : LevelForSell_MoveKoafInPercentByTP;
result.lvl_no_first_order = is_buy ? LevelNoFirstOrderBuy : LevelNoFirstOrderSell;
result.grid_step = bs_reflect ( GridStep ) * bit_multiplier;
result.grid_level = bs_reflect ( GridLevel );
result.grid_value = bs_reflect ( GridStep_AddPips ) * bit_multiplier;
result.grid_level2 = bs_reflect ( GridStep_Level2 );
result.grid_level2_add_pips = bs_reflect ( GridStep_Level2_AddPips ) * bit_multiplier;
result.grid_level3 = bs_reflect ( Grid3 );
result.grid_level3_add_pips = bs_reflect ( Grid3Add ) * bit_multiplier;
result.grid_stop = bs_reflect ( GridStop );
result.lot_exp = lot_exp;
result.tp_type = bs_reflect ( TakeProffitType );
result.take_profit_control_timing = TakeProffitControlTiming;
result.take_profit_control_noloss_fixpips = TakeProffitControlNoLossFixPips * bit_multiplier;
result.take_proffit = bs_reflect ( TakeProffit ) * bit_multiplier;
result.take_proffit_level1 = bs_reflect ( TakeProffit_Level1 );
result.take_proffit_level1_corr = bs_reflect ( TakeProffit_Level1Corr ) * bit_multiplier;
result.take_proffit_level2 = bs_reflect ( TakeProffit_Level1_5 );
result.take_proffit_level2_corr = bs_reflect ( TakeProffit_Level1_5Corr ) * bit_multiplier;
result.take_proffit_level3 = bs_reflect ( TakeProffit_Level2 );
result.take_proffit_level3_fix_pips = bs_reflect ( TakeProffit_Level2FixPips ) * bit_multiplier;
result.tp_channel_height = bs_reflect ( TakeProfitChannelHeight );
result.tp_channel_lvl = bs_reflect (TakeProfitChannelLevel);
result.max_spread_stop_drading_timing = MaxSpreadStopTradingTimining;
result.mult_type = bs_reflect ( CalcLotType );
result.currency_for_001_lot = bs_reflect ( CurrencyFor001Lot );
result.lots = bs_reflect ( MinLot );
result.multi_lots_factor = bs_reflect ( Mult );
result.multi_lots_level1 = bs_reflect ( MultStart );
result.multi_lots_level2 = bs_reflect ( MultLevel2 );
result.multi_lots_level2_corr = bs_reflect ( MultCorr );
result.multi_lots_level3 = bs_reflect ( MultLevel3 );
result.multi_lots_level3_corr = bs_reflect ( MultСorrLevel3 );
result.mult4 = bs_reflect ( Mult3 );
result.mult4_add = bs_reflect ( Mult3Add );
result.mult_stop = bs_reflect ( MultStop );
//--- Capteen 190322
#ifdef USE_FILTERS
filters_settings(result);
#endif
#ifdef RSI_CCI
rc_settings(result);
#endif
//--- Capteen 190322
result.gap_control = GapControl;
result.far_pending_orders_delete=FarPendingOrdersDelete;
result.gap_max_order_stop = GapMaxStopOrders;
result.gap_min_pips_from_market = GapMinDistanceFromMarket * bit_multiplier;
result.gap_min_pips = bs_reflect ( GapMinPips ) * bit_multiplier;
result.gap_min_percent = bs_reflect ( GapMinPercent );
result.gap_lot_koef = bs_reflect ( GapLotKoef );
result.gap_last_order_koef = bs_reflect ( GapLastOrderKoef );
#define set_vol_filter_setting0 \
result.vol_filter.n = 1;\
result.vol_filter.from_level = VolFromLevel;\
result.vol_filter.end_level=VolEndLevel;\
result.vol_filter.candle_tf = custom_tf_to_tf(VolCandleTF);\
result.vol_filter.candles=VolCandles;\
result.vol_filter.null_bars=VolNullBar;\
result.vol_filter.candles_one_way=VolCandles_OneWay;\
result.vol_filter.candle_open_close=VolCandle_OpenClose;\
result.vol_filter.candle_max_size = VolCandleMaxSize * bit_multiplier;\
result.vol_filter.stop_trade_timing = VolStopTradeTimining;\
result.vol_filter.block_both_direction = VolBlockBothDirection;\
#define set_vol_filter_setting(number) \
result.vol_filter##number.n = number;\
result.vol_filter##number.from_level = Vol##number##FromLevel;\
result.vol_filter##number.end_level=Vol##number##EndLevel;\
result.vol_filter##number.candle_tf = custom_tf_to_tf(Vol##number##CandleTF);\
result.vol_filter##number.candles=Vol##number##Candles;\
result.vol_filter##number.null_bars=Vol##number##NullBar;\
result.vol_filter##number.candles_one_way=Vol##number##Candles_OneWay;\
result.vol_filter##number.candle_open_close=Vol##number##Candle_OpenClose;\
result.vol_filter##number.candle_max_size = Vol##number##CandleMaxSize * bit_multiplier;\
result.vol_filter##number.stop_trade_timing = Vol##number##StopTradeTimining;\
result.vol_filter##number.block_both_direction = Vol##number##BlockBothDirection;\
set_vol_filter_setting0
set_vol_filter_setting(2)
set_vol_filter_setting(3)
result.hash_vol_filters=param_vol_filter_to_hash(result);
result.no_first_counter_order_from_level = bs_reflect (NoFirstCounterOrder_FromLevel);
result.trade_start_day = TradeStartDay;
result.trade_start_minute = 60 * TradeStartHour + TradeStartMinute;
result.trade_end_day = TradeEndDay;
result.trade_stop_minute = 60 * TradeEndHour + TradeEndMinute;
result.final_stop_trading = FinalGridDate;
result.max_trade_pairs = MaxTradePairs;
result.currency_block = CurrencyBlock;
result.no1Order_by_drawdown_percent = No1Order_ByDrawdownPercent;
result.no1Order_by_drawdown_percent_off = No1Order_ByDrawdownPercent_Off;
result.close_all_orders_by_drawdown_stop_trade = CloseAllOrders_ByDrawdown_StopTrade;
result.close_orders_by_drawdown_for_001lot=bs_reflect (CloseOrders_ByDrawdown_For001Lot);
result.close_orders_by_drawdown_tp_ratio=bs_reflect (CloseOrders_ByDrawdown_TPRatio);
result.add_comment = AddComment;
result.min_leverage = MinLeverage;
result.min_time_step = MinTimeStep;
result.max_lot = bs_reflect ( MaxLotCoef );
result.test_min_lot = bs_reflect ( TestMinLot );
result.currency_block_label = def_to_str_from_int ( CurrencyBlock );
result.max_trade_pairs_label = def_to_str_from_int ( MaxTradePairs );
result.show_comments = ShowComments;
return result;
}
#define define_check_new_position_pause( number ) \
( NewPositionPause##number##Start != MIN_DATE \
|| NewPositionPause##number##End != MIN_DATE )
#define define_check_intraday( number ) \
( IntraDay##number##StartHour != IntraDay##number##EndHour \
|| IntraDay##number##StartMinute != IntraDay##number##EndMinute )
#define define_check_trade_pause( number ) \
( TradePause##number##Start != MIN_DATE \
&& TradePause##number##End != MIN_DATE )
#define define_check_intraday_stop_trade( number ) \
( IntraDayStopTrade##number##StartHour != IntraDayStopTrade##number##EndHour \
|| IntraDayStopTrade##number##StartMinute != IntraDayStopTrade##number##EndMinute )
#define defines_put_new_position_pause( number ) \
NewPositionPause##number##Start, \
NewPositionPause##number##End
#define defines_put_trade_pause( number ) \
TradePause##number##Start, \
TradePause##number##End
#define define_put_intraday( number ) \
IntraDay##number##StartHour, \
IntraDay##number##StartMinute, \
IntraDay##number##EndHour, \
IntraDay##number##EndMinute
#define define_put_intraday_stop_trade( number ) \
IntraDayStopTrade##number##StartHour, \
IntraDayStopTrade##number##StartMinute, \
IntraDayStopTrade##number##EndHour, \
IntraDayStopTrade##number##EndMinute
void defines_init_scheduler()
{
_IN1("");
if ( TradeStartDay != TradeEndDay
|| TradeStartHour != TradeEndHour
|| TradeStartMinute != TradeEndMinute ) {
_IN2("");
scheduler::set_trade ( TradeStartDay,
TradeStartHour,
TradeStartMinute,
TradeEndDay,
TradeEndHour,
TradeEndMinute );
} else {
_IN2("");
scheduler::reset_trade ();
}
if ( define_check_new_position_pause ( 1 )
|| define_check_new_position_pause ( 2 )
|| define_check_new_position_pause ( 3 )
|| define_check_new_position_pause ( 4 )
|| define_check_new_position_pause ( 5 )
|| define_check_new_position_pause ( 6 )
|| define_check_new_position_pause ( 7 )
|| define_check_new_position_pause ( 8 )
|| define_check_new_position_pause ( 9 )
|| define_check_new_position_pause ( 10 )
|| NewPositionPauseNewYearDayStart > 0
|| NewPositionPauseNewYearDayEnd > 0 ) {
_IN2("");
scheduler::set_new_position_pause ( defines_put_new_position_pause ( 1 ),
defines_put_new_position_pause ( 2 ),
defines_put_new_position_pause ( 3 ),
defines_put_new_position_pause ( 4 ),
defines_put_new_position_pause ( 5 ),
defines_put_new_position_pause ( 6 ),
defines_put_new_position_pause ( 7 ),
defines_put_new_position_pause ( 8 ),
defines_put_new_position_pause ( 9 ),
defines_put_new_position_pause ( 10 ),
NewPositionPauseNewYearDayStart,
NewPositionPauseNewYearDayEnd
);
} else {
_IN2("");
scheduler::reset_new_position_pause();
}
if ( define_check_trade_pause ( 1 )
|| define_check_trade_pause ( 2 )
|| define_check_trade_pause ( 3 )
|| define_check_trade_pause ( 4 )
|| define_check_trade_pause ( 5 )
|| define_check_trade_pause ( 6 )
|| define_check_trade_pause ( 7 )
|| define_check_trade_pause ( 8 )
|| define_check_trade_pause ( 9 )
|| define_check_trade_pause ( 10 ) ) {
_IN2("");
scheduler::set_trade_pause ( defines_put_trade_pause ( 1 ),
defines_put_trade_pause ( 2 ),
defines_put_trade_pause ( 3 ),
defines_put_trade_pause ( 4 ),
defines_put_trade_pause ( 5 ),
defines_put_trade_pause ( 6 ),
defines_put_trade_pause ( 7 ),
defines_put_trade_pause ( 8 ),
defines_put_trade_pause ( 9 ),
defines_put_trade_pause ( 10 ) );
} else {
_IN2("");
scheduler::reset_trade_pause();
}
if ( define_check_intraday ( 1 )
|| define_check_intraday ( 2 )
|| define_check_intraday ( 3 )
|| define_check_intraday ( 4 )
|| define_check_intraday ( 5 )
|| define_check_intraday ( 6 )
|| define_check_intraday ( 7 )
|| define_check_intraday ( 8 )
|| define_check_intraday ( 9 )
|| define_check_intraday ( 10 ) ) {
_IN2("");
scheduler::set_intraday ( define_put_intraday ( 1 ),
define_put_intraday ( 2 ),
define_put_intraday ( 3 ),
define_put_intraday ( 4 ),
define_put_intraday ( 5 ),
define_put_intraday ( 6 ),
define_put_intraday ( 7 ),
define_put_intraday ( 8 ),
define_put_intraday ( 9 ),
define_put_intraday ( 10 ) );
} else {
_IN2("");
scheduler::reset_intraday();
}
if ( define_check_intraday_stop_trade ( 1 )
|| define_check_intraday_stop_trade ( 2 )
|| define_check_intraday_stop_trade ( 3 )
|| define_check_intraday_stop_trade ( 4 )
|| define_check_intraday_stop_trade ( 5 )
|| define_check_intraday_stop_trade ( 6 )
|| define_check_intraday_stop_trade ( 7 )
|| define_check_intraday_stop_trade ( 8 )
|| define_check_intraday_stop_trade ( 9 )
|| define_check_intraday_stop_trade ( 10 ) ) {
_IN2("");
scheduler::set_intraday_stop_trade ( define_put_intraday_stop_trade ( 1 ),
define_put_intraday_stop_trade ( 2 ),
define_put_intraday_stop_trade ( 3 ),
define_put_intraday_stop_trade ( 4 ),
define_put_intraday_stop_trade ( 5 ),
define_put_intraday_stop_trade ( 6 ),
define_put_intraday_stop_trade ( 7 ),
define_put_intraday_stop_trade ( 8 ),
define_put_intraday_stop_trade ( 9 ),
define_put_intraday_stop_trade ( 10 ) );
} else {
_IN2("");
scheduler::reset_intraday_stop_trade();
}
if ( CloseAllOrders_EveryDay_Hour != 0
|| CloseAllOrders_EveryDay_Minute != 0 ) {
_IN2("");
scheduler::set_close_all_orders ( CloseAllOrders_EveryDay_Hour,
CloseAllOrders_EveryDay_Minute );
} else {
_IN2("");
scheduler::reset_close_all_orders();
}
}
#endif