2610 lines
201 KiB
MQL4
2610 lines
201 KiB
MQL4
//+------------------------------------------------------------------+
|
|
//| 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 <Trade\Trade.mqh>
|
|
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]<lastme.bid ){
|
|
if( MA_cur_dir[hIndex]==0 ){
|
|
MA_cur_dir[hIndex]=2;
|
|
}else if( MA_cur_dir[hIndex]==1 ){
|
|
MA_cur_dir[hIndex]=2;
|
|
MA_start[hIndex]=true;
|
|
}
|
|
noShort=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 ){
|
|
noLong=true;
|
|
}else{
|
|
MA_start[hIndex]=false;
|
|
}
|
|
}
|
|
}else{
|
|
noLong=true;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case MA_SECOND:
|
|
CopyBuffer(h[hIndex], 0, 0, 7, buf0);
|
|
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]<buf0[6] ){
|
|
if( MA_cur_dir[hIndex]==0 ){
|
|
MA_cur_dir[hIndex]=2;
|
|
}else if( MA_cur_dir[hIndex]==1 ){
|
|
MA_cur_dir[hIndex]=2;
|
|
MA_start[hIndex]=true;
|
|
}
|
|
noLong=true;
|
|
}
|
|
break;
|
|
}
|
|
#else
|
|
switch(MA_TYPE){
|
|
case MA_FIRST:
|
|
if( iMA(symbol, MA_Timeframe, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 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)<lastme.bid ){
|
|
if( MA_invert ){
|
|
noLong=true;
|
|
}else{
|
|
noShort=true;
|
|
}
|
|
}
|
|
break;
|
|
case MA_SECOND:
|
|
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)<iMA(symbol, MA_Timeframe, MA_PERIOD, 0, MODE_SMA, PRICE_CLOSE, 6) ){
|
|
if( MA_invert ){
|
|
noShort=true;
|
|
}else{
|
|
noLong=true;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if(RSI_PERIOD>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( (res0<rates[0].open && res0>rates[0].close) || (res0>rates[0].open && res0<rates[0].close) ){
|
|
BB_start[hIndex]=true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( SERIES_count>0 ){
|
|
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; i<SERIES_count; i++ ){
|
|
if( rates[i].close>rates[i].open ){
|
|
switch(SERIES_type){
|
|
case MY_SERIES_MINUS:
|
|
isOkLong=false;
|
|
break;
|
|
default:
|
|
isOkShort=false;
|
|
}
|
|
}else if( rates[i].close<rates[i].open ){
|
|
switch(SERIES_type){
|
|
case MY_SERIES_MINUS:
|
|
isOkShort=false;
|
|
break;
|
|
default:
|
|
isOkLong=false;
|
|
}
|
|
}
|
|
if( !isOkShort && !isOkLong ){
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(!isOkShort){
|
|
noShort=true;
|
|
}
|
|
if(!isOkLong){
|
|
noLong=true;
|
|
}
|
|
}else{
|
|
noShort=true;
|
|
noLong=true;
|
|
}
|
|
}
|
|
|
|
bool BARS_noLong=false;
|
|
bool BARS_noShort=false;
|
|
if(BARS_enabled ){
|
|
MqlRates rates[];
|
|
ArraySetAsSeries(rates, true);
|
|
if( CopyRates( symbol, BARS_Timeframe, 0, 2, rates)==2 ){
|
|
if( rates[1].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 || oldTimeLong<PositionGetInteger(POSITION_TIME) ){
|
|
oldTimeLong=(datetime) PositionGetInteger(POSITION_TIME);
|
|
LastLong=PositionGetDouble(POSITION_PRICE_OPEN);
|
|
}
|
|
}else{
|
|
ShortVol[hIndex]+=PositionGetDouble(POSITION_VOLUME);
|
|
ShortPos[hIndex]++;
|
|
if( !oldTimeShort || oldTimeShort<PositionGetInteger(POSITION_TIME) ){
|
|
oldTimeShort=(datetime) PositionGetInteger(POSITION_TIME);
|
|
LastShort=PositionGetDouble(POSITION_PRICE_OPEN);
|
|
}
|
|
}
|
|
|
|
profit += curProfit;
|
|
}
|
|
#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()!=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 || oldTimeLong<OrderOpenTime() ){
|
|
oldTimeLong=OrderOpenTime();
|
|
LastLong=OrderOpenPrice();
|
|
}
|
|
}else{
|
|
ShortVol[hIndex]+=OrderLots();
|
|
ShortPos[hIndex]++;
|
|
if( !oldTimeShort || oldTimeShort<OrderOpenTime() ){
|
|
oldTimeShort=OrderOpenTime();
|
|
LastShort=OrderOpenPrice();
|
|
}
|
|
}
|
|
profit += curProfit;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
void createObject(string name, int weight, string title){
|
|
// if there is no 'name' button on the chart, create it
|
|
if(ObjectFind(0, name)<0){
|
|
// define the shift relative to the chart right angle where the button is to be displayed
|
|
long offset= ChartGetInteger(0, CHART_WIDTH_IN_PIXELS)-87;
|
|
long offsetY=0;
|
|
for(int ti=0; ti<ObjectsTotal((long) 0); ti++){
|
|
string objName= ObjectName(0, ti);
|
|
if( StringFind(objName, prefix_graph)<0 ){
|
|
continue;
|
|
}
|
|
long tmpOffset=ObjectGetInteger(0, objName, OBJPROP_YDISTANCE);
|
|
if( tmpOffset>offsetY){
|
|
offsetY=tmpOffset;
|
|
}
|
|
}
|
|
|
|
for(int ti=0; ti<ObjectsTotal((long) 0); ti++){
|
|
string objName= ObjectName(0, ti);
|
|
if( StringFind(objName, prefix_graph)<0 ){
|
|
continue;
|
|
}
|
|
long tmpOffset=ObjectGetInteger(0, objName, OBJPROP_YDISTANCE);
|
|
if( tmpOffset!=offsetY ){
|
|
continue;
|
|
}
|
|
|
|
tmpOffset=ObjectGetInteger(0, objName, OBJPROP_XDISTANCE);
|
|
if( tmpOffset>0 && tmpOffset<offset){
|
|
offset=tmpOffset;
|
|
}
|
|
}
|
|
offset-=(weight+1);
|
|
if(offset<0){
|
|
offset=ChartGetInteger(0, CHART_WIDTH_IN_PIXELS)-87;
|
|
offsetY+=25;
|
|
offset-=(weight+1);
|
|
}
|
|
|
|
ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0);
|
|
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,offset);
|
|
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,offsetY);
|
|
ObjectSetString(0,name,OBJPROP_TEXT, title);
|
|
ObjectSetInteger(0,name,OBJPROP_XSIZE,weight);
|
|
ObjectSetInteger(0,name,OBJPROP_FONTSIZE, 8);
|
|
ObjectSetInteger(0,name,OBJPROP_COLOR, clrBlack);
|
|
ObjectSetInteger(0,name,OBJPROP_YSIZE,25);
|
|
ObjectSetInteger(0,name,OBJPROP_BGCOLOR, clrLightGray);
|
|
ChartRedraw(0);
|
|
}else{
|
|
ObjectSetString(0,name,OBJPROP_TEXT, title);
|
|
}
|
|
}
|