//+------------------------------------------------------------------+ //| серия простой советник | //| Copyright © 2009, Хлыстов Владимир | //| cmillion@narod.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Хлыстов Владимир" #property link "cmillion@narod.ru" //-------------------------------------------------------------------- /*Продажа: -Цена ниже MA (желательно возможность настроить параметры) -MACD пересекаетнулевую линию сверху вниз (после закрытия бара, он становиться сигнальным)(желательны настройки параметров MACD) -Продажа осуществляется после пробития минимума сформировавшегося сигнального бара -СтопЛосс ставиться за максимумом сигнального бара (но не больше 60п) -Тейк +100 пп(настройки не помешают) -Трейлинг стоп. При достижении профита +50(желательно настройки), стоп в безубыток и далее обычный следящий стоп (с возможностью в настройках отключить его) -Закрытие позиции. Если MACD пересекает нулевую линию обратно*/ //-------------------------------------------------------------------- extern string параметры.МА = ""; extern int period_MA = 100, //Период усреднения для вычисления скользящего среднего. ma_method = MODE_SMA, //Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average). applied_price_МА = PRICE_CLOSE; //Используемая цена. Может быть любой из ценовых констант. extern string параметры.МАCD = ""; extern int fast_ema_period = 12, //Период усреднения для вычисления быстрой скользящей средней. slow_ema_period = 26, //Период усреднения для вычисления медленной скользящей средней. signal_period = 9, //Период усреднения для вычисления сигнальной линии. applied_price_МАCD = PRICE_CLOSE; //Используемая цена. Может быть любой из ценовых констант. extern string параметры.советника = ""; extern int MAXstoploss = 60, takeprofit = 100, TrailingStop = 50, Magic = 123, //уникальный номер ордеров этого советника, если 0 то ведет все ордера, в том числе выставленные вручную slippage = 3; //Максимально допустимое отклонение цены для рыночных ордеров extern double Lot = 0.1; extern string comment = "cmillion@narod.ru"; //-------------------------------------------------------------------- int start() { bool b,s; int tip; for (int j=0; j0||s>0)&&TrailingStop>=STOPLEVEL) TrailingStop(TrailingStop); double MA = iMA(NULL,0,period_MA,ma_method,ma_method,applied_price_МА,0); double MACD0 = iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price_МАCD,MODE_MAIN,1); double MACD1 = iMACD(NULL,0,fast_ema_period,slow_ema_period,signal_period,applied_price_МАCD,MODE_MAIN,2); double SL,TP; if (MACD1<0&&MACD0>0) CLOSEORDER(-1); if (MACD1>0&&MACD0<0) CLOSEORDER(1); if (MA0&&!b&&Bid>High[1]) { if (takeprofit>=STOPLEVEL) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0; if (MAXstoploss >=STOPLEVEL) { if (NormalizeDouble((Bid-Low[1])/Point,Digits)>MAXstoploss) SL = NormalizeDouble(Bid - MAXstoploss*Point,Digits); else if (NormalizeDouble((Bid-Low[1])/Point,Digits)>=STOPLEVEL) SL = NormalizeDouble(Low[1],Digits); } OPENORDER (1,SL,TP); } if (MA>Ask&&MACD1>0&&MACD0<0&&!s&&Ask=STOPLEVEL) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0; if (MAXstoploss>=STOPLEVEL) { if (NormalizeDouble((High[1]-Ask)/Point,Digits)>MAXstoploss) SL = NormalizeDouble(Ask + MAXstoploss*Point,Digits); else if (NormalizeDouble((High[1]-Ask)/Point,Digits)>=STOPLEVEL) SL = NormalizeDouble(High[1],Digits); } OPENORDER (-1,SL,TP); } return(0); } //-------------------------------------------------------------------- bool OPENORDER(int ord,double SL,double TP) { int error,err; while (true) { error=true; if (ord== 1) error=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,comment,Magic,0,Blue); if (ord==-1) error=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,SL,TP,comment,Magic,0,Red); if (error==-1) { Print("===> OPENORDER Error ",GetLastError()); err++;Sleep(2000);RefreshRates(); } else return(1); if (err >10) return(0); } return; } //-------------------------------------------------------------------- bool CLOSEORDER(int ord) { bool error; int err; double profit; while (true) { error=true; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { profit = OrderProfit()+OrderSwap()+OrderCommission(); if (OrderType()==OP_BUY && ord>-1) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,Blue); if (!error) {Print("===> CLOSEORDER Error ",GetLastError()," ",OrderTicket());continue;} else Alert("===> CLOSEORDER ",OrderTicket()," прибыль ",profit); } if (OrderType()==OP_SELL && ord<1) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,Red); if (!error) {Print("===> CLOSEORDER Error ",GetLastError()," ",OrderTicket());continue;} else Alert("===> CLOSEORDER ",OrderTicket()," прибыль ",profit); } } } } if (!error) {err++;Sleep(2000);RefreshRates();} if (error || err >= 10) return(error); } } //-------------------------------------------------------------------- void TrailingStop(int tral) { int tip,Ticket; double StLo,OSL,OOP; for (int i=0; i OSL && StLo > OOP) if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White)) Print("===> TrailingStop Error ",GetLastError()," Order buy ",Ticket," Price ",OOP," SL ",OSL,"->",StLo); else Print("===> TrailingStop Order sell ",Ticket," Price ",OOP," SL ",OSL,"->",StLo); } if (tip==OP_SELL) { StLo = NormalizeDouble(Ask + tral*Point,Digits); if (StLo <= OOP && (StLo < OSL || OSL==0)) if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White)) Print("===> TrailingStop Error ",GetLastError()," Order sell ",Ticket," Price ",OOP," SL ",OSL,"->",StLo); else Print("===> TrailingStop Order sell ",Ticket," Price ",OOP," SL ",OSL,"->",StLo); } } } } } //--------------------------------------------------------------------