Stairs





//+------------------------------------------------------------------+
//|                                                      Stairs.mq4 |
//|                                       Copyright © 2008, Tinytjan |
//|                                                 tinytjan@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Tinytjan"
#property link      "tinytjan@mail.ru"

#include "libraries/trade.mq4"

extern int        Channel           =  1000;

extern int        Profit            =  1500;
extern int        CommonProfit      =  1000;

extern int        AddLots           =  1;

string symbol;
double Lots;
datetime LastTime;

string CloseAll = "StairsCloseAll";
string StartLots = "StartLots";

bool IsStart()
{
   double buyStopPrice = 0;
   double sellStopPrice = 0;

   for(int i = 0; i < OrdersTotal(); i++)
   {
      // already closed
      if(OrderSelect(i, SELECT_BY_POS) == false) continue;
      // not current symbol
      if(OrderSymbol() != Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber() != Magic) continue;
      
      if(OrderType() == OP_SELLSTOP)
      {
         sellStopPrice = OrderOpenPrice();
      }

      if(OrderType() == OP_BUYSTOP)
      {
         buyStopPrice = OrderOpenPrice();
      }
   }
   
   if (buyStopPrice == 0 || sellStopPrice == 0)
   {
      return (false);
   }
   
   double distance = (buyStopPrice - sellStopPrice)/Point;
   return (distance < 1.5*Channel && distance > 0.5*Channel);
}

int GetLastOpenedTicket(int MN)
{
   datetime lastTime = 0;
   int lastTicket = -1;
   
   for(int i = 0; i < OrdersTotal(); i++)
   {
      // already closed
      if(OrderSelect(i, SELECT_BY_POS) == false) continue;
      // not current symbol
      if(OrderSymbol() != Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber() != MN) continue;
      
      if (OrderType() != OP_SELL && OrderType() != OP_BUY) continue;
      
      if (OrderOpenTime() > lastTime)
      {
         lastTime = OrderOpenTime();
         lastTicket = OrderTicket();
      }
   }
   
   return (lastTicket);
}

double GetLastLot(int MN)
{
   int ticket = GetLastOpenedTicket(MN);
   if (OrderSelect(ticket, SELECT_BY_TICKET))
   {
      return (OrderLots());
   }
   
   double lots = TradeLots;
   if (TradeLots == 0)
   {
      lots = GetLotsToBid(RiskPercentage);
   }
   
   return (lots);
}

double GetLastPrice(int MN)
{
   int ticket = GetLastOpenedTicket(MN);
   if (OrderSelect(ticket, SELECT_BY_TICKET))
   {
      return (OrderOpenPrice());
   }
   
   return(0);
}

void Check()
{
   string name = Symbol() + StartLots;

   if (!GlobalVariableCheck(CloseAll))
   {
      GlobalVariableSet(CloseAll, EMPTY_VALUE);
   }
   else
   {
      double value = GlobalVariableGet(CloseAll);
      
      if (value == 1)
      {
         if (GetOrdersCount(Magic) > 0)
         {
            CloseSells(Magic, Slippage);
            CloseBuys(Magic, Slippage);
            DeletePending(Magic);
         }
         RefreshRates();
         
         if (GetOrdersCount(Magic, -1, "all") == 0)
         {
            GlobalVariableSet(CloseAll, EMPTY_VALUE);
         }
         else
         {
            return;
         }
      }
   }
   
   int SL = Channel + MathRound((Ask - Bid)/Point);
   
   if (GetOrdersCount(Magic) == 0)
   {
      double lot = DoubleIf(TradeLots == 0, GetLotsToBid(RiskPercentage), TradeLots);
      
      GlobalVariableSet(name, lot);
      
      int distanse = Channel/2;
      
      OpenBuyStop(Magic, Ask + distanse*Point, 0, SL, lot);
      OpenSellStop(Magic, Ask - distanse*Point, 0, SL, lot);
   }
   
   if (!GetActiveOrders(Magic))
   {
      if (GetOrdersCount(Magic) > 0)
      {
         if (!IsStart())
         {
            // îñòàëèñü îòëîæêè
            // ýòî ñîñòîÿíèå êîíå÷íîå
            // óäàëÿåì 
            DeletePending(Magic);
         }
      }
      return;
   }
   
   if (GetOrdersCount(Magic, OP_BUYSTOP) +  GetOrdersCount(Magic, OP_SELLSTOP) < 2 && GetActiveOrders(Magic))
   {
      // îòëîæêà ñðàáîòàëà, íàäî âûñòàâèòü çàíîâî
      // èëè ïîñòíà÷àëüíîå ñîñòîÿíèå, íàäî ðàññòàâèòü ñåòü.
      
      DeletePending(Magic);

      double lastOpenPrice = GetLastPrice(Magic);
      double lastOpenLots = GetLastLot(Magic);
      double addLot = GlobalVariableGet(name);

      if (AddLots == 1)
      {
         lastOpenLots += addLot;
      }
      
      if (MathAbs(lastOpenPrice - Bid)/Point < Channel/2)
      {
         OpenBuyStop(Magic, lastOpenPrice + Channel*Point, 0, SL, lastOpenLots);
         OpenSellStop(Magic, lastOpenPrice - Channel*Point, 0, SL, lastOpenLots);
      }
   }
   
   double profit = 0;
   
   for(int i = 0; i < OrdersTotal(); i++)
   {
      // already closed
      if (OrderSelect(i, SELECT_BY_POS) == false) continue;
      // not current symbol
      if (OrderSymbol() != symbol) continue;
      // order was opened in another way
      if (OrderMagicNumber() != Magic) continue;
      
      int type = OrderType();
      
      if (type != OP_SELL && type != OP_BUY) continue;
      
      double add = DoubleIf(type == OP_BUY, Bid - OrderOpenPrice(), OrderOpenPrice() - Ask);
      
      profit += add/Point;
   }

   if (profit > Profit)
   {
      CloseSells(Magic, Slippage);
      CloseBuys(Magic, Slippage);
   }

   profit = 0;
   
   for(i = 0; i < OrdersTotal(); i++)
   {
      // already closed
      if (OrderSelect(i, SELECT_BY_POS) == false) continue;
      // order was opened in another way
      if (OrderMagicNumber() != Magic) continue;
      
      type = OrderType();
      
      if (type != OP_SELL && type != OP_BUY) continue;
      
      add = OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK);
      if (type == OP_BUY) add = MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice();
      
      profit += add/MarketInfo(OrderSymbol(), MODE_POINT);
   }

   if (profit > CommonProfit)
   {
      GlobalVariableSet(CloseAll, 1);
   }
}

int init()
{
   Lots = TradeLots;
   symbol = Symbol();
   LastTime = 0;
}

int start()
{
   Check();

   return(0);
}



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders


Other Features: