Expert Advisor will not open buy trades and doesn't follow the conditions

Expert Advisor will not open buy trades and doesn't follow the conditions

Manage alerts

Loading saved threads...

Razvan Cercel · External communityPost link
External question — Stack Overflow Stack Exchange Author: Razvan Cercel Original post: https://stackoverflow.com/questions/67370249 License: CC BY-SA 4.0 — https://creativecommons.org/licenses/by-sa/4.0/ Adaptation: HTML converted to plain text; contact email addresses removed. The EA has no bugs but it doesn't really do what I expected it to do, it should, for example, sell from var_30[i], put a tp at var_2[i] and sl at var_30[i]+(var_30[i]-var_2[i])/2 or buy from var_20[i], put a tp at var_3[i] and sl at var_20[i]+(var_20[i]-var_3[i])/2 I tried to modify it several times but in the end, after using the strategy tester feature the graph always goes to 0, which shouldn't. Here is the code: #property description "Price Border strategy expert advisor by Razvan" //--- Inputs extern double Lots =1; extern double MaximumRisk =2; extern string TimeFrame = "All tf"; extern int HalfLength = 61; extern int Price = 0; extern double ATRMultiplier = 1.6; extern double ATRMultiplier1 = 3.6; extern int ATRPeriod = 480; extern bool Interpolate = TRUE; extern bool alertsOn = TRUE; extern bool alertsOnCurrent = FALSE; extern bool alertsOnHighLow = TRUE; extern bool alertsMessage = FALSE; extern bool alertsSound = TRUE; extern bool alertsEmail = FALSE; double var_1[]; double var_2[]; double var_3[]; double var_4[]; double var_20[]; double var_30[]; string string_1; bool bool_1; bool bool_2; int var_5; string string_2 = "nothing"; datetime Gt_176; string string_3[] = {"M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1", "MN"}; int var_6[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200}; int res; // init function int init() { string str_4[256]; for (int i = 0; i < 256; i++) str_4[i] = CharToStr(i); int var_7 = StrToInteger(str_4[67] + str_4[111] + str_4[112] + str_4[121] + str_4[32] + str_4[82]+ str_4[105] + str_4[103] + str_4[104] + str_4[116] + str_4[32] + str_4[169] + str_4[32] + str_4[75] + str_4[97] + str_4[122] + str_4[97] + str_4[111] + str_4[111] + str_4[32] + str_4[50] + str_4[48] + str_4[49] + str_4[49] + str_4[32]); IndicatorBuffers(4); HalfLength = MathMax(HalfLength, 1); SetIndexBuffer(0, var_1); SetIndexDrawBegin(0, HalfLength); SetIndexBuffer(1, var_2); SetIndexDrawBegin(1, HalfLength); SetIndexBuffer(2, var_3); SetIndexDrawBegin(2, HalfLength); SetIndexBuffer(3, var_4); string_1 = WindowExpertName(); bool_2 = TimeFrame == "returnBars"; if (bool_2) return (0); bool_1 = TimeFrame == "calculateValue"; if (bool_1) return (0); var_5 = func_3(TimeFrame); IndicatorShortName(func_0(var_5) + " TMA bands )" + HalfLength + ")"); return (0); } // deinit function int deinit() { return (0); } // start function int start() { int var_7; double double_1; double double_2; double double_3; double double_31; int var_8; int var_9; int var_10 = IndicatorCounted(); if (var_10 < 0) return (-1); if (var_10 > 0) var_10--; int var_11 = MathMin(Bars - 1, Bars - var_10 + HalfLength); if (bool_2) { var_1[0] = var_11 + 1; return (0); } if (bool_1 || var_5 == Period()) { for (int i = var_11; i >= 0; i--) { double_1 = (HalfLength + 1) * iMA(NULL, 0, 1, 0, MODE_SMA, Price, i); double_2 = HalfLength + 1; var_7 = 1; for (int var_12 = HalfLength; var_7 <= HalfLength; var_12--) { double_1 += var_12 * iMA(NULL, 0, 1, 0, MODE_SMA, Price, i + var_7); double_2 += var_12; if (var_7 <= i) { double_1 += var_12 * iMA(NULL, 0, 1, 0, MODE_SMA, Price, i - var_7); double_2 += var_12; } var_7++; } double_3 = iATR(NULL, 0, ATRPeriod, i + 10) * ATRMultiplier; double_31 = iATR(NULL, 0, ATRPeriod, i + 10) * ATRMultiplier1; var_1[i] = double_1 / double_2; var_2[i] = var_1[i] + double_3; var_20[i] = var_1[i] + double_31; var_30[i] = var_1[i] - double_31; var_3[i] = var_1[i] - double_3; var_4[i] = 0; if (alertsOnHighLow) { if (High[i] > var_2[i]) var_4[i] = 1; if (Low[i] < var_3[i]) var_4[i] = -1; } else { if (Close[i] > var_2[i]) var_4[i] = 1; if (Close[i] < var_3[i]) var_4[i] = -1; } } if (!(!bool_1)) return (0); func_1(); return (0); } var_11 = MathMax(var_11, MathMin(Bars - 1, iCustom(NULL, var_5, string_1, "returnBars", 0, 0) * var_5 / Period())); for (i = var_11; i >= 0; i--) { var_8 = iBarShift(NULL, var_5, Time[i]); var_1[i] = iCustom(NULL, var_5, string_1, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 0, var_8); var_2[i] = iCustom(NULL, var_5, string_1, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 1, var_8); var_3[i] = iCustom(NULL, var_5, string_1, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 2, var_8); var_4[i] = iCustom(NULL, var_5, string_1, "calculateTma", HalfLength, Price, ATRMultiplier, ATRPeriod, 3, var_8); if (var_5 <= Period() || var_8 == iBarShift(NULL, var_5, Time[i - 1])) continue; if (Interpolate) { var_9 = iTime(NULL, var_5, var_8); for (int var_14 = 1; i + var_14 < Bars && Time[i + var_14] >= var_9; var_14++) { } for (var_14 = 1; var_12 < var_14; var_12++) { var_1[i + var_12] = var_1[i] + (var_1[i + var_14] - var_1[i]) * var_12 / var_14; var_2[i + var_12] = var_2[i] + (var_2[i + var_14] - var_2[i]) * var_12 / var_14; var_3[i + var_12] = var_3[i] + (var_3[i + var_14] - var_3[i]) * var_12 / var_14; } } } func_1(); return (0); } // function1 void func_1() { int var_10; if (alertsOn) { if (alertsOnCurrent) var_10 = 0; else var_10 = 1; var_10 = iBarShift(NULL, 0, iTime(NULL, var_5, var_10)); if (var_4[var_10] != var_4[var_10 + 1]) { if (var_4[var_10] == 1.0) func_4(var_10, "up"); if (var_4[var_10] == -1.0) func_4(var_10, "down"); } } } // function4 void func_4(int var_12, string str_5) { string str_6; if (string_2 != str_5 || Gt_176 != Time[var_12]) { string_2 = str_5; Gt_176 = Time[var_12]; str_6 = StringConcatenate(Symbol(), " at ", TimeToStr(TimeLocal(), TIME_SECONDS), " " + func_0(var_5) + " TMA bands price penetrated ", str_5, " band"); if (alertsMessage) Alert(str_6); if (alertsEmail) SendMail(StringConcatenate(Symbol(), "TMA bands "), str_6); if (alertsSound) PlaySound("alert2.wav"); } } // function3 int func_3(string str_7) { str_7 = func_2(str_7); for (int var_7 = ArraySize(var_6) - 1; var_7 >= 0; var_7--) if (str_7 == string_3[var_7] || str_7 == "" + var_6[var_7]) return (MathMax(var_6[var_7], Period())); return (Period()); } // function0 string func_0(int var_12) { for (int i = ArraySize(var_6) - 1; i >= 0; i--) if (var_12 == var_6[i]) return (string_3[i]); return (""); } // function2 string func_2(string str_7) { int var_13; string str_8 = str_7; for (int var_11 = StringLen(str_7) - 1; var_11 >= 0; var_11--) { var_13 = StringGetChar(str_8, var_11); if ((var_13 > '`' && var_13 < '{') || (var_13 > 'ß' && var_13 < 256)) str_8 = StringSetChar(str_8, var_11, var_13 - 32); else if (var_13 > -33 && var_13 < 0) str_8 = StringSetChar(str_8, var_11, var_13 + 224); } return (str_8); } //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //--- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //--- return orders volume if(buys>0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { int var_10 = IndicatorCounted(); int var_11 = MathMin(Bars - 1, Bars - var_10 + HalfLength); for (int i = var_11; i >= 0; i--) {if(High[i] > var_30[i] || Close[i] > var_30[i]) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,30,var_30[i]+(var_30[i]- var_2[i])/2,var_2[i],"",0,Red); //Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen return; } //--- buy conditions else if(Low[i] < var_20[i] || Close[i] < var_20[i]) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,30,var_20[i]+(var_20[i]-var_3[i])/2,var_3[i],"",0,Green); return; }} //--- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { if(Volume[0]>0.1) return; for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()!=Symbol()) continue; //--- check order type if(OrderType()==OP_BUY) { if(High[i] >= var_3[i] || Low[i] <= var_30[i]+(var_30[i]-var_2[i])/2) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,30,White)) Print("OrderClose error ",GetLastError()); } break; } if(OrderType()==OP_SELL) { if(Low[i] <= var_2[i] || High[i] >= var_20[i]+(var_20[i]-var_3[i])/2) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,30,White)) Print("OrderClose error ",GetLastError()); } break; } } //--- } //+------------------------------------------------------------------+ //| OnTick function | //+------------------------------------------------------------------+ void OnTick() { //--- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //--- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //--- } //+------------------------------------------------------------------+
Quote
Report

Post Reply

Checking account access…