//+------------------------------------------------------------------+ //| griderKatMultiAEA.mq4 | //| Copyright 2019, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #define pdxversion "9.27" #property copyright "Klymenko Roman (needtome@icloud.com)" #property link "https://www.mql5.com/en/users/needtome" #property version pdxversion #property strict enum TypeOfPos { MY_BUY, MY_SELL, MY_BUYSTOP, MY_BUYLIMIT, MY_SELLSTOP, MY_SELLLIMIT, MY_BUYSLTP, MY_SELLSLTP, MY_ALLPOS, }; enum TypeOfLang{ MY_ENG, // English MY_RUS, // Russian }; enum TypeOfLots //Lots Mode { MY_FIXED,//Fixed MY_ARIFMET,// Arifmet MY_GEOMET,// Geomet }; enum TypeOfSeries //Series Mode { MY_SERIES_PLUS,//In the direction of the series MY_SERIES_MINUS,// Against the direction of the series }; enum TypeOfMA //MA Type { MA_FIRST,//Lower or higher moving MA_SECOND,// Ascending or descending }; enum TypeOfDir //Direction Type { MA_DIR_BOTH,//Any MA_DIR_LONG,// Only Long MA_DIR_SHORT,// Only Short }; input int EA_Magic=345543; input string my_cmt="giderKatEA"; //Comment input double minSpread=0; // Enter only with spread, less input TypeOfLots typeLot=MY_GEOMET; // Chain increase input double equityLess=0; //Close all when equity is decreased by, $ input bool replaceFirstSymbol=false; // Replace symbol No. 1 with a graph symbol input int closeAtTotal=0; //Close at total profit sinput string delimeter_01_1=""; // ---------- Symbol No. 1 ---------- input bool useSym_1=true; // Allow trading on this symbol input string symName_1=""; // Symbol input double Lot_1=0.05; // Lot size input int gridStep_1=30; // Grid size, points input TypeOfDir typeDir_1=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_1=""; // --- Close all positions input double takeProfit_1=0; //On profit, $ input double takeProfit1step_1=0; //When profit in step 1, $ input double takeProfit2step_1=0; //When profit in step 2, $ input double takeProfit4step_1=0; //When profit in step 4, $ input uint gridStepCountClose_1=2; // Close everything when trading, number sinput string delimeter_07_1=""; // --- Towards the bar input bool BARS_enabled_1=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_1=PERIOD_D1; // Timeframe input int BARS_RSI_Period_1=0; //Start only on RSI signal with period sinput string delimeter_08_1=""; // --- Series of bars input int SERIES_count_1=0; //Enter at N bars one way input TypeOfSeries SERIES_type_1=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_1=PERIOD_M15; // Timeframe sinput string delimeter_09_1=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_1=PERIOD_D1; // Timeframe input int MA_PERIOD_1=0; //Period input TypeOfMA MA_TYPE_1=MA_FIRST; // Type of strategy input bool MA_invert_1=false; // Invert signal input bool MA_across_price_1=false; // Only when crossing the price with MA input bool MA_across_always_1=false; // At all steps when crossing the price sinput string delimeter_10_1=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_1=PERIOD_M5; // Timeframe input int RSI_PERIOD_1=0; //Period input bool RSI_enter_return_1= false; // Enter when exiting borders input bool RSI_only_first_1= true; // Use RSI only on first login input bool RSI_invert_1= false; // Invert signal sinput string delimeter_11_1=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_1=PERIOD_M5; // Timeframe input int BB_PERIOD_1=0; //Period input int BB_SHIFT_1=0; //Offset input double BB_DEVIATION_1=2; //Number of standard deviations input bool BB_only_first_1= false; // Use BB only on first login input bool BB_INVERT_1=false; //Invert signal sinput string delimeter_01_2=""; // ---------- Symbol No. 2 ---------- input bool useSym_2=false; // Allow trading on this symbol input string symName_2=""; // Symbol input double Lot_2=0.05; // Lot size input int gridStep_2=30; // Grid size, points input TypeOfDir typeDir_2=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_2=""; // --- Close all positions input double takeProfit_2=0; //On profit, $ input double takeProfit1step_2=0; //When profit in step 1, $ input double takeProfit2step_2=0; //When profit in step 2, $ input double takeProfit4step_2=0; //When profit in step 4, $ input uint gridStepCountClose_2=2; // Close everything when trading, number sinput string delimeter_07_2=""; // --- Towards the bar input bool BARS_enabled_2=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_2=PERIOD_D1; // Timeframe input int BARS_RSI_Period_2=0; //Start only on RSI signal with period sinput string delimeter_08_2=""; // --- Series of bars input int SERIES_count_2=0; //Enter at N bars one way input TypeOfSeries SERIES_type_2=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_2=PERIOD_M15; // Timeframe sinput string delimeter_09_2=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_2=PERIOD_D1; // Timeframe input int MA_PERIOD_2=0; //Period input TypeOfMA MA_TYPE_2=MA_FIRST; // Type of strategy input bool MA_invert_2=false; // Invert signal input bool MA_across_price_2=false; // Only when crossing the price with MA input bool MA_across_always_2=false; // Only when crossing the price with MA sinput string delimeter_10_2=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_2=PERIOD_M5; // Timeframe input int RSI_PERIOD_2=0; //Period input bool RSI_enter_return_2= false; // Enter when exiting borders input bool RSI_only_first_2= true; // Use RSI only on first login input bool RSI_invert_2= false; // Invert signal sinput string delimeter_11_2=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_2=PERIOD_M5; // Timeframe input int BB_PERIOD_2=0; //Period input int BB_SHIFT_2=0; //Offset input double BB_DEVIATION_2=2; //Number of standard deviations input bool BB_only_first_2= false; // Use BB only on first login input bool BB_INVERT_2=false; //Invert signal sinput string delimeter_01_3=""; // ---------- Symbol No. 3 ---------- input bool useSym_3=false; // Allow trading on this symbol input string symName_3=""; // Symbol input double Lot_3=0.05; // Lot size input int gridStep_3=30; // Grid size, points input TypeOfDir typeDir_3=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_3=""; // --- Close all positions input double takeProfit_3=0; //On profit, $ input double takeProfit1step_3=0; //When profit in step 1, $ input double takeProfit2step_3=0; //When profit in step 2, $ input double takeProfit4step_3=0; //When profit in step 4, $ input uint gridStepCountClose_3=2; // Close everything when trading, number sinput string delimeter_07_3=""; // --- Towards the bar input bool BARS_enabled_3=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_3=PERIOD_D1; // Timeframe input int BARS_RSI_Period_3=0; //Start only on RSI signal with period sinput string delimeter_08_3=""; // --- Series of bars input int SERIES_count_3=0; //Enter at N bars one way input TypeOfSeries SERIES_type_3=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_3=PERIOD_M15; // Timeframe sinput string delimeter_09_3=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_3=PERIOD_D1; // Timeframe input int MA_PERIOD_3=0; //Period input TypeOfMA MA_TYPE_3=MA_FIRST; // Type of strategy input bool MA_invert_3=false; // Invert signal input bool MA_across_price_3=false; // Only when crossing the price with MA input bool MA_across_always_3=false; // At all steps when crossing the price sinput string delimeter_10_3=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_3=PERIOD_M5; // Timeframe input int RSI_PERIOD_3=0; //Period input bool RSI_enter_return_3= false; // Enter when exiting borders input bool RSI_only_first_3= true; // Use RSI only on first login input bool RSI_invert_3= false; // Invert signal sinput string delimeter_11_3=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_3=PERIOD_M5; // Timeframe input int BB_PERIOD_3=0; //Period input int BB_SHIFT_3=0; //Offset input double BB_DEVIATION_3=2; //Number of standard deviations input bool BB_only_first_3= false; // Use BB only on first login input bool BB_INVERT_3=false; //Invert signal sinput string delimeter_01_4=""; // ---------- Symbol No. 4 ---------- input bool useSym_4=false; // Allow trading on this symbol input string symName_4=""; // Symbol input double Lot_4=0.05; // Lot size input int gridStep_4=30; // Grid size, points input TypeOfDir typeDir_4=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_4=""; // --- Close all positions input double takeProfit_4=0; //On profit, $ input double takeProfit1step_4=0; //When profit in step 1, $ input double takeProfit2step_4=0; //When profit in step 2, $ input double takeProfit4step_4=0; //When profit in step 4, $ input uint gridStepCountClose_4=2; // Close everything when trading, number sinput string delimeter_07_4=""; // --- Towards the bar input bool BARS_enabled_4=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_4=PERIOD_D1; // Timeframe input int BARS_RSI_Period_4=0; //Start only on RSI signal with period sinput string delimeter_08_4=""; // --- Series of bars input int SERIES_count_4=0; //Enter at N bars one way input TypeOfSeries SERIES_type_4=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_4=PERIOD_M15; // Timeframe sinput string delimeter_09_4=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_4=PERIOD_D1; // Timeframe input int MA_PERIOD_4=0; //Period input TypeOfMA MA_TYPE_4=MA_FIRST; // Type of strategy input bool MA_invert_4=false; // Invert signal input bool MA_across_price_4=false; // Only when crossing the price with MA input bool MA_across_always_4=false; // At all steps when crossing the price sinput string delimeter_10_4=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_4=PERIOD_M5; // Timeframe input int RSI_PERIOD_4=0; //Period input bool RSI_enter_return_4= false; // Enter when exiting borders input bool RSI_only_first_4= true; // Use RSI only on first login input bool RSI_invert_4= false; // Invert signal sinput string delimeter_11_4=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_4=PERIOD_M5; // Timeframe input int BB_PERIOD_4=0; //Period input int BB_SHIFT_4=0; //Offset input double BB_DEVIATION_4=2; //Number of standard deviations input bool BB_only_first_4= false; // Use BB only on first login input bool BB_INVERT_4=false; //Invert signal sinput string delimeter_01_5=""; // ---------- Symbol No. 5 ---------- input bool useSym_5=false; // Allow trading on this symbol input string symName_5=""; // Symbol input double Lot_5=0.05; // Lot size input int gridStep_5=30; // Grid size, points input TypeOfDir typeDir_5=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_5=""; // --- Close all positions input double takeProfit_5=0; //On profit, $ input double takeProfit1step_5=0; //When profit in step 1, $ input double takeProfit2step_5=0; //When profit in step 2, $ input double takeProfit4step_5=0; //When profit in step 4, $ input uint gridStepCountClose_5=2; // Close everything when trading, number sinput string delimeter_07_5=""; // --- Towards the bar input bool BARS_enabled_5=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_5=PERIOD_D1; // Timeframe input int BARS_RSI_Period_5=0; //Start only on RSI signal with period sinput string delimeter_08_5=""; // --- Series of bars input int SERIES_count_5=0; //Enter at N bars one way input TypeOfSeries SERIES_type_5=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_5=PERIOD_M15; // Timeframe sinput string delimeter_09_5=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_5=PERIOD_D1; // Timeframe input int MA_PERIOD_5=0; //Period input TypeOfMA MA_TYPE_5=MA_FIRST; // Type of strategy input bool MA_invert_5=false; // Invert signal input bool MA_across_price_5=false; // Only when crossing the price with MA input bool MA_across_always_5=false; // At all steps when crossing the price sinput string delimeter_10_5=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_5=PERIOD_M5; // Timeframe input int RSI_PERIOD_5=0; //Period input bool RSI_enter_return_5= false; // Enter when exiting borders input bool RSI_only_first_5= true; // Use RSI only on first login input bool RSI_invert_5= false; // Invert signal sinput string delimeter_11_5=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_5=PERIOD_M5; // Timeframe input int BB_PERIOD_5=0; //Period input int BB_SHIFT_5=0; //Offset input double BB_DEVIATION_5=2; //Number of standard deviations input bool BB_only_first_5= false; // Use BB only on first login input bool BB_INVERT_5=false; //Invert signal sinput string delimeter_01_6=""; // ---------- Symbol No. 6 ---------- input bool useSym_6=false; // Allow trading on this symbol input string symName_6=""; // Symbol input double Lot_6=0.05; // Lot size input int gridStep_6=30; // Grid size, points input TypeOfDir typeDir_6=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_6=""; // --- Close all positions input double takeProfit_6=0; //On profit, $ input double takeProfit1step_6=0; //When profit in step 1, $ input double takeProfit2step_6=0; //When profit in step 2, $ input double takeProfit4step_6=0; //When profit in step 4, $ input uint gridStepCountClose_6=2; // Close everything when trading, number sinput string delimeter_07_6=""; // --- Towards the bar input bool BARS_enabled_6=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_6=PERIOD_D1; // Timeframe input int BARS_RSI_Period_6=0; //Start only on RSI signal with period sinput string delimeter_08_6=""; // --- Series of bars input int SERIES_count_6=0; //Enter at N bars one way input TypeOfSeries SERIES_type_6=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_6=PERIOD_M15; // Timeframe sinput string delimeter_09_6=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_6=PERIOD_D1; // Timeframe input int MA_PERIOD_6=0; //Period input TypeOfMA MA_TYPE_6=MA_FIRST; // Type of strategy input bool MA_invert_6=false; // Invert signal input bool MA_across_price_6=false; // Only when crossing the price with MA input bool MA_across_always_6=false; // At all steps when crossing the price sinput string delimeter_10_6=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_6=PERIOD_M5; // Timeframe input int RSI_PERIOD_6=0; //Period input bool RSI_enter_return_6= false; // Enter when exiting borders input bool RSI_only_first_6= true; // Use RSI only on first login input bool RSI_invert_6= false; // Invert signal sinput string delimeter_11_6=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_6=PERIOD_M5; // Timeframe input int BB_PERIOD_6=0; //Period input int BB_SHIFT_6=0; //Offset input double BB_DEVIATION_6=2; //Number of standard deviations input bool BB_only_first_6= false; // Use BB only on first login input bool BB_INVERT_6=false; //Invert signal sinput string delimeter_01_7=""; // ---------- Symbol No. 7 ---------- input bool useSym_7=false; // Allow trading on this symbol input string symName_7=""; // Symbol input double Lot_7=0.05; // Lot size input int gridStep_7=30; // Grid size, points input TypeOfDir typeDir_7=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_7=""; // --- Close all positions input double takeProfit_7=0; //On profit, $ input double takeProfit1step_7=0; //When profit in step 1, $ input double takeProfit2step_7=0; //When profit in step 2, $ input double takeProfit4step_7=0; //When profit in step 4, $ input uint gridStepCountClose_7=2; // Close everything when trading, number sinput string delimeter_07_7=""; // --- Towards the bar input bool BARS_enabled_7=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_7=PERIOD_D1; // Timeframe input int BARS_RSI_Period_7=0; //Start only on RSI signal with period sinput string delimeter_08_7=""; // --- Series of bars input int SERIES_count_7=0; //Enter at N bars one way input TypeOfSeries SERIES_type_7=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_7=PERIOD_M15; // Timeframe sinput string delimeter_09_7=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_7=PERIOD_D1; // Timeframe input int MA_PERIOD_7=0; //Period input TypeOfMA MA_TYPE_7=MA_FIRST; // Type of strategy input bool MA_invert_7=false; // Invert signal input bool MA_across_price_7=false; // Only when crossing the price with MA input bool MA_across_always_7=false; // At all steps when crossing the price sinput string delimeter_10_7=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_7=PERIOD_M5; // Timeframe input int RSI_PERIOD_7=0; //Period input bool RSI_enter_return_7= false; // Enter when exiting borders input bool RSI_only_first_7= true; // Use RSI only on first login input bool RSI_invert_7= false; // Invert signal sinput string delimeter_11_7=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_7=PERIOD_M5; // Timeframe input int BB_PERIOD_7=0; //Period input int BB_SHIFT_7=0; //Offset input double BB_DEVIATION_7=2; //Number of standard deviations input bool BB_only_first_7= false; // Use BB only on first login input bool BB_INVERT_7=false; //Invert signal sinput string delimeter_01_8=""; // ---------- Symbol No. 8 ---------- input bool useSym_8=false; // Allow trading on this symbol input string symName_8=""; // Symbol input double Lot_8=0.05; // Lot size input int gridStep_8=30; // Grid size, points input TypeOfDir typeDir_8=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_8=""; // --- Close all positions input double takeProfit_8=0; //On profit, $ input double takeProfit1step_8=0; //When profit in step 1, $ input double takeProfit2step_8=0; //When profit in step 2, $ input double takeProfit4step_8=0; //When profit in step 4, $ input uint gridStepCountClose_8=2; // Close everything when trading, number sinput string delimeter_07_8=""; // --- Towards the bar input bool BARS_enabled_8=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_8=PERIOD_D1; // Timeframe input int BARS_RSI_Period_8=0; //Start only on RSI signal with period sinput string delimeter_08_8=""; // --- Series of bars input int SERIES_count_8=0; //Enter at N bars one way input TypeOfSeries SERIES_type_8=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_8=PERIOD_M15; // Timeframe sinput string delimeter_09_8=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_8=PERIOD_D1; // Timeframe input int MA_PERIOD_8=0; //Period input TypeOfMA MA_TYPE_8=MA_FIRST; // Type of strategy input bool MA_invert_8=false; // Invert signal input bool MA_across_price_8=false; // Only when crossing the price with MA input bool MA_across_always_8=false; // At all steps when crossing the price sinput string delimeter_10_8=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_8=PERIOD_M5; // Timeframe input int RSI_PERIOD_8=0; //Period input bool RSI_enter_return_8= false; // Enter when exiting borders input bool RSI_only_first_8= true; // Use RSI only on first login input bool RSI_invert_8= false; // Invert signal sinput string delimeter_11_8=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_8=PERIOD_M5; // Timeframe input int BB_PERIOD_8=0; //Period input int BB_SHIFT_8=0; //Offset input double BB_DEVIATION_8=2; //Number of standard deviations input bool BB_only_first_8= false; // Use BB only on first login input bool BB_INVERT_8=false; //Invert signal sinput string delimeter_01_9=""; // ---------- Symbol No. 9 ---------- input bool useSym_9=false; // Allow trading on this symbol input string symName_9=""; // Symbol input double Lot_9=0.05; // Lot size input int gridStep_9=30; // Grid size, points input TypeOfDir typeDir_9=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_9=""; // --- Close all positions input double takeProfit_9=0; //On profit, $ input double takeProfit1step_9=0; //When profit in step 1, $ input double takeProfit2step_9=0; //When profit in step 2, $ input double takeProfit4step_9=0; //When profit in step 4, $ input uint gridStepCountClose_9=2; // Close everything when trading, number sinput string delimeter_07_9=""; // --- Towards the bar input bool BARS_enabled_9=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_9=PERIOD_D1; // Timeframe input int BARS_RSI_Period_9=0; //Start only on RSI signal with period sinput string delimeter_08_9=""; // --- Series of bars input int SERIES_count_9=0; //Enter at N bars one way input TypeOfSeries SERIES_type_9=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_9=PERIOD_M15; // Timeframe sinput string delimeter_09_9=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_9=PERIOD_D1; // Timeframe input int MA_PERIOD_9=0; //Period input TypeOfMA MA_TYPE_9=MA_FIRST; // Type of strategy input bool MA_invert_9=false; // Invert signal input bool MA_across_price_9=false; // Only when crossing the price with MA input bool MA_across_always_9=false; // At all steps when crossing the price sinput string delimeter_10_9=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_9=PERIOD_M5; // Timeframe input int RSI_PERIOD_9=0; //Period input bool RSI_enter_return_9= false; // Enter when exiting borders input bool RSI_only_first_9= true; // Use RSI only on first login input bool RSI_invert_9= false; // Invert signal sinput string delimeter_11_9=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_9=PERIOD_M5; // Timeframe input int BB_PERIOD_9=0; //Period input int BB_SHIFT_9=0; //Offset input double BB_DEVIATION_9=2; //Number of standard deviations input bool BB_only_first_9= false; // Use BB only on first login input bool BB_INVERT_9=false; //Invert signal sinput string delimeter_01_10=""; // ---------- Symbol No. 10 ---------- input bool useSym_10=false; // Allow trading on this symbol input string symName_10=""; // Symbol input double Lot_10=0.05; // Lot size input int gridStep_10=30; // Grid size, points input TypeOfDir typeDir_10=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_10=""; // --- Close all positions input double takeProfit_10=0; //On profit, $ input double takeProfit1step_10=0; //When profit in step 1, $ input double takeProfit2step_10=0; //When profit in step 2, $ input double takeProfit4step_10=0; //When profit in step 4, $ input uint gridStepCountClose_10=2; // Close everything when trading, number sinput string delimeter_07_10=""; // --- Towards the bar input bool BARS_enabled_10=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_10=PERIOD_D1; // Timeframe input int BARS_RSI_Period_10=0; //Start only on RSI signal with period sinput string delimeter_08_10=""; // --- Series of bars input int SERIES_count_10=0; //Enter at N bars one way input TypeOfSeries SERIES_type_10=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_10=PERIOD_M15; // Timeframe sinput string delimeter_09_10=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_10=PERIOD_D1; // Timeframe input int MA_PERIOD_10=0; //Period input TypeOfMA MA_TYPE_10=MA_FIRST; // Type of strategy input bool MA_invert_10=false; // Invert signal input bool MA_across_price_10=false; // Only when crossing the price with MA input bool MA_across_always_10=false; // At all steps when crossing the price sinput string delimeter_10_10=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_10=PERIOD_M5; // Timeframe input int RSI_PERIOD_10=0; //Period input bool RSI_enter_return_10= false; // Enter when exiting borders input bool RSI_only_first_10= true; // Use RSI only on first login input bool RSI_invert_10= false; // Invert signal sinput string delimeter_11_10=""; // --- Bolinger Bands input ENUM_TIMEFRAMES BB_Timeframe_10=PERIOD_M5; // Timeframe input int BB_PERIOD_10=0; //Period input int BB_SHIFT_10=0; //Offset input double BB_DEVIATION_10=2; //Number of standard deviations input bool BB_only_first_10= false; // Use BB only on first login input bool BB_INVERT_10=false; //Invert signal sinput string delimeter_01_11=""; // ---------- Symbol No. 11 ---------- input bool useSym_11=false; // Allow trading on this symbol input string symName_11=""; // Symbol input double Lot_11=0.05; // Lot size input int gridStep_11=30; // Grid size, points input TypeOfDir typeDir_11=MA_DIR_BOTH; // Entry directions sinput string delimeter_02_11=""; // --- Close all positions input double takeProfit_11=0; //On profit, $ input double takeProfit1step_11=0; //When profit in step 1, $ input double takeProfit2step_11=0; //When profit in step 2, $ input double takeProfit4step_11=0; //When profit in step 4, $ input uint gridStepCountClose_11=2; // Close everything when trading, number sinput string delimeter_07_11=""; // --- Towards the bar input bool BARS_enabled_11=false; //Use bar entry input ENUM_TIMEFRAMES BARS_Timeframe_11=PERIOD_D1; // Timeframe input int BARS_RSI_Period_11=0; //Start only on RSI signal with period sinput string delimeter_08_11=""; // --- Series of bars input int SERIES_count_11=0; //Enter at N bars one way input TypeOfSeries SERIES_type_11=MY_SERIES_PLUS; // Entry direction input ENUM_TIMEFRAMES SERIES_Timeframe_11=PERIOD_M15; // Timeframe sinput string delimeter_09_11=""; // --- MA input ENUM_TIMEFRAMES MA_Timeframe_11=PERIOD_D1; // Timeframe input int MA_PERIOD_11=0; //Period input TypeOfMA MA_TYPE_11=MA_FIRST; // Type of strategy input bool MA_invert_11=false; // Invert signal input bool MA_across_price_11=false; // Only when crossing the price with MA input bool MA_across_always_11=false; // At all steps when crossing the price sinput string delimeter_10_11=""; // --- RSI input ENUM_TIMEFRAMES RSI_Timeframe_11=PERIOD_M5; // Timeframe input int RSI_PERIOD_11=0; //Period input bool RSI_enter_return_11= false; // Enter when exiting borders input bool RSI_only_first_11= true; // Use RSI only on first login input bool RSI_invert_11= false; // Invert signal sinput string delimeter_11_11=""; // --- Bollinger Bands input ENUM_TIMEFRAMES BB_Timeframe_11=PERIOD_M5; // Timeframe input int BB_PERIOD_11=0; //Period input int BB_SHIFT_11=0; //Offset input double BB_DEVIATION_11=2; //Number of standard deviations input bool BB_only_first_11= false; // Use BB only on first login input bool BB_INVERT_11=false; //Invert signal sinput string delimeter_13=""; // --- Other input TypeOfLang LANG=MY_RUS; // Language #ifdef __MQL5__ #include CTrade Trade; enum TypeOfFilling // Filling Mode { FOK,//ORDER_FILLING_FOK RETURN,// ORDER_FILLING_RETURN IOC,//ORDER_FILLING_IOC }; input TypeOfFilling useORDER_FILLING_RETURN=FOK; //Order filling mode #endif TypeOfDir typeDir=MA_DIR_BOTH; // Entry direction double takeProfit=0; //When profit is, $ double takeProfit1step=0; //Profit at step 1, $ double takeProfit2step=0; //Profit at step 2, $ double takeProfit4step=0; //Profit at step 4, $ uint gridStepCountClose=0; // Close all at trade number bool BARS_enabled=false; //Use entry by bar only ENUM_TIMEFRAMES BARS_Timeframe=PERIOD_D1; // Timeframe int BARS_RSI_Period=0; //Start only upon RSI signal with specific period int SERIES_count=0; //Enter if N bars in one direction TypeOfSeries SERIES_type=MY_SERIES_PLUS; // Entry direction ENUM_TIMEFRAMES SERIES_Timeframe=PERIOD_M15; // Timeframe ENUM_TIMEFRAMES MA_Timeframe=PERIOD_D1; // Timeframe int MA_PERIOD=0; //Period TypeOfMA MA_TYPE=MA_FIRST; // Strategy type bool MA_invert=false; // Invert the signal bool MA_across_price=false; // Only when price crosses MA bool MA_across_always=false; // In all steps when price is crossed ENUM_TIMEFRAMES RSI_Timeframe=PERIOD_M5; // Timeframe int RSI_PERIOD=0; //Period bool RSI_enter_return= false; // Enter when moves beyond borders bool RSI_only_first= false; // Use RSI only for the first entry bool RSI_invert= false; // Invert the signal ENUM_TIMEFRAMES BB_Timeframe=PERIOD_M5; // Timeframe int BB_PERIOD=0; //Period int BB_SHIFT=0; //Shift double BB_DEVIATION=2; //Number if standard deviations bool BB_only_first= false; // Use BB only on first login bool BB_INVERT=false; //Invert the signal MqlTick lastme; uint LongPos[11]; uint ShortPos[11]; double LongVol[11]; double ShortVol[11]; string prefix_graph="griderKat_"; string msg_lines[]; uchar lines_size=0; double curLot; double mSpread; int h[11]; int h2[11]; int h3[11]; int h4[11]; int hIndex=0; double buf0[]; double buf1[]; double buf2[]; int cur_offset; int cur_offset_mult; bool noLong=false; bool noShort=false; datetime Old_Time[11]; double LastLong=0; double LastShort=0; bool RSI_start[11]; bool BB_start[11]; bool MA_start[11]; uint MA_cur_dir[11]; ulong minVolTicket = 0; ulong maxVolTicket = 0; double minVolIs = 0; double maxVolIs = 0; double minVolProfit = 0; double maxVolProfit = 0; struct translate{ string err1; string err2; string err3; string err4; string err5; string err6; string err7; string err8; string err9; string err64; string err65; string err128; string err129; string err130; string err131; string err132; string err133; string err134; string err135; string err136; string err137; string err138; string err139; string err140; string err141; string err145; string err146; string err147; string err148; string err0; string retcode; string retcode10004; string retcode10006; string retcode10007; string retcode10010; string retcode10011; string retcode10012; string retcode10013; string retcode10014; string retcode10015; string retcode10016; string retcode10017; string retcode10018; string retcode10019; string retcode10020; string retcode10021; string retcode10022; string retcode10023; string retcode10024; string retcode10025; string retcode10026; string retcode10027; string retcode10028; string retcode10029; string retcode10030; string retcode10031; string retcode10032; string retcode10033; string retcode10034; string retcode10035; string retcode10036; string retcode10038; string retcode10039; string retcode10040; string retcode10041; string retcode10042; string retcode10043; string retcode10044; }; translate langs; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(!MQLInfoInteger(MQL_TRADE_ALLOWED)){ Comment("The Expert Advisor is not allowed to trade! ("+(string) EA_Magic+")"); return(INIT_SUCCEEDED); } if( GlobalVariableCheck(prefix_graph+"_equity") ){ Comment("Equity on begin: "+(string) GlobalVariableGet(prefix_graph+"_equity")); } init_lang(); for(int i=0; i<11; i++){ Old_Time[i]=0; LongPos[i]=0; ShortPos[i]=0; LongVol[i]=0; ShortVol[i]=0; RSI_start[i]=false; BB_start[i]=false; MA_start[i]=false; MA_cur_dir[i]=0; } cur_offset_mult=0; #ifdef __MQL5__ if( StringLen(symName_1) && useSym_1 ){ string curSym = symName_1; if (replaceFirstSymbol) { curSym = _Symbol; } if(MA_PERIOD_1>0){ h[0] = iMA(curSym, MA_Timeframe_1, MA_PERIOD_1, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_1>0){ h2[0] = iRSI(curSym, RSI_Timeframe_1, RSI_PERIOD_1, PRICE_CLOSE); }else if(BARS_RSI_Period_1>0){ h3[0] = iRSI(curSym, PERIOD_M5, BARS_RSI_Period_1, PRICE_CLOSE); }else if(BB_PERIOD_1>0){ h4[0] = iBands(curSym, BB_Timeframe_1, BB_PERIOD_1, BB_SHIFT_1, BB_DEVIATION_1, PRICE_CLOSE); } } if( StringLen(symName_2) && useSym_2 ){ if( MA_PERIOD_2>0){ h[1] = iMA(symName_2, MA_Timeframe_2, MA_PERIOD_2, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_2>0){ h2[1] = iRSI(symName_2, RSI_Timeframe_2, RSI_PERIOD_2, PRICE_CLOSE); }else if(BARS_RSI_Period_2>0){ h3[1] = iRSI(symName_2, PERIOD_M5, BARS_RSI_Period_2, PRICE_CLOSE); }else if(BB_PERIOD_2>0){ h4[1] = iBands(symName_2, BB_Timeframe_2, BB_PERIOD_2, BB_SHIFT_2, BB_DEVIATION_2, PRICE_CLOSE); } } if( StringLen(symName_3) && useSym_3 ){ if( MA_PERIOD_3>0){ h[2] = iMA(symName_3, MA_Timeframe_3, MA_PERIOD_3, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_3>0){ h2[2] = iRSI(symName_3, RSI_Timeframe_3, RSI_PERIOD_3, PRICE_CLOSE); }else if(BARS_RSI_Period_3>0){ h3[2] = iRSI(symName_3, PERIOD_M5, BARS_RSI_Period_3, PRICE_CLOSE); }else if(BB_PERIOD_3>0){ h4[2] = iBands(symName_3, BB_Timeframe_3, BB_PERIOD_3, BB_SHIFT_3, BB_DEVIATION_3, PRICE_CLOSE); } } if( StringLen(symName_4) && useSym_4 ){ if( MA_PERIOD_4>0){ h[3] = iMA(symName_4, MA_Timeframe_4, MA_PERIOD_4, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_4>0){ h2[3] = iRSI(symName_4, RSI_Timeframe_4, RSI_PERIOD_4, PRICE_CLOSE); }else if(BARS_RSI_Period_4>0){ h3[3] = iRSI(symName_4, PERIOD_M5, BARS_RSI_Period_4, PRICE_CLOSE); }else if(BB_PERIOD_4>0){ h4[3] = iBands(symName_4, BB_Timeframe_4, BB_PERIOD_4, BB_SHIFT_4, BB_DEVIATION_4, PRICE_CLOSE); } } if( StringLen(symName_5) && useSym_5 ){ if( MA_PERIOD_5>0){ h[4] = iMA(symName_5, MA_Timeframe_5, MA_PERIOD_5, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_5>0){ h2[4] = iRSI(symName_5, RSI_Timeframe_5, RSI_PERIOD_5, PRICE_CLOSE); }else if(BARS_RSI_Period_5>0){ h3[4] = iRSI(symName_5, PERIOD_M5, BARS_RSI_Period_5, PRICE_CLOSE); }else if(BB_PERIOD_5>0){ h4[4] = iBands(symName_5, BB_Timeframe_5, BB_PERIOD_5, BB_SHIFT_5, BB_DEVIATION_5, PRICE_CLOSE); } } if( StringLen(symName_6) && useSym_6 ){ if( MA_PERIOD_6>0){ h[5] = iMA(symName_6, MA_Timeframe_6, MA_PERIOD_6, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_6>0){ h2[5] = iRSI(symName_6, RSI_Timeframe_6, RSI_PERIOD_6, PRICE_CLOSE); }else if(BARS_RSI_Period_6>0){ h3[5] = iRSI(symName_6, PERIOD_M5, BARS_RSI_Period_6, PRICE_CLOSE); }else if(BB_PERIOD_6>0){ h4[5] = iBands(symName_6, BB_Timeframe_6, BB_PERIOD_6, BB_SHIFT_6, BB_DEVIATION_6, PRICE_CLOSE); } } if( StringLen(symName_7) && useSym_7 ){ if( MA_PERIOD_7>0){ h[6] = iMA(symName_7, MA_Timeframe_7, MA_PERIOD_7, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_7>0){ h2[6] = iRSI(symName_7, RSI_Timeframe_7, RSI_PERIOD_7, PRICE_CLOSE); }else if(BARS_RSI_Period_7>0){ h3[6] = iRSI(symName_7, PERIOD_M5, BARS_RSI_Period_7, PRICE_CLOSE); }else if(BB_PERIOD_7>0){ h4[6] = iBands(symName_7, BB_Timeframe_7, BB_PERIOD_7, BB_SHIFT_7, BB_DEVIATION_7, PRICE_CLOSE); } } if( StringLen(symName_8) && useSym_8 ){ if( MA_PERIOD_8>0){ h[7] = iMA(symName_8, MA_Timeframe_8, MA_PERIOD_8, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_8>0){ h2[7] = iRSI(symName_8, RSI_Timeframe_8, RSI_PERIOD_8, PRICE_CLOSE); }else if(BARS_RSI_Period_8>0){ h3[7] = iRSI(symName_8, PERIOD_M5, BARS_RSI_Period_8, PRICE_CLOSE); }else if(BB_PERIOD_8>0){ h4[7] = iBands(symName_8, BB_Timeframe_8, BB_PERIOD_8, BB_SHIFT_8, BB_DEVIATION_8, PRICE_CLOSE); } } if( StringLen(symName_9) && useSym_9 ){ if( MA_PERIOD_9>0){ h[8] = iMA(symName_9, MA_Timeframe_9, MA_PERIOD_9, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_9>0){ h2[8] = iRSI(symName_9, RSI_Timeframe_9, RSI_PERIOD_9, PRICE_CLOSE); }else if(BARS_RSI_Period_9>0){ h3[8] = iRSI(symName_9, PERIOD_M5, BARS_RSI_Period_9, PRICE_CLOSE); }else if(BB_PERIOD_9>0){ h4[8] = iBands(symName_9, BB_Timeframe_9, BB_PERIOD_9, BB_SHIFT_9, BB_DEVIATION_9, PRICE_CLOSE); } } if( StringLen(symName_10) && useSym_10 ){ if( MA_PERIOD_10>0){ h[9] = iMA(symName_10, MA_Timeframe_10, MA_PERIOD_10, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_10>0){ h2[9] = iRSI(symName_10, RSI_Timeframe_10, RSI_PERIOD_10, PRICE_CLOSE); }else if(BARS_RSI_Period_10>0){ h3[9] = iRSI(symName_10, PERIOD_M5, BARS_RSI_Period_10, PRICE_CLOSE); }else if(BB_PERIOD_10>0){ h4[9] = iBands(symName_10, BB_Timeframe_10, BB_PERIOD_10, BB_SHIFT_10, BB_DEVIATION_10, PRICE_CLOSE); } } if( StringLen(symName_11) && useSym_11 ){ if( MA_PERIOD_11>0){ h[10] = iMA(symName_11, MA_Timeframe_11, MA_PERIOD_11, 0, MODE_SMA, PRICE_CLOSE); }else if(RSI_PERIOD_11>0){ h2[10] = iRSI(symName_11, RSI_Timeframe_11, RSI_PERIOD_11, PRICE_CLOSE); }else if(BARS_RSI_Period_11>0){ h3[10] = iRSI(symName_11, PERIOD_M5, BARS_RSI_Period_11, PRICE_CLOSE); }else if(BB_PERIOD_11>0){ h4[10] = iBands(symName_11, BB_Timeframe_11, BB_PERIOD_11, BB_SHIFT_11, BB_DEVIATION_11, PRICE_CLOSE); } } #endif if( !EventSetTimer(7) ){ Comment("Timer NOT SET!"); }else{ Comment(""); } //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- ObjectsDeleteAll(0, prefix_graph); #ifdef __MQL5__ if( StringLen(symName_1) && useSym_1 ){ if( MA_PERIOD_1>0 ){ IndicatorRelease(h[0]); } if( RSI_PERIOD_1>0 ){ IndicatorRelease(h2[0]); } if( BARS_RSI_Period_1>0 ){ IndicatorRelease(h3[0]); } if( BB_PERIOD_1>0 ){ IndicatorRelease(h4[0]); } } if( StringLen(symName_2) && useSym_2 ){ if( MA_PERIOD_2>0 ){ IndicatorRelease(h[1]); } if( RSI_PERIOD_2>0 ){ IndicatorRelease(h2[1]); } if( BARS_RSI_Period_2>0 ){ IndicatorRelease(h3[1]); } if( BB_PERIOD_2>0 ){ IndicatorRelease(h4[1]); } } if( StringLen(symName_3) && useSym_3 ){ if( MA_PERIOD_3>0 ){ IndicatorRelease(h[2]); } if( RSI_PERIOD_3>0 ){ IndicatorRelease(h2[2]); } if( BARS_RSI_Period_3>0 ){ IndicatorRelease(h3[2]); } if( BB_PERIOD_3>0 ){ IndicatorRelease(h4[2]); } } if( StringLen(symName_4) && useSym_4 ){ if( MA_PERIOD_4>0 ){ IndicatorRelease(h[3]); } if( RSI_PERIOD_4>0 ){ IndicatorRelease(h2[3]); } if( BARS_RSI_Period_4>0 ){ IndicatorRelease(h3[3]); } if( BB_PERIOD_4>0 ){ IndicatorRelease(h4[3]); } } if( StringLen(symName_5) && useSym_5 ){ if( MA_PERIOD_5>0 ){ IndicatorRelease(h[4]); } if( RSI_PERIOD_5>0 ){ IndicatorRelease(h2[4]); } if( BARS_RSI_Period_5>0 ){ IndicatorRelease(h3[4]); } if( BB_PERIOD_5>0 ){ IndicatorRelease(h4[4]); } } if( StringLen(symName_6) && useSym_6 ){ if( MA_PERIOD_6>0 ){ IndicatorRelease(h[5]); } if( RSI_PERIOD_6>0 ){ IndicatorRelease(h2[5]); } if( BARS_RSI_Period_6>0 ){ IndicatorRelease(h3[5]); } if( BB_PERIOD_6>0 ){ IndicatorRelease(h4[5]); } } if( StringLen(symName_7) && useSym_7 ){ if( MA_PERIOD_7>0 ){ IndicatorRelease(h[6]); } if( RSI_PERIOD_7>0 ){ IndicatorRelease(h2[6]); } if( BARS_RSI_Period_7>0 ){ IndicatorRelease(h3[6]); } if( BB_PERIOD_7>0 ){ IndicatorRelease(h4[6]); } } if( StringLen(symName_8) && useSym_8 ){ if( MA_PERIOD_8>0 ){ IndicatorRelease(h[7]); } if( RSI_PERIOD_8>0 ){ IndicatorRelease(h2[7]); } if( BARS_RSI_Period_8>0 ){ IndicatorRelease(h3[7]); } if( BB_PERIOD_8>0 ){ IndicatorRelease(h4[7]); } } if( StringLen(symName_9) && useSym_9 ){ if( MA_PERIOD_9>0 ){ IndicatorRelease(h[8]); } if( RSI_PERIOD_9>0 ){ IndicatorRelease(h2[8]); } if( BARS_RSI_Period_9>0 ){ IndicatorRelease(h3[8]); } if( BB_PERIOD_9>0 ){ IndicatorRelease(h4[8]); } } if( StringLen(symName_10) && useSym_10 ){ if( MA_PERIOD_10>0 ){ IndicatorRelease(h[9]); } if( RSI_PERIOD_10>0 ){ IndicatorRelease(h2[9]); } if( BARS_RSI_Period_10>0 ){ IndicatorRelease(h3[9]); } if( BB_PERIOD_10>0 ){ IndicatorRelease(h4[9]); } } if( StringLen(symName_11) && useSym_11 ){ if( MA_PERIOD_11>0 ){ IndicatorRelease(h[10]); } if( RSI_PERIOD_11>0 ){ IndicatorRelease(h2[10]); } if( BARS_RSI_Period_11>0 ){ IndicatorRelease(h3[10]); } if( BB_PERIOD_11>0 ){ IndicatorRelease(h4[10]); } } #endif EventKillTimer(); } void startTimer(string sym, int hI, double Lt, int gStep){ hIndex=hI; curLot=Lt; cur_offset=gStep; mSpread=minSpread; if(SymbolInfoInteger(sym, SYMBOL_DIGITS)==5 || SymbolInfoInteger(sym, SYMBOL_DIGITS)==3){ cur_offset*=10; if( mSpread>0 ){ mSpread*=10; } } getmeinfo_btn(sym, EA_Magic); if( checkTakeProfit(sym)){ closeAllPos(sym); } if( !pdxIsNewBar(sym, hI) ){ return; } SymbolInfoTick(sym, lastme); if( lastme.bid==0 ){ return; } startCheckPositions(EA_Magic, sym, Lt); } void OnTimer() { if( equityLess>0 && AccountInfoDouble(ACCOUNT_BALANCE)-AccountInfoDouble(ACCOUNT_EQUITY)>= equityLess ){ closeAllPos(); } if (closeAtTotal > 0 && AccountInfoDouble(ACCOUNT_EQUITY) - AccountInfoDouble(ACCOUNT_BALANCE) > closeAtTotal ) { closeAllPos(); } if( useSym_1 && StringLen(symName_1) ){ typeDir=typeDir_1; takeProfit=takeProfit_1; takeProfit1step=takeProfit1step_1; takeProfit2step=takeProfit2step_1; takeProfit4step=takeProfit4step_1; gridStepCountClose=gridStepCountClose_1; BARS_enabled=BARS_enabled_1; BARS_Timeframe=BARS_Timeframe_1; BARS_RSI_Period=BARS_RSI_Period_1; SERIES_count=SERIES_count_1; SERIES_type=SERIES_type_1; SERIES_Timeframe=SERIES_Timeframe_1; MA_Timeframe=MA_Timeframe_1; MA_PERIOD=MA_PERIOD_1; MA_TYPE=MA_TYPE_1; MA_invert=MA_invert_1; MA_across_price=MA_across_price_1; MA_across_always=MA_across_always_1; RSI_Timeframe=RSI_Timeframe_1; RSI_PERIOD=RSI_PERIOD_1; RSI_enter_return= RSI_enter_return_1; RSI_only_first= RSI_only_first_1; RSI_invert= RSI_invert_1; BB_Timeframe=BB_Timeframe_1; BB_PERIOD=BB_PERIOD_1; BB_SHIFT=BB_SHIFT_1; BB_DEVIATION=BB_DEVIATION_1; BB_only_first= BB_only_first_1; BB_INVERT=BB_INVERT_1; string curSym = symName_1; if (replaceFirstSymbol) { curSym = _Symbol; } startTimer(curSym, 0, Lot_1, gridStep_1); } if( useSym_2 && StringLen(symName_2) ){ typeDir=typeDir_2; takeProfit=takeProfit_2; takeProfit1step=takeProfit1step_2; takeProfit2step=takeProfit2step_2; takeProfit4step=takeProfit4step_2; gridStepCountClose=gridStepCountClose_2; BARS_enabled=BARS_enabled_2; BARS_Timeframe=BARS_Timeframe_2; BARS_RSI_Period=BARS_RSI_Period_2; SERIES_count=SERIES_count_2; SERIES_type=SERIES_type_2; SERIES_Timeframe=SERIES_Timeframe_2; MA_Timeframe=MA_Timeframe_2; MA_PERIOD=MA_PERIOD_2; MA_TYPE=MA_TYPE_2; MA_invert=MA_invert_2; MA_across_price=MA_across_price_2; MA_across_always=MA_across_always_2; RSI_Timeframe=RSI_Timeframe_2; RSI_PERIOD=RSI_PERIOD_2; RSI_enter_return= RSI_enter_return_2; RSI_only_first= RSI_only_first_2; RSI_invert= RSI_invert_2; BB_Timeframe=BB_Timeframe_2; BB_PERIOD=BB_PERIOD_2; BB_SHIFT=BB_SHIFT_2; BB_DEVIATION=BB_DEVIATION_2; BB_only_first= BB_only_first_2; BB_INVERT=BB_INVERT_2; startTimer(symName_2, 1, Lot_2, gridStep_2); } if( useSym_3 && StringLen(symName_3) ){ typeDir=typeDir_3; takeProfit=takeProfit_3; takeProfit1step=takeProfit1step_3; takeProfit2step=takeProfit2step_3; takeProfit4step=takeProfit4step_3; gridStepCountClose=gridStepCountClose_3; BARS_enabled=BARS_enabled_3; BARS_Timeframe=BARS_Timeframe_3; BARS_RSI_Period=BARS_RSI_Period_3; SERIES_count=SERIES_count_3; SERIES_type=SERIES_type_3; SERIES_Timeframe=SERIES_Timeframe_3; MA_Timeframe=MA_Timeframe_3; MA_PERIOD=MA_PERIOD_3; MA_TYPE=MA_TYPE_3; MA_invert=MA_invert_3; MA_across_price=MA_across_price_3; MA_across_always=MA_across_always_3; RSI_Timeframe=RSI_Timeframe_3; RSI_PERIOD=RSI_PERIOD_3; RSI_enter_return= RSI_enter_return_3; RSI_only_first= RSI_only_first_3; RSI_invert= RSI_invert_3; BB_Timeframe=BB_Timeframe_3; BB_PERIOD=BB_PERIOD_3; BB_SHIFT=BB_SHIFT_3; BB_DEVIATION=BB_DEVIATION_3; BB_only_first= BB_only_first_3; BB_INVERT=BB_INVERT_3; startTimer(symName_3, 2, Lot_3, gridStep_3); } if( useSym_4 && StringLen(symName_4) ){ typeDir=typeDir_4; takeProfit=takeProfit_4; takeProfit1step=takeProfit1step_4; takeProfit2step=takeProfit2step_4; takeProfit4step=takeProfit4step_4; gridStepCountClose=gridStepCountClose_4; BARS_enabled=BARS_enabled_4; BARS_Timeframe=BARS_Timeframe_4; BARS_RSI_Period=BARS_RSI_Period_4; SERIES_count=SERIES_count_4; SERIES_type=SERIES_type_4; SERIES_Timeframe=SERIES_Timeframe_4; MA_Timeframe=MA_Timeframe_4; MA_PERIOD=MA_PERIOD_4; MA_TYPE=MA_TYPE_4; MA_invert=MA_invert_4; MA_across_price=MA_across_price_4; MA_across_always=MA_across_always_4; RSI_Timeframe=RSI_Timeframe_4; RSI_PERIOD=RSI_PERIOD_4; RSI_enter_return= RSI_enter_return_4; RSI_only_first= RSI_only_first_4; RSI_invert= RSI_invert_4; BB_Timeframe=BB_Timeframe_4; BB_PERIOD=BB_PERIOD_4; BB_SHIFT=BB_SHIFT_4; BB_DEVIATION=BB_DEVIATION_4; BB_only_first= BB_only_first_4; BB_INVERT=BB_INVERT_4; startTimer(symName_4, 3, Lot_4, gridStep_4); } if( useSym_5 && StringLen(symName_5) ){ typeDir=typeDir_5; takeProfit=takeProfit_5; takeProfit1step=takeProfit1step_5; takeProfit2step=takeProfit2step_5; takeProfit4step=takeProfit4step_5; gridStepCountClose=gridStepCountClose_5; BARS_enabled=BARS_enabled_5; BARS_Timeframe=BARS_Timeframe_5; BARS_RSI_Period=BARS_RSI_Period_5; SERIES_count=SERIES_count_5; SERIES_type=SERIES_type_5; SERIES_Timeframe=SERIES_Timeframe_5; MA_Timeframe=MA_Timeframe_5; MA_PERIOD=MA_PERIOD_5; MA_TYPE=MA_TYPE_5; MA_invert=MA_invert_5; MA_across_price=MA_across_price_5; MA_across_always=MA_across_always_5; RSI_Timeframe=RSI_Timeframe_5; RSI_PERIOD=RSI_PERIOD_5; RSI_enter_return= RSI_enter_return_5; RSI_only_first= RSI_only_first_5; RSI_invert= RSI_invert_5; BB_Timeframe=BB_Timeframe_5; BB_PERIOD=BB_PERIOD_5; BB_SHIFT=BB_SHIFT_5; BB_DEVIATION=BB_DEVIATION_5; BB_only_first= BB_only_first_5; BB_INVERT=BB_INVERT_5; startTimer(symName_5, 4, Lot_5, gridStep_5); } if( useSym_6 && StringLen(symName_6) ){ typeDir=typeDir_6; takeProfit=takeProfit_6; takeProfit1step=takeProfit1step_6; takeProfit2step=takeProfit2step_6; takeProfit4step=takeProfit4step_6; gridStepCountClose=gridStepCountClose_6; BARS_enabled=BARS_enabled_6; BARS_Timeframe=BARS_Timeframe_6; BARS_RSI_Period=BARS_RSI_Period_6; SERIES_count=SERIES_count_6; SERIES_type=SERIES_type_6; SERIES_Timeframe=SERIES_Timeframe_6; MA_Timeframe=MA_Timeframe_6; MA_PERIOD=MA_PERIOD_6; MA_TYPE=MA_TYPE_6; MA_invert=MA_invert_6; MA_across_price=MA_across_price_6; MA_across_always=MA_across_always_6; RSI_Timeframe=RSI_Timeframe_6; RSI_PERIOD=RSI_PERIOD_6; RSI_enter_return= RSI_enter_return_6; RSI_only_first= RSI_only_first_6; RSI_invert= RSI_invert_6; BB_Timeframe=BB_Timeframe_6; BB_PERIOD=BB_PERIOD_6; BB_SHIFT=BB_SHIFT_6; BB_DEVIATION=BB_DEVIATION_6; BB_only_first= BB_only_first_6; BB_INVERT=BB_INVERT_6; startTimer(symName_6, 5, Lot_6, gridStep_6); } if( useSym_7 && StringLen(symName_7) ){ typeDir=typeDir_7; takeProfit=takeProfit_7; takeProfit1step=takeProfit1step_7; takeProfit2step=takeProfit2step_7; takeProfit4step=takeProfit4step_7; gridStepCountClose=gridStepCountClose_7; BARS_enabled=BARS_enabled_7; BARS_Timeframe=BARS_Timeframe_7; BARS_RSI_Period=BARS_RSI_Period_7; SERIES_count=SERIES_count_7; SERIES_type=SERIES_type_7; SERIES_Timeframe=SERIES_Timeframe_7; MA_Timeframe=MA_Timeframe_7; MA_PERIOD=MA_PERIOD_7; MA_TYPE=MA_TYPE_7; MA_invert=MA_invert_7; MA_across_price=MA_across_price_7; MA_across_always=MA_across_always_7; RSI_Timeframe=RSI_Timeframe_7; RSI_PERIOD=RSI_PERIOD_7; RSI_enter_return= RSI_enter_return_7; RSI_only_first= RSI_only_first_7; RSI_invert= RSI_invert_7; BB_Timeframe=BB_Timeframe_7; BB_PERIOD=BB_PERIOD_7; BB_SHIFT=BB_SHIFT_7; BB_DEVIATION=BB_DEVIATION_7; BB_only_first= BB_only_first_7; BB_INVERT=BB_INVERT_7; startTimer(symName_7, 6, Lot_7, gridStep_7); } if( useSym_8 && StringLen(symName_8) ){ typeDir=typeDir_8; takeProfit=takeProfit_8; takeProfit1step=takeProfit1step_8; takeProfit2step=takeProfit2step_8; takeProfit4step=takeProfit4step_8; gridStepCountClose=gridStepCountClose_8; BARS_enabled=BARS_enabled_8; BARS_Timeframe=BARS_Timeframe_8; BARS_RSI_Period=BARS_RSI_Period_8; SERIES_count=SERIES_count_8; SERIES_type=SERIES_type_8; SERIES_Timeframe=SERIES_Timeframe_8; MA_Timeframe=MA_Timeframe_8; MA_PERIOD=MA_PERIOD_8; MA_TYPE=MA_TYPE_8; MA_invert=MA_invert_8; MA_across_price=MA_across_price_8; MA_across_always=MA_across_always_8; RSI_Timeframe=RSI_Timeframe_8; RSI_PERIOD=RSI_PERIOD_8; RSI_enter_return= RSI_enter_return_8; RSI_only_first= RSI_only_first_8; RSI_invert= RSI_invert_8; BB_Timeframe=BB_Timeframe_8; BB_PERIOD=BB_PERIOD_8; BB_SHIFT=BB_SHIFT_8; BB_DEVIATION=BB_DEVIATION_8; BB_only_first= BB_only_first_8; BB_INVERT=BB_INVERT_8; startTimer(symName_8, 7, Lot_8, gridStep_8); } if( useSym_9 && StringLen(symName_9) ){ typeDir=typeDir_9; takeProfit=takeProfit_9; takeProfit1step=takeProfit1step_9; takeProfit2step=takeProfit2step_9; takeProfit4step=takeProfit4step_9; gridStepCountClose=gridStepCountClose_9; BARS_enabled=BARS_enabled_9; BARS_Timeframe=BARS_Timeframe_9; BARS_RSI_Period=BARS_RSI_Period_9; SERIES_count=SERIES_count_9; SERIES_type=SERIES_type_9; SERIES_Timeframe=SERIES_Timeframe_9; MA_Timeframe=MA_Timeframe_9; MA_PERIOD=MA_PERIOD_9; MA_TYPE=MA_TYPE_9; MA_invert=MA_invert_9; MA_across_price=MA_across_price_9; MA_across_always=MA_across_always_9; RSI_Timeframe=RSI_Timeframe_9; RSI_PERIOD=RSI_PERIOD_9; RSI_enter_return= RSI_enter_return_9; RSI_only_first= RSI_only_first_9; RSI_invert= RSI_invert_9; BB_Timeframe=BB_Timeframe_9; BB_PERIOD=BB_PERIOD_9; BB_SHIFT=BB_SHIFT_9; BB_DEVIATION=BB_DEVIATION_9; BB_only_first= BB_only_first_9; BB_INVERT=BB_INVERT_9; startTimer(symName_9, 8, Lot_9, gridStep_9); } if( useSym_10 && StringLen(symName_10) ){ typeDir=typeDir_10; takeProfit=takeProfit_10; takeProfit1step=takeProfit1step_10; takeProfit2step=takeProfit2step_10; takeProfit4step=takeProfit4step_10; gridStepCountClose=gridStepCountClose_10; BARS_enabled=BARS_enabled_10; BARS_Timeframe=BARS_Timeframe_10; BARS_RSI_Period=BARS_RSI_Period_10; SERIES_count=SERIES_count_10; SERIES_type=SERIES_type_10; SERIES_Timeframe=SERIES_Timeframe_10; MA_Timeframe=MA_Timeframe_10; MA_PERIOD=MA_PERIOD_10; MA_TYPE=MA_TYPE_10; MA_invert=MA_invert_10; MA_across_price=MA_across_price_10; MA_across_always=MA_across_always_10; RSI_Timeframe=RSI_Timeframe_10; RSI_PERIOD=RSI_PERIOD_10; RSI_enter_return= RSI_enter_return_10; RSI_only_first= RSI_only_first_10; RSI_invert= RSI_invert_10; BB_Timeframe=BB_Timeframe_10; BB_PERIOD=BB_PERIOD_10; BB_SHIFT=BB_SHIFT_10; BB_DEVIATION=BB_DEVIATION_10; BB_only_first= BB_only_first_10; BB_INVERT=BB_INVERT_10; startTimer(symName_10, 9, Lot_10, gridStep_10); } if( useSym_11 && StringLen(symName_11) ){ typeDir=typeDir_11; takeProfit=takeProfit_11; takeProfit1step=takeProfit1step_11; takeProfit2step=takeProfit2step_11; takeProfit4step=takeProfit4step_11; gridStepCountClose=gridStepCountClose_11; BARS_enabled=BARS_enabled_11; BARS_Timeframe=BARS_Timeframe_11; BARS_RSI_Period=BARS_RSI_Period_11; SERIES_count=SERIES_count_11; SERIES_type=SERIES_type_11; SERIES_Timeframe=SERIES_Timeframe_11; MA_Timeframe=MA_Timeframe_11; MA_PERIOD=MA_PERIOD_11; MA_TYPE=MA_TYPE_11; MA_invert=MA_invert_11; MA_across_price=MA_across_price_11; MA_across_always=MA_across_always_11; RSI_Timeframe=RSI_Timeframe_11; RSI_PERIOD=RSI_PERIOD_11; RSI_enter_return= RSI_enter_return_11; RSI_only_first= RSI_only_first_11; RSI_invert= RSI_invert_11; BB_Timeframe=BB_Timeframe_11; BB_PERIOD=BB_PERIOD_11; BB_SHIFT=BB_SHIFT_11; BB_DEVIATION=BB_DEVIATION_11; BB_only_first= BB_only_first_11; BB_INVERT=BB_INVERT_11; startTimer(symName_11, 10, Lot_11, gridStep_11); } } void startCheckPositions(int magic, string symbol, double Lt){ if( (LongPos[hIndex]==0 && ShortPos[hIndex] == 0) || (RSI_PERIOD>0 && ( !RSI_only_first || (LongPos[hIndex]==0 && ShortPos[hIndex] == 0) ) ) || ( BB_PERIOD>0 && ( !BB_only_first || (LongPos[hIndex]==0 && ShortPos[hIndex] == 0) ) ) || (MA_PERIOD>0 && MA_across_always) ){ if( mSpread>0 && MathAbs(lastme.bid-lastme.ask) > mSpread*SymbolInfoDouble(symbol, SYMBOL_POINT) ){ return; } checkDirection(symbol); } if( LongPos[hIndex] + ShortPos[hIndex] == 0 ){ if(!noLong){ if(!pdxSendOrder(MY_BUY, lastme.bid, 0, 0, curLot, 0, "", symbol, magic)){ } }else if(!noShort){ if(!pdxSendOrder(MY_SELL, lastme.ask, 0, 0, curLot, 0, "", symbol, magic)){ } } }else{ if(LongPos[hIndex]>0 ){ switch(typeLot){ case MY_ARIFMET: curLot=maxVolIs+Lt; break; case MY_GEOMET: if(LongPos[hIndex]>1) curLot=Lt*(MathPow(2, LongPos[hIndex]-1)); break; } if( ( RSI_PERIOD>0 && !RSI_only_first ) || ( BB_PERIOD>0 && !BB_only_first ) || (MA_PERIOD>0 && MA_across_always) ){ if( !noLong ){ if( gridStepCountClose>0 && gridStepCountClose<=LongPos[hIndex] ){ closeAllPos(symbol, MY_ALLPOS, magic); return; } if(!pdxSendOrder(MY_BUY, lastme.bid, 0, 0, curLot, 0, "", symbol, magic)){ } } }else if(LastLong-lastme.ask >= (cur_offset+cur_offset_mult*(LongPos[hIndex]-1))*SymbolInfoDouble(symbol, SYMBOL_POINT) ){ if( gridStepCountClose>0 && gridStepCountClose<=LongPos[hIndex] ){ closeAllPos(symbol, MY_ALLPOS, magic); return; } if(!pdxSendOrder(MY_BUY, lastme.bid, 0, 0, curLot, 0, "", symbol, magic)){ } } } if(ShortPos[hIndex]>0 ){ switch(typeLot){ case MY_ARIFMET: curLot=maxVolIs+Lt; break; case MY_GEOMET: if(ShortPos[hIndex]>1) curLot=Lt*(MathPow(2, ShortPos[hIndex]-1)); break; } if( ( RSI_PERIOD>0 && !RSI_only_first ) || ( BB_PERIOD>0 && !BB_only_first ) || (MA_PERIOD>0 && MA_across_always) ){ if( !noShort ){ if( gridStepCountClose>0 && gridStepCountClose<=ShortPos[hIndex] ){ closeAllPos(symbol, MY_ALLPOS, magic); return; } if(!pdxSendOrder(MY_SELL, lastme.ask, 0, 0, curLot, 0, "", symbol, magic)){ } } }else if(lastme.bid-LastShort >= (cur_offset+cur_offset_mult*(ShortPos[hIndex]-1))*SymbolInfoDouble(symbol, SYMBOL_POINT) ){ if( gridStepCountClose>0 && gridStepCountClose<=ShortPos[hIndex] ){ closeAllPos(symbol, MY_ALLPOS, magic); return; } if(!pdxSendOrder(MY_SELL, lastme.ask, 0, 0, curLot, 0, "", symbol, magic)){ } } } } } void checkDirection(string symbol){ noLong=false; noShort=false; if(MA_PERIOD>0){ #ifdef __MQL5__ switch(MA_TYPE){ case MA_FIRST: CopyBuffer(h[hIndex], 0, 0, 1, buf0); if( buf0[0]>lastme.bid ){ if( MA_cur_dir[hIndex]==0 ){ MA_cur_dir[hIndex]=1; }else if( MA_cur_dir[hIndex]==2 ){ MA_cur_dir[hIndex]=1; MA_start[hIndex]=true; } noLong=true; if( MA_across_price ){ if( MA_start[hIndex] ){ MqlRates rates[]; ArraySetAsSeries(rates, true); if( CopyRates( symbol, PERIOD_H1, 1, 1, rates)==1 ){ if( buf0[0] >= rates[0].open ){ noShort=true; }else{ MA_start[hIndex]=false; } } }else{ noShort=true; } } }else if( buf0[0]buf0[6] ){ if( MA_cur_dir[hIndex]==0 ){ MA_cur_dir[hIndex]=1; }else if( MA_cur_dir[hIndex]==2 ){ MA_cur_dir[hIndex]=1; MA_start[hIndex]=true; } noShort=true; }else if( buf0[0]lastme.bid ){ if( MA_invert ){ noShort=true; }else{ noLong=true; } }else if( iMA(symbol, MA_Timeframe, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 0)iMA(symbol, MA_Timeframe, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 6) ){ if( MA_invert ){ noLong=true; }else{ noShort=true; } }else if( iMA(symbol, MA_Timeframe, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 0)0){ double res1=0; double res2=0; #ifdef __MQL5__ CopyBuffer(h2[hIndex], 0, 0, 2, buf0); res1=buf0[0]; res2=buf0[1]; #else res1=iRSI(symbol, RSI_Timeframe, RSI_PERIOD, PRICE_CLOSE, 0); res2=iRSI(symbol, RSI_Timeframe, RSI_PERIOD, PRICE_CLOSE, 1); #endif if( RSI_start[hIndex] ){ if( !RSI_enter_return && res1>70 ){ if( RSI_invert ){ noShort=true; }else{ noLong=true; } RSI_start[hIndex]=false; }else if( RSI_enter_return && res2>70 && res1<70 ){ if( RSI_invert ){ noShort=true; }else{ noLong=true; } RSI_start[hIndex]=false; }else if( !RSI_enter_return && res1<30 ){ if( RSI_invert ){ noLong=true; }else{ noShort=true; } RSI_start[hIndex]=false; }else if( RSI_enter_return && res2<30 && res1>30 ){ if( RSI_invert ){ noLong=true; }else{ noShort=true; } RSI_start[hIndex]=false; }else{ noLong=true; noShort=true; } }else{ noLong=true; noShort=true; if( (res1<50 && res2>50) || (res2<50 && res1>50) ){ RSI_start[hIndex]=true; } } } if(BB_PERIOD>0){ double res0=0; double res1=0; double res2=0; #ifdef __MQL5__ CopyBuffer(h4[hIndex], 0, 0, 1, buf0); CopyBuffer(h4[hIndex], 1, 0, 1, buf1); CopyBuffer(h4[hIndex], 2, 0, 1, buf2); res0=buf0[0]; res1=buf1[0]; res2=buf2[0]; #else res0=iBands(symbol, BB_Timeframe, BB_PERIOD, BB_DEVIATION, BB_SHIFT, PRICE_CLOSE, 0, 0); res1=iBands(symbol, BB_Timeframe, BB_PERIOD, BB_DEVIATION, BB_SHIFT, PRICE_CLOSE, 1, 0); res2=iBands(symbol, BB_Timeframe, BB_PERIOD, BB_DEVIATION, BB_SHIFT, PRICE_CLOSE, 2, 0); #endif if( BB_start[hIndex] ){ if( res1<=lastme.bid ){ if( BB_INVERT ){ noShort=true; }else{ noLong=true; } BB_start[hIndex]=false; }else if( res2>=lastme.bid ){ if( BB_INVERT ){ noLong=true; }else{ noShort=true; } BB_start[hIndex]=false; }else{ noLong=true; noShort=true; } }else{ noLong=true; noShort=true; MqlRates rates[]; ArraySetAsSeries(rates, true); // раньше было CopyRates( symbol, PERIOD_H1, 1, 1, rates)==1 !!! if( CopyRates( symbol, PERIOD_H1, 0, 1, rates)==1 ){ if( (res0rates[0].close) || (res0>rates[0].open && res00 ){ MqlRates rates[]; ArraySetAsSeries(rates, true); if( CopyRates( symbol, SERIES_Timeframe, 1, SERIES_count, rates)==SERIES_count ){ bool isOkLong=true; bool isOkShort=true; for( int i=0; irates[i].open ){ switch(SERIES_type){ case MY_SERIES_MINUS: isOkLong=false; break; default: isOkShort=false; } }else if( rates[i].close rates[1].open ){ BARS_noShort=true; }else if( rates[1].close < rates[1].open ){ BARS_noLong=true; }else{ BARS_noShort=true; BARS_noLong=true; } } if( BARS_noLong ){ noLong=true; if( BARS_RSI_Period>0 ){ double res1=0; #ifdef __MQL5__ CopyBuffer(h3[hIndex], 0, 0, 1, buf0); res1=buf0[0]; #else res1=iRSI(symbol, PERIOD_M5, BARS_RSI_Period, PRICE_CLOSE, 0); #endif if( res1<=70 ){ noShort=true; } } } if( BARS_noShort ){ noShort=true; if( BARS_RSI_Period>0 ){ double res1=0; #ifdef __MQL5__ CopyBuffer(h3[hIndex], 0, 0, 1, buf0); res1=buf0[0]; #else res1=iRSI(symbol, PERIOD_M5, BARS_RSI_Period, PRICE_CLOSE, 0); #endif if( res1>=30 ){ noLong=true; } } } } if( typeDir == MA_DIR_LONG ){ noShort=true; }else if( typeDir == MA_DIR_SHORT ){ noLong=true; } } bool pdxIsNewBar(string symbol, int hI){ datetime New_Time[1]; if(CopyTime(symbol,_Period,0,1,New_Time)>0){ if(Old_Time[hI]!=New_Time[0]){ Old_Time[hI]=New_Time[0]; return true; } } return false; } bool checkTakeProfit(string symbol, TypeOfPos type = MY_ALLPOS, int magic = 0){ if( takeProfit<=0 ) return false; double curProfit=0; double profit=0; if( magic==0 ){ magic=EA_Magic; } #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if(PositionGetSymbol(ti)!=symbol) continue; if(magic>0 && PositionGetInteger(POSITION_MAGIC)!=magic) continue; if(type==MY_BUY && PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_BUY ) continue; if(type==MY_SELL && PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_SELL ) continue; profit+=PositionGetDouble(POSITION_PROFIT); profit+=PositionGetDouble(POSITION_SWAP); } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderType()==OP_BUY || OrderType()==OP_SELL ){}else{ continue; } if(OrderSymbol()!=symbol) continue; if(magic>0 && OrderMagicNumber()!=magic) continue; if(type==MY_BUY && OrderType()!=OP_BUY ) continue; if(type==MY_SELL && OrderType()!=OP_SELL ) continue; profit+=OrderCommission(); profit+=OrderProfit(); profit+=OrderSwap(); } } #endif if( takeProfit1step>0 && (LongPos[hIndex]+ShortPos[hIndex])==1 ){ if(profit>takeProfit1step){ return true; } }else if( takeProfit2step>0 && (LongPos[hIndex]+ShortPos[hIndex])==2 ){ if(profit>takeProfit2step){ return true; } }else if( takeProfit4step>0 && (LongPos[hIndex]+ShortPos[hIndex])==4 ){ if(profit>takeProfit4step){ return true; } }else{ if(profit>takeProfit){ return true; } } return false; } void closeAllPos(string symbol="", TypeOfPos type = MY_ALLPOS, int magic = 0){ if( magic==0 ){ magic=EA_Magic; } #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if( StringLen(symbol) && PositionGetSymbol(ti)!=symbol) continue; if(magic>0 && PositionGetInteger(POSITION_MAGIC)!=magic) continue; if(type==MY_BUY && PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_BUY ) continue; if(type==MY_SELL && PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_SELL ) continue; Trade.PositionClose(PositionGetInteger(POSITION_TICKET)); } int cntMyPosO=OrdersTotal(); for(int ti=cntMyPosO-1; ti>=0; ti--){ ulong orderTicket=OrderGetTicket(ti); if(StringLen(symbol) && OrderGetString(ORDER_SYMBOL)!=symbol) continue; if(magic>0 && OrderGetInteger(ORDER_MAGIC)!=magic) continue; if(type==MY_BUY && OrderGetInteger(ORDER_TYPE)!=ORDER_TYPE_BUY_STOP ) continue; if(type==MY_SELL && OrderGetInteger(ORDER_TYPE)!=ORDER_TYPE_SELL_STOP ) continue; Trade.OrderDelete(orderTicket); } #else int cntMyPos=OrdersTotal(); if(cntMyPos>0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( StringLen(symbol) && OrderSymbol()!=symbol ) continue; if(magic>0 && OrderMagicNumber()!=magic) continue; if( OrderType()==OP_BUY ){ if(type==MY_SELL) continue; MqlTick latest_price; if(!SymbolInfoTick(OrderSymbol(),latest_price)){ Alert(GetLastError()); return; } if(!OrderClose(OrderTicket(), OrderLots(),latest_price.bid,100)){ } }else if(OrderType()==OP_SELL){ if(type==MY_BUY) continue; MqlTick latest_price; if(!SymbolInfoTick(OrderSymbol(),latest_price)){ Alert(GetLastError()); return; } if(!OrderClose(OrderTicket(), OrderLots(),latest_price.ask,100)){ } }else{ if(type==MY_BUY && OrderType()!=OP_BUYSTOP ) continue; if(type==MY_SELL && OrderType()!=OP_SELLSTOP ) continue; if(!OrderDelete(OrderTicket())){ } } } } #endif } bool pdxSendOrder(TypeOfPos mytype, double price, double sl, double tp, double volume, ulong position=0, string comment="", string sym="", int magic=0){ if( !StringLen(sym) ){ sym=_Symbol; } if( magic==0 ){ magic=EA_Magic; } int curDigits=(int) SymbolInfoInteger(sym, SYMBOL_DIGITS); if(sl>0){ sl=NormalizeDouble(sl,curDigits); } if(tp>0){ tp=NormalizeDouble(tp,curDigits); } if(price>0){ price=NormalizeDouble(price,curDigits); }else{ #ifdef __MQL5__ #else MqlTick latest_price; SymbolInfoTick(sym,latest_price); if( mytype == MY_SELL ){ price=latest_price.ask; }else if( mytype == MY_BUY ){ price=latest_price.bid; } #endif } if( StringLen(my_cmt) && comment=="" ){ comment=my_cmt; } #ifdef __MQL5__ ENUM_TRADE_REQUEST_ACTIONS action=TRADE_ACTION_DEAL; ENUM_ORDER_TYPE type=ORDER_TYPE_BUY; switch(mytype){ case MY_BUY: action=TRADE_ACTION_DEAL; type=ORDER_TYPE_BUY; break; case MY_BUYSLTP: action=TRADE_ACTION_SLTP; type=ORDER_TYPE_BUY; break; case MY_BUYSTOP: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_BUY_STOP; break; case MY_BUYLIMIT: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_BUY_LIMIT; break; case MY_SELL: action=TRADE_ACTION_DEAL; type=ORDER_TYPE_SELL; break; case MY_SELLSLTP: action=TRADE_ACTION_SLTP; type=ORDER_TYPE_SELL; break; case MY_SELLSTOP: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_SELL_STOP; break; case MY_SELLLIMIT: action=TRADE_ACTION_PENDING; type=ORDER_TYPE_SELL_LIMIT; break; } MqlTradeRequest mrequest; MqlTradeResult mresult; ZeroMemory(mrequest); mrequest.action = action; mrequest.sl = sl; mrequest.tp = tp; mrequest.symbol = sym; if(position>0){ mrequest.position = position; } if(StringLen(comment)){ mrequest.comment=comment; } if(action!=TRADE_ACTION_SLTP){ if(price>0){ mrequest.price = price; } if(volume>0){ mrequest.volume = volume; } mrequest.type = type; mrequest.magic = magic; switch(useORDER_FILLING_RETURN){ case FOK: mrequest.type_filling = ORDER_FILLING_FOK; break; case RETURN: mrequest.type_filling = ORDER_FILLING_RETURN; break; case IOC: mrequest.type_filling = ORDER_FILLING_IOC; break; } mrequest.deviation=100; } if(OrderSend(mrequest,mresult)){ if(mresult.retcode==10009 || mresult.retcode==10008){ if(action!=TRADE_ACTION_SLTP){ switch(type){ case ORDER_TYPE_BUY: // Alert("Order Buy #:",mresult.order," sl",sl," tp",tp," p",price," !!"); break; case ORDER_TYPE_SELL: // Alert("Order Sell #:",mresult.order," sl",sl," tp",tp," p",price," !!"); break; } }else{ // Alert("Order Modify SL #:",mresult.order," sl",sl," tp",tp," !!"); } return true; }else{ msgErr(GetLastError(), mresult.retcode); } } #else int type=OP_BUY; switch(mytype){ case MY_BUY: type=OP_BUY; break; case MY_BUYSTOP: type=OP_BUYSTOP; break; case MY_BUYLIMIT: type=OP_BUYLIMIT; break; case MY_SELL: type=OP_SELL; break; case MY_SELLSTOP: type=OP_SELLSTOP; break; case MY_SELLLIMIT: type=OP_SELLLIMIT; break; } if(OrderSend(sym, type, volume, price, 100, sl, tp, comment, magic, 0)<0){ msgErr(GetLastError()); }else{ switch(type){ case OP_BUY: Alert("Order Buy sl",sl," tp",tp," p",price," !!"); break; case OP_SELL: Alert("Order Sell sl",sl," tp",tp," p",price," !!"); break; } return true; } #endif return false; } void msgErr(int err, int retcode=0){ string curErr=""; switch(err){ case 1: curErr=langs.err1; break; case 2: curErr=langs.err2; break; case 3: curErr=langs.err3; break; case 4: curErr=langs.err4; break; case 5: curErr=langs.err5; break; case 6: curErr=langs.err6; break; case 7: curErr=langs.err7; break; case 8: curErr=langs.err8; break; case 9: curErr=langs.err9; break; case 64: curErr=langs.err64; break; case 65: curErr=langs.err65; break; case 128: curErr=langs.err128; break; case 129: curErr=langs.err129; break; case 130: curErr=langs.err130; break; case 131: curErr=langs.err131; break; case 132: curErr=langs.err132; break; case 133: curErr=langs.err133; break; case 134: curErr=langs.err134; break; case 135: curErr=langs.err135; break; case 136: curErr=langs.err136; break; case 137: curErr=langs.err137; break; case 138: curErr=langs.err138; break; case 139: curErr=langs.err139; break; case 140: curErr=langs.err140; break; case 141: curErr=langs.err141; break; case 145: curErr=langs.err145; break; case 146: curErr=langs.err146; break; case 147: curErr=langs.err147; break; case 148: curErr=langs.err148; break; default: curErr=langs.err0+": "+(string) err; } if(retcode>0){ curErr+=" "; switch(retcode){ case 10004: curErr+=langs.retcode10004; break; case 10006: curErr+=langs.retcode10006; break; case 10007: curErr+=langs.retcode10007; break; case 10010: curErr+=langs.retcode10010; break; case 10011: curErr+=langs.retcode10011; break; case 10012: curErr+=langs.retcode10012; break; case 10013: curErr+=langs.retcode10013; break; case 10014: curErr+=langs.retcode10014; break; case 10015: curErr+=langs.retcode10015; break; case 10016: curErr+=langs.retcode10016; break; case 10017: curErr+=langs.retcode10017; break; case 10018: curErr+=langs.retcode10018; break; case 10019: curErr+=langs.retcode10019; break; case 10020: curErr+=langs.retcode10020; break; case 10021: curErr+=langs.retcode10021; break; case 10022: curErr+=langs.retcode10022; break; case 10023: curErr+=langs.retcode10023; break; case 10024: curErr+=langs.retcode10024; break; case 10025: curErr+=langs.retcode10025; break; case 10026: curErr+=langs.retcode10026; break; case 10027: curErr+=langs.retcode10027; break; case 10028: curErr+=langs.retcode10028; break; case 10029: curErr+=langs.retcode10029; break; case 10030: curErr+=langs.retcode10030; break; case 10031: curErr+=langs.retcode10031; break; case 10032: curErr+=langs.retcode10032; break; case 10033: curErr+=langs.retcode10033; break; case 10034: curErr+=langs.retcode10034; break; case 10035: curErr+=langs.retcode10035; break; case 10036: curErr+=langs.retcode10036; break; case 10038: curErr+=langs.retcode10038; break; case 10039: curErr+=langs.retcode10039; break; case 10040: curErr+=langs.retcode10040; break; case 10041: curErr+=langs.retcode10041; break; case 10042: curErr+=langs.retcode10042; break; case 10043: curErr+=langs.retcode10043; break; case 10044: curErr+=langs.retcode10044; break; } } Alert(curErr); } void init_lang(){ switch(LANG){ case MY_ENG: langs.err1="No error, but unknown result. (1)"; langs.err2="General error (2)"; langs.err3="Incorrect parameters (3)"; langs.err4="Trade server busy (4)"; langs.err5="Old client terminal version (5)"; langs.err6="No connection to trade server (6)"; langs.err7="Not enough rights (7)"; langs.err8="Too frequent requests (8)"; langs.err9="Invalid operation disruptive server operation (9)"; langs.err64="Account blocked (64)"; langs.err65="Invalid account number (65)"; langs.err128="Expired waiting period for transaction (128)"; langs.err129="Invalid price (129)"; langs.err130="Wrong stop loss (130)"; langs.err131="Wrong volume (131)"; langs.err132="Market closed (132)"; langs.err133="Trade prohibited (133)"; langs.err134="Not enough money to complete transaction. (134)"; langs.err135="Price changed (135)"; langs.err136="No prices (136)"; langs.err137="Broker busy (137)"; langs.err138="New prices (138)"; langs.err139="Order blocked and already being processed (139)"; langs.err140="Only purchase allowed (140)"; langs.err141="Too many requests (141)"; langs.err145="Modification prohibited because order too close to market. (145)"; langs.err146="Trading subsystem busy (146)"; langs.err147="Using order expiration date prohibited by broker (147)"; langs.err148="Number of open and pending orders reached limit set by broker (148)"; langs.err0="Error occurred while running request"; langs.retcode="Reason"; langs.retcode10004="Requote"; langs.retcode10006="Request rejected"; langs.retcode10007="Request canceled by trader"; langs.retcode10010="Only part of request completed"; langs.retcode10011="Request processing error"; langs.retcode10012="Request canceled by timeout"; langs.retcode10013="Invalid request"; langs.retcode10014="Invalid volume in request"; langs.retcode10015="Invalid price in request"; langs.retcode10016="Invalid stops in request"; langs.retcode10017="Trade disabled"; langs.retcode10018="Market closed"; langs.retcode10019="Not enough money to complete request"; langs.retcode10020="Prices changed"; langs.retcode10021="No quotes to process request"; langs.retcode10022="Invalid order expiration date in request"; langs.retcode10023="Order state changed"; langs.retcode10024="Too frequent requests"; langs.retcode10025="No changes in request"; langs.retcode10026="Autotrading disabled by server"; langs.retcode10027="Autotrading disabled by client terminal"; langs.retcode10028="Request locked for processing"; langs.retcode10029="Order or position frozen"; langs.retcode10030="Invalid order filling type"; langs.retcode10031="No connection with trade server"; langs.retcode10032="Operation allowed only for live accounts"; langs.retcode10033="Number of pending orders reached limit"; langs.retcode10034="Volume of orders and positions for symbol reached limit"; langs.retcode10035="Incorrect or prohibited order type"; langs.retcode10036="Position with specified POSITION_IDENTIFIER already closed"; langs.retcode10038="Close volume exceeds current position volume"; langs.retcode10039="Close order already exists for specified position"; langs.retcode10040="Number of open items exceeded"; langs.retcode10041="Pending order activation request rejected, order canceled"; langs.retcode10042="Only long positions allowed"; langs.retcode10043="Only short positions allowed"; langs.retcode10044="Only position closing allowed"; break; case MY_RUS: langs.err0="Во время выполнения запроса произошла ошибка"; langs.err1="Нет ошибки, но результат неизвестен (1)"; langs.err2="Общая ошибка (2)"; langs.err3="Неправильные параметры (3)"; langs.err4="Торговый сервер занят (4)"; langs.err5="Старая версия клиентского терминала (5)"; langs.err6="Нет связи с торговым сервером (6)"; langs.err7="Недостаточно прав (7)"; langs.err8="Слишком частые запросы (8)"; langs.err9="Недопустимая операция нарушающая функционирование сервера (9)"; langs.err64="Счет заблокирован (64)"; langs.err65="Неправильный номер счета (65)"; langs.err128="Истек срок ожидания совершения сделки (128)"; langs.err129="Неправильная цена (129)"; langs.err130="Неправильные стопы (130)"; langs.err131="Неправильный объем (131)"; langs.err132="Рынок закрыт (132)"; langs.err133="Торговля запрещена (133)"; langs.err134="Недостаточно денег для совершения операции (134)"; langs.err135="Цена изменилась (135)"; langs.err136="Нет цен (136)"; langs.err137="Брокер занят (137)"; langs.err138="Новые цены (138)"; langs.err139="Ордер заблокирован и уже обрабатывается (139)"; langs.err140="Разрешена только покупка (140)"; langs.err141="Слишком много запросов (141)"; langs.err145="Модификация запрещена, так как ордер слишком близок к рынку (145)"; langs.err146="Подсистема торговли занята (146)"; langs.err147="Использование даты истечения ордера запрещено брокером (147)"; langs.err148="Количество открытых и отложенных ордеров достигло предела, установленного брокером (148)"; langs.retcode="Причина"; langs.retcode10004="Реквота"; langs.retcode10006="Запрос отклонен"; langs.retcode10007="Запрос отменен трейдером"; langs.retcode10010="Заявка выполнена частично"; langs.retcode10011="Ошибка обработки запроса"; langs.retcode10012="Запрос отменен по истечению времени"; langs.retcode10013="Неправильный запрос"; langs.retcode10014="Неправильный объем в запросе"; langs.retcode10015="Неправильная цена в запросе"; langs.retcode10016="Неправильные стопы в запросе"; langs.retcode10017="Торговля запрещена"; langs.retcode10018="Рынок закрыт"; langs.retcode10019="Нет достаточных денежных средств для выполнения запроса"; langs.retcode10020="Цены изменились"; langs.retcode10021="Отсутствуют котировки для обработки запроса"; langs.retcode10022="Неверная дата истечения ордера в запросе"; langs.retcode10023="Состояние ордера изменилось"; langs.retcode10024="Слишком частые запросы"; langs.retcode10025="В запросе нет изменений"; langs.retcode10026="Автотрейдинг запрещен сервером"; langs.retcode10027="Автотрейдинг запрещен клиентским терминалом"; langs.retcode10028="Запрос заблокирован для обработки"; langs.retcode10029="Ордер или позиция заморожены"; langs.retcode10030="Указан неподдерживаемый тип исполнения ордера по остатку "; langs.retcode10031="Нет соединения с торговым сервером"; langs.retcode10032="Операция разрешена только для реальных счетов"; langs.retcode10033="Достигнут лимит на количество отложенных ордеров"; langs.retcode10034="Достигнут лимит на объем ордеров и позиций для данного символа"; langs.retcode10035="Неверный или запрещённый тип ордера"; langs.retcode10036="Позиция с указанным POSITION_IDENTIFIER уже закрыта"; langs.retcode10038="Закрываемый объем превышает текущий объем позиции"; langs.retcode10039="Для указанной позиции уже есть ордер на закрытие"; langs.retcode10040="Количество открытых позиций превышено"; langs.retcode10041="Запрос на активацию отложенного ордера отклонен, а сам ордер отменен"; langs.retcode10042="Разрешены только длинные позиции"; langs.retcode10043="Разрешены только короткие позиции"; langs.retcode10044="Разрешено только закрывать существующие позиции"; break; } } void getmeinfo_btn(string symname, int magic){ double profit=0; double positionExist=false; LongVol[hIndex]=0; ShortVol[hIndex]=0; datetime oldTimeLong=0; datetime oldTimeShort=0; LastLong=0; LastShort=0; minVolTicket = 0; maxVolTicket = 0; minVolIs = 0; maxVolIs = 0; minVolProfit = 0; maxVolProfit = 0; LongPos[hIndex]=0; ShortPos[hIndex]=0; // count the number of open Long and Short positions, // as well as their total profit #ifdef __MQL5__ int cntMyPos=PositionsTotal(); for(int ti=cntMyPos-1; ti>=0; ti--){ if(PositionGetSymbol(ti)!=symname) continue; if(magic>0 && PositionGetInteger(POSITION_MAGIC)!=magic) continue; positionExist=true; double curProfit = 0; curProfit+=PositionGetDouble(POSITION_PROFIT); curProfit+=PositionGetDouble(POSITION_SWAP); if (minVolIs == 0 || minVolIs > PositionGetDouble(POSITION_VOLUME)) { minVolIs = PositionGetDouble(POSITION_VOLUME); minVolTicket = PositionGetInteger(POSITION_TICKET); minVolProfit = curProfit; } if (maxVolIs == 0 || maxVolIs < PositionGetDouble(POSITION_VOLUME)) { maxVolIs = PositionGetDouble(POSITION_VOLUME); maxVolTicket = PositionGetInteger(POSITION_TICKET); maxVolProfit = curProfit; } if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY){ LongVol[hIndex]+=PositionGetDouble(POSITION_VOLUME); LongPos[hIndex]++; if( !oldTimeLong || oldTimeLong0){ for(int ti=cntMyPos-1; ti>=0; ti--){ if(OrderSelect(ti,SELECT_BY_POS,MODE_TRADES)==false) continue; if( OrderType()==OP_BUY || OrderType()==OP_SELL ){}else{ continue; } if(OrderSymbol()!=symname) continue; if(magic>0 && OrderMagicNumber()!=magic) continue; positionExist=true; double curProfit = 0; curProfit+=OrderCommission(); curProfit+=OrderProfit(); curProfit+=OrderSwap(); if (minVolIs == 0 || minVolIs > OrderLots()) { minVolIs = OrderLots(); minVolTicket = OrderTicket(); minVolProfit = curProfit; } if (maxVolIs == 0 || maxVolIs < OrderLots()) { maxVolIs = OrderLots(); maxVolTicket = OrderTicket(); maxVolProfit = curProfit; } if(OrderType()==OP_BUY){ LongVol[hIndex]+=OrderLots(); LongPos[hIndex]++; if( !oldTimeLong || oldTimeLongoffsetY){ offsetY=tmpOffset; } } for(int ti=0; ti0 && tmpOffset