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
0 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

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 ---