Author: Copyright 2015, MetaQuotes Software Corp.
Orders Execution
It automatically opens orders when conditions are reached
Miscellaneous
It opens Message Boxes to the user
0 Views
0 Downloads
0 Favorites
lastprice
//+------------------------------------------------------------------+
//|                                                    LastPrice.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "2.00"
input long Interval=400;                                       // Ìèí. îòêëîíåíèå öåíû ñäåëêè
input long minVolume=1;                                        // Ìèí. îáúåì ñäåëêè
input long maxVolume=900000;                                   // Ìàêñ. îáúåì ñäåëêè
input long Spread= 200;                                        // Ìàêñ. ñïðåä
input long Lots=1;                                             // Ëîò
input long SlPips=400;                                         // Stop Loss
input ENUM_ORDER_TYPE_FILLING Filling=ORDER_FILLING_RETURN;    // Ðåæèì çàïîëíåíèÿ îðäåðà
double tradePrice= 0;
double LastPrice = 0;
double interval;
double pips;
#include <trade/trade.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   interval=PointsToPrice(Interval); //Èç ïóíêòîâ â öåíó ñèìâîëa
   pips=PointsToPrice(SlPips);
   if(!MarketBookAdd(_Symbol))
     {
      MessageBox("Íå äîáàâëåí ñòàêàí ïî ñèìâîëó "+_Symbol);
      return( INIT_FAILED );
     }
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Expert Points to price function                                  |
//+------------------------------------------------------------------+
double PointsToPrice(const long a_points)
  {
   double step_price=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   double a_price=(double(a_points)*_Point)/step_price;

   if(a_points<0)
     {
      a_price=MathFloor(a_price)*step_price;
     }
   else
     {
      a_price=MathCeil(a_price)*step_price;
     }

   return( NormalizeDouble( a_price, _Digits ) );
  }
//+------------------------------------------------------------------+
//| Get Stakan values function                                       |
//+------------------------------------------------------------------+ 
bool GetStakanValues(const string aSymbol,double &ask,double &bid)
  {
   MqlBookInfo book_price[];
   bid = 0;
   ask = DBL_MAX;

//--- Get stakan
   if(MarketBookGet(aSymbol,book_price))
     {
      int size=ArraySize(book_price);
      //---    
      if(size>0)
        {
         for(int i=0; i<size; i++)
           {
            if(book_price[i].type==BOOK_TYPE_SELL)
              {
               if(book_price[i].price<ask)
                 {
                  ask=book_price[i].price;
                 }
              }
            else
            if(book_price[i].type==BOOK_TYPE_BUY)
              {
               bid=book_price[i].price;
               return( true );
              }
           }
        }
     }
//---
   if(ask==DBL_MAX) ask=0;
   return( false);
  }
//+------------------------------------------------------------------+
//| Set order function                                               |
//+------------------------------------------------------------------+  
bool SetOrder(const double price,const bool buy_sell,ulong  &ticket)
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};

//--- Fill structure
   request.action=TRADE_ACTION_PENDING;        // setting a pending order
   request.magic = 68975;                      // ORDER_MAGIC
   request.symbol = _Symbol;                   // symbol
   request.volume = double( Lots );
//---   
   if(buy_sell)
     {
      request.type=ORDER_TYPE_BUY_LIMIT;       // order type
      request.sl=price-pips;
     }
   else
     {
      request.type=ORDER_TYPE_SELL_LIMIT;
      request.sl=price+pips;
     }
   request.price=price;                        // open price
   request.type_filling=Filling;
   request.deviation=0;
   request.type_time=ORDER_TIME_DAY;
//---
   if(OrderSend(request,result))
     {
      if(( result.retcode==TRADE_RETCODE_PLACED) && (result.order>0))
        {
         ticket=result.order;
         return( true );
        }
     }
   else
     {
      Print(" Order not set!");
     }
   return( false );
  }
