//+------------------------------------------------------------------+ //| SMC Autotrader Momentum.mq4 | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ extern double TakeProfit = 50; extern double Lots = 0.1; extern double InitialStop = 30; extern double TrailingStop = 20; datetime BarTime; //##################################################################### int init() { //---- //---- return(0); } //##################################################################### int start() { int cnt,total,ticket,MinDist,tmp; double Spread; double ATR; double StopMA; double SetupHigh, SetupLow; //############################################################################ if(Bars<100){ Print("bars less than 100"); return(0); } //exit if not new bar if(BarTime == Time[0]) {return(0);} //new bar, update bartime BarTime = Time[0]; //######################################################################################### //~~~~~~~~~~~~~~~~Miscellaneous setup stuff~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MinDist=MarketInfo(Symbol(),MODE_STOPLEVEL); Spread=(Ask-Bid); //######################################################################################### // use an indicator for data values //######################################################################################## //################## ORDER CLOSURE ################################################### // If Orders are in force then check for closure against Technicals LONG & SHORT //CLOSE LONG Entries total=OrdersTotal(); if(total>0) { for(cnt=0;cnt Close[10]) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close SHORT position }} } // for loop return } // close 1st if //############################################################################## //################## ORDER TRAILING STOP Adjustment ####################### //TRAILING STOP: LONG if(0==1) //This is used to turn the trailing stop on & off { total=OrdersTotal(); if(total>0) { for(cnt=0;cnt (Point*TrailingStop) && OrderStopLoss()0) { for(cnt=0;cnt (Point*TrailingStop) && OrderStopLoss() > Ask+(Point*TrailingStop) ) {OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(Point*TrailingStop),OrderTakeProfit(),0,Yellow); return(0);} }} } // end bracket for on/off switch //########################################################################################## //~~~~~~~~~~~ END OF ORDER Closure routines & Stoploss changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~ //########################################################################################## //~~~~~~~~~~~~START of NEW ORDERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //######################### NEW POSITIONS ? ###################################### //Possibly add in timer to stop multiple entries within Period // Check Margin available // ONLY ONE ORDER per SYMBOL // Loop around orders to check symbol doesn't appear more than once // Check for elapsed time from last entry to stop multiple entries on same bar if (0==1) // switch to turn ON/OFF history check { total=HistoryTotal(); if(total>0) { for(cnt=0;cnt0) { for(cnt=0;cnt0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //ENTRY RULES: SHORT //################################ if(Close[1] < Close[20]) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"MaxMin Short",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } //#################################################################################### //############ End of PROGRAM ######################### return(0); }