Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

Besoin aide ajout fonction dans EA

  • chris8469

    Bonjour a tous j'ai un EA qui est semi automatique et j'aimerai y ajouter un fonction de maniére qu'il soit totalement automatique, je souhaiterai qu'il puisse ouvrir un ordre buy stop et sell stop en fonction du plus haut ou plus bas a x pips au choix de la 1ere a 3eme bougie précédente si cela est possible merci de votre aide voici le code


    Code
    #include <WinUser32.mqh> #include <stdlib.mqh> extern double lots = 0.1; extern double eurusdBuy = 0.0; extern double eurusdSell = 0.0; extern double usdchfBuy = 0.0; extern double usdchfSell = 0.0; extern double gbpusdBuy = 0.0; extern double gbpusdSell = 0.0; extern bool closeAll = FALSE; extern string _params_ = "------- parameters -------"; extern string eurusdSymbol = "EURUSD"; extern string usdchfSymbol = "USDCHF"; extern string gbpusdSymbol = "GBPUSD"; extern int profitCoverClosePercent = 0; extern bool profitCoverCloseOpposite = FALSE; extern string _common_ = "------- common -------"; extern int slippage = 3; extern int openHour = 11; int var_192 = 11; int var_196 = 12; int var_200 = 12; int var_204; int var_208; int var_212; int var_216; string var_comment_220 = "BuyForexSignals"; extern bool isECNbroker = FALSE; extern int magic = 59181128; bool var_236 = TRUE; bool var_bool_240 = FALSE; int var_244 = 40; int var_248 = 15; int var_252 = 70; int var_256 = 30; int var_260 = 70; int var_264 = 30; int var_268 = 5; bool var_272 = TRUE; int var_276 = 1; int var_datetime_280; int var_day_of_year_284; bool var_288 = FALSE; int var_292; int var_296; int var_300; int var_304; int var_308; int var_312; int var_316; bool var_320; string var_str_concat_324; string var_332; string var_str_concat_340; string var_dummy_348; string var_str_concat_356; string var_364; string var_372; string var_380; int gia_388[6]; int gia_392[6][10]; int gia_396[6][10]; int gia_400[6][10]; bool gba_404[6][10]; double gda_408[6][10]; double gda_412[6][10]; double gda_416[6][10]; bool var_420 = FALSE; bool initVars() { if (var_288) return (FALSE); var_288 = TRUE; profitCoverClosePercent = MathMin(MathMax(0, profitCoverClosePercent), 70); initPipScale(); initTime(); initCloseTime(); initPriceStr(); var_364 = ""; var_372 = ""; var_380 = ""; var_332 = ""; var_320 = TRUE; return (TRUE); } void initPipScale() { int var_digits_0; if (var_272) { var_digits_0 = MarketInfo(Symbol(), MODE_DIGITS); if (var_digits_0 == 3 || var_digits_0 == 5) var_276 = 10; } var_str_concat_340 = StringConcatenate("BuyForexSignals v1.1\n\n", "PIPscale = ", var_276, " (auto=", var_272, ") (digits=", MarketInfo(Symbol(), MODE_DIGITS), ")"); var_320 = TRUE; var_292 = var_244 * var_276; var_296 = var_248 * var_276; var_308 = var_252 * var_276; var_312 = var_256 * var_276; var_300 = var_260 * var_276; var_304 = var_264 * var_276; var_316 = var_268 * var_276; slippage *= var_276; } void initTime() { var_204 = (openHour + var_192) % 24; var_208 = (openHour + var_196) % 24; var_212 = 3600 * var_192; var_216 = 3600 * (var_196 - var_192); var_day_of_year_284 = -1; var_str_concat_340 = StringConcatenate(var_str_concat_340, "\n-------\norder Close time: ", var_208, ":00\nOld order: after ", var_200, " hours"); var_320 = TRUE; } void initCloseTime() { int var_str2time_0; if (var_day_of_year_284 != DayOfYear()) { var_day_of_year_284 = DayOfYear(); var_str2time_0 = StrToTime(StringConcatenate(openHour, ":00")); var_datetime_280 = var_str2time_0 + 3600 * var_196; } } void initPriceStr() { var_str_concat_356 = StringConcatenate(initOpenPrice("EUR/USD", eurusdSymbol, eurusdBuy, eurusdSell), "\n", initOpenPrice("USD/CHF", usdchfSymbol, usdchfBuy, usdchfSell), "\n", initOpenPrice("GBP/USD", gbpusdSymbol, gbpusdBuy, gbpusdSell)); var_320 = TRUE; } string initOpenPrice(string var_0, string var_symbol_8, double var_16, double var_24) { string var_str_concat_32; if (MarketInfo(var_symbol_8, MODE_ASK) <= 0.0) var_str_concat_32 = StringConcatenate(var_0, ": Invalid symbol name: \'", var_symbol_8, "\'!"); else var_str_concat_32 = StringConcatenate(var_0, ": symbol name: \'", var_symbol_8, "\' | BUY at ", var_16, " / SELL at ", var_24); return (var_str_concat_32); } int isOpenTimeValid() { int var_hour_0 = Hour(); if (openHour < var_204) return (var_hour_0 >= openHour && var_hour_0 < var_204); return (var_hour_0 >= openHour || var_hour_0 < var_204); } bool isCloseTimeValid() { int var_hour_0 = Hour(); if (openHour < var_208) return (var_hour_0 < openHour || var_hour_0 >= var_208); return (var_hour_0 < openHour && var_hour_0 >= var_208); } int startOrdersWithRetry() { if (!isOpenTimeValid()) { MessageBox("Orders are started only within the first " + var_192 + " hours from the specified openHour!", "Warning"); return (0); } closeOldOrders(); initCloseTime(); bool var_ret_0 = FALSE; if (startOrders(eurusdSymbol, lots, eurusdBuy, eurusdSell, var_292, var_296) < 0) var_ret_0 = TRUE; if (startOrders(usdchfSymbol, lots, usdchfBuy, usdchfSell, var_308, var_312) < 0) var_ret_0 = TRUE; if (startOrders(gbpusdSymbol, lots, gbpusdBuy, gbpusdSell, var_300, var_304) < 0) var_ret_0 = TRUE; if (var_ret_0) { if (var_372 == "") { var_372 = "\nCould not start all of the orders... retrying at next tick..."; var_320 = TRUE; } } else { if (var_372 != "") { var_372 = ""; var_320 = TRUE; } } return (var_ret_0); } int startOrders(string var_symbol_0, double var_8, double var_16, double var_24, int var_32, int var_36) { int var_88; int var_digits_40 = MarketInfo(var_symbol_0, MODE_DIGITS); double var_point_44 = MarketInfo(var_symbol_0, MODE_POINT); double var_52 = var_36 * var_point_44; double var_60 = var_32 * var_point_44; double var_68 = MarketInfo(var_symbol_0, MODE_ASK) - MarketInfo(var_symbol_0, MODE_BID); double var_76 = MathMax(NormalizeDouble(var_8 * profitCoverClosePercent / 100.0, 2), 0); int var_ret_84 = 1; if (NormalizeDouble(var_16, var_digits_40) > 0.0) { if (var_236) var_88 = startOrder(var_symbol_0, 4, var_8, var_16, var_24, var_16 + var_60); else { var_88 = startOrder(var_symbol_0, 4, var_8, var_16, var_24, var_16 + var_52); if (var_88 >= 0) var_88 = startOrder(var_symbol_0, 4, var_8 - var_76, var_16 + var_52 + var_68, var_16, var_16 + var_60); } if (var_88 < 0) var_ret_84 = -1; } if (NormalizeDouble(var_24, var_digits_40) > 0.0) { if (var_236) var_88 = startOrder(var_symbol_0, 5, var_8, var_24, var_16, var_24 - var_60); else { var_88 = startOrder(var_symbol_0, 5, var_8, var_24, var_16, var_24 - var_52); if (var_88 >= 0) var_88 = startOrder(var_symbol_0, 5, var_8 - var_76, var_24 - var_52 - var_68, var_24, var_24 - var_60); } if (var_88 < 0) var_ret_84 = -1; } return (var_ret_84); } int startOrder(string var_symbol_0, int var_8, double var_12, double var_20, double var_28, double var_36) { bool var_68; double var_price_72; string var_84; int var_digits_44 = MarketInfo(var_symbol_0, MODE_DIGITS); double var_point_48 = MarketInfo(var_symbol_0, MODE_POINT); if (NormalizeDouble(var_20, var_digits_44) < 0.01) return (0); if (findOrder(var_symbol_0, var_8, var_20, TimeCurrent() - var_212) > 0) return (0); var_20 = NormalizeDouble(var_20, var_digits_44); var_28 = NormalizeDouble(var_28, var_digits_44); var_36 = NormalizeDouble(var_36, var_digits_44); double var_56 = NormalizeDouble(var_316 * var_point_48, var_digits_44); int var_ticket_64 = startOrderWithSLandTP(var_symbol_0, var_8, var_12, var_20, var_28, var_36); if (var_ticket_64 == -1) { var_68 = FALSE; switch (var_8) { case 2: break; case 4: var_price_72 = MarketInfo(var_symbol_0, MODE_ASK); if (NormalizeDouble(var_price_72 - var_20, var_digits_44) >= 0.0 && NormalizeDouble(var_price_72 - (var_20 + var_56), var_digits_44) <= 0.0) { var_8 = 0; var_20 = NormalizeDouble(var_price_72, var_digits_44); var_68 = TRUE; } break; case 3: break; case 5: var_price_72 = MarketInfo(var_symbol_0, MODE_BID); if (NormalizeDouble(var_price_72 - var_20, var_digits_44) <= 0.0 && NormalizeDouble(var_price_72 - (var_20 - var_56), var_digits_44) >= 0.0) { var_8 = 1; var_20 = NormalizeDouble(var_price_72, var_digits_44); var_68 = TRUE; } } if (var_68) var_ticket_64 = startOrderWithSLandTP(var_symbol_0, var_8, var_12, var_20, var_28, var_36); } if (var_ticket_64 == -1) { var_84 = "Error while sending order! " + ErrorDescription(GetLastError()); Print(var_84); return (-1); } OrderSelect(var_ticket_64, SELECT_BY_TICKET); return (var_ticket_64); } int startOrderWithSLandTP(string var_symbol_0, int var_cmd_8, double var_lots_12, double var_price_20, double var_price_28, double var_price_36) { int var_ticket_44; string var_48 = getCmdStr(var_cmd_8); Print("startOrders... ", var_symbol_0, " cmd=", var_48, " @", var_price_20, " S/L=", var_price_28, " T/P=", var_price_36, " (ASK/BID=", MarketInfo(var_symbol_0, MODE_ASK), "/", MarketInfo(var_symbol_0, MODE_BID), "); lots=" + var_lots_12); if (!isECNbroker) var_ticket_44 = OrderSend(var_symbol_0, var_cmd_8, var_lots_12, var_price_20, slippage, var_price_28, var_price_36, var_comment_220, magic, var_datetime_280, CLR_NONE); else { var_ticket_44 = OrderSend(var_symbol_0, var_cmd_8, var_lots_12, var_price_20, slippage, 0, 0, var_comment_220, magic, var_datetime_280, CLR_NONE); if (var_ticket_44 != -1 && var_price_28 > 0.01 || var_price_36 > 0.01) var_ticket_44 = OrderModify(var_ticket_44, var_price_20, var_price_28, var_price_36, var_datetime_280, CLR_NONE); } return (var_ticket_44); } int closeOrdersTime() { if (isCloseTimeValid()) { if (!var_420) { var_420 = TRUE; var_380 = "\nClose hour reached..."; var_320 = TRUE; } return (closeOrders(NULL, -1, TimeCurrent() - var_216)); } if (var_420) { var_420 = FALSE; var_380 = ""; var_320 = TRUE; } return (0); } void closeOldOrders() { closeOrders(NULL, -1, TimeCurrent() - var_212); } int closeOrders(string var_symbol_0, int var_cmd_8 = -1, int var_12 = 0) { string var_symbol_16; for (int var_pos_24 = OrdersTotal() - 1; var_pos_24 >= 0; var_pos_24--) { if (OrderSelect(var_pos_24, SELECT_BY_POS)) { if (OrderMagicNumber() == magic) { if (var_cmd_8 != -1) if (OrderType() != var_cmd_8) continue; if (var_12 != 0) if (OrderOpenTime() > var_12) continue; var_symbol_16 = OrderSymbol(); if (var_symbol_0 == "") { if (var_symbol_16 != var_symbol_0) continue; } else if (var_symbol_16 != eurusdSymbol && var_symbol_16 != usdchfSymbol && var_symbol_16 != gbpusdSymbol) continue; switch (OrderType()) { case OP_BUY: OrderClose(OrderTicket(), OrderLots(), MarketInfo(var_symbol_16, MODE_BID), slippage, Blue); break; case OP_SELL: OrderClose(OrderTicket(), OrderLots(), MarketInfo(var_symbol_16, MODE_ASK), slippage, Red); break; case OP_BUYLIMIT: case OP_SELLLIMIT: case OP_BUYSTOP: case OP_SELLSTOP: OrderDelete(OrderTicket()); } } } } return (0); } int closeLots(int var_ticket_0) { if (!OrderSelect(var_ticket_0, SELECT_BY_TICKET)) return (1); double var_minlot_4 = MathMax(NormalizeDouble(OrderLots() * profitCoverClosePercent / 100.0, 2), 0); if (var_minlot_4 < MarketInfo(OrderSymbol(), MODE_MINLOT)) { Print("DEBUG - profitCovering(): profitCoverClosePercent too low! Overriding..."); var_minlot_4 = MarketInfo(OrderSymbol(), MODE_MINLOT); } double var_price_12 = 0; color var_color_20 = CLR_NONE; switch (OrderType()) { case OP_BUY: var_price_12 = MarketInfo(OrderSymbol(), MODE_BID); var_color_20 = Blue; break; case OP_SELL: var_price_12 = MarketInfo(OrderSymbol(), MODE_ASK); var_color_20 = Red; break; default: Print("DEBUG - profitCovering(): Invalid order type: ", OrderType()); return (1); } OrderClose(var_ticket_0, var_minlot_4, var_price_12, slippage, var_color_20); return (1); } void breakEven(int var_ticket_0) { int var_digits_4; double var_price_8; double var_16; double var_24; if (OrderSelect(var_ticket_0, SELECT_BY_TICKET)) { var_digits_4 = MarketInfo(OrderSymbol(), MODE_DIGITS); var_price_8 = OrderOpenPrice(); if (isBreakEven() == 0) { var_16 = MarketInfo(OrderSymbol(), MODE_STOPLEVEL) * MarketInfo(OrderSymbol(), MODE_POINT); switch (OrderType()) { case OP_BUY: var_24 = MarketInfo(OrderSymbol(), MODE_BID) - var_16; if (NormalizeDouble(var_24 - var_price_8, var_digits_4) < 0.0) var_price_8 = var_24; break; case OP_SELL: var_24 = MarketInfo(OrderSymbol(), MODE_ASK) + var_16; if (NormalizeDouble(var_24 - var_price_8, var_digits_4) > 0.0) var_price_8 = var_24; } OrderModify(var_ticket_0, OrderOpenPrice(), var_price_8, OrderTakeProfit(), OrderExpiration()); } } } bool isBreakEven() { int var_digits_0 = MarketInfo(OrderSymbol(), MODE_DIGITS); switch (OrderType()) { case OP_BUY: if (NormalizeDouble(OrderOpenPrice() - OrderStopLoss(), var_digits_0) <= 0.0) return (TRUE); break; case OP_SELL: if (NormalizeDouble(OrderOpenPrice() - OrderStopLoss(), var_digits_0) >= 0.0) return (TRUE); break; default: Print("ERROR - profitCovering(): Invalid order type: ", OrderType()); return (TRUE); } return (FALSE); } void checkOrders(string var_symbol_0, double var_unused_8, int var_16, int var_20) { queryOrders(var_symbol_0); int var_digits_24 = MarketInfo(var_symbol_0, MODE_DIGITS); double var_point_28 = MarketInfo(var_symbol_0, MODE_POINT); double var_ask_36 = MarketInfo(var_symbol_0, MODE_ASK); double var_bid_44 = MarketInfo(var_symbol_0, MODE_BID); double var_52 = (var_16 - var_20) * var_point_28; int var_60 = 0; updateOrders(var_symbol_0, var_60, NormalizeDouble(var_bid_44 - (gda_416[var_60][0] - var_52), var_digits_24) > 0.0, 5); var_60 = 1; updateOrders(var_symbol_0, var_60, NormalizeDouble(var_ask_36 - (gda_416[var_60][0] + var_52), var_digits_24) < 0.0, 4); } void updateOrders(string var_0, int var_8, bool var_12, int var_16) { if (gia_388[var_8] > 0) { if (gba_404[var_8][0]) { if (var_12) { if (profitCoverClosePercent > 0) closeLots(gia_396[var_8][0]); else breakEven(gia_396[var_8][0]); } } else { breakEven(gia_396[var_8][0]); if (profitCoverCloseOpposite) if (gia_388[var_16] > 0) closeOrders(var_0, var_16); } } } void queryOrders(string var_0) { int var_cmd_12; int var_16; for (int var_pos_8 = ArraySize(gia_388) - 1; var_pos_8 >= 0; var_pos_8--) gia_388[var_pos_8] = 0; for (var_pos_8 = 0; var_pos_8 < OrdersTotal(); var_pos_8++) { if (OrderSelect(var_pos_8, SELECT_BY_POS)) { if (isSameOrder(var_0, -1)) { var_cmd_12 = OrderType(); if (gia_388[var_cmd_12] == 0) { var_16 = gia_388[var_cmd_12]; gia_392[var_cmd_12][var_16] = var_pos_8; gia_396[var_cmd_12][var_16] = OrderTicket(); gia_400[var_cmd_12][var_16] = OrderType(); if (var_cmd_12 == OP_BUY || var_cmd_12 == OP_SELL) gba_404[var_cmd_12][var_16] = isInitialOrder(); gda_408[var_cmd_12][var_16] = OrderOpenPrice(); gda_412[var_cmd_12][var_16] = OrderStopLoss(); gda_416[var_cmd_12][var_16] = OrderTakeProfit(); gia_388[var_cmd_12]++; } } } } } int findOrder(string var_0, int var_8, double var_12, int var_20, bool var_24 = TRUE) { for (int var_pos_28 = OrdersTotal() - 1; var_pos_28 >= 0; var_pos_28--) { if (OrderSelect(var_pos_28, SELECT_BY_POS)) if (isSameOrderExt(var_0, var_8, var_12, var_20)) return (OrderTicket()); } if (!var_24) return (0); for (var_pos_28 = OrdersHistoryTotal() - 1; var_pos_28 >= 0; var_pos_28--) { if (OrderSelect(var_pos_28, SELECT_BY_POS, MODE_HISTORY)) if (isSameOrderExt(var_0, var_8, var_12, var_20)) return (OrderTicket()); } return (0); } bool isSameOrder(string var_symbol_0, int var_8) { int var_cmd_16; int var_cmd_20; if (OrderMagicNumber() != magic) return (FALSE); switch (var_8) { case -1: break; case 0: case 2: case 4: var_cmd_16 = OrderType(); if (var_cmd_16 != OP_BUY) { if (var_cmd_16 != OP_BUYLIMIT) if (var_cmd_16 != OP_BUYSTOP) return (FALSE); } break; case 1: case 3: case 5: var_cmd_20 = OrderType(); if (var_cmd_20 != OP_SELL) { if (var_cmd_20 != OP_SELLLIMIT) if (var_cmd_20 != OP_SELLSTOP) return (FALSE); } break; } if (OrderSymbol() != var_symbol_0) return (FALSE); return (TRUE); } bool isSameOrderExt(string var_0, int var_8, double var_12, int var_20) { if (!isSameOrder(var_0, var_8)) return (FALSE); if (NormalizeDouble(OrderOpenPrice() - var_12, 6) != 0.0) return (FALSE); if (OrderOpenTime() < var_20) return (FALSE); return (TRUE); } int isInitialOrder() { if (var_comment_220 != OrderComment()) return (0); return (!isBreakEven()); } string getCmdStr(int var_0) { switch (var_0) { case 0: return ("BUY "); case 2: return ("BUY LIMIT "); case 4: return ("BUY STOP "); case 1: return ("SELL "); case 3: return ("SELL LIMIT "); case 5: return ("SELL STOP "); } return ("??"); } int init() { var_288 = FALSE; start(); return (0); } int deinit() { return (0); } void initMode() { if (closeAll) { closeAll = MessageBox("Do you want to close all of the BuyForexSignals orders?", "Order close...", MB_YESNO) == IDYES; if (closeAll) { var_364 = "Closing all orders mode activated!\nReset \'closeAll\' parameter to open new / monitor existing orders."; var_320 = TRUE; var_bool_240 = FALSE; } } if (!closeAll) { var_bool_240 = MessageBox("Do you want to (re)open the specified orders?", "Order start...", MB_YESNO) == IDYES; if (var_bool_240) var_364 = "Opening new orders..."; else var_364 = "Monitoring..."; var_320 = TRUE; } } int start() { if (initVars()) initMode(); if (closeAll) closeOrders(NULL); else { closeOrdersTime(); if (var_bool_240) { var_bool_240 = startOrdersWithRetry(); if (!var_bool_240) { var_364 = "All orders have been placed successfully!\nMonitoring..."; var_320 = TRUE; } } checkOrders(eurusdSymbol, lots, var_292, var_296); checkOrders(usdchfSymbol, lots, var_308, var_312); checkOrders(gbpusdSymbol, lots, var_300, var_304); } bool var_0 = FALSE; if (var_320) { var_320 = FALSE; var_str_concat_324 = StringConcatenate(var_str_concat_340, "\n-------\n", var_str_concat_356, "\n-------\n", var_364, var_372, var_380); if (var_332 != var_str_concat_324) { var_332 = StringSubstr(var_str_concat_324, 0); var_0 = TRUE; } } if (var_0) Comment(var_332); return (0); }
    Modifié le 2013-11-11 09:40:05 par AliX
  • chris8469 — en réponse à chris8469 dans son message #85756

    si plus simple place stop buy a x pips ou stop sell a louverture de la bougie qui ouvre a l'heure donnée merci
  • forexensemble — en réponse à chris8469 dans son message #85756

    chris8469, le 11/11/2013 dit :
    Bonjour a tous j'ai un EA qui est semi automatique et j'aimerai y ajouter un fonction de maniére qu'il soit totalement automatique

    En soi, ce que tu demandes est simple à réaliser.

    Ce qui me chagrine, c'est que tu demandes d'intervenir sur un code source décompilé, ce qui pourrait laisser penser que tu veux faire modifier un code source piraté.

    Tu comprendras certainement que cela puisse poser quelques problèmes...

    Si tu disposes du code original, je t'aide très volontiers.