论坛全局菜单下方 - TICKMILL 285X70论坛全局菜单下方 - ThinkMarkets285X70论坛全局菜单下方 - 荔枝返现285X70论坛全局菜单下方 -  icmarkets285X70
查看:2073回复:0
草龙
注册时间2004-12-17
[MT4-EA]bouncingPipEA_mpower
楼主发表于:2014-02-10 16:50只看该作者倒序浏览
1楼 电梯直达
电梯直达
/ / | EA的程序员 - / / |的项目如下: / / |完成1。锯齿形箭头见面,确认由随机,当它穿越 / / |添加很多其他的过滤器中的线程讨论 / / | Done(完成)2。 XX点后移动S / L。它往上走XX点后跟踪 / / |这是延迟追踪止损 / / | Done(完成)3。 S / L是xxpips。 / / | Done(完成)4。一套以利润= XX点... / / |零效果更好 / / | Done(完成)5。集资金管理 - 在XX很多股票达到万美元为XXXXX后进入 / / | 6。设置部分止盈 - 在XX点 / / | / / |添加代码来检查适当票值 / / |在从服务器或功率损耗断开 / / |门票是从服务器检索如有立场是开放的 / / | / / | 2007/9/18修改过滤逻辑,让超过1过滤器 / / |添加检查过滤指标或逻辑退出行业 / / |缺省选择退出,从原来的代码曲折 / / ------------------------------------------------ ------------------//+------------------------------------------------------------------+ //| bouncingPipEA_mpower.mq4 | //| Copyright ? 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //| //| Originally coded for mPower by Zmax and modified by Robert Hill //| using ideas posted at forex-tsd thread Follow The Bouncing Pip //| //| confirm entry using stochastic 14,3,3. //| take profit default 30pips changed to 0 to allow exit at signal //| from arrow and nonlagzigzag //| //| the trade is trigger when the arrow meet non lag zigzag and //| after stochastic cross. //| Added other tests to check including Heiken Ashi, Heiken Ashi Smoothed //| CCI, nonlagdot, and QQE //| //| for EA programmer - //| the entry is as follows: //| Done 1. zigzag + arrow meet,confirmation by stochastic -when it cross //| Added many other filters as discussed in the thread //| Done 2. move the S/L after xx pips. trail after its going up xx pips //| This is the delayed trailing stop //| Done 3. S/L is xxpips. //| Done 4. set take profit = xx pips... //| zero works better //| Done 5. set money management - enter at xx lot after equity reach usd xxxxx //| 6. set partial take profit - at xx pips //| //| Added code to check for proper ticket value //| in case of disconnect from server or power loss //| Ticket is retrieved from the server if any positions are open //| //| 9/18/2007 Modified filter logic to allow more than 1 filter //| Added checking filter indicators as OR logic for exiting trades //| Default exit is ZigZag from original code //+------------------------------------------------------------------+ #property copyright "Copyright ? 2007, mpower, Zmax and Robert Hill" #property link "None" #include #include // MoneyManagement method #define NONE 1 #define NIX 2 #define BURNS 3 #define NIX2 4 // Trend #define LONG 1 #define SHORT -1 #define FLAT 0 // Filter Method #define NO_FILTER 1 #define HA_FILTER 2 #define HAS_FILTER 3 #define STOCH_FILTER 4 #define CCI_FILTER 5 #define DOT_FILTER 6 #define QQE_FILTER 7 #define NONLAGMA_FILTER 8 extern bool Debug = false; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ extern int MagicID = 12345; extern string MoneyManagement = "-------------------------------------"; extern double Lots = 0.1; extern string mm0 = "MM Method"; extern string mm1 = " 1. Use Lots"; extern string mm2 = " 2. NIX version"; extern string mm3 = " 3. Burn0050 version"; extern string mm4 = " 4. NIX new version w/stoploss"; extern int MM_Method = 2; extern bool AccountIsMini = true; extern double Risk = 10; // percent extern double MIN_lots = 0.1; extern double MAX_lots = 5; extern string s0 = "---StopLoss Method---"; extern string s1 = " 1. User Input"; extern string s2 = " 2. Candle High/Low + UserInput"; extern string s3 = " 3. Candle High/Low + Spread"; extern int StopLossMethod = 2; extern int StopLoss = 30; extern int TakeProfit=0; extern string z0 = "---ZigZag settings---"; extern string z1 = "---ZigZag Pointer---"; extern int ExtDepth = 100; extern int ExtDeviation = 75; extern int ExtBackstep = 15; extern string z2 = "NonLagZigZag_v2"; extern int Price = 0; //Apply to Price(0-Close;1-Open;2-High;3-Low;4-Median price;5-Typical price;6-Weighted Close) extern int Length = 100; //Period of NonLagMA extern double PctFilter = 2; //Dynamic filter in decimals extern string f0 = "---FilterMethods---"; extern string f1 = " All useYyy switches require"; extern string f2 = " 0 for false and 1 for true"; extern int useWick = 0; extern int useHA = 0; extern int useHAS = 0; extern int useStoch = 0; extern int useCCI = 0; extern int useNonLagDot = 1; extern int useQQE = 0; extern int useNonLagMA = 0; extern string f3 = "---Exit Methods---"; extern int useZigZag_Exit = 1; extern int useHA_Exit = 0; extern int useHAS_Exit = 0; extern int useStoch_Exit = 0; extern int useCCI_Exit = 0; extern int useNonLagDot_Exit = 0; extern int useQQE_Exit = 0; extern int useNonLagMA_Exit = 0; extern string f = "Wick"; extern int Wick=0; extern string w1 = "Wait how many candles for confirmation"; extern int WaitSignal=3; extern string h1 = "Heiken Ashi Smoothed"; extern string has = "HAS Inputs"; extern int MaMethod = 2; extern int MaPeriod = 6; extern int MaMethod2 = 3; extern int MaPeriod2 = 2; extern string sto0 = "Stochastic Inputs"; extern int K_Period = 14; extern int D_Period = 3; extern int Slowing = 3; extern string sto1 = "Price Mode"; extern string sto2 = " 0 - Low/High"; extern string sto3 = " 1 - Close/Close"; extern int StochPrice = 0; extern int StochBuyLevel = 20; extern int StochSellLevel = 80; extern string cci = "CCI Inputs"; extern int CCI_Period = 34; extern string p = "--Applied Price Types--"; extern string p0 = " 0 = close"; extern string p1 = " 1 = open"; extern string p2 = " 2 = high"; extern string p3 = " 3 = low"; extern string p4 = " 4 = median(high+low)/2"; extern string p5 = " 5 = typical(high+low+close)/3"; extern string p6 = " 6 = weighted(high+low+close+close)/4"; extern int CCI_Price = 5; extern int CCI_BuyCrossLevel = 0; extern int CCI_SellCrossLevel = 0; extern string dt0 = "NonLagDots settings"; extern int NLD_Price = 0; extern int NLD_Length = 20; extern int NLD_Displace = 0; extern int NLD_Filter = 0; extern int NLD_Color = 1; extern int NLD_ColorBarBack = 0; extern double NLD_Deviation = 0; extern string nl0 = "NonLagMA settings"; extern int sPrice = 0; //Apply to Price(0-Close;1-Open;2-High;3-Low;4-Median price;5-Typical price;6-Weighted Close) extern int sLength =55; //Period of NonLagMA int sDisplace = 0; //DispLace or Shift extern double sPctFilter = 0; //Dynamic filter in decimal int sColor = 1; //Switch of Color mode (1-color) int sColorBarBack = 0; //Bar back for color mode extern double sDeviation = 0; //Up/down deviation extern string ts0 = "---TrailingStop Method---"; extern string ts1 = " 1. None"; extern string ts2 = " 2. PriceChannelStop"; extern string ts3 = " 3. Breakeven + Lock"; extern string ts4 = " 4. Delayed at input"; extern string ts5 = " 5. Trail immediately"; extern int TrailingStopMethod = 1; extern string ts6 = "2. PriceChannelStop"; extern int Trigger = 10; extern string ts7 = "3. Breakeven at input settings"; extern double BreakEvenLevel = 30; extern int LockInPips = 5; // Profit Lock in pips extern string ts8 = "4. Delayed at input setting"; extern double BeginTrailingStop = 35; // Change to whatever number of pips you wish to trail your position with. extern int SignalCandle = 1; bool okDownArrow,okUpArrow; int count; int NumOrders = 0; double myStop, myTake; double ZigZagUp,ZigZagDown; double NonLagZigZag; int init(){ count=0; okDownArrow=false; okUpArrow=false; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit(){ return(0); } int getHAS()// return 1 is blue ;-1 is red { double hasOpen, hasClose; hasOpen = iCustom(NULL,0,"Heiken_Ashi_Smoothed",MaMethod,MaPeriod,MaMethod2,MaPeriod2,1,SignalCandle) ; hasClose = iCustom(NULL,0,"Heiken_Ashi_Smoothed",MaMethod,MaPeriod,MaMethod2,MaPeriod2,0,SignalCandle) ; if (hasOpen < hasClose) return(SHORT); if (hasOpen > hasClose) return(LONG); return(FLAT); } int getHA() { double HeikenAshiOpen, HeikenAshiClose; HeikenAshiOpen=iCustom(NULL,0,"Heiken Ashi",2,SignalCandle); HeikenAshiClose=iCustom(NULL,0,"Heiken Ashi",3,SignalCandle); if (HeikenAshiOpen < HeikenAshiClose) return (LONG); //up HA if (HeikenAshiOpen > HeikenAshiClose) return (SHORT); //down HA return(FLAT); } int getStoch() { double StochMain, StochSignal; StochMain = iStochastic(NULL, 0, K_Period, D_Period, Slowing, MODE_SMA, StochPrice, MODE_MAIN, SignalCandle); StochSignal = iStochastic(NULL, 0, K_Period, D_Period, Slowing, MODE_SMA, StochPrice, MODE_SIGNAL, SignalCandle); if (StochMain < StochBuyLevel) { if (StochSignal > StochMain) return (LONG); } if (StochMain > StochSellLevel) { if (StochSignal < StochMain) return (SHORT); } return(FLAT); } int getCCI() { double CCI_Cur, CCI_Prev; CCI_Cur = iCCI(NULL, 0, CCI_Period, CCI_Price, SignalCandle); CCI_Prev = iCCI(NULL, 0, CCI_Period, CCI_Price, SignalCandle); if (CCI_Prev < CCI_BuyCrossLevel && CCI_Cur > CCI_BuyCrossLevel) return(LONG); if (CCI_Prev > CCI_SellCrossLevel && CCI_Cur < CCI_SellCrossLevel) return(SHORT); return(FLAT); } int getNonLagDot() { double NLD_Long, NLD_Short; NLD_Long = iCustom(NULL, 0, "nonlagdot", NLD_Price, NLD_Length,NLD_Displace, NLD_Filter,NLD_Color, NLD_ColorBarBack,NLD_Deviation, 1,SignalCandle); NLD_Short = iCustom(NULL, 0, "nonlagdot", NLD_Price, NLD_Length,NLD_Displace, NLD_Filter,NLD_Color, NLD_ColorBarBack,NLD_Deviation, 2,SignalCandle); if (NLD_Long < 1000) return(LONG); if (NLD_Short < 1000) return(SHORT); return(FLAT); } int getQQE() { double QQE_RsiMa, QQE_TrLevelSlow; double QQE_RsiMaPrev, QQE_TrLevelSlowPrev; QQE_RsiMa = iCustom(NULL, 0, "QQE", 0,SignalCandle); QQE_TrLevelSlow = iCustom(NULL, 0, "QQE", 1, SignalCandle); QQE_RsiMaPrev = iCustom(NULL, 0, "QQE", 0,SignalCandle + 1); QQE_TrLevelSlowPrev = iCustom(NULL, 0, "QQE", 1, SignalCandle + 1); if (QQE_RsiMaPrev < QQE_TrLevelSlowPrev && QQE_RsiMa > QQE_TrLevelSlow) return(LONG); if (QQE_RsiMaPrev > QQE_TrLevelSlowPrev && QQE_RsiMa < QQE_TrLevelSlow) return(SHORT); return(FLAT); } int getNLMA() { double sNL_Long, sNL_Short; sNL_Long = iCustom(Symbol(),0,"NonLagMA_v7.1",sPrice,sLength,sDisplace,sPctFilter,sColor,sColorBarBack,sDeviation,0,0,1,SignalCandle); sNL_Short = iCustom(Symbol(),0,"NonLagMA_v7.1",sPrice,sLength,sDisplace,sPctFilter,sColor,sColorBarBack,sDeviation,0,0,2,SignalCandle); // double sNL12 = iCustom(Symbol(),NL_TF,"NonLagMA_v7.1",sPrice,sLength,sDisplace,sPctFilter,sColor,sColorBarBack,sDeviation,0,0,1,SignalCandle+1); // double sNL22 = iCustom(Symbol(),NL_TF,"NonLagMA_v7.1",sPrice,sLength,sDisplace,sPctFilter,sColor,sColorBarBack,sDeviation,0,0,2,SignalCandle+1); if (sNL_Long != EMPTY_VALUE) return(LONG); if (sNL_Short != EMPTY_VALUE) return(SHORT); return(FLAT); } bool checkHA(int cmd) { int HA; HA = getHA(); switch (cmd) { case OP_BUY : if (HA == LONG) return(true); break; case OP_SELL : if (HA == SHORT) return (true); } return (false); } bool checkHAS(int cmd) { int HAS; HAS = getHAS(); switch (cmd) { case OP_BUY : if (HAS == LONG) return(true); break; case OP_SELL : if (HAS == SHORT) return (true); } return (false); } bool checkStoch(int cmd) { int Stoch; Stoch = getStoch(); switch (cmd) { case OP_BUY : if (Stoch == LONG) return(true); break; case OP_SELL : if (Stoch == SHORT) return (true); } return (false); } bool checkCCI(int cmd) { int CCI; CCI = getCCI(); switch (cmd) { case OP_BUY : if (CCI == LONG) return(true); break; case OP_SELL : if (CCI == SHORT) return (true); } return (false); } bool checkNLD(int cmd) { int NLD; NLD = getNonLagDot(); switch (cmd) { case OP_BUY : if (NLD == LONG) return(true); break; case OP_SELL : if (NLD == SHORT) return (true); } return (false); } bool checkQQE(int cmd) { int QQE; QQE = getQQE(); switch (cmd) { case OP_BUY : if (QQE == LONG) return(true); break; case OP_SELL : if (QQE == SHORT) return (true); } return (false); } bool checkNLMA(int cmd) { int NLMA; NLMA = getNLMA(); switch (cmd) { case OP_BUY : if (NLMA == LONG) return(true); break; case OP_SELL : if (NLMA == SHORT) return (true); } return (false); } // Modified to allow more than one filter to be used // All filters must be true to allow trades bool CheckFilter(int cmd) { bool rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8; // Assume all rules are met // That way if a rule is not used it is automaticaly true rule1 = true; rule2 = true; rule3 = true; rule4 = true; rule5 = true; rule6 = true; rule7 = true; rule8 = true; if (useHA == 1) rule1 = checkHA (cmd); if (rule1 == true) { if (useHAS == 1) rule2 = checkHAS(cmd); if (rule2 == true) { if (useStoch == 1) rule3 = checkStoch(cmd); if (rule3 == true) { if (useCCI == 1) rule4 = checkCCI(cmd); if (rule4 == true) { if (useHA == 1) rule5 = checkNLD(cmd); if (rule5 == true) { if (useNonLagDot == 1) rule6 = checkNLD(cmd); if (rule6 == true) { if (useQQE == 1) rule7 = checkQQE(cmd); // Done this way to make it easier to add new rules if (rule7 == true) { if (useNonLagMA == 1) rule8 = checkNLMA(cmd); } if (rule8 == true) return(true); } } } } } } return (false); } bool checkZigZag(int cmd) { if (cmd == OP_SELL) { //check down arrow & nonlag if ((ZigZagDown != 0) && (ZigZagDown == NonLagZigZag))return (true); } if (cmd == OP_BUY) { //check up arrow & nonlag if ((ZigZagUp != 0) && (ZigZagUp == NonLagZigZag))return (true); } return (false); } // Will exit when any exit method is true bool CheckExit(int cmd) { int myCmd; // reverse cmd for exit check // Exit buy needs indicator to show sell signal // Exit sell needs indicator to show buy signal if (cmd == OP_BUY) myCmd = OP_SELL; if (cmd == OP_SELL) myCmd = OP_BUY; if (useZigZag_Exit == 1) { if (checkZigZag(myCmd) == true) return (true);} if (useHA_Exit == 1){ if (checkHA(myCmd) == true) return(true);} if (useHAS_Exit == 1){ if (checkHAS(myCmd) == true) return(true);} if (useStoch_Exit == 1){ if (checkStoch(myCmd) == true) return(true);} if (useCCI_Exit == 1){ if (checkCCI(myCmd) == true) return(true);} if (useNonLagDot_Exit == 1){ if (checkNLD(myCmd) == true) return(true);} if (useQQE_Exit == 1){ if (checkQQE(myCmd) == true) return(true);} if (useNonLagMA_Exit == 1){ if (checkNLMA(myCmd) == true) return(true);} return (false); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start(){ static datetime dtBarTime = 0; static int ticket; int myTicket; double myLots, mStop; // For closed candle only check once per Bar if (SignalCandle == 1) { if (dtBarTime == Time[0]) return(0); dtBarTime = Time[0]; } NonLagZigZag=iCustom(NULL,0,"NonLagZigZag_v2",Price,Length,PctFilter,0,SignalCandle); ZigZagUp=iCustom(NULL,0,"ZigZag Pointer", ExtDepth,ExtDeviation,ExtBackstep,0,SignalCandle); ZigZagDown=iCustom(NULL,0,"ZigZag Pointer", ExtDepth,ExtDeviation,ExtBackstep,1,SignalCandle); if ((okUpArrow == true) && (okDownArrow == false)){ count=count+1; if (count <= WaitSignal){ // Alert("UP count: ",count," waitSignal: ",WaitSignal); if (CheckFilter(OP_BUY) == true){ myStop = GetStopLoss(OP_BUY, count); mStop = StopLong(Bid, myStop); myTake = TakeLong(Ask, TakeProfit); myLots = GetLots(OP_BUY, myStop, Risk); ticket=OrderSend(Symbol(),OP_BUY,myLots,Ask,3,mStop,myTake,"",MagicID,0,Green); okUpArrow=false; count=0; // Alert("zzz1"); } }else{ count=0; okUpArrow=false; } } if ((okDownArrow == true) && (okUpArrow == false)){ count=count+1; if (count <= WaitSignal){ // Alert("Down count: ",count," waitSignal: ",WaitSignal); if (CheckFilter(OP_SELL) == true){ myStop = GetStopLoss(OP_SELL, count); mStop = StopShort(Ask, myStop); myTake = TakeShort(Bid, TakeProfit); myLots = GetLots(OP_SELL, myStop, Risk); ticket=OrderSend(Symbol(),OP_SELL,myLots,Bid,3,mStop,myTake,"",MagicID,0,Red); okDownArrow=false; count=0; // Alert("zzz2"); } }else{ okDownArrow=false; count=0; } } if (okDownArrow == false){ myTicket = GetOpenTicket(); if (myTicket > 0) { if (CheckExit (OP_BUY) == true){ //down arrow & nonlag CloseOrder(myTicket); return(0); } else CheckForTrail(myTicket); } if (checkZigZag(OP_SELL) == true) { if (Body_Wick(OP_SELL, 1) == true){ //if body is smaller than the wick okDownArrow=true; // Alert("Down"); } } } if (okUpArrow == false){ myTicket = GetOpenTicket(); if (myTicket > 0) { if (CheckExit(OP_SELL) == true){ //up arrow & nonlag CloseOrder(myTicket); return(0); } else CheckForTrail(myTicket); } if (checkZigZag(OP_BUY) == true) { if (Body_Wick(OP_BUY, 1) == true){ //if body is smaller than the wick okUpArrow=true; // Alert("Up"); } } } return(0); } int GetOpenTicket() { int mTicket = 0; for (int i = OrdersTotal() - 1; i >= 0;i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != MagicID) continue; // We have an open trade mTicket = OrderTicket(); } return (mTicket); } void CloseOrder(int ticket) { int myTicket; datetime ctm; myTicket = ticket; // Do this in case disconnect or power loss cause ticket to reset to 0 if (ticket == 0) { myTicket = GetOpenTicket(); } if (OrderSelect(myTicket,SELECT_BY_TICKET) == true){ ctm = OrderCloseTime(); if (ctm == 0) // Order has not closed { if (OrderType() == OP_BUY){ OrderClose(myTicket,OrderLots(),Bid,3,Green); } if (OrderType() == OP_SELL){ OrderClose(myTicket,OrderLots(),Ask,3,Red); //Alert("zzzz: ticket", myTicket); } } } return(0); } void CheckForTrail(int ticket) { int myTicket; datetime ctm; double OrderLTS, OrderOP; double OrderTP, OrderSL; myTicket = ticket; // Do this in case disconnect or power loss cause ticket to reset to 0 if (ticket == 0) { myTicket = GetOpenTicket(); } if (OrderSelect(myTicket,SELECT_BY_TICKET) == true) { ctm = OrderCloseTime(); if (ctm == 0) // Order has not closed { OrderOP = OrderOpenPrice(); OrderTP = OrderTakeProfit(); OrderSL = OrderStopLoss(); if(OrderType()==OP_BUY) { HandleTrailingStop(OP_BUY, myTicket, OrderOP, OrderSL, OrderTP); } if(OrderType()==OP_SELL) { HandleTrailingStop(OP_SELL, myTicket, OrderOP, OrderSL, OrderTP); } } } } // Modified to return stoploss in pips double GetStopLoss(int cmd, int count) { double myStopLoss; if (cmd == OP_BUY) { switch (StopLossMethod) { case 1 : myStopLoss = StopLoss; break; case 2 : myStopLoss = (Bid - iLow(Symbol(),Period(),SignalCandle)) / Point - StopLoss; break; case 3 : myStopLoss = (Bid - iLow(Symbol(),Period(),count+1)) / Point-(MarketInfo(Symbol(),MODE_SPREAD)+1); } } if (cmd == OP_SELL) { switch (StopLossMethod) { case 1 : myStopLoss = StopLoss; break; case 2 : myStopLoss = (iHigh(Symbol(),Period(),SignalCandle) - Ask) / Point + StopLoss; break; case 3 : myStopLoss = (iHigh(Symbol(),Period(),count+1) - Ask) / Point + (MarketInfo(Symbol(),MODE_SPREAD)+1); } } return (myStopLoss); } double StopLong(double price,int stop) { if(stop==0) return(0); else return(price-(stop*Point)); } double StopShort(double price,int stop) { if(stop==0) return(0); else return(price+(stop*Point)); } double TakeLong(double price,int take) { if(take==0) return(0); else return(price+(take*Point)); } double TakeShort(double price,int take) { if(take==0) return(0); else return(price-(take*Point)); } bool Body_Wick(int cmd, int shift){ bool auxValue=false; double body,bottomWick,topWick; double open,close,high,low; // Check switch if (useWick == 0) return(true); open=iOpen(Symbol(),Period(),shift); close=iClose(Symbol(),Period(),shift); low=iLow(Symbol(),Period(),shift); high=iHigh(Symbol(),Period(),shift); if (open < close){ //up candle topWick=high-close; body=close-open; bottomWick=open-low; } else{ //down candle topWick=high-open; body=open-close; bottomWick=close-low; } if (cmd == OP_BUY) { if (topWick > Wick*body) auxValue=true; } if (cmd == OP_SELL) { if (bottomWick > Wick*body) auxValue=true; } return (auxValue); } double GetLots(int cmd, double myStop, double myRisk) { int mStop; double mLots; switch (MM_Method ) { case NONE : mLots = Lots; break; case NIX : mLots = AutoLots(); break; case BURNS : if (cmd == OP_BUY) mStop = MathFloor((Bid - myStop) / Point); if (cmd == OP_SELL) mStop = MathFloor((myStop - Ask) / Point); mLots = LotSize (mStop, myRisk); // Print("StopInPips : ", mStop, "StopLoss : ", myStop, "Lots : ", mLots); case NIX2 : if (cmd == OP_BUY) mStop = MathFloor((Bid - myStop) / Point); if (cmd == OP_SELL) mStop = MathFloor((myStop - Ask) / Point); mLots = AutoLots2(myRisk, mStop); } return (mLots); } // version from burn0050 double LotSize(int stopInPips, double accountRisk){ double lotMM = ( AccountFreeMargin() * (accountRisk/100) )/( MarketInfo(Symbol(),MODE_TICKVALUE) * stopInPips ); //This can be used with discretion if (AccountIsMini) { //Round to the nearest 10th - AccountIsMini needs to be a bool set at the top level lotMM = MathFloor(lotMM*10)/10; } else { //Round to the nearest lot lotMM = MathRound(lotMM); //To be aggressive, use this one //lotMM = MathCeil(lotMM); } if (lotMM < 0.1) lotMM = .1; if (lotMM > 100) lotMM = 100; return (lotMM); } // Version from nix double AutoLots() { int Decimals = 0; double mLots; double MaxLotPurchase = 0; // // don't overleverage! // //int AccLeverage = AccountLeverage(); int AccLeverage = 100; // // Step for changing lots // double ModeLotStep = MarketInfo(Symbol(), MODE_LOTSTEP); double ModeLotSize = MarketInfo(Symbol(), MODE_LOTSIZE); if(ModeLotStep == 0.01) Decimals = 2; if(ModeLotStep == 0.1) Decimals = 1; // // Calculate auto lots // if(ModeLotSize != 0) MaxLotPurchase=((AccountEquity()*AccLeverage)/ModeLotSize)*(Risk*0.01); else MaxLotPurchase=MIN_lots; mLots = StrToDouble(DoubleToStr(MaxLotPurchase,Decimals)); if (mLots < MIN_lots) mLots = MIN_lots; if (mLots > MAX_lots) mLots = MAX_lots; return(mLots); } // Version 2 from Nix //double AutoLots2(int Risk, int StopLossInPips, double MIN_lots = 0.1, double MAX_lots = 5) // MIN_Lots and MAX_Lots are inputs to the EA double AutoLots2(int accountRisk, int StopLossInPips) { int Decimals = 0; double LotStep = MarketInfo(Symbol(), MODE_LOTSTEP); double LotSize = MarketInfo(Symbol(), MODE_LOTSIZE); double LotTickValue = MarketInfo(Symbol(), MODE_TICKVALUE); if(LotStep == 0.01) Decimals = 2; if(LotStep == 0.1) Decimals = 1; double LotsToRisk = ((AccountFreeMargin()*accountRisk)/100)/StopLossInPips; double Lots = StrToDouble(DoubleToStr(LotsToRisk/LotTickValue,Decimals)); if (Lots < MIN_lots) Lots = MIN_lots; if (Lots > MAX_lots) Lots = MAX_lots; return(Lots); } //+------------------------------------------------------------------+ //| HandleTrailingStop | //| Type 1 is do not trail | //| Type 2 Moves to breakeven + lock when internal TP is hit | //| Type 3 is like Type 5 but waits until internal TP is hit | //| Type 4 Move stop to breakeven + Lockin, no trail | //| Type 5 waits for price to move the amount of the trailStop | //| before moving stop loss then moves like type 4 | //| Type 6 moves the stoploss without delay. | //+------------------------------------------------------------------+ void HandleTrailingStop(int cmd, int ticket, double op, double os, double tp) { switch (TrailingStopMethod) { case 1 : //MoveTP(cmd, ticket, op, os, tp); break; case 2 : Trail_PriceChannel(cmd, ticket, op, os, tp); break; case 3 : BreakEven_TrailingStop (cmd, ticket, op, os, tp); break; case 4 : Delayed_TrailingStop (cmd, ticket, op, os, tp); break; case 5 : Immediate_TrailingStop (cmd, ticket, op, os, tp); break; default : //MoveTP(cmd, ticket, op, os, tp); break; } } void Trail_PriceChannel(int cmd, int ticket, double oOP, double oSL, double oTP ) { double PriceChannelStopUp,PriceChannelStopDown; if (OrderType() == OP_BUY) { if ((Ask-oOP) > Trigger*Point) { PriceChannelStopUp=iCustom(NULL,0,"PriceChannel_Stop_v1",0,0); if (PriceChannelStopUp < 1000) { //Alert("Victor buy: ",Ask-OrderOpenPrice()); OrderModify(ticket,oOP,PriceChannelStopUp,oTP,0,Red); } } } if (OrderType() == OP_SELL){ if ((oOP - Bid)> Trigger*Point) { PriceChannelStopDown=iCustom(NULL,0,"PriceChannel_Stop_v1",1,0); if (PriceChannelStopDown < 1000) { //Alert(" Victor sell: ",OrderOpenPrice() - Bid); OrderModify(ticket,oOP,PriceChannelStopDown,oTP,0,Red); } } } } //+------------------------------------------------------------------+ //| BreakEven_TrailingStop | //| Copyright ? 2006, Forex-TSD.com | //| Written by MrPip,[email protected] | //+------------------------------------------------------------------+ void BreakEven_TrailingStop(int cmd, int ticket, double oOP, double oSL, double oTP ) { double myStopLoss; if (cmd == OP_BUY) { if(Bid >= oOP + BreakEvenLevel * Point) { // Check move stop loss if (oSL < oOP) { // Move Stop to Breakeven + BreakEvenLock myStopLoss = oOP + LockInPips * Point; myStopLoss = ValidStopLoss(OP_BUY,Bid, myStopLoss); myStopLoss = NormalizeDouble( myStopLoss, Digits); ModifyOrder(ticket,oOP, myStopLoss, oTP,LightGreen); } } } if (cmd == OP_SELL) { if(Ask <= oOP - BreakEvenLevel * Point) { // Check move stop loss if((oSL > oOP) || (oSL < 0.1)) { // Move Stop to Breakeven + BreakEvenLock myStopLoss = oOP - LockInPips * Point; myStopLoss = ValidStopLoss(OP_SELL,Ask, myStopLoss); myStopLoss = NormalizeDouble( myStopLoss, Digits); ModifyOrder(ticket,oOP, myStopLoss, oTP,DarkOrange); } } } } //+------------------------------------------------------------------+ //| Delayed_TrailingStop.mq4 | //| Copyright ? 2006, Forex-TSD.com | //| Written by MrPip,[email protected] | //| | //| Waits for price to move the amount of the BeginTrailingStop | //| Moves the stoploss pip for pip after delay. | //+------------------------------------------------------------------+ void Delayed_TrailingStop(int cmd, int ticket, double oOP, double oSL, double oTP ) { double myStopLoss; if(cmd == OP_BUY) { if(Bid >= oOP + BeginTrailingStop * Point) { myStopLoss = Bid - BeginTrailingStop * Point; myStopLoss = ValidStopLoss(OP_BUY,Bid, myStopLoss); myStopLoss = NormalizeDouble( myStopLoss, Digits); if (oSL < myStopLoss) { ModifyOrder(ticket,oOP, myStopLoss, oTP,LightGreen); } } } if (cmd == OP_SELL) { if(Ask <= oOP - BeginTrailingStop * Point) { myStopLoss = Ask + BeginTrailingStop * Point; myStopLoss = ValidStopLoss(OP_SELL,Ask, myStopLoss); myStopLoss = NormalizeDouble( myStopLoss, Digits); if ((oSL > myStopLoss) || (oSL < 0.1)) { ModifyOrder(ticket,oOP, myStopLoss, oTP,DarkOrange); } } } } //+------------------------------------------------------------------+ //| Immediate_TrailingStop.mq4 | //| Copyright ? 2006, Forex-TSD.com | //| Written by MrPip,[email protected] | //| | //| Moves the stoploss without delay. | //+------------------------------------------------------------------+ void Immediate_TrailingStop(int cmd, int ticket, double oOP, double oSL, double oTP) { double myStopLoss; if (cmd==OP_BUY) { myStopLoss = Bid - myStop * Point; if (Digits > 0) myStopLoss = NormalizeDouble( myStopLoss, Digits); myStopLoss = ValidStopLoss(OP_BUY,Bid, myStopLoss); myStopLoss = NormalizeDouble( myStopLoss, Digits); if (oSL < myStopLoss) { ModifyOrder(ticket,oOP, myStopLoss, oTP,LightGreen); } } if (cmd==OP_SELL) { myStopLoss = Ask + myStop * Point; if (Digits > 0) myStopLoss = NormalizeDouble( myStopLoss, Digits); myStopLoss = ValidStopLoss(OP_SELL, Ask, myStopLoss); myStopLoss = NormalizeDouble( myStopLoss, Digits); if (oSL > myStopLoss) { ModifyOrder(ticket,oOP, myStopLoss, oTP,DarkOrange); } } } int ModifyOrder(int ord_ticket,double op, double oSL, double oTP, color mColor) { int CloseCnt, err; CloseCnt=0; while (CloseCnt < 3) { if (OrderModify(ord_ticket,op,oSL,oTP,0,mColor)) { CloseCnt = 3; } else { err=GetLastError(); if (err == 1) CloseCnt = 3; else { Print(CloseCnt," Error modifying order : (", err , ") " + ErrorDescription(err)); if (err>0) CloseCnt++; } } } } double ValidStopLoss(int type, double price, double SL) { double minstop, pp; if (SL < 0.1) return(SL); pp = MarketInfo(Symbol(), MODE_POINT); minstop = MarketInfo(Symbol(),MODE_STOPLEVEL); if (type == OP_BUY) { if((price - SL) < minstop*pp) SL = price - minstop*pp; } if (type == OP_SELL) { if((SL-price) < minstop*pp) SL = price + minstop*pp; } return(SL); } //+------------------------------------------------------------------+
TK29帖子1楼右侧xm竖版广告90-240
个性签名

