//+-------------------------------------------------------------------+ //| TurtleTrading2.mq4 | //| Copyright © 2009, My Millionaire Goal | //| | //+-------------------------------------------------------------------+ #property copyright "Copyright © 2009, My Millionaire Goal" #property link "http://www.mymillionairegoal.com" //---- input parameters extern int enterCount = 55; extern int exitCount = 20; extern int riskPercent = 2; extern int NMultiple = 2; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ datetime Time0 = 0; int start() { //---- static double highToBreak; static double lowToBreak; static double buyExitPrice; static double sellExitPrice; static double prevN, N; static double lots; int ticket, cnt; if (Time0 != Time[0]) //Calculate N at the start of each day { if (OrdersTotal() == 0) { //N = calculateN(prevN); //prevN = N; N = NMultiple*0.5*iATR(NULL, 0, 20, 1); highToBreak = High[iHighest(NULL, 0, MODE_HIGH, enterCount, 1)]; lowToBreak = Low[iLowest(NULL, 0, MODE_LOW, enterCount, 1)]; lots = NormalizeDouble((0.005*riskPercent*AccountFreeMargin()*Point)/N, 2); } } Time0 = Time[0]; buyExitPrice = Low[iLowest(NULL, 0, MODE_LOW, exitCount, 1)]; sellExitPrice = High[iHighest(NULL, 0, MODE_HIGH, exitCount, 1)]; // if (useEA) // { cnt = OrdersTotal(); if (cnt > 0) { OrderSelect(0, SELECT_BY_POS, MODE_TRADES); if ((OrderType() == OP_BUY && Bid < buyExitPrice) || (OrderType() == OP_SELL && Ask > sellExitPrice)) { CloseAllTrades(); highToBreak = 10000; lowToBreak = -1; } } if (Ask > highToBreak && iMA(NULL, 0, 50, 0, MODE_SMA, PRICE_CLOSE, 0) > iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0)) { if (cnt == 0) ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask - 2*N, 0, "First", 1729, 0, Green); else if (cnt < 4 && Ask > highToBreak + 0.5*N*cnt) { ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, highToBreak + 0.5*N*cnt - 2*N, 0, "Pyramid", 1729, 0, Green); if (ticket < 0) { Print("ERROR: Buy/Pyramid Order Failed with error # ", GetLastError(), ", n= ", cnt); //useEA = false; return(0); }else { ModifyAllTrades(1729, highToBreak + 0.5*N*cnt - 2*N); } } } if (Bid < lowToBreak && iMA(NULL, 0, 50, 0, MODE_SMA, PRICE_CLOSE, 0) < iMA(NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0)) { if (cnt == 0) ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + 2*N, 0, "First", 1729, 0, Red); else if (cnt < 4 && Bid < lowToBreak - 0.5*N*cnt) { ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, lowToBreak - 0.5*N*cnt + 2*N, 0, "Pyramid", 1729, 0, Red); if (ticket < 0) { Print("ERROR: Sell/Pyramid Order Failed with error # ", GetLastError(), ", n= ", cnt); //useEA = false; return(0); }else { ModifyAllTrades(1729, lowToBreak - 0.5*N*cnt + 2*N); } } } // } //---- return(0); } //+------------------------------------------------------------------+ bool ModifyAllTrades(int MagicNumber, double StopPrice) { int cnt; cnt = OrdersTotal() - 1; while (cnt > 0) { OrderSelect(cnt-1, SELECT_BY_POS, MODE_TRADES); if (OrderMagicNumber() == MagicNumber) { if (!OrderModify(OrderTicket(), OrderOpenPrice(), StopPrice, 0, 0, Blue)) { Print("Total = ", OrdersTotal(), ". Order # ", cnt, " failed to modify. Error Code: ", GetLastError(), " Order Comment ", OrderComment()); return (false); } } cnt--; } return (true); } double calculateN(double prevN) { if (prevN == 0) { int cnt; double N, range, sum; for (cnt = 1; cnt < 21; cnt++) { range = MathMax(High[cnt]-Low[cnt], MathMax(High[cnt] - Close[cnt + 1], Close[cnt + 1] - Low[cnt])); sum = sum + range; } prevN = NormalizeDouble(sum/20, 4); } range = MathMax(High[1]-Low[1], MathMax(High[1] - Close[2], Close[2] - Low[1])); N = NormalizeDouble((19*prevN + range)/20, 4); return (N); } void CloseAllTrades() { int cnt; cnt = OrdersTotal(); while (cnt > 0) { OrderSelect(cnt-1, SELECT_BY_POS, MODE_TRADES); if (OrderType() == OP_BUY) { OrderClose(OrderTicket(), OrderLots(), Bid, 3, Blue); }else if (OrderType() == OP_SELL) { OrderClose(OrderTicket(), OrderLots(), Ask, 3, Yellow); } cnt--; } Print("All orders closed"); }