//+------------------------------------------------------------------+ //| ****.mq4 | //| BARS | //| www.*********.ru | //+------------------------------------------------------------------+ #property copyright "BARS-Alligator" #property link "****" // Эксперт работает по "Ценам открытия". // Экперт способен работать при открытии позиций в условиях рыночного // исполнения торговых заявок Market Watch , - WHС, BROCO и т.п. // Добавлен встроенный блок ММ (корректно работает только на валютах). // Предусмотрен запрет одноименных сделок на одном баре более одной - // - применена ф-я И.Кима NumberOfBarOpenLastPos(). // Эксперт адаптирован под условия Чемпионата Роботов 2008 по // количеству ордеров и лотов. //---- input parameters extern int Magic=5675; extern int Orders =3; extern int StopLoss=50; extern int TakeProfit=50; extern string ___= "Параметры инд. Аллигатор"; extern int JawsPeriod=13; extern int JawsShift=8; extern int TeethPeriod=8; extern int TeethShift=5; extern int LipsPeriod=5; extern int LipsShift=3; extern string ____= "Параметры Трейлинг стопа"; extern bool UseTrailing = true;//выключатель трейлинга extern int lMinProfit = 40;//порог трала длинных поз extern int lTrailingStop = 50;//размер трала длинных поз extern int lTrailingStep = 5;// шаг трала extern int sMinProfit = 40;//порог трала коротких поз extern int sTrailingStop = 50;//размер трала коротких поз extern int sTrailingStep = 5; //шаг трала extern string ______= "Параметры блока MoneyManagement"; extern double Lots = 0.1; extern bool MoneyManagement=true; extern int MarginPercent=3; //---------------------------------- double SL,TP; int ticket; double lots; static int prevtime = 0; //-- Подключаемые модули -- //#include // библиотека ММ #include #include //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим prevtime = Time[0]; // Свежий бар, запоминаем время //---- if (UseTrailing) TrailPositions(); //трейлинг стоп // Объявляем переменные int total, cnt; double MA1,MA2,MA3,MA4,MA5,MA6; int err; // double lots; // Вычисляем начальные параметры индикаторов для поиска условий входа MA1 = iAlligator(NULL, 0, JawsPeriod, JawsShift, TeethPeriod, TeethShift, LipsPeriod, LipsShift, MODE_SMMA, PRICE_CLOSE, MODE_GATORLIPS, 1); // зелёная MA2 = iAlligator(NULL, 0, JawsPeriod, JawsShift, TeethPeriod, TeethShift, LipsPeriod, LipsShift, MODE_SMMA, PRICE_CLOSE, MODE_GATORTEETH, 1); // красная линия MA3 = iAlligator(NULL, 0, JawsPeriod, JawsShift, TeethPeriod, TeethShift, LipsPeriod, LipsShift, MODE_SMMA, PRICE_CLOSE, MODE_GATORTEETH, 2); // красная MA4 = iAlligator(NULL, 0, JawsPeriod, JawsShift, TeethPeriod, TeethShift, LipsPeriod, LipsShift, MODE_SMMA, PRICE_CLOSE, MODE_GATORLIPS, 2); // зелёная MA5 = iAlligator(NULL, 0, JawsPeriod, JawsShift, TeethPeriod, TeethShift, LipsPeriod, LipsShift, MODE_SMMA, PRICE_CLOSE, MODE_GATORJAW , 1); /// синия линия. MA6 = iAlligator(NULL, 0, JawsPeriod, JawsShift, TeethPeriod, TeethShift, LipsPeriod, LipsShift, MODE_SMMA, PRICE_CLOSE, MODE_GATORJAW , 2); /// синия линия. total=OrdersTotal(); Comment( LotsCounting() ); //======================================================================= // Проверка средств if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //============Открытие позиций ======================================= if ( NumberOfPositions(NULL , -1, Magic )=MA5 && MA40) SL=Ask-Point*StopLoss; if(TakeProfit>0) TP=Ask+Point*TakeProfit; lots=LotsCounting(); ticket=WHCOrderSend(Symbol(),OP_BUY,lots,Ask,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Green); if(ticket < 0) { Print("Ошибка открытия ордера BUY #", GetLastError()); Sleep(10000); prevtime = Time[1]; return (0); } } } //================================================================= // Проверка условий для совершения сделки селл if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELL, Magic) ==0) {//запрет неск. поз на одном баре if(MA1<=MA5&& MA4>MA6 )//продаем { SL=0;TP=0; if(StopLoss>0) SL=Bid+Point*StopLoss; if(TakeProfit>0) TP=Bid-Point*TakeProfit; lots=LotsCounting(); ticket=WHCOrderSend(Symbol(),OP_SELL,lots,Bid,3,SL,TP,"Продаем- тра-ля-ля",Magic,0,Red); if(ticket < 0){ Print("Ошибка открытия ордера SELL #", GetLastError()); Sleep(10000); prevtime = Time[1]; return (0); } } } //===================================================================== } //если открытых позиций менее Orders //============ конец блока открытия позиций =========================== //================Закрытие позиций===================================== //---------------------------------------------------------------------- for ( int v = OrdersTotal() - 1; v >= 0; v -- ) { if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { //----------------------------------------------------- if (OrderType() == OP_BUY) { if((MA1<=MA2&&MA4>MA3&& OrderProfit( ) >=0)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Yellow); // закрываем позицию // return(0); // выходим } } //-------------------------------------------------------- if (OrderType() == OP_SELL) { if(MA1>=MA2&&MA4=0) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow); // закрываем позицию // return(0); // выходим } } //------------------------------------------------------- } // Symbol() } // select } //total //================== Конец блока закрытия ============================= return(0); } //ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ Конец функции int start() ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ void TrailPositions() {// функция трейлинг стоп int Orders = OrdersTotal(); for (int i=0; i lMinProfit*Point) { if (OrderStopLoss() < Bid-(lTrailingStop+lTrailingStep-1)*Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid-lTrailingStop*Point, OrderTakeProfit(), 0, Blue); }}} if (OrderType() == OP_SELL && OrderMagicNumber()==Magic) { if (OrderOpenPrice()-Ask > sMinProfit*Point) { if (OrderStopLoss() > Ask+(sTrailingStop+sTrailingStep-1)*Point || OrderStopLoss() == 0) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask+sTrailingStop*Point, OrderTakeProfit(), 0, Blue); }}}} } //------------------------------------------------------------------------------+ //======================== Блок ММ ============================================== //ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ double LotsCounting() { double lots=Lots; if (MoneyManagement) { double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE); double freemargin=AccountFreeMargin(); lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),1); Comment(NormalizeDouble((MarginPercent*freemargin/lotsize),1)); } if (lots>5) lots=4.9; if (lots<0.1) lots=0.1;return (lots); } //ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ // Функция orders for WHC - //Для открытие позиций в условиях рыночного исполнения торговых заявок Market Watch int WHCOrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration, color arrow_color) { int ticket = OrderSend(symbol,cmd, volume, price, slippage, 0, 0, comment, magic, expiration, arrow_color); int check = -1; if (ticket > 0 && (stoploss != 0 || takeprofit != 0)) { if (!OrderModify(ticket, price, stoploss, takeprofit,expiration, arrow_color)) { check = GetLastError(); if (check != ERR_NO_ERROR) { Print("OrderModify error: ", ErrorDescription(check)); } } } else { check = GetLastError(); if (check != ERR_NO_ERROR){ Print("OrderSend error: ",ErrorDescription(check)); } } return (ticket); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if (sy=="0") sy=Symbol(); for (i=0; i