阅尽天下指标
搬砖开始,始于2014

广告
TK30+TK31帖子一樓廣告
TK30+TK31帖子一樓廣告

本站免责声明:

1、本站所有广告及宣传信息均与韬客无关,如需投资请依法自行决定是否投资、斟酌资金安全及交易亏损风险;

2、韬客是独立的、仅为投资者提供交流的平台,网友发布信息不代表韬客的观点与意思表示,所有因网友发布的信息而造成的任何法律后果、风险与责任,均与韬客无关;

3、金融交易存在极高法律风险,未必适合所有投资者,请不要轻信任何高额投资收益的诱导而贸然投资;投资保证金交易导致的损失可能超过您投入的资金和预期。请您考虑自身的投资经验及风险承担能力,进行合法、理性投资;

4、所有投资者的交易帐户应仅限本人使用,不应交由第三方操作,对于任何接受第三方喊单、操盘、理财等操作的投资和交易,由此导致的任何风险、亏损及责任由投资者个人自行承担;

5、韬客不隶属于任何券商平台,亦不受任何第三方控制,韬客不邀约客户投资任何保证金交易,不接触亦不涉及投资者的任何资金及账户信息,不代理任何交易操盘行为,不向客户推荐任何券商平台,亦不存在其他任何推荐行为。投资者应自行选择券商平台,券商平台的任何行为均与韬客无关。投资者注册及使用韬客即表示其接受和认可上述声明,并自行承担法律风险。

版权所有:韬客外汇论坛 www.talkfx.com 联络我们:[email protected]