Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
MACD-EURUSD-M5
//+------------------------------------------------------------------+
//| MACD.mq4 |
//| Copyright © 2011, Work2it |
//| http://www.work2it.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Work2it"
#property link "http://www.work2it.ru"
#define MAGICMA 20050610
extern double Lots = 0.05;
extern int BullTrailingStop = 24;
extern int BearTrailingStop = 25;
extern int BULL_PRICE_MODE = 3; // 0-PRICE_CLOSE, 1-PRICE_OPEN, 2-PRICE_HIGH, 3-PRICE_LOW, 4-PRICE_MEDIAN, 5-PRICE_TYPICAL, 6-PRICE_WEIGHTED
extern int BEAR_PRICE_MODE = 3; // 0-PRICE_CLOSE, 1-PRICE_OPEN, 2-PRICE_HIGH, 3-PRICE_LOW, 4-PRICE_MEDIAN, 5-PRICE_TYPICAL, 6-PRICE_WEIGHTED
extern double BullMACD_Min = 79;
extern double BearMACD_Min = 88;
extern int PreNum = 1;
extern bool UseBullTrend = true;
extern bool UseBearTrend = true;
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(buys>0) return(buys);
else return(-sells);
}
//+------------------------------------------------------------------+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen() {
int res;
double mv_now;
double mv_pre;
double ms_now;
double ms_pre;
if(Volume[0]>1) return;
double bull_mv_pre=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_MAIN,PreNum)*100000;
double bear_mv_pre=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_MAIN,PreNum)*100000;
if (UseBearTrend) {
if (bear_mv_pre >= BearMACD_Min) {
mv_now=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_MAIN,0)*100000;
mv_pre=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_MAIN,PreNum)*100000;
ms_now=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_SIGNAL,0)*100000;
ms_pre=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_SIGNAL,PreNum)*100000;
if ((ms_now > mv_now) && (ms_pre < mv_pre)) {
res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MAGICMA,0,Red);
return;
}
}
}
if (UseBullTrend) {
if (bull_mv_pre <= -1*BullMACD_Min) {
mv_now=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_MAIN,0)*100000;
mv_pre=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_MAIN,PreNum)*100000;
ms_now=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_SIGNAL,0)*100000;
ms_pre=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_SIGNAL,PreNum)*100000;
if ((ms_now < mv_now) && (ms_pre > mv_pre)) {
res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Blue);
return;
}
}
}
}
//+------------------------------------------------------------------+
//| Check for close order conditions |
//+------------------------------------------------------------------+
void CheckForClose()
{
double SL;
double mv_now;
double mv_pre;
double ms_now;
double ms_pre;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//----
for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
//---- check order type
if(OrderType()==OP_BUY) {
mv_now=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_MAIN,0)*100000;
mv_pre=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_MAIN,PreNum)*100000;
ms_now=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_SIGNAL,0)*100000;
ms_pre=iMACD(NULL,0,12,26,9,BULL_PRICE_MODE,MODE_SIGNAL,PreNum)*100000;
if ((mv_now <= ms_now) || ((ms_now > 0) && (mv_now <= mv_pre))) { // óñëîâèå çàêðûòèÿ
OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
break;
}
else if (BullTrailingStop > 0) { // TrallingStop
if (OrderStopLoss() == 0.0) OrderModify(OrderTicket(),OrderOpenPrice(),Low[0]-Point*BullTrailingStop,OrderTakeProfit(),0,Blue);
else {
SL = Low[0]-Point*BullTrailingStop;
if (OrderStopLoss() < SL) OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue);
}
break;
}
}
if(OrderType()==OP_SELL) {
mv_now=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_MAIN,0)*100000;
mv_pre=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_MAIN,PreNum)*100000;
ms_now=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_SIGNAL,0)*100000;
ms_pre=iMACD(NULL,0,12,26,9,BEAR_PRICE_MODE,MODE_SIGNAL,PreNum)*100000;
if ((mv_now >= ms_now) || ((ms_now < 0) && (mv_now <= mv_pre))) { // óñëîâèå çàêðûòèÿ
OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
break;
}
else if (BearTrailingStop > 0) { // TrallingStop
if (OrderStopLoss() == 0.0) OrderModify(OrderTicket(),OrderOpenPrice(),High[0]+Point*BearTrailingStop,OrderTakeProfit(),0,Blue);
else {
SL = High[0]+Point*BearTrailingStop;
if (OrderStopLoss() > SL) OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,Blue);
}
break;
}
}
}
//----
}
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
if(Bars<100 || IsTradeAllowed()==false) return;
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
}
//+------------------------------------------------------------------+
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
---