Orders Execution
Indicators Used
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---