#include <stdlib.mqh>
extern int Length = 10;
extern int ATRperiod = 5;
extern double Kv = 2.5;
int gia_96[];
int init() {
if (Bars <= 500) {
Comment("Not enough bars");
Print("Not enough bars");
return (-1);
}
/*
if (Order_Ticket == 0 || OrderSelect(Order_Ticket, SELECT_BY_TICKET, MODE_TRADES) == FALSE) {
Comment("Invalid Order Ticket");
Print("Invalid Order Ticket");
return (-1);
}
*/
ArrayResize(gia_96, 5);
gia_96[0] = 128;
gia_96[1] = 129;
gia_96[2] = 135;
gia_96[3] = 138;
gia_96[4] = 146;
return (0);
}
int deinit() {
Comment("");
return (0);
}
int start() {
int Order_Ticket;
double ld_0;
double lda_8[90];
double lda_12[90];
int lia_16[90];
bool l_bool_20;
int l_error_24;
string ls_unused_28;
if (Bars <= 500 /* || Order_Ticket == 0 || OrderSelect(Order_Ticket, SELECT_BY_TICKET, MODE_TRADES) == FALSE */) return (-1);
for (int li_36 = 90; li_36 >= 0; li_36--) {
lda_8[li_36] = High[li_36] - Kv * iATR(NULL, 0, ATRperiod, li_36);
lda_12[li_36] = Low[li_36] + Kv * iATR(NULL, 0, ATRperiod, li_36);
for (int li_40 = Length - 1; li_40 >= 0; li_40--) {
lda_8[li_36] = MathMax(lda_8[li_36], High[li_36 + li_40] - Kv * iATR(NULL, 0, ATRperiod, li_36 + li_40));
lda_12[li_36] = MathMin(lda_12[li_36], Low[li_36 + li_40] + Kv * iATR(NULL, 0, ATRperiod, li_36 + li_40));
}
lia_16[li_36] = lia_16[li_36 + 1];
if (Close[li_36] > lda_12[li_36 + 1]) lia_16[li_36] = 1;
if (Close[li_36] < lda_8[li_36 + 1]) lia_16[li_36] = -1;
if (lia_16[li_36] > 0) {
if (lda_8[li_36] < lda_8[li_36 + 1]) lda_8[li_36] = lda_8[li_36 + 1];
ld_0 = lda_8[li_36];
} else {
if (lia_16[li_36] < 0) {
if (lda_12[li_36] > lda_12[li_36 + 1]) lda_12[li_36] = lda_12[li_36 + 1];
ld_0 = lda_12[li_36];
}
}
}
Comment("SL:" + NormalizeDouble(ld_0, Digits));
for(int OrderCnt=OrdersTotal();OrderCnt>0;OrderCnt--){
if (OrderSelect(OrderCnt-1, SELECT_BY_POS, MODE_TRADES) == TRUE) {
Order_Ticket=OrderTicket();
if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP || OrderSymbol()!=Symbol()) continue;
if (ld_0 > 0.0 && NormalizeDouble(OrderStopLoss(), Digits) != NormalizeDouble(ld_0, Digits)) {
Print(WindowExpertName(), ":: modifying order #", DoubleToStr(OrderTicket(), 0), " SL:", OrderStopLoss(), " =-> ", NormalizeDouble(ld_0, Digits), ")");
if (IsTradeAllowed()) {
while (true) {
l_bool_20 = OrderModify(Order_Ticket, OrderOpenPrice(), NormalizeDouble(ld_0, Digits), OrderTakeProfit(), 0);
if (l_bool_20 != TRUE) {
l_error_24 = GetLastError();
Print(WindowExpertName(), ":: Error modifying order #", DoubleToStr(OrderTicket(), 0), " : ", ErrorDescription(l_error_24));
} else l_error_24 = 0;
if (!(_ignoreError(l_error_24))) break;
RefreshRates();
}
}
}
} else {
l_error_24 = GetLastError();
Comment(ErrorDescription(l_error_24));
return (-1);
}
}
return (0);
}
bool _ignoreError(int ai_0) {
bool li_ret_4 = FALSE;
int l_arr_size_8 = ArraySize(gia_96);
for (int l_index_12 = 0; l_index_12 < l_arr_size_8; l_index_12++) {
if (gia_96[l_index_12] == ai_0) {
li_ret_4 = TRUE;
break;
}
}
return (li_ret_4);
}