//+------------------------------------------------------------------+
//| Expert Check trading time function                               |
//+------------------------------------------------------------------+
bool CheckTradingTime()
  {
   MqlDateTime local_time;
   TimeLocal(local_time);
   MqlDateTime tick_time;
   TimeTradeServer(tick_time);
//---  
   if(( tick_time.day_of_week==0) || (tick_time.day_of_week==6))
     {
      return( false );
     }
//---
   if(( tick_time.hour>=0) && (tick_time.hour<10))
     {
      return( false );
     }
//---
   uint trade_time=tick_time.hour*3600+tick_time.min*60+tick_time.sec;
//---
   if(((trade_time>=(10*3600+10+5*60+30)) && (trade_time<(13*3600+54*60+30))) || 
      ( ( trade_time >= ( 14 * 3600 + 8 * 60 + 30 ) ) && ( trade_time < ( 15 * 3600 + 44 * 60 + 30 ) ) ) ||
      ( ( trade_time >= ( 16 * 3600 + 5 * 60 + 30 ) ) && ( trade_time < ( 18 * 3600 + 39 * 60 + 30 ) ) ) ||
      ( ( trade_time >= ( 19 * 3600 + 15 * 60 + 10 ) ) && ( trade_time < ( 23 * 3600 + 44 * 60  + 30 ) ) ) )
     {
      return( true );
     }
   return( false );
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol==_Symbol)
     {
      double ask,bid,last,price=0;
      ulong ticket;
      long lastvol;
      //---            
      if(GetStakanValues(_Symbol,ask,bid)) //Áåðåì çäåñü, ïîòîìó ÷òî íóæíî êàê è äëÿ îòêðûòèÿ ïîçèöèè, òàê è äëÿ çàêðûòèÿ
        {
         last=SymbolInfoDouble(_Symbol,SYMBOL_LAST);
         lastvol=SymbolInfoInteger(_Symbol,SYMBOL_VOLUME);
         //---      
         if(PositionSelect(_Symbol))
           {
            if(ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE))==POSITION_TYPE_BUY)///BUY
              {
               if((!CheckTradingTime()) || (((LastPrice<=bid || LastPrice<=ask) && (tradePrice<=bid)) || (tradePrice<bid)))
                 {
                  //--- Ïðîâåðêà çàêðûòèÿ, åñëè äà òî
                  int i=PositionsTotal();//Wait openedPosition 
                  if(SetOrder(bid,false,ticket))
                    {
                     tradePrice=bid;
                     while(i==PositionsTotal())//Wait openedPosition
                       {
                        GetStakanValues(_Symbol,ask,bid);//Close freezy order
                        if(bid!=tradePrice && OrderSelect(ticket))
                          {
                           CTrade trade;
                           trade.SetTypeFilling(Filling);
                           if(trade.OrderDelete(ticket)) break;
                          }
                       }
                    }
                 }
              }
            else///SELL
              {
               if((!CheckTradingTime()) || (((LastPrice>=ask || LastPrice>=bid) && (tradePrice>=ask)) || (tradePrice>ask)))
                 {
                  //--- Ïðîâåðêà çàêðûòèÿ, åñëè äà òî
                  int i=PositionsTotal();//Wait openedPosition 
                  if(SetOrder(ask,true,ticket))
                    {
                     tradePrice=ask;
                     while(i==PositionsTotal())//Wait openedPosition
                       {
                        GetStakanValues(_Symbol,ask,bid);//Close freezy order
                        if(ask!=tradePrice && OrderSelect(ticket))
                          {
                           CTrade trade;
                           trade.SetTypeFilling(Filling);
                           if(trade.OrderDelete(ticket)) break;
                          }
                       }
                    }
                 }
              }
           }
         else //No Position:
         if(CheckTradingTime() && (lastvol>=minVolume && lastvol<=maxVolume) && Spread>=(ask-bid))
           {
            //--- Äåëàåì ïðîâåðêè, êàêîé îðäåð óñòàíîâèòü (BUY or SELL), è áåðåì öåíó
            if(last>=ask+interval)///BUY
              {
               //--- Óñòàíàâëèâàåì îðäåð 
               int i=PositionsTotal();//Wait openedPosition 
               if(SetOrder(ask,true,ticket)) // true îðäåð íà ïîêóïêó; false - îðäåð íà ïðîäàæó
                 {
                  //--- Îðäåð óñòàíîâëåí
                  tradePrice=ask;
                  while(i==PositionsTotal())//Wait openedPosition
                    {
                     GetStakanValues(_Symbol,ask,bid);//Close freezy order
                     if(ask!=tradePrice && OrderSelect(ticket))
                       {
                        CTrade trade;
                        trade.SetTypeFilling(Filling);
                        if(trade.OrderDelete(ticket)) break;
                       }
                    }
                  LastPrice=last;
                 }
              }
            //--- Äåëàåì ïðîâåðêè, êàêîé îðäåð óñòàíîâèòü (BUY or SELL), è áåðåì öåíó
            if(last<=bid-interval)///SELL
              {//--- Óñòàíàâëèâàåì îðäåð 
               int i=PositionsTotal();//Wait openedPosition 
               if(SetOrder(bid,false,ticket)) // true îðäåð íà ïîêóïêó; false - îðäåð íà ïðîäàæó
                 {
                  //--- Îðäåð óñòàíîâëåí
                  tradePrice=bid;
                  while(i==PositionsTotal())//Wait openedPosition
                    {
                     GetStakanValues(_Symbol,ask,bid);//Close freezy order
                     if(bid!=tradePrice && OrderSelect(ticket))
                       {
                        CTrade trade;
                        trade.SetTypeFilling(Filling);
                        if(trade.OrderDelete(ticket)) break;
                       }
                    }
                  LastPrice=last;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---