#property link "www.fxgeneral.com" extern int slip=5; extern int MaxSPREAD=5; extern bool Reverse=false; extern int ExtDepth = 12; extern int ExtDeviation = 5; extern int ExtBackstep = 3; extern int _point = 1; //extern double _lots = 0.1; extern int _takeProfit = 94; extern int _stopLoss = 65; extern int BBUSize = 10; extern int BBUSizepip = 4; extern int MAGICMA=20100612; extern bool TrailingStopFr = false; //true трейлинг по фракталам // MM start extern string MM_SETUP = "Money managment setup"; extern string _s1 = "redefinition minLot, maxLot, stepLot - if = 0, autodefinition"; extern double s_minLot = 0.1; //можем переопределить минимальный, максимальный размер лота и шаг лота - если оставить ноль, то автоматическое определение extern double s_maxLot = 0; extern double s_stepLot = 0.1; extern string s2="---"; extern double DecreaseFactor = 3; //эта штука уменьшает возможные потери при серии убыточных сделок, уменьшая лот до минимума. extern string _s2 = "Percent of free margin"; extern double MaximumRisk = 60; //можем работать процентом от свободных средств. extern string _s3 = "or fixed lot"; extern bool fixedLots = false; //или фиксированным лотом, если здесь поставим true extern double Lot = 0.1; //а тут размер фиксированного лота double minLot; double stepLot; double maxLot; double _lastExtremum=0.0; double _currentExtremum=0.0; double _previousExtremum=0.0; int _extType=-1; double _workLots=0.0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { minLot = s_minLot; stepLot = s_stepLot; maxLot = s_maxLot; if (s_minLot == 0) { Print("Автоматическое определение минимального лота"); Comment("Автоматическое определение минимального лота"); minLot = MarketInfo(Symbol(),MODE_MINLOT); } Print("Размер минимального лота: " + minLot); Comment("Размер минимального лота: " + minLot); Print("---"); if (s_maxLot == 0) { Print("Автоматическое определение максимального лота"); Comment("Автоматическое определение максимального лота"); maxLot = MarketInfo(Symbol(),MODE_MAXLOT); } Print("Размер максимального лота: " + maxLot); Comment("Размер максимального лота: " + maxLot); Print("---"); if (s_stepLot == 0) { Print("Автоматическое определение минимального шага лота"); Comment("Автоматическое определение минимального шага лота"); stepLot = MarketInfo(Symbol(),MODE_LOTSTEP); } Print("Размер минимального шага лота: " + stepLot); Comment("Размер минимального шага лота: " + stepLot); Print("---"); return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int err1; int start() { int spr=MarketInfo(Symbol(),MODE_SPREAD); int ticket=0; double _sl=0.0, _tp=0.0; double _price=0.0; if (TrailingStopFr) TrailingStop(); if(BBUSize>0){err1=BBU();} //---- if (Volume[0]>1) return; _lastExtremum=GetExtremumZZPrice(1); Comment (_lastExtremum); if(!Reverse) { if (Close[0]<_lastExtremum){ if (_extType!=OP_BUYSTOP){ _CheckOrder(OP_BUYSTOP); _price=NormalizeDouble((_lastExtremum+_point*Point),Digits); if (_stopLoss>0) _sl=NormalizeDouble(_price-_stopLoss*Point,Digits); if (_takeProfit>0) _tp=NormalizeDouble(_price+_takeProfit*Point,Digits); _extType=OP_BUYSTOP; if(spr<MaxSPREAD) ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0); } } if (Close[0]>_lastExtremum){ if (_extType!=OP_SELLSTOP){ _CheckOrder(OP_SELLSTOP); _price=NormalizeDouble((_lastExtremum-_point*Point),Digits); if (_stopLoss>0) _sl=NormalizeDouble(_price+_stopLoss*Point,Digits); if (_takeProfit>0) _tp=NormalizeDouble(_price-_takeProfit*Point,Digits); _extType=OP_SELLSTOP; if(spr<MaxSPREAD) ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0); } } } if(Reverse) { if (Close[0]<_lastExtremum){ if (_extType!=OP_SELLLIMIT){ _CheckOrder(OP_SELLLIMIT); _price=NormalizeDouble((_lastExtremum+_point*Point),Digits); if (_stopLoss>0) _sl=NormalizeDouble(_price+_stopLoss*Point,Digits); if (_takeProfit>0) _tp=NormalizeDouble(_price-_takeProfit*Point,Digits); _extType=OP_SELLLIMIT; if(spr<MaxSPREAD) ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0); } } if (Close[0]>_lastExtremum){ if (_extType!=OP_BUYLIMIT){ _CheckOrder(OP_BUYLIMIT); _price=NormalizeDouble((_lastExtremum-_point*Point),Digits); if (_stopLoss>0) _sl=NormalizeDouble(_price-_stopLoss*Point,Digits); if (_takeProfit>0) _tp=NormalizeDouble(_price+_takeProfit*Point,Digits); _extType=OP_BUYLIMIT; if(spr<MaxSPREAD) ticket=OrderSend(Symbol(),_extType,fLots(),_price,slip,_sl,_tp,0,MAGICMA,0,0); } } } //---- return(0); } //+------------------------------------------------------------------+ double GetExtremumZZPrice(int ne=0) { double zz; int i, k=iBars(Symbol(), 0), ke=0; for (i=1; i<k; i++) { zz=iCustom(Symbol(),0, "ZigZag", ExtDepth,ExtDeviation,ExtBackstep,0,i); if (zz!=0) { ke++; if (ke>ne) return(zz); } } return(0); } //+------------------------------------------------------------------+ int _CheckOrder(int _checkType=0){ int i; if (OrdersTotal()>0){ for (i=0; i<=OrdersTotal()-1; i++){ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ if (OrderType()==_checkType && OrderMagicNumber()==MAGICMA) OrderDelete(OrderTicket()); } } } return(0); } //+------------------------------------------------------------------+ int BBU() {//описание функции http://fxnow.ru/blog/programming_mql4/2.html int i;bool err; for( i=1; i<=OrdersTotal(); i++) { if(OrderSelect(i-1,SELECT_BY_POS)==true) { if(BBUSize>0 && OrderType()==OP_BUY && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA && OrderStopLoss()<OrderOpenPrice()) { if(Bid-OrderOpenPrice()>=BBUSize*Point && BBUSize>0 ) { Print("ПОРА В БезуБыток"); err=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BBUSizepip*Point,OrderTakeProfit(),0,Green); if(err==false){return(-1);} }//if(Bid-OrderOpenPrice() }//if(BBUSize>0 }//if(OrderSelect(i if(OrderSelect(i-1,SELECT_BY_POS)==true) { if(BBUSize>0 && OrderType()==OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA && (OrderStopLoss()>OrderOpenPrice() || OrderStopLoss()==0)) { if(OrderOpenPrice()-Ask>=BBUSize*Point && BBUSize>0) { Print("ПОРА В БезуБыток"); err=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BBUSizepip*Point,OrderTakeProfit(),0,Green); if(err==false){return(-1);} }//if(OrderOpenPrice() }//if(BBUSize>0 }// if(OrderSelect }// for( i=1; return(0); } //+------------------------------------------------------------------------------+ //| TrailingStop | //| Copyright © 2010, Хлыстов Владимир | //| cmillion@narod.ru | //+------------------------------------------------------------------------------+ void TrailingStop() { int tip,Ticket; bool error; double StLo,OSL,OOP; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS)==true) { tip = OrderType(); if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { OSL = OrderStopLoss(); OOP = OrderOpenPrice(); Ticket = OrderTicket(); if (tip==OP_BUY) { StLo = NormalizeDouble(SlLastBar(1,Bid),Digits); if (StLo==0) continue; if (StLo < OOP) continue; if (StLo > OSL) { error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,DeepPink); if (!error) Print("Error order ",Ticket," TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo); else Print("TrailingStopFR ",Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); } } if (tip==OP_SELL) { StLo = NormalizeDouble(SlLastBar(-1,Ask),Digits); if (StLo==0) continue; if (StLo > OOP) continue; if (StLo < OSL || OSL==0 ) { error=OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,DeepPink); if (!error) Print("Error order ",Ticket," TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo); else Print("TrailingStopFR "+Ticket," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); } } } } } } //-------------------------------------------------------------------- double SlLastBar(int tip,double price) { double fr; int i; int STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL); if (tip== 1) { for (i=2; i<100; i++) { fr = iFractals(NULL,0,MODE_LOWER,i); if (fr!=0) {if (price-STOPLEVEL*Point > fr) return(fr);} else return(0); } } if (tip==-1) { for (i=2; i<100; i++) { fr = iFractals(NULL,0,MODE_UPPER,i); if (fr!=0) {if (price+STOPLEVEL*Point < fr) return(fr);} else return(0); } } } //-------------------------------------------------------------------- double fLots() { if (fixedLots) return(Lot); return(LotsOptimized()); } double LotsOptimized() { double z_lot; int z_orders=HistoryTotal(); // history orders total int z_losses=0; // number of losses orders without a break //---- select lot size z_lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/100/1000.0,2); //---- calcuulate number of losses orders without a break if(DecreaseFactor>0) { for(int z_i=z_orders-1;z_i>=0;z_i--) { if(OrderSelect(z_i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) z_losses++; } if(z_losses>1) z_lot=NormalizeDouble(z_lot-z_lot*z_losses/DecreaseFactor,1); } //---- return lot size z_lot=NormalizeDouble(z_lot/stepLot,0)*stepLot; if(z_lot<minLot) z_lot=minLot; if(z_lot>maxLot) z_lot=maxLot; return(z_lot); }
Комментарии к исходному коду форекс советника e-Droba-ZigZag_V2.01.mq4
В целях безопасности и борьбы со спамом в тексте комментариев запрещено размещать html-теги и ссылки. Благодарим за понимание.