//+------------------------------------------------------------------+ //| 1111111.mq4 | //| vdn_gol | //| mobipart.com.ua@mail.ru | //+------------------------------------------------------------------+ #property copyright "2005-2014, vdn_gol." #property link "mailto:mobipart.com.ua@mail.ru" /* провести оптимизацию весов провести оптимизацию углов для решения */ input int StepToSafe = 200; // Стоп убыток можно открывать на расстоянии от предыдущего. input int Percent_dep = 5; int TrailingStop = 0; int TrailingStopLoc=0; input int TrailingStop_dop = 20; input int Close_minus = 0; //input int Max_orders =1; //input double Ves_ugla_15=1.0; //input double Ves_ugla_30=1.0; //input double Ves_ugla_60=1.0; //input double Ves_ugla_240=1.0; //input double Ves_ugla_D1=1.0; string comm=""; double Lots=0.01; int InpFastEMA=12; // Fast EMA Period int InpSlowEMA=26; // Slow EMA Period int InpSignalSMA=9; // Signal SMA Period //double OsMA15_0; double Ugol_15; //double OsMA30_0; double Ugol_30; //double OsMA60_0; double Ugol_60; //double OsMA240_0; double Ugol_240; double Ugol_D1; datetime Today=0; int ticket=0; int Id_ticket_Sell=0; int Orders_Buy=0; // кол-во баев int Orders_Sell=0; // кол-во селов int Orders_Buy_without_stop=0; int Orders_Sell_without_stop=0; int OrdersProf=0; //int TimeLifeLastBuy=0; //int TimeLifeLastSell=0; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int init() { return (0); } void OnTick(void) { if(TrailingStopOsMA15_1) Trend_15=1; else Trend_15=-1; int Trend_30=0; if(OsMA30_0>OsMA30_1) Trend_30=1; else Trend_30=-1; int Trend_60=0; if(OsMA60_0>OsMA60_1) Trend_60=1; else Trend_60=-1; int Trend_240=0; if(OsMA240_0>OsMA240_1) Trend_240=1; else Trend_240=-1; // END trend ???? int Trend=0; if(Ugol_15>0 && Ugol_30>0 && Ugol_60>0 && Ugol_240>0 && Ugol_D1>0) Trend=1; // && Ugol_D1>0 если д1 туда же - можно удвоить лоты if(Ugol_15<0 && Ugol_30<0 && Ugol_60<0 && Ugol_240<0 && Ugol_D1<0) Trend=-1; // int Orders_Total=OrdersTotal(); // =================== основной цикл { // ОБХОД ордеров for (int i=1; i<=OrdersTotal(); i++) //Цикл по всем ордерам,.. { //отражённым в терминале if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderSymbol()==Symbol())//Если есть следующий { OrdersProf=OrdersProf+OrderProfit(); // подсч прибыль независимо от типа ордера // ========================== работа с БАЙ ===================== if(OrderType()==OP_BUY) { Orders_Buy++; // TimeLifeLastBuy= TimeCurrent()-OrderOpenTime(); // Print("Orders_Buy "+Orders_Buy); // +++++++++++ +++++++++++ //============== обработка убыточного ордера BUY ================== // если бай в убытке и тренд бай - покупать и расстояние больше 100 пипсов if(DistMarketAndPos("OP_BUY")>StepToSafe && OrderProfit()<0 && Trend<=0 && Orders_Sell_without_stop==0) // да как же дать только 1 ордер { if(Exist_Prot("OP_SELL")==0) // не дать повторов { comm="prot"; SetSell(MyLot(Percent_dep)*1.25,comm); } //Print("Try open Sell Contra"); } // если селл в убытке и тренд селл - покупать //============== КОНЕЦ обработка убыточного ордера ================== // +++++++++++ +++++++++++ // если тренд есть, а ордера в другую сторону - закрываем те, что против тренда if(Trend<0 && OrderProfit()<0 && Close_minus==1) { //--- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Blue)) Print("OrderClose error ",GetLastError()); } // в этом же переборе херачим трейлинг обычный BUY if(Trend>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()Point*TrailingStopLoc) { if(OrderStopLoss()StepToSafe && OrderProfit()<0 && Trend>=0 && Orders_Buy_without_stop==0) { if(Exist_Prot("OP_BUY")==0) // не дать повторов { comm="prot"; SetBuy(MyLot(Percent_dep)*1.25,comm); } //Print("Try open Buy Contra"); } // если селл в убытке и тренд селл - покупать //============== КОНЕЦ обработка убыточного ордера ================== // +++++++++++ +++++++++++ // если тренд есть, а ордера в другую сторону - закрываем те, что против тренда SELL if(Trend>0 && OrderProfit()<0 && Close_minus==1) { //--- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Red)) Print("OrderClose error ",GetLastError()); } // в этом же переборе херачим трейлинг обычный SELL if(Trend<0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop))) { Print("try trail sell "+OrderTicket()+" "+Symbol()); while (IsTradeContextBusy()) Sleep(500); RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red)) Print("OrderModify error ",GetLastError()); } } } // в этом же переборе херачим трейлинг экстрим SELL if(Trend>=0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStopLoc)) { if((OrderStopLoss()>(Ask+Point*TrailingStopLoc)) || (OrderStopLoss()==0)) { Print("try trail Sell Ext3 "+OrderTicket()+" "+Symbol()+" Ask="+Ask+" to "+NormalizeDouble(Ask+Point*TrailingStopLoc,Digits)); while (IsTradeContextBusy()) Sleep(500); RefreshRates(); if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStopLoc,Digits),OrderTakeProfit(),0,Red)) Print("OrderModify error ",GetLastError()); } } } } } } // ====================== постановка ордеров /////////////////if(Orders_Total60*60*Delay)) { comm="radian"; SetBuy(MyLot(Percent_dep),comm); } // если селл и нет ордера - ставим. тянем дальний тп if((Trend==-1 && Orders_Sell_without_stop==0)) // - задержка в 10 минут от последнего ордера || (Trend==-1 && (TimeLifeLastSell==0 || TimeLifeLastBuy>60*60*Delay)) { comm="radian"; SetSell(MyLot(Percent_dep),comm); } } // ====================== конец постановка ордеров } // =================== КОНЕЦ основной цикл string mess="Ugol_15 = "+DoubleToString(Ugol_15,8)+"\n Ugol_30 = "+DoubleToString(Ugol_30,8)+"\n Ugol_60 = "+DoubleToString(Ugol_60,8)+"\n Ugol_240 = "+DoubleToString(Ugol_240,8)+"\n Ugol_D1 = "+DoubleToString(Ugol_D1,8)+"\n Free = "+DoubleToString(AccountFreeMargin(),2)+"\n % lot="+MyLot(Percent_dep)+"\n Orders_Buy="+Orders_Buy+" (W/o Sl) "+Orders_Buy_without_stop+"\n Orders_Sell="+Orders_Sell+" (W/o Sl) "+Orders_Sell_without_stop+"\n Prof="+OrdersProf; Comment(mess); } // =========== ФУНКЦИИ =========== double MyLot(double Percent_dep2) { double One_Lot = MarketInfo(Symbol(),MODE_MARGINREQUIRED); double Stepx = MarketInfo(Symbol(),MODE_LOTSTEP); double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT); double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT); Lots=MathFloor(AccountFreeMargin()*Percent_dep2/100/One_Lot/Stepx)*Stepx; if(LotsMax_Lot) Lots=Max_Lot; // ========== наличие свободных денег для открытия ордеров =============== if((Lots)*One_Lot>AccountFreeMargin()) { // Print("Нет свободных средств для открытия ордера"); return(0); } return (Lots); } void SetBuy(double Lots2,string comm2) { ticket=OrderSend(Symbol(),OP_BUY,Lots2,Ask,3,0,0,comm2,16384,0,Blue); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return; } void SetSell(double Lots2,string comm2) { ticket=OrderSend(Symbol(),OP_SELL,Lots2,Bid,3,0,0,comm2,16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return; } int DistMarketAndPos(string op) { // определение расстояния от цены до ордера double p=MarketInfo(Symbol(), MODE_POINT); if (p==0) if (StringFind(Symbol(), "JPY")<0) p=0.0001; else p=0.01; double d; int i, k=OrdersTotal(), r=1000000; for (i=0; id) r=NormalizeDouble(d, 0); //Print(OrderTicket()+" расст = "+r); } if (OrderType()==OP_SELL && op=="OP_SELL") { d=MathAbs(OrderOpenPrice()-MarketInfo(Symbol(), MODE_BID))/p; if (r>d) r=NormalizeDouble(d, 0); //Print(OrderTicket()+" расст = "+r); } } } } //Print(op+" >> "+Symbol()+" расст = "+r); return(r); } int Exist_Prot(string op) { // определение расстояния от цены до ордера double prot_exist=0; int i, k=OrdersTotal(); for (i=0; i