//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Moving Average v.3.0. #150 only for EURUSD M1. 08.2006-12.2006" #property link "http://automated-trading.narod.ru/" #define MAGICMA 150 //óñòàíîâëåíû ëó÷øåå ïàðàìåòðû ïðè îïòèìèçàöèè extern double Lots = 0.1; //ñòàíäàðòíûå óñòàíîâêè 0.1 extern double LotMax = 1000; //óñòàíîâêà ìàêñèìàëüíîãî ëîòà extern double MaximumRisk = 0.105; //ñòàíäàðòíûå óñòàíîâêè 0.02, ðàáîòàåò íîðìàëüíî ïðè 0.2 è 0.5, îñîáåííî ïðè 0.6, íî î÷åíü ðèñêîâàíî extern double DecreaseFactor = 3; //ñòàíäàðòíûå óñòàíîâêè 3 extern double MovingPeriod = 13; //ñòàíäàðòíûå óñòàíîâêè 12, ðàáîòàåò èíîãäà ëó÷øå íà 13 è îñîáåííî ïðè 1, åñëè MaximumRisk=0.6 íà M5 extern double MovingShift = 15; //ñòàíäàðòíûå óñòàíîâêè 6 extern int MODE_Op_Buy = 1; //Ìåòîä âû÷èñëåíèÿ ñêîëüçÿùåãî ñðåäíåãî (Moving Average)... extern int MODE_Cl_Buy = 1; //...& 0-MODE_SMA, 1-MODE_EMA, 2-MODE_SMMA, 3-MODE_LWMA... extern int MODE_Op_Sell = 2; //...& MODE_SMA-Ïðîñòîå ñêîëüçÿùåå ñðåäíåå, MODE_EMA-Ýêñïîíåíöèàëüíîå ñêîëüçÿùåå ñðåäíåå, MODE_SMMA-Ñãëàæåííîå ñêîëüçÿùåå ñðåäíåå, MODE_LWMA-Ëèíåéíî-âçâåøåííîå ñêîëüçÿùåå ñðåäíåå extern int MODE_Cl_Sell = 0; //---||---...& ---||--- extern int PriceConstantMAofOp_Buy = 0; //Öåíîâûå êîíñòàíòû-öåíà äëÿ ðàñ÷¸òà èíäèêàòîðîâ... extern int PriceConstantMAofCl_Buy = 0; //...& 0-PRICE_CLOSE, 1-PRICE_OPEN, 2-PRICE_HIGH, 3-PRICE_LOW, 4-PRICE_MEDIAN, 5-PRICE_TYPICAL, 6-PRICE_WEIGHTED extern int PriceConstantMAofOp_Sell = 0; //...& PRICE_CLOSE-Öåíà çàêðûòèÿ, PRICE_OPEN-Öåíà îòêðûòèÿ, PRICE_HIGH-Ìàêñèìàëüíàÿ öåíà, PRICE_LOW-Ìèíèìàëüíàÿ öåíà, PRICE_MEDIAN-Ñðåäíÿÿ öåíà, (high+low)/2, PRICE_TYPICAL-Òèïè÷íàÿ öåíà, (high+low+close)/3, PRICE_WEIGHTED-Âçâåøåííàÿ öåíà çàêðûòèÿ, (high+low+close+close)/4 extern int PriceConstantMAofCl_Sell = 4; //---||---...& ---||--- extern int Buy = 1; //0-íå îòêðûâàòü ïîçèöèþ Buy (ëþáîå ïîëîæèòåëüíîå ÷èñëî îòêðûâàòü ïîçèöèþ) extern int Sell = 1; //0-íå îòêðûâàòü ïîçèöèþ Sell (ëþáîå ïîëîæèòåëüíîå ÷èñëî îòêðûâàòü ïîçèöèþ) extern int MinAccountBalance = 1; //0-ïîçèöèè íå îòêðûâàþòüñÿ è ïðè 0 õîðîøèå ðåçóëüòàòû. Òîëüêî äëÿ áàëàíñà â USD. Îòêðûâàåò ïðîòèâîïîëîæíóþ ïîçèöèþ ïðè êðèòè÷åñêîì çàíà÷åíèè FreeMargin. MinAccountBalance-ýòî çíà÷åíèå FreeMargin ïðè îòêðûòîé ïîçèöèè è ïðîòèâîïîëîæíî îòêðûòîé ïîçèöèè. extern int VolumeLot = 100000; //Îáúåì ëîòà äëÿ äàííîãî èíñòðóìåíòà â ÷àñòíîñòè EURUSD. extern int ConsiderPricelosingOrder = 1; //To consider the price of closing of the order-ó÷èòûâàòü öåíó çàêðûòèÿ îðäåðà (0-íå ó÷èòûâàòü, áîëüøå 0-ó÷èòûâàòü) extern int ToOpenOrdersWithEqualLots = 1; //Îòêðûâàòü îðäåðà ñ ðàâíûìè ëîòàìè //+------------------------------------------------------------------+ //| 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); if(lot<0.1) lot=0.1; } //---- return lot size if(lot>LotMax) lot=LotMax; if(OrderSelect(SELECT_BY_POS,MODE_TRADES)==true) { if(ToOpenOrdersWithEqualLots>0 && (OrderLots()>lot || OrderLots()<lot)) { lot=OrderLots(); } } return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; double ocp1; double ocp2; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average //open Sell ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_Op_Sell,PriceConstantMAofOp_Sell,0); //---- sell conditions int 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_SELL) sells++; } } //ó÷èòûâàòü öåíó çàêðûòèÿ îðäåðà if(sells==0) { if(OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==true) { ocp2=OrderClosePrice(); } } //---- sell conditions if(((ocp2<=Bid && ConsiderPricelosingOrder>=1)==true && Open[1]>ma && Close[1]<ma && sells<1 && Sell>=1) || (ConsiderPricelosingOrder<=0 && Open[1]>ma && Close[1]<ma && sells<1 && Sell>=1)) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } //open Buy if(Volume[0]>1) return; ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_Op_Buy,PriceConstantMAofOp_Buy,0); //---- sell conditions int buys=0; //---- for(int i2=0;i2<OrdersTotal();i2++) { if(OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { if(OrderType()==OP_BUY) buys++; } } //ó÷èòûâàòü öåíó çàêðûòèÿ îðäåðà if(buys==0) { if(OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)==true) { ocp1=OrderClosePrice(); } } //---- buy conditions if((((ocp1>=Ask || ocp1==0) && ConsiderPricelosingOrder>=1)==true && Open[1]<ma && Close[1]>ma && buys<1 && Buy>=1) || (ConsiderPricelosingOrder<=0 && Open[1]<ma && Close[1]>ma && buys<1 && Buy>=1)) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } if(MinAccountBalance>0) { if(OrderSelect(SELECT_BY_POS,MODE_TRADES)==true) { if(sells<1 && OrderType()==OP_BUY==true && OrderType()==OP_SELL==false && Bid*VolumeLot/AccountLeverage()*OrderLots()+MinAccountBalance>=AccountFreeMargin()) { OrderSend(Symbol(),OP_SELL,OrderLots(),Bid,3,0,0,"",MAGICMA,0,DarkOrchid); Print("Sell ïðè êðèòè÷åñêîì çàíà÷åíèè FreeMargin ðàâíîì ",AccountFreeMargin(),", # ",MAGICMA,", Ticket# ",OrderTicket()); } } if(OrderSelect(SELECT_BY_POS,MODE_TRADES)==true) { if(buys<1 && OrderType()==OP_BUY==false && OrderType()==OP_SELL==true && Ask*VolumeLot/AccountLeverage()*OrderLots()+MinAccountBalance>=AccountFreeMargin()) { OrderSend(Symbol(),OP_BUY,OrderLots(),Ask,3,0,0,"",MAGICMA,0,Orange); Print("Buy ïðè êðèòè÷åñêîì çàíà÷åíèè FreeMargin ðàâíîì ",AccountFreeMargin(),", # ",MAGICMA,", Ticket# ",OrderTicket()); } } } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { //Close Buy double ma; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_Cl_Buy,PriceConstantMAofCl_Buy,0); //---- for(int i2=0;i2<OrdersTotal();i2++) { if(OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { int Fa1; while(Fa1<1) { if (Open[1]>ma && Close[1]<ma && OrderProfit()>=0) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } } } //Close Sell if(Volume[0]>1) return; ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_Cl_Sell,PriceConstantMAofCl_Sell,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_SELL) { int Fa2; while(Fa2<1) { if (Open[1]<ma && Close[1]>ma && OrderProfit()>=0) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break; } } } //---- } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; CheckForOpen(); CheckForClose(); //---- } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains tick volumes of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Indicator Curves created:
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It Closes Orders by itself
Other Features: