//+------------------------------------------------------------------+ //| Executer_AC.mq4 | //| Copyright © 2006, Alex Sidd (Executer) | //| mailto:work_st@mail.ru | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Äàííûé ñîâåòíèê íàïèñàí íà îñíîâå ñîâåòíèêà MACD Sample. | //+------------------------------------------------------------------+ extern double TakeProfit = 120; //ïðîôèò extern double Lots = 0.9; //êîë-âî âûñòàâëÿåìûõ ëîòîâ extern double TrailingStop = 30; //òðåéëèíã ñòîï extern double StopLoss = 70; extern double DecreaseFactor = 80; extern double MaximumRisk = 0.014; extern double MaximumLots = 100; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double GetSizeLot() //îïòèìèçàöèÿ ëîòîâ { double Lot = Lots; int cycle; int prof = 0; int orders = HistoryTotal(); // history orders total int losses = 0; // number of losses orders without a break int vinn = 0; int i = orders; //---- select lot size Lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk / 100, 1); //---- if(AccountFreeMargin() <= 14) DecreaseFactor = 14; //---- if(AccountFreeMargin() > 10000) DecreaseFactor = 60; //---- if(DecreaseFactor > 0 && orders > DecreaseFactor) { //---- for(cycle = 1; cycle < DecreaseFactor; cycle++) { i--; //---- if(OrderSelect(i, SELECT_BY_TICKET, MODE_HISTORY) == false) { Print("Error in history!"); break; } //---- if(OrderCloseTime()>0) { prof = prof + OrderProfit(); if(OrderProfit() <= 0 ) losses++; else vinn++; } } if(prof <= 0 && losses > vinn) Lot = 0.1; if(prof <=0 && vinn > losses) Lot = Lot - (0.1*losses); if(prof > 0 && losses > vinn) { Lot = Lot + (0.1*NormalizeDouble(vinn / 4, 0.1)); } if(prof > 0 && losses <= vinn ) { Lot = Lot + (0.1*NormalizeDouble(vinn / 2, 0.1)); } } if(AccountFreeMargin() < 300 || Lot < 0.1) Lot = 0.1; if(Lot*1275 >= AccountFreeMargin()) Lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk / 100, 1); if(MaximumLots != 0 && Lot > MaximumLots) Lot = MaximumLots; if(DecreaseFactor > orders) Lot = Lots; return(Lot); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double ACCur, ACPrev, ACPrev2, ACPrev3; int cnt, ticket, total; // iAC - îñöèëëÿòîð óñêîðåíèÿ-çàìåäëåíèÿ. // Ñèíòàêñèñ: iAC( shift ) // Ïàðàìåòð: shift - ñìåùåíèå îòíîñèòåëüíî òåêóùåãî áàðà (êîëè÷åñòâî ïåðèîäîâ // íàçàä), îòêóäà íóæíî áðàòü äàííûå. if(Bars < 100) { Print("Áàðîâ ìåíüøå 100"); return(0); } if(TakeProfit < 10) { Print("TakeProfit ìåíüøå ÷åì 10"); return(0); // check TakeProfit } ACCur = iAC(NULL, 0, 1); ACPrev = iAC(NULL, 0, 2); ACPrev2 = iAC(NULL, 0, 3); ACPrev3 = iAC(NULL, 0, 4); total = OrdersTotal(); // ïðîâåðÿåì åñòü ëè îòêðûòûå ïîçèöèè if(total < 1) { if(AccountFreeMargin() < (500*Lots)) // ïðîâåðÿåì äåíåæêè íà ñ÷åòó { Print("Äåíåã ïî÷òè íåò, îñòàëîñü âñåãî: ", AccountFreeMargin()); return(0); } // ïðîâåðÿåì îòêðûòèå ïîçèöèè íà ïîêóïêó if(ACCur > 0 && ACPrev > 0) { // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïîêóïêó if(ACCur > ACPrev && ACPrev > ACPrev2) { OrderSend(Symbol(), OP_BUY, GetSizeLot(), Ask, 3, Ask - StopLoss*Point, Ask + TakeProfit*Point, "AC expert", 16384, 0, Green); return(0); } // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïðîäàæó if(ACCur < ACPrev && ACPrev < ACPrev2 && ACPrev2 < ACPrev3) { OrderSend(Symbol(), OP_SELL, GetSizeLot(), Bid, 3, Bid + StopLoss*Point, Bid - TakeProfit*Point, "AC expert", 16384, 0, Red); return(0); } } if(ACCur < 0 && ACPrev < 0) { // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïîêóïêó if(ACCur > ACPrev && ACPrev > ACPrev2 && ACPrev2 > ACPrev3) { OrderSend(Symbol(), OP_BUY, GetSizeLot(), Ask, 3, Ask - StopLoss*Point, Ask + TakeProfit*Point, "AC expert", 16384, 0, Green); return(0); } // ïðîâåðÿåì âîçìîæíîñòü îòêðûòèÿ íà ïðîäàæó if(ACCur < ACPrev && ACPrev < ACPrev2) { OrderSend(Symbol(), OP_SELL, GetSizeLot(), Bid, 3, Bid + StopLoss*Point, Bid - TakeProfit*Point, "AC expert", 16384, 0, Red); return(0); } } if(ACCur > 0 && ACPrev < 0) { OrderSend(Symbol(), OP_BUY, GetSizeLot(), Ask, 3, Ask - StopLoss*Point, Ask + TakeProfit*Point, "AC expert", 16384, 0, Green); return(0); } if(ACCur < 0 && ACPrev > 0) { OrderSend(Symbol(), OP_SELL, GetSizeLot(), Bid, 3, Bid + StopLoss*Point, Bid - TakeProfit*Point, "AC expert", 16384, 0, Red); return(0); } return(0); } for(cnt = 0; cnt < total; cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType() <= OP_SELL && // ïðîâåðêà îòêðûòîé ïîçèöèè OrderSymbol() == Symbol()) // ïðîâåðêà ñ íàøåãî ëè îíà ãðàôèêà { if(OrderType() == OP_BUY) // åñëè îòêðûòà ïîçèöèÿ íà ïîêóïêó { // íàäî ëè åå çàêðûòü? if(ACCur < ACPrev) { OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet); // çàêðûëè return(0); // ñâàëèâàåì } // íóæíî ëè äâèãàòü òðåéëèíã ñòîï if(TrailingStop > 0) { if(Bid - OrderOpenPrice() > Point*TrailingStop) { if(OrderStopLoss() < Bid - Point*TrailingStop) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point*TrailingStop, OrderTakeProfit(), 0, Green); return(0); } } } } else // åñëè ýòà ïîçèöèÿ íà ïðîäàæó { // íàäî ëè çàêðûòü? if(ACCur > ACPrev) { OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet); // çàêðûëè return(0); // âûõîä } // íóæîí ëè òðåéëèíãñòîïèíã if(TrailingStop > 0) { if((OrderOpenPrice() - Ask) > (Point*TrailingStop)) { if((OrderStopLoss() > (Ask + Point*TrailingStop)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point*TrailingStop, OrderTakeProfit(), 0, Red); return(0); } } } } } } return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Bill Williams Accelerator/Decelerator oscillator
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
Other Features: