- The code works fine on one currency symbol, however I am using multiple currency symbols ...hence need this EA to support multiple charts, can someone add this feature to the below code ?
- An input like All Trades = True/False
- Is this possible ??
- An input like All Trades = True/False
- Is this possible ??
Inserted Code
//+------------------------------------------------------------------+ //| FPA=BreakEven.mq4 | //| Copyright 2013, Forex Peace Army | //| http://www.forexpeacearmy.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2013 © Peter @ Forex Peace Army" #property link "http://www.forexpeacearmy.com" extern double Break_Even_Trigger_in_Pips = 10.0; extern double Break_Even_in_Pips = 1.0; string label_font_type = "Calibri"; int error_font_size = 12; color error_message_color = OrangeRed; double pip_value = 0.0; int pip_digits = 0; double stop_level_in_pips = 0.0; bool error_state = false; double equality_tolerance = 0.0; string error_message_name = "BreakEven - Error Message"; string error_title__input_parameters = "FPA=BreakEven has just confused 8("; string error__title_order_modify = "FPA=BreakEven: problem while modifying order"; string error__be_params_reserved = "BE trigger is closer than BE itself."; string error__be_params_are_too_close = "Can\'t set stop level so close to market price."; #define CORNER_UPPERLEFT 0 #define CORNER_UPPERRIGHT 1 #define CORNER_LOWERLEFT 2 #define CORNER_LOWERRIGHT 3 // --- test order parameters --- string test_time_strs[] = { "2014.01.02 00:15", "2014.01.02 04:12" }; int test_orders[] = { OP_SELL, OP_SELL }; double test_lots[] = { 0.1, 0.1 }; bool test_placed[]; datetime test_times[]; //+------------------------------------------------------------------+ //+- Builtins: init(), deinit(), start() ----------------------------+ //+------------------------------------------------------------------+ int init() { pip_value = MathPow(10.0, MathFloor(MathLog(Bid / 2.0) / MathLog(10.0)) - 3); pip_digits = MathRound(MathLog(pip_value / Point) / MathLog(10.0)); stop_level_in_pips = NormalizeDouble(MarketInfo(Symbol(), MODE_STOPLEVEL) * Point / pip_value, pip_digits); equality_tolerance = Point / 2.0; validate_external_parameters(); initialize_test_scenario(); return(0); } //+------------------------------------------------------------------+ int deinit() { make_sure_error_message_hidden(); return(0); } //+------------------------------------------------------------------+ int start() { do_test_scenario_activities(); check_trade_levels_to_set_be(); return(0); } //+------------------------------------------------------------------+ //+- Specific modules -----------------------------------------------+ //+------------------------------------------------------------------+ void validate_external_parameters() { error_state = false; if (Break_Even_Trigger_in_Pips < Break_Even_in_Pips) { write_error_message(error_title__input_parameters, error__be_params_reserved); error_state = true; return; } else if (Break_Even_Trigger_in_Pips - stop_level_in_pips < Break_Even_in_Pips) { write_error_message(error_title__input_parameters, error__be_params_are_too_close); error_state = true; return; } error_state = false; } //+------------------------------------------------------------------+ void check_trade_levels_to_set_be() { if ( ! error_state) for(int i = 0; i < OrdersTotal(); i++) if (OrderSelect(i, SELECT_BY_POS)) if (OrderSymbol() == Symbol()) if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL)) if ( ! order_is_in_be_or_further()) if (order_is_triggered_by_be()) set_break_even(); } //+------------------------------------------------------------------+ bool order_is_in_be_or_further() { if (OrderType() == OP_BUY) return(OrderStopLoss() - OrderOpenPrice() > Break_Even_in_Pips * pip_value - equality_tolerance); if (OrderType() == OP_SELL) return((OrderStopLoss() != 0.0) && (OrderOpenPrice() - OrderStopLoss() > Break_Even_in_Pips * pip_value - equality_tolerance)); return(true); } //+------------------------------------------------------------------+ bool order_is_triggered_by_be() { if (OrderType() == OP_BUY) return(Bid - OrderOpenPrice() > Break_Even_Trigger_in_Pips * pip_value - equality_tolerance); if (OrderType() == OP_SELL) return(OrderOpenPrice() - Ask > Break_Even_Trigger_in_Pips * pip_value - equality_tolerance); return(false); } //+------------------------------------------------------------------+ void set_break_even() { Comment(GetTickCount()); double new_stop_level = 0.0; if (OrderType() == OP_BUY) new_stop_level = NormalizeDouble(OrderOpenPrice() + Break_Even_in_Pips * pip_value, Digits); if (OrderType() == OP_SELL) new_stop_level = NormalizeDouble(OrderOpenPrice() - Break_Even_in_Pips * pip_value, Digits); if (new_stop_level > 0.0) if ( ! OrderModify(OrderTicket(), 0.0, new_stop_level, OrderTakeProfit(), 0)) write_error_message(error__title_order_modify, TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS) + get_error_message(GetLastError())); } //+------------------------------------------------------------------+ void make_sure_error_message_hidden() { object_hide(error_message_name + " 1"); object_hide(error_message_name + " 2"); } //+------------------------------------------------------------------+ void write_error_message(string title, string message) { refresh_chart_label(error_message_name + " 1", title, error_message_color, label_font_type, error_font_size, 0, CORNER_LOWERLEFT, 12, 36); refresh_chart_label(error_message_name + " 2", message, error_message_color, label_font_type, error_font_size, 0, CORNER_LOWERLEFT, 12, 18); } //+------------------------------------------------------------------+ //+- Test functions -------------------------------------------------+ //+------------------------------------------------------------------+ void initialize_test_scenario() { ArrayResize(test_placed, ArraySize(test_time_strs)); ArrayResize(test_times, ArraySize(test_time_strs)); for(int i = 0; i < ArraySize(test_time_strs); i++) { test_placed[i] = false; test_times[i] = StrToTime(test_time_strs[i]); } } //+------------------------------------------------------------------+ void do_test_scenario_activities() { if (IsTesting()) { for(int i = 0; i < ArraySize(test_times); i++) if ( ! test_placed[i]) if ((Time[0] >= test_times[i]) && (Time[1] < test_times[i])) { if (test_orders[i] == OP_BUY) OrderSend(Symbol(), OP_BUY, test_lots[i], Ask, 7, 0.0, 0.0); if (test_orders[i] == OP_SELL) OrderSend(Symbol(), OP_SELL, test_lots[i], Bid, 7, 0.0, 0.0); test_placed[i] = true; } for(i = 0; i < 500000; i++) {} } } //+------------------------------------------------------------------+ //+- Library functions ----------------------------------------------+ //+------------------------------------------------------------------+ void refresh_chart_label(string label_name, string label_text, int clr, string font, int size, int window, int corner, int distance_x, int distance_y) { if (ObjectFind(label_name) == -1) { ObjectCreate(label_name, OBJ_LABEL, 0, 0, 0); } ObjectSetText(label_name, label_text, size, font, clr); ObjectSet(label_name, OBJPROP_CORNER, corner); ObjectSet(label_name, OBJPROP_XDISTANCE, distance_x); ObjectSet(label_name, OBJPROP_YDISTANCE, distance_y); } //+------------------------------------------------------------------+ void object_hide(string object_name) { if (ObjectFind(object_name) != -1) ObjectDelete(object_name); } //+------------------------------------------------------------------+ string get_error_message(int error_code) { switch(error_code) { case 0: return("Server: No error returned (0)"); case 1: return("Server: No error returned, but the result is unknown (1)"); case 2: return("Server: Common error (2)"); case 3: return("Server: Invalid trade parameters (3)"); case 4: return("Server: Trade server is busy (4)"); case 5: return("Server: Old version of the client terminal (5)"); case 6: return("Server: No connection with trade server (6)"); case 7: return("Server: Not enough rights (7)"); case 8: return("Server: Too frequent requests (8)"); case 9: return("Server: Malfunctional trade operation (9)"); case 64: return("Server: Account disabled (64)"); case 65: return("Server: Invalid account (65)"); case 128: return("Server: Trade timeout (128)"); case 129: return("Server: Invalid price (129)"); case 130: return("Server: Invalid stops (130)"); case 131: return("Server: Invalid trade volume (131)"); case 132: return("Server: Market is closed (132)"); case 133: return("Server: Trade is disabled (133)"); case 134: return("Server: Not enough money (134)"); case 135: return("Server: Price changed (135)"); case 136: return("Server: Off quotes (136)"); case 137: return("Server: Broker is busy (137)"); case 138: return("Server: Requote (138)"); case 139: return("Server: Order is locked (139)"); case 140: return("Server: Long positions only allowed (140)"); case 141: return("Server: Too many requests (141)"); case 145: return("Server: Modification denied because order too close to market (145)"); case 146: return("Server: Trade context is busy (146)"); case 147: return("Server: Expirations are denied by broker (147)"); case 148: return("Server: The amount of open and pending orders has reached the limit set by the broker (148)"); case 4000: return("Runtime: No error (4000)"); case 4001: return("Runtime: Wrong function pointer (4001)"); case 4002: return("Runtime: Array index is out of range (4002)"); case 4003: return("Runtime: No memory for function call stack (4003)"); case 4004: return("Runtime: Recursive stack overflow (4004)"); case 4005: return("Runtime: Not enough stack for parameter (4005)"); case 4006: return("Runtime: No memory for parameter string (4006)"); case 4007: return("Runtime: No memory for temp string (4007)"); case 4008: return("Runtime: Not initialized string (4008)"); case 4009: return("Runtime: Not initialized string in array (4009)"); case 4010: return("Runtime: No memory for array string (4010)"); case 4011: return("Runtime: Too long string (4011)"); case 4012: return("Runtime: Remainder from zero divide (4012)"); case 4013: return("Runtime: Zero divide (4013)"); case 4014: return("Runtime: Unknown command (4014)"); case 4015: return("Runtime: Wrong jump (never generated error (4015)"); case 4016: return("Runtime: Not initialized array (4016)"); case 4017: return("Runtime: DLL calls are not allowed (4017)"); case 4018: return("Runtime: Cannot load library (4018)"); case 4019: return("Runtime: Cannot call function (4019)"); case 4020: return("Runtime: Expert function calls are not allowed (4020)"); case 4021: return("Runtime: Not enough memory for temp string returned from function (4021)"); case 4022: return("Runtime: System is busy (never generated error (4022)"); case 4050: return("Runtime: Invalid function parameters count (4050)"); case 4051: return("Runtime: Invalid function parameter value (4051)"); case 4052: return("Runtime: String function internal error (4052)"); case 4053: return("Runtime: Some array error (4053)"); case 4054: return("Runtime: Incorrect series array using (4054)"); case 4055: return("Runtime: Custom indicator error (4055)"); case 4056: return("Runtime: Arrays are incompatible (4056)"); case 4057: return("Runtime: Global variables processing error (4057)"); case 4058: return("Runtime: Global variable not found (4058)"); case 4059: return("Runtime: Function is not allowed in testing mode (4059)"); case 4060: return("Runtime: Function is not confirmed (4060)"); case 4061: return("Runtime: Send mail error (4061)"); case 4062: return("Runtime: String parameter expected (4062)"); case 4063: return("Runtime: Integer parameter expected (4063)"); case 4064: return("Runtime: Double parameter expected (4064)"); case 4065: return("Runtime: Array as parameter expected (4065)"); case 4066: return("Runtime: Requested history data in updating state (4066)"); case 4067: return("Runtime: Some error in trading function (4067)"); case 4099: return("Runtime: End of file (4099)"); case 4100: return("Runtime: Some file error (4100)"); case 4101: return("Runtime: Wrong file name (4101)"); case 4102: return("Runtime: Too many opened files (4102)"); case 4103: return("Runtime: Cannot open file (4103)"); case 4104: return("Runtime: Incompatible access to a file (4104)"); case 4105: return("Runtime: No order selected (4105)"); case 4106: return("Runtime: Unknown symbol (4106)"); case 4107: return("Runtime: Invalid price (4107)"); case 4108: return("Runtime: Invalid ticket (4108)"); case 4109: return("Runtime: Trade is not allowed. Enable checkbox \"Allow live trading\" in the expert properties (4109)"); case 4110: return("Runtime: Longs are not allowed. Check the expert properties (4110)"); case 4111: return("Runtime: Shorts are not allowed. Check the expert properties (4111)"); case 4200: return("Runtime: Object exists already (4200)"); case 4201: return("Runtime: Unknown object property (4201)"); case 4202: return("Runtime: Object does not exist (4202)"); case 4203: return("Runtime: Unknown object type (4203)"); case 4204: return("Runtime: No object name (4204)"); case 4205: return("Runtime: Object coordinates error (4205)"); case 4206: return("Runtime: No specified subwindow (4206)"); case 4207: return("Runtime: Some error in object function (4207)"); default: return("Unknown error code: " + error_code); } } //+------------------------------------------------------------------+