//+------------------------------------------------------------------+ //| RSI_Test.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double RiskPercentage = 10; // ðèñê extern int TrailingStop = 50; // òðåéëèíã ñòîï extern int MaxOrders = 1; // ìàêñèìàëüíîå êîëè÷åñòâî îðäåðîâ, åñëè 0 - íå êîíòðîëèðóåòñÿ extern int BuyOp = 12; // ñèãíàë íà ïîêóïêó extern int SellOp = 88; // ñèãíàë íà ïðîäàæó extern int magicnumber = 777; extern int Test = 14; // ïåðèîä RSI int expertBars; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ extern int SetHour = 00; //×àñ ñòàðòà îïòèìèçàöèè extern int SetMinute = 05; //Ìèíóòà ñòàðòà îïòèìèçàöèè int TestDay = 3; //Êîëè÷åñòâî äíåé äëÿ îïòèìèçàöèè int TimeOut = 12; //Âðåìÿ îæèäàíèÿ îêîí÷àíèÿ îïòèìèçàöèè â ìèíóòàõ string NameMTS = "rsi_test"; //Èìÿ ñîâåòíèêà string NameFileSet = "rsi_test.set"; //Èìÿ Set ôàéëà ñ óñòàíîâêàìè string PuthTester = "D:\Forex\Metatrader1";//Ïóòü ê òåñòåðó //--- Ïîñëåäîâàòåëüíîñòü ôèëüòðàöèè int Gross_Profit = 1; //Ñîðòèðîâêà ïî Ìàêñèìàëüíîé ïðèáûëè int Profit_Factor = 2; //Ñîðòèðîâêà ïî Ìàêñèìàëüíîé ïðèáûëüíîñòè int Expected_Payoff= 3; //Ñîðòèðîâêà ïî Ìàêñèìàëüíîìó ìàòîæèäàíèþ //--èìåíà ïåðåìåííûõ äëÿ îïòèìèçàöèè string Per1 = "BuyOp"; string Per2 = "SellOp"; string Per3 = "Test"; string Per4 = ""; bool StartTest=false; datetime TimeStart; //--- Ïîäêëþ÷åíèå áèáëèîòåêè àâòîîïòèìèçàòîðà #include <auto_optimization.mqh> //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- double margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED); double minLot = MarketInfo(Symbol(), MODE_MINLOT); double maxLot = MarketInfo(Symbol(), MODE_MAXLOT); double step = MarketInfo(Symbol(), MODE_LOTSTEP); double account = AccountFreeMargin(); double percentage = account*RiskPercentage/100; double Lots = MathRound(percentage/margin/step)*step; if(Lots < minLot) { Lots = minLot; } if(Lots > maxLot) { Lots = maxLot; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!IsTesting() && !IsOptimization()){ //Ïðè òåñòèðîâàíèè è îïòèìèçàöèè íå çàïóñêàòü if(TimeHour(TimeCurrent())==SetHour){ //Ñðàâíåíèå òåêóùåãî ÷àñà ñ óñòàíîâëåííûì äëÿ çàïóñêà if(!StartTest){ //Çàùèòà îò ïîâòîðíîãî çàïóñêà if(TimeMinute(TimeCurrent())>SetMinute-1){ //Ñðàâíåíèå äèàïàçîíà ìèíóò ñ óñòàíîâëåííîé äëÿ çàïóñêà ìèíóòîé if(TimeMinute(TimeCurrent())<SetMinute+1){ //äèàïàçîí íóæåí â ñëó÷àå åñëè ïî êàêèì-òî ïðè÷èíàì äîëãî íåò íîâîãî òèêà TimeStart =TimeLocal(); StartTest =true; //Ôëàã çàïóñêà òåñòåðà Tester(TestDay,NameMTS,NameFileSet,PuthTester,TimeOut,Gross_Profit,Profit_Factor,Expected_Payoff,Per1,Per2,Per3,Per4); }}}} BuyOp =GlobalVariableGet(Per1); SellOp =GlobalVariableGet(Per2); Test =GlobalVariableGet(Per3); // TrailingStop=GlobalVariableGet(Per4); } if(StartTest){ //Åñëè ôëàã çàïóñêà òåñòåðà óñòàíîâëåí if(TimeLocal()-TimeStart > TimeOut*60){ //Åñëè ñ ìîìåíòà çàïóñêà ïðîøëî áîëüøå óñòàíîâëåííîãî âðåìåíè îæèäàíèÿ òåñòèðîâàíèÿ StartTest = false; //Îáíóëèì ôëàã }} //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if(!StartTest){Comment("BuyOp ",BuyOp," | SellOp ",SellOp," | Test ",Test);} int i=0; int total = OrdersTotal(); for(i = 0; i <= total; i++) { if(TrailingStop>0) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderMagicNumber() == magicnumber) { TrailingStairs(OrderTicket(),TrailingStop,TrailingStop); } } } if ((total < MaxOrders || MaxOrders == 0)) { if ((iRSI(NULL,0,Test,PRICE_CLOSE,0) < BuyOp) && (iRSI(NULL,0,Test,PRICE_CLOSE,0) > iRSI(NULL,0,Test,PRICE_CLOSE,1))) { if (Open[0]>Open[1]) {OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"RSI_Buy",magicnumber,0,Green);} } if ((iRSI(NULL,0,Test,PRICE_CLOSE,0) > SellOp) && (iRSI(NULL,0,Test,PRICE_CLOSE,0) < iRSI(NULL,0,Test,PRICE_CLOSE,1))) { if (Open[0]<Open[1]) {OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"RSI_Sell",magicnumber,0,Red);} } } //---- return(0); } //+------------------------------------------------------------------+ void TrailingStairs(int ticket,int trldistance,int trlstep) { double nextstair; // áëèæàéøåå çíà÷åíèå êóðñà, ïðè êîòîðîì áóäåì ìåíÿòü ñòîïëîññ // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))) { Print("Òðåéëèíã ôóíêöèåé TrailingStairs() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ."); return(0); } // åñëè äëèííàÿ ïîçèöèÿ (OP_BUY) if (OrderType()==OP_BUY) { // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice())) nextstair = OrderOpenPrice() + trldistance*Point; // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä else nextstair = OrderStopLoss() + trldistance*Point; // åñëè òåêóùèé êóðñ (Bid) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé if (Bid>=nextstair) { if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) { if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration())) Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError()); } } /* else { if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration())) Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError()); }*/ } // åñëè êîðîòêàÿ ïîçèöèÿ (OP_SELL) if (OrderType()==OP_SELL) { // ðàñ÷èòûâàåì, ïðè êàêîì çíà÷åíèè êóðñà ñëåäóåò ñêîððåêòèðîâàòü ñòîïëîññ // åñëè ñòîïëîññ íèæå îòêðûòèÿ èëè ðàâåí 0 (íå âûñòàâëåí), òî áëèæàéøèé óðîâåíü = êóðñ îòêðûòèÿ + trldistance + ñïðýä if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice())) nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point; // èíà÷å áëèæàéøèé óðîâåíü = òåêóùèé ñòîïëîññ + trldistance + trlstep + ñïðýä else nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point; // åñëè òåêóùèé êóðñ (Àñê) >= nextstair è íîâûé ñòîïëîññ òî÷íî ëó÷øå òåêóùåãî, êîððåêòèðóåì ïîñëåäíèé if (Ask<=nextstair) { if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) { if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration())) Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError()); } } /* else { if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration())) Print("Íå óäàëîñü ìîäèôèöèðîâàòü ñòîïëîññ îðäåðà ¹",OrderTicket(),". Îøèáêà: ",GetLastError()); }*/ } }
Sample
Analysis
Market Information Used:
Series array that contains open prices of each bar
Indicator Curves created:
Indicators Used:
Relative strength index
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It can change open orders parameters, due to possible stepping strategy
Other Features: