Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //+------------------------------------------------------------------+
- //| Moving Average.mq4 |
- //| Copyright 2005-2014, MetaQuotes Software Corp. |
- //| http://www.mql4.com |
- //+------------------------------------------------------------------+
- #property copyright "2005-2014, MetaQuotes Software Corp."
- #property link "http://www.mql4.com"
- #property description "Moving Average sample expert advisor"
- #define MAGICMA 20131111
- //--- Inputs
- input double Lots =0.1;
- input double MaximumRisk =0.02;
- input double DecreaseFactor=3;
- input int MovingPeriod1 =5;
- input int MovingPeriod2 =200;
- input int MovingShift =6;
- input int StopLoss =10;
- input int RsiPeriod =2;
- //+------------------------------------------------------------------+
- //| 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);
- }
- //+------------------------------------------------------------------+
- //| Calculate optimal lot size |
- //+------------------------------------------------------------------+
- /*
- double LotsOptimized()
- {
- double lot=Lots;
- int orders=HistoryTotal(); // history orders total
- int losses=0; // number of losses orders without a break
- //--- select lot size
- lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
- //--- calcuulate number of losses orders without a break
- if(DecreaseFactor>0)
- {
- for(int i=orders-1;i>=0;i--)
- {
- if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
- {
- Print("Error in history!");
- break;
- }
- if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
- continue;
- //---
- if(OrderProfit()>0) break;
- if(OrderProfit()<0) losses++;
- }
- if(losses>1)
- lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
- }
- //--- return lot size
- if(lot<0.1) lot=0.1;
- return(lot);
- }
- */
- //+------------------------------------------------------------------+
- //| Check for open order conditions |
- //+------------------------------------------------------------------+
- void CheckForOpen()
- {
- double ma1, ma2, rsi;
- int res;
- //--- go trading only for first tiks of new bar
- if(Volume[0]>1) return;
- //--- get Moving Averages
- ma1=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,0);
- ma2=iMA(NULL,0,MovingPeriod2,MovingShift,MODE_SMA,PRICE_CLOSE,0);
- rsi=iRSI(NULL,0,RsiPeriod,PRICE_CLOSE,0);
- //--- sell conditions
- if(rsi>90)
- {
- res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point(),0,"",MAGICMA,0,Red);
- return;
- }
- //--- buy conditions
- if(rsi<10)
- {
- res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss*Point(),0,"",MAGICMA,0,Blue);
- return;
- }
- //---
- }
- //+------------------------------------------------------------------+
- //| Check for close order conditions |
- //+------------------------------------------------------------------+
- void CheckForClose()
- {
- double ma1, ma2, rsi;
- //--- go trading only for first tiks of new bar
- if(Volume[0]>1) return;
- //--- get Moving Averages
- ma1=iMA(NULL,0,MovingPeriod1,MovingShift,MODE_SMA,PRICE_CLOSE,0);
- ma2=iMA(NULL,0,MovingPeriod2,MovingShift,MODE_SMA,PRICE_CLOSE,0);
- rsi=iRSI(NULL,0,RsiPeriod,PRICE_CLOSE,0);
- //---
- 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)
- {
- //if(Open[1]>ma1 && Close[1]<ma1)
- if(rsi>90)
- {
- if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
- Print("OrderClose error ",GetLastError());
- }
- break;
- }
- if(OrderType()==OP_SELL)
- {
- //if(Open[1]<ma1 && Close[1]>ma1)
- if(rsi<10)
- {
- if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
- Print("OrderClose error ",GetLastError());
- }
- break;
- }
- }
- //---
- }
- //+------------------------------------------------------------------+
- //| OnTick function |
- //+------------------------------------------------------------------+
- void OnTick()
- {
- //--- check for history and trading
- if(Bars<100 || IsTradeAllowed()==false)
- return;
- //--- calculate open orders by current symbol
- if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
- else CheckForClose();
- //---
- }
- //+------------------------------------------------------------------+
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement