Middle_Moving_Average

Author: Copyright 2016, DLim0n4IK.DK
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Moving average indicator
0 Views
0 Downloads
0 Favorites
Middle_Moving_Average
//+------------------------------------------------------------------+
//|                                        Middle Moving Average.mq4 |
//|                                   "Copyright 2016, DLim0n4IK.DK" |
//|                       https://www.mql5.com/ru/users/dlim0n4ik.dk |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, DLim0n4IK.DK"
#property link      "https://www.mql5.com/ru/users/dlim0n4ik.dk"
#property version   "161.015"
#property description "Ïðîñòîé ñîâåòíèê îñíîâàíûé íà Moving Average"
#property strict
#define MAGICMA  20161015
extern double  Lots           =0.01;   //Ðàçìåð ëîòà
extern double  MaximumRisk    =0.02;   //Ìàêñèìàëüíûé ðèñê
extern double  DecreaseFactor =3;      //DF
extern double  StopLoss       = 0;     //Óðîâåíü óáûòêîâ (â ïóíêòàõ)
extern double  TakeProfit     = 0;     //Óðîâåíü ïðèáûëè (â ïóíêòàõ)
//--------------------------------------------------------------------
extern string           MA_Info           = "Íàñòðîéêè MA"; //Ïàðàìåòðû
extern ENUM_TIMEFRAMES  MA_TimeFrame      = PERIOD_CURRENT; //Òàéìôðåéì
extern int              MA_Period         = 20;             //Ïåðèîä
extern int              MA_Shift          = 0;              //Ñìåùåíèå ÌÀ
extern ENUM_MA_METHOD   MA_Method         = MODE_EMA;       //Ìåòîò ðàñ÷åòà ÌÀ
//extern ENUM_APPLIED_PRICE   MA_Applied_Price  = PRICE_CLOSE;   //Applied price
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//--- Ïðîâåðèì äîñòàòî÷íà ëè â èñòîðèè áàðîâ äëÿ àíàëèçà -------------
if(Bars<100 || IsTradeAllowed()==false) return;
//--- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else                                    CheckForClose();
//---
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Ôóíêöèÿ ðàñ÷åòà êîëè÷åñòâà îòêðûòûõ îðåðîâ                     |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int Count = 0;
for(int index = 0; index < OrdersTotal();index++)
   {
   if(OrderSelect(index,SELECT_BY_POS,MODE_TRADES)==false) break;
   if(OrderSymbol()==symbol && OrderMagicNumber()==MAGICMA)
      {
      if(OrderType()==OP_BUY || OrderType()==OP_SELL)  Count++;
      }
   }
return(Count);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Ðàñ÷åò îïòèìàëüíîãî ðàçìåðà ëîòà                               |
//+------------------------------------------------------------------+
double LotsOptimized()
{
//--- Èíèöèàëèçàöèÿ ïåðåìåíûõ ----------------------------------------
string   symbol   /* Èìÿ ñèìâîëà */                      = Symbol();
int      orders   /* Êîëè÷åñòâî îðäåðîâ â èñòîðèè */     = HistoryTotal();
int      losses   /* Êîëè÷åñòâîóáûòî÷íûõ îðäåðîâ */      = 0;
int      digits   /* Êîëè÷åñòâî çíàêîâ ïîñëå çàïÿòîé */  = 2;
double   lot      /* Ðàçìåð ëîòà */                      = Lots;
//--------------------------------------------------------------------
lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,digits); //Âûáåðåì ðàçìåð ëîòà
//--- Ïîäñ÷èòàåì êîëè÷åñòâî óáûòî÷íûõ îðäåðîâ ------------------------
if(DecreaseFactor>0)
   {
   for(int index = orders-1; index >= 0; index--)
      {
      if(OrderSelect(index,SELECT_BY_POS,MODE_HISTORY)==false)
         {
         Print("Error in history!");
         break;
         }
      if(OrderSymbol()==symbol && OrderMagicNumber()==MAGICMA)
         {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
            {
            if(OrderProfit()>0) break;
            if(OrderProfit()<0) losses++;
            }
         }
      }
   if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,digits);
   }
