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