Steping Stop & Reverse





// Steping Stop & Reverse.mq4
// Ñîâåòíèê
/*Ñîâåòíèê "Øàãàþùèé ñòîï ñ ðàçâîðîòîì" 
ïðèìåð
Îòêðûâàåòñÿ ïîçèöèÿ â ëþáóþ ñòîðîíó (ïåðâàÿ), äàëåå ïîñëå ñðàáàòûâàíèÿ ëîñÿ èä¸ò ïåðåâîðîò. 
(ïîçèöèÿ â ïðîòèâîïîëîæíóþ ñòîðîíó)
Ïîñëå îòêðûòèÿ ïîçèöèè ïðîôèò ñòàâèòñÿ íà 70ï. à ëîñü èä¸ò çà öåíîé â -10ï..
Ìåíÿåòñÿ (ïåðåñòàâëÿåòñÿ) ëîñü òàê æå êàæäûå 10 ï., à íå âñ¸ âðåìÿ.
StepStop áîëüøå èëè ðàâíî, ÷åì ìèíèìàëüíûé óðîâåíü ñòîïîâ ïëþñ ñïðåä. 
Óðîâåíü ñòîïîâ ïîêàçûâàåòñÿ â æóðíàëå "Ýêñïåðòû" ïðè ñòàðòå ñîâåòíèêà.
*/
#property copyright "mandorr@gmail.com"
#include <stdlib.mqh>

extern int TakeProfit=70;
extern int StepStop=10;
extern double Lots=0.1;
extern bool MoneyManagement=false;
extern int MarginPercent=20;

int level_sell_stop;
int level_buy_stop;


void init()
   {
   int minstop=MarketInfo(Symbol(),MODE_STOPLEVEL);
   Print("Óðîâåíü ñòîïîâ: "+minstop);
   }

void start()
   {
   if (!IsTradeAllowed()) return;
   level_buy_stop=0;
   level_sell_stop=0;
   StepingStop();
   StepingPendings();
   if (TotalBuy ()==0 && TotalBuyStop ()==0) SetBuyStop ();
   if (TotalSell()==0 && TotalSellStop()==0) SetSellStop();
   Comment("Level Buy Stop=",level_buy_stop*Point,"\n","Level Sell Stop=",level_sell_stop*Point);
   }

void StepingStop()
   {
   if (StepStop<1) return;
   int ask, bid, open, stop, x;
   double loss;
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_BUY)
         {
         bid=MathRound(Bid/Point);
         open=MathRound(OrderOpenPrice()/Point);
         stop=MathRound(OrderStopLoss()/Point);
         x=(bid-open)/StepStop; x--; x*=StepStop;
         level_sell_stop=open+x;
         if (stop>=open+x) continue;
         loss=(open+x)*Point;
         OrderModify(OrderTicket(),OrderOpenPrice(),loss,OrderTakeProfit(),0,CLR_NONE);
         }
      if (OrderType()==OP_SELL)
         {
         ask=MathRound(Ask/Point);
         open=MathRound(OrderOpenPrice()/Point);
         stop=MathRound(OrderStopLoss()/Point);
         x=(open-ask)/StepStop; x--; x*=StepStop;
         level_buy_stop=open-x;
         if (stop>0 && stop<=open-x) continue;
         loss=(open-x)*Point;
         OrderModify(OrderTicket(),OrderOpenPrice(),loss,OrderTakeProfit(),0,CLR_NONE);
         }
      }
   }

void StepingPendings()
   {
   int ask, bid, open;
   double price, loss, profit;
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_BUYSTOP)
         {
         if (level_buy_stop==0) continue;
         open=MathRound(OrderOpenPrice()/Point);
         if (open<=level_buy_stop) continue;
         price=level_buy_stop*Point;
         loss=price-StepStop*Point;
         profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point;
         OrderModify(OrderTicket(),price,loss,profit,0,CLR_NONE);
         }
      if (OrderType()==OP_SELLSTOP)
         {
         if (level_sell_stop==0) continue;
         open=MathRound(OrderOpenPrice()/Point);
         if (open>=level_sell_stop) continue;
         price=level_sell_stop*Point;
         loss=price+StepStop*Point;
         profit=0; if (TakeProfit>0) profit=price-TakeProfit*Point;
         OrderModify(OrderTicket(),price,loss,profit,0,CLR_NONE);
         }
      }
   }

void SetBuyStop()
   {
   double lots=LotsCounting();
   double price=Bid+StepStop*Point;
   double loss=price-StepStop*Point;
   double profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point;
   int ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,price,0,loss,profit,"",0,0,CLR_NONE);
   if (ticket<1) Print("Set a pending order failed with error #",GetLastError()," ",ErrorDescription(GetLastError()));
   }

void SetSellStop()
   {
   double lots=LotsCounting();
   double price=Ask-StepStop*Point;
   double loss=price+StepStop*Point;
   double profit=0; if (TakeProfit>0) profit=price-TakeProfit*Point;
   int ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,price,0,loss,profit,"",0,0,CLR_NONE);
   if (ticket<1) Print("Set a pending order failed with error #",GetLastError()," ",ErrorDescription(GetLastError()));
   }

int TotalBuy()
   {
   int count=0;
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_BUY) count++;
      }
   return (count);
   }

int TotalBuyStop()
   {
   int count=0;
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_BUYSTOP) count++;
      }
   return (count);
   }

int TotalSell()
   {
   int count=0;
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_SELL) count++;
      }
   return (count);
   }

int TotalSellStop()
   {
   int count=0;
   for (int i=0; i<OrdersTotal(); i++)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_SELLSTOP) count++;
      }
   return (count);
   }

double LotsCounting()
   {
   double lots=Lots;
   if (MoneyManagement)
      {
      double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE);
      double freemargin=AccountFreeMargin();
      lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),1);
      }
   if (lots>10) lots=NormalizeDouble(lots,0);
   if (lots<0.1) lots=0.1;
   return (lots);
   }


// End



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached

Other Features:

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for Steping Stop & Reverse


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: