Author: Copyright © 2006, народное :-)
Price Data Components
Series array that contains close prices for each barSeries array that contains open prices of each bar
Orders Execution
Checks for the total of open orders
10 Views
0 Downloads
0 Favorites
Autotrade
ÿþ//+------------------------------------------------------------------+

//|                           Autotrade(barabashkakvn's edition).mq5 |

//|                      Copyright © 2006, MetaQuotes Software Corp. |

//|                                        http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2006, =0@>4=>5 :-)"

#property link      "scrivimi@mail.ru"

#property version   "1.001"

#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\SymbolInfo.mqh>  

#include <Trade\OrderInfo.mqh>

CPositionInfo  m_position;                   // trade position object

CTrade         m_trade;                      // trading object

CSymbolInfo    m_symbol;                     // symbol info object

COrderInfo     m_order;                      // pending orders object

input ushort   InpIndent              = 12;  // >BABC? 4;O 2KAB02;5=8O >B;>65==>3> >@45@0

input double   MinProfit              = 2;   // min ?@81K;L 2 20;NB5 45?>78B0

input ushort   ExpirationMinutes      = 41;  // 2@5<O 8AB5G5=8O, <8=CB

input double   AbsoluteFixation       = 43;  // ?@81K;L 8;8 C1KB>: ?> 4>AB865=8N :>B>@>9 70:@K205<

input ushort   InpStabilization       = 25;  // AB018;870F8O ?C=:B>2

input double   Lots                   = 0.1; // >1JQ< >B:@KB8O

//---

ulong          m_magic=16384; // magic number

double         ExtIndent=0.0;

double         ExtStabilization=0.0;

ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;

double         m_adjusted_point;             // point value adjusted for 3 or 5 points

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

   SetMarginMode();

   if(!IsHedging())

     {

      Print("Hedging only!");

      return(INIT_FAILED);

     }

//---

   m_symbol.Name(Symbol());                  // sets symbol name

   if(!RefreshRates())

     {

      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),

            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));

      return(INIT_FAILED);

     }

   m_symbol.Refresh();

//---

   m_trade.SetExpertMagicNumber(m_magic);    // sets magic number

//--- tuning for 3 or 5 digits

   int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)

      digits_adjust=10;

   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtIndent         = InpIndent        * m_adjusted_point;

   ExtStabilization  = InpStabilization * m_adjusted_point;

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---



  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//double pip=MarketInfo(Symbol(),MODE_TICKSIZE);

//--- AG8B05< >B:@KBK5 ?>78F88

   int total=0;

   int count_buy=0;  // AGQBG8: ?>78F89 Buy

   int count_sell=0; // AGQBG8: ?>78F89 Sell

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)

           {

            total++;

            if(m_position.PositionType()==POSITION_TYPE_BUY)

               count_buy++;

            if(m_position.PositionType()==POSITION_TYPE_SELL)

               count_sell++;

           }

//--- 0 B5?5@L :>=B@>;L: 2 @01>B5 <>65B 1KBL B>;L:> >4=0 ?>78F8O

   if(total>1)

     {

      if(count_buy>1 || count_sell>1 || count_buy+count_sell>1)

        {

         CloseAllPositions(); // 70:@K205< 2A5 ?>78F88, B0: :0: GB>-B> ?>H;> =5 B0:

         return;              // 2KE>48<

        }

     }

//---

   if(total==0)

     {

      //--- ?@>25@8< :>;8G5AB2> >B;>65==KE >@45@>2

      int total_orders=0;

      for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders

         if(m_order.SelectByIndex(i))

            if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)

               total_orders++;

      //--- 5A;8 5ABL 1>;55 >4=>3> >B;>65==>3> >@45@0 - B> 2KE>48<

      if(total_orders>1)

         return;



      //--- 5A;8 =5 C40;>AL >1=>28BL F5=K - B> 2KE>48<

      if(!RefreshRates())

         return;



      double buy=m_symbol.Ask()+ExtIndent;

      double sell=m_symbol.Bid()-ExtIndent;

      //--- 2KAB02;O5< >B;>65==K9 BuyStop >@45@ A >3@0=8G5==K< 2@5<5=5< 687=8 

      m_trade.BuyStop(Lots,buy,NULL,0.0,0.0,ORDER_TIME_SPECIFIED,TimeCurrent()+ExpirationMinutes*60);

      //--- 2KAB02;O5< >B;>65==K9 SellStop >@45@ A >3@0=8G5==K< 2@5<5=5< 687=8 

      m_trade.SellStop(Lots,sell,NULL,0.0,0.0,ORDER_TIME_SPECIFIED,TimeCurrent()+ExpirationMinutes*60);

      return;                 // 2KE>48<

     }

//--- 5A;8 <K 745AL, 7=0G8B 5ABL >4=0 >B:@KB0O ?>78F8O ?> B5:CI5<C A8<2>;C 8 A B5:CI8< Magic

//--- 8 ?>:0 =58725AB=> A:>;L:> >B;>65==KE >@45@>2 :)

   double close1=iClose(m_symbol.Name(),Period(),1);

   double close2=iClose(m_symbol.Name(),Period(),2);

   double open1=iOpen(m_symbol.Name(),Period(),1);

   double open2=iOpen(m_symbol.Name(),Period(),2);

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)

           {

            if(m_position.PositionType()==POSITION_TYPE_BUY)

              {

               if(m_position.Profit()>MinProfit && MathAbs(iClose(m_symbol.Name(),Period(),1)-iOpen(m_symbol.Name(),Period(),1))<=ExtStabilization)

                 {

                  m_trade.PositionClose(m_position.Ticket());

                  DeleteOrders(ORDER_TYPE_SELL_STOP);

                  return;

                 }

               //--- 70I8B0 >B <0;5=L:8E 10@>2 !1 8 !2 - =5 >?@0240=0 - 2:;NG5=85 MB>9 70I8BK 254QB : A;82C

               //if(MathAbs(iClose(1)-iOpen(1))<=ExtStabilization && MathAbs(iClose(2)-iOpen(2))<=ExtStabilization)

               //  {

               //   m_trade.PositionClose(m_position.Ticket());

               //   DeleteOrders(ORDER_TYPE_SELL_STOP);

               //  }

               //--- 2KE>48< ?> 4>AB865=8N 01A>;NB=>9 ?@81K;8 8;8 01A>;NB=>3> C1KB:0

               if(m_position.Profit()>=AbsoluteFixation || m_position.Profit()<=-AbsoluteFixation)

                 {

                  m_trade.PositionClose(m_position.Ticket());

                  DeleteOrders(ORDER_TYPE_SELL_STOP);

                 }

              }

            if(m_position.PositionType()==POSITION_TYPE_SELL)

              {

               if(m_position.Profit()>MinProfit && MathAbs(iOpen(m_symbol.Name(),Period(),1)-iClose(m_symbol.Name(),Period(),1))<=ExtStabilization)

                 {

                  m_trade.PositionClose(m_position.Ticket());

                  DeleteOrders(ORDER_TYPE_BUY_STOP);

                  return;

                 }

               //--- 70I8B0 >B <0;5=L:8E 10@>2 !1 8 !2 - =5 >?@0240=0 - 2:;NG5=85 MB>9 70I8BK 254QB : A;82C

               //if(MathAbs(iOpen(1)-iClose(1))<=ExtStabilization && MathAbs(iOpen(2)-iClose(2))<=ExtStabilization)

               //  {

               //   m_trade.PositionClose(m_position.Ticket());

               //   DeleteOrders(ORDER_TYPE_BUY_STOP);

               //  }

               //--- 2KE>48< ?> 4>AB865=8N 01A>;NB=>9 ?@81K;8 8;8 01A>;NB=>3> C1KB:0

               if(m_position.Profit()>=AbsoluteFixation || m_position.Profit()<=-AbsoluteFixation)

                 {

                  m_trade.PositionClose(m_position.Ticket());

                  DeleteOrders(ORDER_TYPE_BUY_STOP);

                 }

              }

           }

//----

   return;

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void SetMarginMode(void)

  {

   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

bool IsHedging(void)

  {

   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);

  }

//+------------------------------------------------------------------+

//| Refreshes the symbol quotes data                                 |

//+------------------------------------------------------------------+

bool RefreshRates()

  {

//--- refresh rates

   if(!m_symbol.RefreshRates())

      return(false);

//--- protection against the return value of "zero"

   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)

      return(false);

//---

   return(true);

  }

//+------------------------------------------------------------------+

//|  0:@K205< 2A5 ?>78F88 ?> B5:CI5<C A8<2>;C 8 A B5:CI8< Magic     |

//+------------------------------------------------------------------+

void CloseAllPositions()

  {

   Print(__FUNCTION__);

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)

            m_trade.PositionClose(m_position.Ticket());

   return;

  }

//+------------------------------------------------------------------+

//| Delete Orders                                                    |

//+------------------------------------------------------------------+

void DeleteOrders(ENUM_ORDER_TYPE order_type)

  {

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders

      if(m_order.SelectByIndex(i))

         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic)

            if(m_order.OrderType()==order_type)

               m_trade.OrderDelete(m_order.Ticket());

  }

//+------------------------------------------------------------------+

Comments