//--------------------------------------------------------------------
if(lot<0.01) lot=0.01;
return(lot);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Ôóíêöèÿ ðàñò÷åòà è îïðåäåëåíèÿ ñîîòâåòñòâèÿ óñëîâèé            |                                                                  |
//+------------------------------------------------------------------+
string Signal()
{
//--- Èíèöèàëèçàöèÿ ïåðåìåíûõ ----------------------------------------
string               symbol         /* Èìÿ ñèìâîëà */       = Symbol();
ENUM_TIMEFRAMES      timeframe      /* Òàéìôðåéì */         = MA_TimeFrame;
int                  ma_period      /* Ïåðèîä */            = MA_Period;
int                  ma_shift       /* Ñäâèã ñðåäíåé */     = MA_Shift;
ENUM_MA_METHOD       ma_method      /* Ìåòîä óñðåäíåíèÿ */  = MA_Method;
//ENUM_APPLIED_PRICE   applied_price  /* Òèï öåíû */          = MA_Applied_Price;
int                  shift          /* Ñäâèã */             = 1;
int  digits   = (int) SymbolInfoInteger(symbol,SYMBOL_DIGITS); //
//--------------------------------------------------------------------
double hMA = NormalizeDouble(iMA(symbol,timeframe,ma_period,ma_shift,ma_method,PRICE_HIGH,shift),digits);
double cMA = NormalizeDouble(iMA(symbol,timeframe,ma_period,ma_shift,ma_method,PRICE_CLOSE,shift),digits);
double oMA = NormalizeDouble(iMA(symbol,timeframe,ma_period,ma_shift,ma_method,PRICE_OPEN,shift),digits);
double lMA = NormalizeDouble(iMA(symbol,timeframe,ma_period,ma_shift,ma_method,PRICE_LOW,shift),digits);
double MA = NormalizeDouble((hMA+cMA+oMA+lMA) / 4,digits);
//--------------------------------------------------------------------
if (Open[1] < MA && Close[1] > MA)return("BUY");
if (Open[1] > MA && Close[1] < MA)return("SELL");
//--------------------------------------------------------------------
return("NO Signal");
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Ïðîâåðÿåì óñëîâèÿ íà îòêðûòèå îðäåðà                           |
//+------------------------------------------------------------------+
void CheckForOpen()
{
if(Volume[0]>1) return; //Íà÷íåì òîðãîâàòü íà íîâîì áàðå
//--- Ïðîâåðÿåì è îòêðûâàåì îðäåð íà ïîêóïêó -------------------------
if(Signal()=="BUY")
   {
   OpenOrder("BUY");
   return;
   }
//--- Ïðîâåðÿåì è îòêðûâàåì îðäåð íà ïðîäàæó -------------------------
if(Signal()=="SELL")
   {
   OpenOrder("SELL");
   return;
   }
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Ïðîâåðÿåì óñëîâèÿ íà çàêðûòèå îðäåðà                           |
//+------------------------------------------------------------------+
void CheckForClose()
{
//--- Èíèöèàëèçàöèÿ ïåðåìåíûõ ----------------------------------------
string   symbol   /* Èìÿ ñèìâîëà */ = Symbol();
if(Volume[0]>1) return;
for(int index = 0; index < OrdersTotal(); index++)
   {
   if(OrderSelect(index,SELECT_BY_POS,MODE_TRADES)==false) break;
   if(OrderSymbol()!=symbol || OrderMagicNumber()!=MAGICMA) continue;
//--------------------------------------------------------------------
   if(OrderType()==OP_BUY)
      {
      if(Signal()=="SELL")
         {
         if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
         }
      break;
      }
//--------------------------------------------------------------------
   if(OrderType()==OP_SELL)
      {
      if(Signal()=="BUY")
         {
         if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
         }
      break;
      }
   }
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Ôóíêöèÿ îòêðûòèÿ îðäåðà                                        |
//|------------------------------------------------------------------|
//|   Ïàðàìåòðû çàïðîñà:                                             |
//|   OpenOrder("BUY")  - Îòêðûòèå îðäåðà íà ïîêóïêó (BUY)           |
//|   OpenOrder("SELL") - Îòêðûòèå îðäåðà íà ïðîäàæó (SELL)          |
//+------------------------------------------------------------------+
void OpenOrder(string type)
{
//--- Èíèöèàëèçàöèÿ ïåðåìåíûõ ----------------------------------------
int               ticket      = 0;
string            symbol      /* Cèìâîë */                  = Symbol();
ENUM_ORDER_TYPE   cmd         /* Òîðãîâàÿ îïåðàöèÿ */       = ORDER_TYPE_BUY; 
double            volume      /* Êîëè÷åñòâî ëîòîâ */        = LotsOptimized();
double            price       /* Öåíà */                    = 0.0;
int               slippage    /* Ïðîñêàëüçûâàíèå */         = 3; 
double            stoploss    /* stop loss */               = 0;
double            takeprofit  /* take profit */             = 0;
string            comment     /* Êîììåíòàðèé */             = NULL;
int               magic       /* Èäåíòèôèêàòîð */           = MAGICMA;
datetime          expiration  /* Cðîê èñòå÷åíèÿ îðäåðà */   = 0;
color             arrow_color /* Öâåò */                    = clrNONE;
//--- Ïîëó÷èì èíôîðìàöèþ ---------------------------------------------
double point   = MarketInfo(symbol,MODE_POINT);  // Çàïðîñ Point
int digits  = (int)MarketInfo(symbol,MODE_DIGITS);  // Çàïðîñ Digits
//--- Ïîäñòàâèì çíà÷åíèÿ ïîä ñîîòâåòñòâóþùèé òèï îðäåðà --------------
if (type == "BUY")
   {
   cmd = ORDER_TYPE_BUY;
   price = NormalizeDouble(Ask,digits);
   if (StopLoss > 0) stoploss = NormalizeDouble(Bid - StopLoss * point,digits);
   if (TakeProfit > 0) takeprofit = NormalizeDouble(Ask + TakeProfit * point,digits);
   arrow_color = Green;
   }
if (type == "SELL")
   {
   cmd = ORDER_TYPE_SELL;
   price = NormalizeDouble(Bid,digits);
   if (StopLoss > 0) stoploss = NormalizeDouble(Ask + StopLoss * point,digits); 
   if (TakeProfit > 0) takeprofit = NormalizeDouble(Bid - TakeProfit * point,digits);
   arrow_color = Red;
   }
//--- Ïðîâåðèì äîñòàòî÷íî ëè ñðåäñòâ äëÿ îòêðûòèÿ îðäåðà -------------
double free_margin=AccountFreeMarginCheck(symbol,cmd,volume);
if(free_margin<0) //Åñëè íà ñ÷åòó íå õâàòàåò ñðåäñòâ
   {
   string oper=(cmd==OP_BUY)? "Buy":"Sell";
   Print("Not enough money for ", oper," ",volume, " ", symbol, " Error code=",GetLastError());
   return;
   }
//--------------------------------------------------------------------
if(free_margin>0)
   {ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);}
//--------------------------------------------------------------------
}
//+------------------------------------------------------------------+

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