/* Generated by EX4 TO MQ4 decompile Service Website: http://www.ex4Tomq4.net E-mail : info@ex4Tomq4.net */ #property copyright "Copyright � 2007, Ryan Klefas (Base 1.8)" #property link "rklefas@inbox.com" //#include #import "stdlib.ex4" string ErrorDescription(int a0); #import extern string id = "==== Identity Settings ===="; extern bool Symbol_Specific = TRUE; extern bool MagicNum_Specific = FALSE; extern int MagicNumber = 9999; extern bool SelectiveScan = FALSE; extern bool RequireAllConditions = FALSE; extern string cond = "==== Conditions: General ===="; extern bool Immediate_Activation = FALSE; extern bool Time_Activation = FALSE; extern int Time_Hour = 23; extern int Time_Minute = 55; extern int Minimum_FreeMargin = 0; extern bool FreeMargin_LessThan = FALSE; extern string pro_cond = "==== Conditions: Profit-Based ===="; extern int MaxProfit_Dollar = 0; extern int MaxProfit_Pip = 0; extern int MaxProfit_Percent = 0; extern string loss_cond = "==== Conditions: Loss-Based ===="; extern int MaxLoss_Dollar = 0; extern int MaxLoss_Pip = 0; extern int MaxLoss_Percent = 0; extern string action = "==== Actions: General ===="; extern bool CloseOrders = FALSE; extern bool HedgeOrders = FALSE; extern string mod_action = "==== Actions: Modify Orders ===="; extern bool SetTakeProfit = FALSE; extern bool SetStoploss = FALSE; extern bool RemoveTakeProfit = FALSE; extern bool RemoveStoploss = FALSE; extern string input_action = "==== Action Inputs ===="; extern int TakeProfit = 0; extern int Stoploss = 0; extern string otype = "==== Order Types: Standard ===="; extern bool Allow_All_Types = FALSE; extern bool Buy_Active = FALSE; extern bool Sell_Active = FALSE; extern bool Buy_Stop = FALSE; extern bool Sell_Stop = FALSE; extern bool Buy_Limit = FALSE; extern bool Sell_Limit = FALSE; extern string manage = "==== Stop Management ===="; extern int BreakEvenAt = 0; extern int BreakEvenSlide = 0; extern int TrailingStop = 0; extern bool OnlyTrailProfits = FALSE; extern string extra = "==== Extra Settings ===="; extern string ExpertName = "Swiss Army EA"; extern bool Disable_Comments = FALSE; extern int Slippage = 3; extern string sep = "============================="; extern string author = "Programming: Ryan Klefas"; extern string contact = "Email: rklefas@inbox.com"; extern string web = "Website: www.forex-tsd.com"; int gi_348 = -1; int gi_352 = 90; int gi_356 = 91; int gi_360 = 92; int gi_364 = 93; int gi_unused_368 = 94; int gi_unused_372 = 95; int gi_unused_376 = 99; int g_count_380 = 0; int g_count_384 = 0; int g_count_388 = 0; int g_count_392 = 0; int g_count_396 = 0; int g_count_400 = 0; int gi_404 = 0; int gi_408 = 0; int gi_412 = 0; int gi_416 = 0; int gi_420 = 0; int gi_424 = 0; int gi_428 = 0; int gi_432; double gd_436 = 0.0; double gd_444 = 0.0; double gd_452 = 0.0; double gd_460 = 0.0; string gsa_468[1]; string gsa_472[1]; double gda_476[1]; double gd_480 = 0.0; double gd_488 = 0.0; int gi_496 = 3007; int init() { onScreenComment(91); return (0); } int deinit() { onScreenComment(99); return (0); } int start() { if (Year() > gi_496) { Comment("\nThis version of Swiss Army EA has past its expiration date. If you would like an\n" + "updated copy, please contact the author, Ryan Klefas at rklefas@inbox.com, or visit the \n" + "original forum thread at www.forex-tsd.com for further information and updates: \n\n" + "http://www.forex-tsd.com/expert-advisors-metatrader-4/7552-swiss-army-ea-automatic-order-management.html" + Year()); } else commence(); return (0); } void commence() { bool li_0 = FALSE; bool li_4 = FALSE; findMyOrders(); statTracker(); onScreenComment(98); if (gi_420 > 0) { if (BreakEvenAt > 0) breakEvenManager(BreakEvenAt, BreakEvenSlide); if (TrailingStop > 0) trailingStopManager(TrailingStop, OnlyTrailProfits); } if (Immediate_Activation) li_0 = TRUE; if (Time_Activation) { if (Hour() == Time_Hour && Minute() >= Time_Minute) li_0 = TRUE; else li_4 = TRUE; } if (MathAbs(MaxProfit_Dollar) > 0.0) { if (gd_436 > MathAbs(MaxProfit_Dollar)) li_0 = TRUE; else li_4 = TRUE; } if (MathAbs(MaxLoss_Dollar) > 0.0) { if (gd_436 < -1.0 * MathAbs(MaxLoss_Dollar)) li_0 = TRUE; else li_4 = TRUE; } if (MathAbs(MaxProfit_Pip) > 0.0) { if (gd_444 > MathAbs(MaxProfit_Pip)) li_0 = TRUE; else li_4 = TRUE; } if (MathAbs(MaxLoss_Pip) > 0.0) { if (gd_444 < -1.0 * MathAbs(MaxLoss_Pip)) li_0 = TRUE; else li_4 = TRUE; } if (MathAbs(MaxLoss_Percent) > 0.0) { if (balanceDeviation() < -1.0 * MathAbs(MaxLoss_Percent)) li_0 = TRUE; else li_4 = TRUE; } if (MathAbs(MaxProfit_Percent) > 0.0) { if (balanceDeviation() > MathAbs(MaxProfit_Percent)) li_0 = TRUE; else li_4 = TRUE; } if (MathAbs(Minimum_FreeMargin) > 0.0) { if (AccountFreeMargin() < Minimum_FreeMargin) li_0 = TRUE; else li_4 = TRUE; } if (FreeMargin_LessThan) { if (AccountFreeMargin() < AccountMargin()) li_0 = TRUE; else li_4 = TRUE; } if (RequireAllConditions) { if (li_0) if (li_4 == FALSE) actionFunction(); } else if (li_0) actionFunction(); findMyOrders(); statTracker(); onScreenComment(98); } void onScreenComment(int ai_0) { string dbl2str_4; string dbl2str_12; string dbl2str_20; string dbl2str_28; string dbl2str_36; string dbl2str_44; string ls_52; string ls_60; string ls_68; string ls_76; string ls_84; string ls_92; string ls_100; string ls_108; string ls_116; string ls_124; string ls_132; if (Disable_Comments == FALSE) { dbl2str_4 = DoubleToStr(balanceDeviation(), 2); dbl2str_12 = DoubleToStr(gd_436, 2); dbl2str_20 = DoubleToStr(gd_452, 2); dbl2str_28 = DoubleToStr(-gd_460, 2); dbl2str_36 = DoubleToStr(gd_480, 2); dbl2str_44 = DoubleToStr(gd_488, 2); ls_52 = "\n"; ls_60 = "------------------------------------"; ls_68 = ls_60 + ls_52; ls_76 = ExpertName + " run-time statistics: " + ls_52; if (!(TrailingStop > 0)) ls_100 = "Trailing Stop management disabled" + ls_52; else if (TrailingStop > 0) ls_100 = "Trailing Stop management enabled" + ls_52; if (!(BreakEvenAt > 0)) ls_92 = "Breakeven management disabled" + ls_52; else if (BreakEvenAt > 0) ls_92 = "Breakeven management enabled" + ls_52; if (MagicNum_Specific == FALSE && Symbol_Specific == FALSE) ls_84 = "Managing ALL orders in this terminal" + ls_52; else { if (MagicNum_Specific && Symbol_Specific) ls_84 = "Managing only " + Symbol() + " orders that have magic number " + MagicNumber + ls_52; else { if (MagicNum_Specific) ls_84 = "Managing all orders that have magic number " + MagicNumber + ls_52; else if (Symbol_Specific) ls_84 = "Managing all " + Symbol() + " orders " + ls_52; } } ls_108 = "Buy Active: " + g_count_380 + ls_52 + "Sell Active: " + g_count_384 + ls_52 + "Buy Stop: " + g_count_388 + ls_52 + "Sell Stop: " + g_count_392 + ls_52 + "Buy Limit: " + g_count_396 + ls_52 + "Sell Limit: " + g_count_400 + ls_52 + "Grand Total: " + gi_428 + ls_52; ls_116 = "Date and Time: " + TimeToStr(TimeCurrent()) + ls_52 + "Account Leverage: " + AccountLeverage() + ":1" + ls_52; ls_124 = "Cash: $" + dbl2str_12 + ls_52 + "Swap: $" + dbl2str_20 + ls_52 + "Pips: " + pipCount() + ls_52 + "Percent: " + dbl2str_4 + "%" + ls_52; ls_132 = "Largest Recorded Gain: " + dbl2str_44 + "%" + ls_52 + "Largest Recorded Drawdown: " + dbl2str_36 + "%" + ls_52 + "Order Costs: $" + dbl2str_28 + ls_52; switch (ai_0) { case 91: Comment(ls_52 + ExpertName + " is waiting for the next tick to begin."); return; case 98: Comment(ls_52 + ls_76 + ls_68 + ls_84 + ls_100 + ls_92 + ls_68 + ls_116 + ls_68 + ls_132 + ls_68 + ls_124 + ls_68 + ls_108); return; case 99: Comment(" "); } } } int simpleMagicGenerator() { return (MagicNumber); } int orderBelongsToMe() { bool li_0 = FALSE; bool li_4 = FALSE; if (MagicNum_Specific) { if (OrderMagicNumber() == simpleMagicGenerator()) li_0 = TRUE; } else li_0 = TRUE; if (Symbol_Specific) { if (OrderSymbol() == Symbol()) li_4 = TRUE; } else li_4 = TRUE; if (li_4 && li_0) return (1); return (0); } void findMyOrders() { g_count_380 = 0; g_count_384 = 0; g_count_388 = 0; g_count_392 = 0; g_count_396 = 0; g_count_400 = 0; gi_404 = 0; gi_408 = 0; gi_412 = 0; gi_416 = 0; gi_420 = 0; gi_424 = 0; gi_428 = 0; for (int pos_0 = OrdersTotal() - 1; pos_0 >= 0; pos_0--) { OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES); if (orderBelongsToMe()) { if (OrderType() == OP_BUY) { g_count_380++; continue; } if (OrderType() == OP_SELL) { g_count_384++; continue; } if (OrderType() == OP_BUYSTOP) { g_count_388++; continue; } if (OrderType() == OP_SELLSTOP) { g_count_392++; continue; } if (OrderType() == OP_BUYLIMIT) { g_count_396++; continue; } if (OrderType() == OP_SELLLIMIT) g_count_400++; } } gi_404 = g_count_388 + g_count_396; gi_408 = g_count_392 + g_count_400; gi_424 = gi_404 + gi_408; gi_420 = g_count_380 + g_count_384; gi_412 = g_count_388 + g_count_396 + g_count_380; gi_416 = g_count_392 + g_count_400 + g_count_384; gi_428 = gi_420 + gi_424; } void breakEvenManager(int ai_0, int ai_4) { double point_8; double bid_16; double ask_24; for (int pos_32 = 0; pos_32 < OrdersTotal(); pos_32++) { OrderSelect(pos_32, SELECT_BY_POS, MODE_TRADES); if (ai_0 > 0 && orderBelongsToMe()) { bid_16 = MarketInfo(OrderSymbol(), MODE_BID); ask_24 = MarketInfo(OrderSymbol(), MODE_ASK); point_8 = MarketInfo(OrderSymbol(), MODE_POINT); if (OrderType() == OP_BUY) { if (bid_16 - OrderOpenPrice() < point_8 * ai_0) continue; if (OrderStopLoss() >= OrderOpenPrice() + ai_4 * point_8) continue; OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + ai_4 * point_8, OrderTakeProfit(), 0, Green); continue; } if (OrderType() == OP_SELL) { if (OrderOpenPrice() - ask_24 >= point_8 * ai_0) if (OrderStopLoss() > OrderOpenPrice() - ai_4 * point_8 || OrderStopLoss() == 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - ai_4 * point_8, OrderTakeProfit(), 0, Red); } } } } void trailingStopManager(int ai_0, int ai_4) { double point_8; double bid_16; double ask_24; for (int pos_32 = 0; pos_32 < OrdersTotal(); pos_32++) { OrderSelect(pos_32, SELECT_BY_POS, MODE_TRADES); if (ai_0 > 0 && orderBelongsToMe()) { bid_16 = MarketInfo(OrderSymbol(), MODE_BID); ask_24 = MarketInfo(OrderSymbol(), MODE_ASK); point_8 = MarketInfo(OrderSymbol(), MODE_POINT); if (OrderType() == OP_BUY) { if (!(bid_16 - OrderOpenPrice() > point_8 * ai_0 || ai_4 == 0)) continue; if (OrderStopLoss() >= bid_16 - point_8 * ai_0) continue; OrderModify(OrderTicket(), OrderOpenPrice(), bid_16 - point_8 * ai_0, OrderTakeProfit(), 0, Green); continue; } if (OrderType() == OP_SELL) { if (OrderOpenPrice() - ask_24 > point_8 * ai_0 || ai_4 == 0) if (OrderStopLoss() > ask_24 + point_8 * ai_0 || OrderStopLoss() == 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), ask_24 + point_8 * ai_0, OrderTakeProfit(), 0, Red); } } } } void swissArmyOrderCloser() { for (int pos_0 = 0; pos_0 < OrdersTotal(); pos_0++) { OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES); if (orderBelongsToMe()) { if (orderTypeManagementAllowed(OrderType())) { doing("close " + OrderSymbol() + " orders."); positionCloser(pos_0); } } } } void actionFunction() { bool li_0 = TRUE; bool li_4 = TRUE; if (gi_428 > 0) { if (CloseOrders) { swissArmyOrderCloser(); li_4 = FALSE; li_0 = FALSE; } } if (gi_420 > 0 && li_4) { if (HedgeOrders) { prepareToHedge(); sendHedges(); } } if (gi_420 > 0 && li_0) { if (SetStoploss && Stoploss > 0) modifyMyOrders(gi_364); else if (RemoveStoploss) modifyMyOrders(gi_356); if (SetTakeProfit && TakeProfit > 0) { modifyMyOrders(gi_360); return; } if (RemoveTakeProfit) modifyMyOrders(gi_352); } } double balanceDeviation() { double ld_0 = AccountBalance() + gd_436 + gd_452; double ld_8 = AccountBalance(); double ld_ret_16 = 100.0 * (ld_0 / ld_8 - 1.0); return (ld_ret_16); } void doing(string as_0) { Print(ExpertName + " is attempting to " + as_0); } int pipCount() { int li_ret_0 = gd_444; return (li_ret_0); } void modifyMyOrders(int ai_0) { color color_4 = Red; for (int pos_8 = OrdersTotal() - 1; pos_8 >= 0; pos_8--) { OrderSelect(pos_8, SELECT_BY_POS, MODE_TRADES); if (orderBelongsToMe() && orderTypeAllowed(OrderType())) { if (ai_0 == gi_352) { if (OrderTakeProfit() != 0.0) { doing("remove takeprofits."); OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 0, 0, color_4); } } else { if (ai_0 == gi_360) { if (OrderTakeProfit() == 0.0) { doing("set takeprofits."); OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), takeGenerator(OrderSymbol(), OrderType(), OrderOpenPrice(), TakeProfit), 0, color_4); } } } if (ai_0 == gi_356) { if (OrderStopLoss() == 0.0) continue; doing("remove stoplosses."); OrderModify(OrderTicket(), OrderOpenPrice(), 0, OrderTakeProfit(), 0, color_4); continue; } if (ai_0 == gi_364) { if (OrderStopLoss() == 0.0) { doing("set stoplosses"); OrderModify(OrderTicket(), OrderOpenPrice(), stopGenerator(OrderSymbol(), OrderType(), OrderOpenPrice(), Stoploss), OrderTakeProfit(), 0, color_4); } } } } } void prepareToHedge() { ArrayResize(gsa_468, gi_420); string ls_unused_0 = "\n"; int index_8 = 0; int index_12 = 0; for (int pos_16 = OrdersTotal() - 1; pos_16 >= 0; pos_16--) { OrderSelect(pos_16, SELECT_BY_POS, MODE_TRADES); if (orderBelongsToMe() && orderTypeAllowed(OrderType())) { if (OrderType() == OP_BUY) { gsa_468[index_8] = OrderSymbol(); index_8++; continue; } if (OrderType() == OP_SELL) { gsa_468[index_8] = OrderSymbol(); index_8++; } } } gi_432 = createUniqueArray(); ArrayResize(gda_476, gi_432); for (pos_16 = 0; pos_16 < gi_432; pos_16++) gda_476[pos_16] = 0; for (int count_20 = 0; count_20 < gi_432; count_20++) { for (pos_16 = OrdersTotal() - 1; pos_16 >= 0; pos_16--) { OrderSelect(pos_16, SELECT_BY_POS, MODE_TRADES); if (orderBelongsToMe()) { if (OrderSymbol() == gsa_472[index_12]) { if (OrderType() == OP_BUY) gda_476[index_12] += OrderLots(); if (OrderType() == OP_SELL) gda_476[index_12] = gda_476[index_12] - OrderLots(); } } } index_12++; } } int createUniqueArray() { bool li_0 = FALSE; int li_ret_4 = 0; ArrayResize(gsa_472, gi_420); for (int index_8 = 0; index_8 < gi_420; index_8++) gsa_472[index_8] = "empty"; for (int index_12 = 0; index_12 < gi_420; index_12++) { for (int index_16 = 0; index_16 < gi_420; index_16++) if (gsa_472[index_16] == gsa_468[index_12]) li_0 = TRUE; if (li_0 == FALSE) { gsa_472[li_ret_4] = gsa_468[index_12]; li_ret_4++; } li_0 = FALSE; } ArrayResize(gsa_472, li_ret_4); return (li_ret_4); } void sendHedges() { double ld_4; double price_16; bool li_0 = FALSE; bool li_12 = gi_348; for (int index_24 = 0; index_24 < gi_432; index_24++) { if (gda_476[index_24] < 0.0) { li_0 = TRUE; li_12 = FALSE; ld_4 = MathAbs(gda_476[index_24]); price_16 = MarketInfo(gsa_472[index_24], MODE_ASK); } else { if (gda_476[index_24] > 0.0) { li_0 = TRUE; li_12 = TRUE; ld_4 = gda_476[index_24]; price_16 = MarketInfo(gsa_472[index_24], MODE_BID); } } if (li_0) { doing("hedge active " + gsa_472[index_24] + " orders."); universalOrderTaker(gsa_472[index_24], li_12, ld_4, price_16, stopGenerator(gsa_472[index_24], li_12, price_16, Stoploss), takeGenerator(gsa_472[index_24], li_12, price_16, TakeProfit), commentString(), simpleMagicGenerator()); } li_0 = FALSE; } } string commentString() { string str_concat_0 = StringConcatenate(ExpertName, ": Hedge Order"); return (str_concat_0); } void statTracker() { gd_436 = 0; gd_444 = 0; gd_452 = 0; gd_460 = 0; if (balanceDeviation() > gd_488) gd_488 = balanceDeviation(); if (balanceDeviation() < gd_480) gd_480 = balanceDeviation(); for (int pos_0 = OrdersTotal() - 1; pos_0 >= 0; pos_0--) { OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES); if (orderBelongsToMe() && orderTypeAllowed(OrderType()) || SelectiveScan == FALSE) { if (OrderType() == OP_BUY) gd_444 += (MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice()) / MarketInfo(OrderSymbol(), MODE_POINT); else if (OrderType() == OP_SELL) gd_444 += (OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK)) / MarketInfo(OrderSymbol(), MODE_POINT); if (OrderType() == OP_SELL || OrderType() == OP_BUY) { gd_436 += OrderProfit(); gd_452 += OrderSwap(); gd_460 += OrderLots() * MarketInfo(OrderSymbol(), MODE_SPREAD) * MarketInfo(OrderSymbol(), MODE_TICKVALUE); } } } } void Wait() { while (IsTradeContextBusy()) Sleep(100); } int orderTypeAllowed(int ai_0) { switch (ai_0) { case 0: if (!(Buy_Active || Allow_All_Types)) return (0); return (1); case 1: if (!(Sell_Active || Allow_All_Types)) return (0); return (1); case 4: if (!(Buy_Stop || Allow_All_Types)) return (0); return (1); case 5: if (!(Sell_Stop || Allow_All_Types)) return (0); return (1); case 2: if (!(Buy_Limit || Allow_All_Types)) return (0); return (1); case 3: if (!(Sell_Limit || Allow_All_Types)) return (0); return (1); } return (0); } void universalOrderCloser(int a_pos_0, int ai_4, double a_order_lots_8) { int slippage_16 = Slippage; OrderSelect(a_pos_0, ai_4, MODE_TRADES); if (OrderTicket() > 0) { if (a_order_lots_8 <= 0.0) a_order_lots_8 = OrderLots(); Wait(); switch (OrderType()) { case OP_SELLLIMIT: case OP_SELLSTOP: case OP_BUYLIMIT: case OP_BUYSTOP: OrderDelete(OrderTicket()); return; case OP_SELL: OrderClose(OrderTicket(), a_order_lots_8, MarketInfo(OrderSymbol(), MODE_ASK), slippage_16, CLR_NONE); return; case OP_BUY: OrderClose(OrderTicket(), a_order_lots_8, MarketInfo(OrderSymbol(), MODE_BID), slippage_16, CLR_NONE); } } } void positionCloser(int ai_0) { universalOrderCloser(ai_0, SELECT_BY_POS, 0); } int orderTypeManagementAllowed(int ai_0) { switch (ai_0) { case 0: if (!(Buy_Active || Allow_All_Types)) return (0); return (1); case 1: if (!(Sell_Active || Allow_All_Types)) return (0); return (1); case 4: if (!(Buy_Stop || Allow_All_Types)) return (0); return (1); case 5: if (!(Sell_Stop || Allow_All_Types)) return (0); return (1); case 2: if (!(Buy_Limit || Allow_All_Types)) return (0); return (1); case 3: if (!(Sell_Limit || Allow_All_Types)) return (0); return (1); } return (0); } void universalOrderTaker(string a_symbol_0, int a_cmd_8, double a_lots_12, double a_price_20, double a_price_28, double a_price_36, string a_comment_44, int a_magic_52) { string ls_60; int slippage_56 = Slippage; switch (a_cmd_8) { case OP_SELLSTOP: ls_60 = "SELLSTOP"; break; case OP_SELLLIMIT: ls_60 = "SELLLIMIT"; break; case OP_BUYSTOP: ls_60 = "BUYSTOP"; break; case OP_BUYLIMIT: ls_60 = "BUYLIMIT"; break; case OP_SELL: ls_60 = "SELL"; break; case OP_BUY: ls_60 = "BUY"; } Wait(); int ticket_72 = OrderSend(a_symbol_0, a_cmd_8, a_lots_12, a_price_20, slippage_56, a_price_28, a_price_36, a_comment_44, a_magic_52, 0, Violet); if (ticket_72 > 0) { if (OrderSelect(ticket_72, SELECT_BY_TICKET, MODE_TRADES)) Print(ExpertName + " " + ls_60 + " order at ", OrderOpenPrice()); } else Print("Error opening " + ls_60 + " order: ", ErrorDescription(GetLastError())); } double takeGenerator(string a_symbol_0, int ai_8, double ad_12, int ai_20) { double point_24 = MarketInfo(a_symbol_0, MODE_POINT); if (ai_20 == 0) return (0); if (ai_8 == 0) return (ad_12 + ai_20 * point_24); if (ai_8 == 1) return (ad_12 - ai_20 * point_24); return (0); } double stopGenerator(string a_symbol_0, int ai_8, double ad_12, int ai_20) { double point_24 = MarketInfo(a_symbol_0, MODE_POINT); if (ai_20 == 0) return (0); if (ai_8 == 0) return (ad_12 - ai_20 * point_24); if (ai_8 == 1) return (ad_12 + ai_20 * point_24); return (0); }