//+------------------------------------------------------------------+ //| Charles.mq4 | //| Copyright 2012, AlFa Corp. | //| alessio.fabiani @ gmail.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, AlFa" #property link "alessio.fabiani @ gmail.com" #define VER "2.1.5" #define DECIMAL_CONVERSION 10 extern string Comment_1 = " -- Comma separated list of Symbol Pairs: EURUSD,USDCHF"; extern string Comment_1a = " --- must be equal to the string of your account provider."; extern string Symbols = "EURUSDm,EURGBPm,EURJPYm,CHFJPYm,GBPUSDm,GBPJPYm,GBPCHFm,GBPAUDm,USDCADm,USDCHFm,USDJPYm,AUDNZDm,AUDUSDm,NZDUSDm"; //extern string Symbols; extern int MagicNumber = 3939; extern double xFactor = 1.8; extern string TimeSet = "07:32"; extern string Comment_2 = " -- Balance percentage order balance and Lot value"; extern double RiskPercent = 5; extern string Comment_3 = " -- Percentage of the risk for each Lot"; extern string Comment_3a = " --- auto-adapted to number of pairs."; extern double RiskPerTrade = 10; extern int MaxAllowedOrders = 15; extern int MaxOpenHours = 0; extern int ProfitCheckPeriod = 3; extern string Comment_4 = " -- Whether or not use more strict supports and resistances"; extern bool Aggressive = false; extern bool UsePivots = true; extern string Comment_5 = " -- Whether or not leave open profitable orders"; extern int FastPeriod = 18; extern int SlowPeriod = 60; extern int Selectivity = 14; extern string Comment_6 = " -- Fixed value if RiskPerTrade == 0"; extern double Lots = 0.01; extern int Slippage = 3; extern string Comment_7 = " -- Set to true if broker is ECN/STP needing stops adding after order"; extern bool ECN = true; extern double MarginPercent = 20; extern string Comment_8 = " -- On all orders"; extern int StopLoss = 0; extern int TrailStart = 30; extern int TrailingAmount = 10; extern int TakeProfit = 20; extern string Comment_9 = " -- Whether or not manage ALL opened orders (manual too)"; extern bool AllOrders = true; extern string Comment_10 = " -- Whether or not compute the Profit on ALL pairs"; extern bool AllSymbols = true; extern string Comment_11 = " -- Log to console or to a file"; extern bool LogToFile = false; extern string Comment_12 = " -- On init delete all pending orders"; extern bool InitResetOrders = true; extern string Comment_13 = " -- Trading Time Management"; extern int StartHour = 0; extern int EndHour = 24; extern bool CloseAllNow = false; extern int FridayCloseTime = 0; int Anchor, PendingBuy, PendingSell, Buys, Sells, i, StopLevel, Spread; int MaxOpenOrders; double BuyLots, SellLots, PendingBuyLots, PendingSellLots; double Amount, Profit, LastProfit, Up, Dw, SL, TP; double LotsValue, LotsHedgeValue; double MaxPrice,MinPrice,MaxOpenPrice,MinOpenPrice; bool isInGain=false, blockConditionHit=false, unlockOrdersPlaced=false; int LastOrderTicket, UnlockingOrderTicket, Result, Error; int Delta; //Order price shift (in points) from High/Low price int LastDay; double stopLoss, delta; double trailStart, trailAmount, takeProfit; double lastBarTime,lastpM5BarTime,lastpM15BarTime,lastpH1BarTime; string SymbolsArray[0], CurrentSymbol; bool canSell[0], canBuy[0], bullish[0], bearish[0]; bool Inited[0], DayStart[0], inited=false; bool tradingAllowed=false; double Pivot[0]; double Resist1[0]; double Resist2[0]; double Resist3[0]; double Support1[0]; double Support2[0]; double Support3[0]; double pPoint[0]; bool isCals[0]; double r1[0] , s1[0] ,s2[0], r2[0], r3[0], s3[0]; //+------------------------------------------------------------------+ //| Init function | //+------------------------------------------------------------------+ void init() { RefreshRates(); if(LogToFile){startFile();} Amount = 1.0; Anchor = 250; Delta = 5; LastDay = 1; PendingBuy = 0; PendingSell = 0; Buys = 0; Sells = 0; BuyLots = 0; SellLots = 0; PendingBuyLots = 0; PendingSellLots = 0; LastOrderTicket = -1; UnlockingOrderTicket = -1; string delim = ","; int size; if(StringLen(Symbols)==0) { size = 1; } else { size = 1+StringFindCount(Symbols,delim); } MaxOpenOrders = MaxAllowedOrders/size; ArrayResize(SymbolsArray,size); if(StringLen(Symbols)>0){StrToStringArray(Symbols,SymbolsArray,delim);} ArrayResize(canSell,size); ArrayResize(canBuy,size); ArrayResize(Inited,size); ArrayResize(DayStart,size); ArrayResize(Pivot,size); ArrayResize(Resist1,size); ArrayResize(Resist2,size); ArrayResize(Support1,size); ArrayResize(Support2,size); ArrayResize(Support3,size); ArrayResize(Resist3,size); ArrayResize(pPoint,size); ArrayResize(isCals,size); ArrayResize(r1,size); ArrayResize(s1,size); ArrayResize(s2,size); ArrayResize(r2,size); ArrayResize(r3,size); ArrayResize(s3,size); ArrayResize(bullish,size); ArrayResize(bearish,size); for(i=0; i=PERIOD_M5) { pM5=true; lastpM5BarTime=TimeCurrent(); } if((TimeCurrent()-lastpM15BarTime)/60>=PERIOD_M15) { pM15=true; lastpM15BarTime=TimeCurrent(); } if((TimeCurrent()-lastpH1BarTime)/60>=PERIOD_H1) { pH1=true; lastpH1BarTime=TimeCurrent(); } int SystemPeriod=1; tradingAllowed=false; if((StartHour < EndHour && TimeHour(TimeCurrent()) >= StartHour && TimeHour(TimeCurrent()) < EndHour) || (StartHour > EndHour && TimeHour(TimeCurrent()) >= StartHour || TimeHour(TimeCurrent()) < EndHour)) { if(DayOfWeek() != 5 || FridayCloseTime==0 || Hour()0 && Hour()>=FridayCloseTime) ) { ForceCloseAllOpenOrders(); DeleteAllPendingOrders(); } if( inited==false || (TimeCurrent() - lastBarTime)/60 >= SystemPeriod ) { if(inited==false) inited=true; int s; for(s=0; s0) { CurrentSymbol = StringTrim(SymbolsArray[s]); } else { CurrentSymbol = Symbol(); } if(Inited[s] == false) { if(InitResetOrders == true) { int Pos; int Total=OrdersTotal(); if(Total>0) { for(i=Total-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE) { if(OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if Pos=OrderType(); if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT)){Result=OrderDelete(OrderTicket(), CLR_NONE);} //----------------------- if(Result<0){Error=GetLastError();Log("LastError = "+Error);} else Error=0; //----------------------- }//if }//for }//if }//if Inited[s]=true; }//if Spread = MarketInfo(CurrentSymbol, MODE_SPREAD); StopLevel = MarketInfo(CurrentSymbol, MODE_STOPLEVEL) + Spread; if (MarketInfo(CurrentSymbol, MODE_DIGITS) == 3 || MarketInfo(CurrentSymbol, MODE_DIGITS) == 5) { stopLoss = NormalizeDouble(StopLoss* DECIMAL_CONVERSION * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); delta = NormalizeDouble(Delta * DECIMAL_CONVERSION * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); trailStart = NormalizeDouble(TrailStart * DECIMAL_CONVERSION * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); trailAmount = NormalizeDouble(TrailingAmount * DECIMAL_CONVERSION * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); takeProfit = NormalizeDouble(TakeProfit * DECIMAL_CONVERSION * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); } else { stopLoss = NormalizeDouble(StopLoss * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); delta = NormalizeDouble(Delta * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); trailStart = NormalizeDouble(TrailStart * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); trailAmount = NormalizeDouble(TrailingAmount * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); takeProfit = NormalizeDouble(TakeProfit * MarketInfo(CurrentSymbol, MODE_POINT),MarketInfo(CurrentSymbol, MODE_DIGITS)); } if( stopLoss>0 && stopLossMaxPrice) MaxOpenPrice = MarketInfo(CurrentSymbol,MODE_ASK)+StopLevel*MarketInfo(CurrentSymbol, MODE_POINT); if (MarketInfo(CurrentSymbol,MODE_BID)-StopLevel*MarketInfo(CurrentSymbol, MODE_POINT)=20) { //Alert(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS) + " -- " + Volatility1 + " / " + Volatility2); if( iClose(CurrentSymbol,PERIOD_M15,1)>iOpen(CurrentSymbol,PERIOD_M15,1) ) { //SignalBufferSellLimit=iHigh(CurrentSymbol,PERIOD_M5,iHighest(CurrentSymbol,PERIOD_M5,MODE_HIGH,3,0)); SignalBufferSellStop=NormalizeDouble( iLow(CurrentSymbol,PERIOD_M15,1)-delta+((iHigh(CurrentSymbol,PERIOD_M15,1)-iLow(CurrentSymbol,PERIOD_M15,1))/2), MarketInfo(CurrentSymbol,MODE_DIGITS)); } else { //SignalBufferBuyLimit=iLow(CurrentSymbol,PERIOD_M5,iLowest(CurrentSymbol,PERIOD_M5,MODE_LOW,3,0)); SignalBufferBuyStop=NormalizeDouble( iLow(CurrentSymbol,PERIOD_M15,1)+delta-((iLow(CurrentSymbol,PERIOD_M15,1)-iHigh(CurrentSymbol,PERIOD_M15,1))/2), MarketInfo(CurrentSymbol,MODE_DIGITS)); } } if(SignalBufferSellStop>0 && (Sells+Buys)<=MaxOpenOrders) { OpenOrder(CurrentSymbol,LotsValue,OP_SELLSTOP,SignalBufferSellLimit); } if(SignalBufferBuyStop>0 && (Sells+Buys)<=MaxOpenOrders) { OpenOrder(CurrentSymbol,LotsValue,OP_BUYSTOP,SignalBufferBuyLimit); } if(SignalBufferSellLimit>0 && (Sells+Buys)<=MaxOpenOrders) { OpenOrder(CurrentSymbol,LotsValue,OP_SELLLIMIT,SignalBufferSellLimit); } if(SignalBufferBuyLimit>0 && (Sells+Buys)<=MaxOpenOrders) { OpenOrder(CurrentSymbol,LotsValue,OP_BUYLIMIT,SignalBufferBuyLimit); } } if(pM15==true) { // CHECK TREND CONDITION bullish[s]=((RSI>55&&RSIM1>55&&RSIL1>55)&&(RSIL2<50&&RSIM2<50&&RSI2<50)&&EMAS1>EMAF1); bearish[s]=((RSI<55&&RSIM1<55&&RSIL1<55)&&(RSIL2>50&&RSIM2>50&&RSI2>50)&&EMAS1 NormalizeDouble(MarketInfo(CurrentSymbol,MODE_BID)+delta+(Spread*MarketInfo(CurrentSymbol, MODE_POINT)),MarketInfo(CurrentSymbol, MODE_DIGITS))) { Up = Up1; } else if (Up4 > NormalizeDouble(MarketInfo(CurrentSymbol,MODE_BID)+delta+(Spread*MarketInfo(CurrentSymbol, MODE_POINT)),MarketInfo(CurrentSymbol, MODE_DIGITS))) { Up = Up4; } else { Up = UpA; } if((PendingSell==0 && PendingBuy==0) || (TimeStr(CurTime())==TimeSet)) { RefreshRates(); if(TimeStr(CurTime())==TimeSet && DayStart[s]==false) { Log("[DAY RESET: "+TimeToStr(TimeCurrent())+"]"); DeleteAllPendingOrders(); Dw=MinOpenPrice; Up=MaxOpenPrice; DayStart[s]=true; } else if(TimeStr(CurTime())!=TimeSet && DayStart[s]==true) { DayStart[s]=false; } SL=0; TP=0; if(PendingSell == 0) { if(canSell[s]) { if(ECN == false && stopLoss > 0){SL=Dw+stopLoss;} if(tradingAllowed==true && AccountFreeMarginCheck(CurrentSymbol,OP_SELL,LotsHedgeValue)>=(AccountEquity()*MarginPercent/100) && GetLastError()!=134) { //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(CurrentSymbol,OP_SELLSTOP,LotsHedgeValue,Dw,Slippage,SL,TP,"Charles_"+VER,MagicNumber,0,Red); //----------------------- if(Result<0){Error=GetLastError();Log("LastError [CORE;OP_SELLSTOP]= "+Error+" - Dw# "+Dw+" - Ask#"+MarketInfo(CurrentSymbol,MODE_ASK));} else Error=0; //----------------------- } } } if(PendingBuy == 0 && Error==0) { if(canBuy[s]) { if(ECN == false && stopLoss > 0){SL=Up-stopLoss;} if(tradingAllowed==true && AccountFreeMarginCheck(CurrentSymbol,OP_BUY,LotsHedgeValue)>=(AccountEquity()*MarginPercent/100) && GetLastError()!=134) { //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(CurrentSymbol,OP_BUYSTOP,LotsHedgeValue,Up,Slippage,SL,TP,"Charles_"+VER,MagicNumber,0,Blue); //----------------------- if(Result<0){Error=GetLastError();Log("LastError [CORE;OP_BUYSTOP] = "+Error+" - Dw# "+Up+" - Bid#"+MarketInfo(CurrentSymbol,MODE_BID));} else Error=0; //----------------------- } } } } else { if((PendingSell == 0 && PendingBuy > 0) || (PendingSell > 0 && PendingBuy == 0)) { RefreshRates(); SL=0; TP=0; if(PendingSell == 0 && PendingBuy > 0) { if(canSell[s]) { if(ECN == false && stopLoss > 0){SL=Dw+stopLoss;} if(tradingAllowed==true && AccountFreeMarginCheck(CurrentSymbol,OP_SELL,LotsHedgeValue)>=(AccountEquity()*MarginPercent/100) && GetLastError()!=134) { //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(CurrentSymbol,OP_SELLSTOP,LotsHedgeValue,Dw,Slippage,SL,TP,"Charles_"+VER,MagicNumber,0,Red); //----------------------- if(Result<0){Error=GetLastError();Log("LastError [CORE - HEDGE;OP_SELLSTOP]= "+Error);} else if(Result!=0) { Error=0; } //----------------------- } } } if(PendingSell > 0 && PendingBuy == 0 && Error==0) { if(canBuy[s]) { if(ECN == false && stopLoss > 0){SL=Up-stopLoss;} if(tradingAllowed==true && AccountFreeMarginCheck(CurrentSymbol,OP_BUY,LotsHedgeValue)>=(AccountEquity()*MarginPercent/100) && GetLastError()!=134) { //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(CurrentSymbol,OP_BUYSTOP,LotsHedgeValue,Up,Slippage,SL,TP,"Charles_"+VER,MagicNumber,0,Blue); //----------------------- if(Result<0){Error=GetLastError();Log("LastError [CORE - HEDGE;OP_BUYSTOP] = "+Error);} else if(Result!=0) { Error=0; } //----------------------- } } } } } } pM5=false; pM15=false; pH1=false; lastBarTime = TimeCurrent(); CharlesStatus(); } } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- int CheckForClose(int s) { RefreshRates(); Count(); int ordersTotal=OrdersTotal(); bool skipBasket=false; if(ordersTotal>0) { if(Profit>=0) { skipBasket=true; } if(skipBasket==false) { double ordersWinningBasket[],ordersWinningBasketTkts[],ordersLosingBasket[],ordersLosingBasketTkts[],ordersBasketHedgeTkts[]; ArrayResize(ordersWinningBasket,ordersTotal); ArrayResize(ordersWinningBasketTkts,ordersTotal); ArrayResize(ordersLosingBasket,ordersTotal); ArrayResize(ordersLosingBasketTkts,ordersTotal); ArrayResize(ordersBasketHedgeTkts,ordersTotal); int winners=0,loosers=0; for(i=0; i0) { ordersWinningBasket[winners] = OrderProfit()+OrderSwap()+OrderCommission(); ordersWinningBasketTkts[winners] = OrderTicket(); winners++; } else if(OrderProfit()+OrderSwap()+OrderCommission()<0) { ordersLosingBasket[loosers] = OrderProfit()+OrderSwap()+OrderCommission(); ordersLosingBasketTkts[loosers] = OrderTicket(); loosers++; } } } }//for Log( "[Basket] - Winners#"+winners+"; Loosers#"+loosers ); for(int w=0;w0) { for(int ls=0;ls1) Log( "[Basket - STEP 1."+ls+"] - hedgePos#"+hedgePos+"; hedgeProfit#"+MathAbs(hedgeProfit*xFactor)+"; ordersWinningBasket#"+ordersWinningBasket[w] ); if(hedgePos>1 && (MathAbs(hedgeProfit*xFactor)=0 && Profit>=Amount) { ordersTotal=OrdersTotal(); double gainingProfit=0,loosingProfit=0; if(ordersTotal>0) { for(i=ordersTotal-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if( (OrderProfit()+OrderSwap()+OrderCommission())>0 ) { gainingProfit+=(OrderProfit()+OrderSwap()+OrderCommission()); } else { loosingProfit+=(OrderProfit()+OrderSwap()+OrderCommission()); } } } } if(loosingProfit==0 || gainingProfit>(MathAbs(loosingProfit)) ) { isInGain=true; } else { isInGain=false; } RefreshRates(); Count(); if( isInGain==false && Profit<=(LastProfit - Amount/10) ) { isInGain = false; blockConditionHit=false; unlockOrdersPlaced=false; LastOrderTicket = -1; UnlockingOrderTicket = -1; LastProfit=0; for(sx=0; sx0) { for(i=ordersTotal-1; i>=0; i--) { double highest=0; double lowest=0; double chgFromOpen=0,chgFromPeak=0,chgFromLown=0; double ceil=0,floor=0; if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if (MarketInfo(OrderSymbol(), MODE_DIGITS) == 3 || MarketInfo(OrderSymbol(), MODE_DIGITS) == 5) { floor = NormalizeDouble(Delta * DECIMAL_CONVERSION * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS)); ceil = NormalizeDouble(TakeProfit * DECIMAL_CONVERSION * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS)); } else { floor = NormalizeDouble(Delta * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS)); ceil = NormalizeDouble(TakeProfit * MarketInfo(OrderSymbol(), MODE_POINT),MarketInfo(OrderSymbol(), MODE_DIGITS)); } highest = iHigh(OrderSymbol(),PERIOD_M15,iHighest(CurrentSymbol,PERIOD_M15,MODE_HIGH,ProfitCheckPeriod,1)); lowest = iLow(OrderSymbol(),PERIOD_M15,iLowest(CurrentSymbol,PERIOD_M15,MODE_LOW,ProfitCheckPeriod,1)); if( OrderType() == OP_BUY ) { chgFromOpen = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - OrderOpenPrice(), MarketInfo(OrderSymbol(),MODE_DIGITS)); chgFromPeak = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - highest, MarketInfo(OrderSymbol(),MODE_DIGITS)); chgFromLown = NormalizeDouble(lowest - MarketInfo(OrderSymbol(),MODE_ASK), MarketInfo(OrderSymbol(),MODE_DIGITS)); if( (TimeCurrent()-OrderOpenTime())/60>=ProfitCheckPeriod*PERIOD_M15 && OrderProfit()+OrderCommission()+OrderSwap()>0 && chgFromOpen>0 && MathAbs(chgFromOpen-chgFromPeak)>=floor && MathAbs(chgFromOpen-chgFromPeak)<=ceil && chgFromLown<0 && MathAbs(chgFromLown)>=floor) { for(sx=0; sx=ProfitCheckPeriod*PERIOD_M15 && OrderProfit()+OrderCommission()+OrderSwap()>0 && chgFromOpen>0 && MathAbs(chgFromOpen-chgFromLown)>=floor && MathAbs(chgFromOpen-chgFromLown)<=ceil && chgFromPeak<0 && MathAbs(chgFromPeak)>=floor) { for(sx=0; sx0) { for(i=ordersTotal-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(AllSymbols==false && OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if CheckTrailingStop(OrderTicket(),s,isInGain); } } } RefreshRates(); Count(); if(Profit==0 && Buys==0 && Sells==0 && PendingBuy==0 && PendingSell==0) { isInGain = false; blockConditionHit=false; unlockOrdersPlaced=false; LastOrderTicket = -1; UnlockingOrderTicket = -1; for(sx=0; sx=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if if(OrderProfit()+OrderCommission()+OrderSwap()<0) { blockedOrderSymbol = OrderSymbol(); if(OrderType()==OP_BUY) { blockedBuyLots+=OrderLots(); } else if(OrderType()==OP_SELL) { blockedSellLots+=OrderLots(); } } int ticket=-1; if( (blockedSellLots>0 || blockedBuyLots>0) && (blockedSellLots != blockedBuyLots) ) { if(blockedSellLots > blockedBuyLots) { ticket=OpenOrder(blockedOrderSymbol,blockedSellLots-blockedBuyLots, OP_BUY); if(ticket>0) { LastOrderTicket=ticket; Log("[CONDIZIONE DI BLOCCAGGIO DI EMERGENZA - Blocking Loss]: SellLots>BuyLots; Opened BUY Order Ticket: " + LastOrderTicket); } }//if else if(blockedBuyLots > blockedSellLots) { ticket=OpenOrder(blockedOrderSymbol,blockedBuyLots-blockedSellLots, OP_SELL); if(ticket>0) { LastOrderTicket=ticket; Log("[CONDIZIONE DI BLOCCAGGIO DI EMERGENZA - Blocking Loss]: SellLots>BuyLots; Opened BUY Order Ticket: " + LastOrderTicket); } }//if }//if }//if }//for } else { blockConditionHit=false; } if(blockConditionHit==true) { for(i=OrdersTotal()-1; i>=0; i--) { double OpenedLoosingSellProfit=0,OpenedLoosingBuyProfit=0; double OpenedLoosingSellLots=0,OpenedLoosingBuyLots=0; if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if if((OrderProfit() + OrderCommission() + OrderSwap())<0) { if(OrderType() == OP_BUY) { OpenedLoosingBuyLots+=OrderLots(); OpenedLoosingBuyProfit+=(OrderProfit() + OrderCommission() + OrderSwap()); canBuy[s]=false; } if(OrderType() == OP_SELL) { OpenedLoosingSellLots+=OrderLots(); OpenedLoosingSellProfit+=(OrderProfit() + OrderCommission() + OrderSwap()); canSell[s]=false; } } else { if(OrderType() == OP_BUY) { canBuy[s]=true; } if(OrderType() == OP_SELL) { canSell[s]=true; } } }//if //Alert(OpenedLoosingBuyLots+" - "+OpenedLoosingSellLots); if( OpenedLoosingBuyLots>0 && OpenedLoosingSellLots>0 && OpenedLoosingBuyLots == OpenedLoosingSellLots) { double balanceLots=normPrice(OpenedLoosingBuyLots); if(balanceLotsOpenedLoosingSellProfit) { OpenOrder(CurrentSymbol,balanceLots, OP_BUY); } if(OpenedLoosingSellProfit>OpenedLoosingBuyProfit) { OpenOrder(CurrentSymbol,balanceLots, OP_SELL); } } }//for }//if CharlesStatus(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void CharlesStatus() { if(Buys == 0 && Sells == 0 && PendingBuy==0 && PendingSell==0) { for(int sx=0; sx0 && Profit>=Amount/10.0) {LookingFor=(LastProfit - Amount/10.0);} string blocked; if(blockConditionHit) { blocked = "\nBlock Condition HIT"; } Comment("Charles ",VER," - Gain= ",Profit," LookingFor= ",LookingFor," RiskPercent= ",(-AccountBalance()*RiskPercent/100), ";\nBalance=",AccountBalance(),"; FreeMargin=", AccountFreeMargin(),"; Equity=", AccountEquity(), ";\nBuy=",Buys,"; Sell=", Sells,"; BuyLots=",BuyLots,"; SellLots=",SellLots, ";\nPendingBuys=",PendingBuy,"; PendingSells=",PendingSell,"; PendingBuyLots=",PendingBuyLots,"; PendingSellLots=",PendingSellLots,blocked); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- double LOT() { RefreshRates(); double money=AccountFreeMargin(); int leverage=AccountLeverage(); double tickvalue=MarketInfo(CurrentSymbol,MODE_TICKVALUE); double MINLOT = MarketInfo(CurrentSymbol,MODE_MINLOT); double LOTDIGITS = MarketInfo(CurrentSymbol,MODE_DIGITS); double LOT; int riskPip; if (StopLoss>0) { riskPip = StopLoss; } else { riskPip = RiskPercent*10; } if(RiskPercent==0 || RiskPerTrade==0) { LOT = AccountFreeMargin()*AccountLeverage()/1000/MarketInfo(CurrentSymbol,MODE_MARGINREQUIRED)/15; } else { double ordRisk = RiskPerTrade*0.01; double ordLeverage = leverage*0.1; LOT = NormalizeDouble((money*ordRisk/riskPip)/(leverage/tickvalue),LOTDIGITS); //LOT = (( ( AccountEquity()/100 )*( RiskPerTrade/ArraySize(SymbolsArray) ))/RiskFactor )/NormalizeDouble(MarketInfo(CurrentSymbol,MODE_TICKVALUE),2); } if (LOT>MarketInfo(CurrentSymbol,MODE_MAXLOT)) LOT = MarketInfo(CurrentSymbol,MODE_MAXLOT); if (LOT=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(AllSymbols==false && OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if Profit += (OrderProfit() + OrderCommission() + OrderSwap()); if(OrderType()==OP_SELL){SellLots=SellLots+OrderLots();Sells++;} if(OrderType()==OP_BUY){BuyLots=BuyLots+OrderLots();Buys++;} if(OrderSymbol()==CurrentSymbol) { if(OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT){PendingSellLots=PendingSellLots+OrderLots();PendingSell++;} if(OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT){PendingBuyLots=PendingBuyLots+OrderLots();PendingBuy++;} }//if }//if }//for } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void CloseAll(int sx, bool isGaining=false) { RefreshRates(); int Pos; int Total=OrdersTotal(); double BuysProfit=0,SellsProfit=0; if(Total>0) { for(i=Total-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE) { if(AllSymbols==false && OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if Pos=OrderType(); switch(Pos) { case OP_BUY: if(isGaining==true) { if( /*(bullish[sx]==true && OrderSymbol()==SymbolsArray[sx]) ||*/ (OrderStopLoss()>0 && OrderStopLoss()>OrderOpenPrice()) ) continue; } Result=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slippage, Blue); BuysProfit += OrderProfit()+OrderCommission()+OrderSwap(); continue; case OP_SELL: if(isGaining==true) { if( /*(bearish[sx]==true && OrderSymbol()==SymbolsArray[sx]) ||*/ (OrderStopLoss()>0 && OrderStopLoss()0 && isInGain==true) { for(i=Total-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE) { if(AllSymbols==false && OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if Pos=OrderType(); switch(Pos) { case OP_BUYSTOP: case OP_BUYLIMIT: case OP_SELLSTOP: case OP_SELLLIMIT: Result=OrderDelete(OrderTicket(), CLR_NONE); continue; } //----------------------- if(Result<0){Error=GetLastError();Log("LastError = "+Error);} else Error=0; //----------------------- //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); }//if }//for }//if return(0); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void ForceCloseAllOpenOrders() { RefreshRates(); int Pos; int Total=OrdersTotal(); if(Total>0) { for(i=Total-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE) { if(AllSymbols==false && OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if Pos=OrderType(); switch(Pos) { case OP_BUY: Result=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slippage, Blue); continue; case OP_SELL: Result=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slippage, Red); continue; } //----------------------- if(Result<0){Error=GetLastError();Log("LastError = "+Error);} else Error=0; //----------------------- //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); }//if }//for }//if } void DeleteAllPendingOrders(int PosClose=-1) { RefreshRates(); bool Result; int i,Pos,Error; int Total=OrdersTotal(); if(Total>0) {for(i=Total-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE) { if(AllSymbols==false && OrderSymbol()!=CurrentSymbol) { continue; }//if if(AllOrders==false && OrderMagicNumber()!=MagicNumber) { continue; }//if Pos=OrderType(); switch(PosClose) { case -1: if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT)){Result=OrderDelete(OrderTicket(), CLR_NONE);} break; case OP_BUY: if((Pos==OP_BUYSTOP)||(Pos==OP_SELLLIMIT)){Result=OrderDelete(OrderTicket(), CLR_NONE);} break; case OP_SELL: if((Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)){Result=OrderDelete(OrderTicket(), CLR_NONE);} break; } //----------------------- if(Result<0){Error=GetLastError();Log("LastError = "+Error);} else Error=0; //----------------------- //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); }//if }//for }//if return(0); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- int OpenOrder(string symbol, double LotOpenValue, int Type, double Price=0) { RefreshRates(); //Log("OpenOrder - LotHedgeValue:" + LotOpenValue + "; AccountFreeMargin: "+AccountFreeMargin()); if(tradingAllowed==true && AccountFreeMargin()>0) { if(Type==OP_BUY) { SL = 0; TP = 0; if(ECN == false && stopLoss > 0){SL=MarketInfo(symbol,MODE_ASK)+stopLoss;} if(AccountFreeMarginCheck(symbol,OP_BUY,LotOpenValue)<=(AccountEquity()*MarginPercent/100) || GetLastError()==134) { return(-1); } //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(symbol,OP_BUY,LotOpenValue,MarketInfo(symbol,MODE_ASK),Slippage,SL,TP,"Charels_"+VER,MagicNumber,0,Blue); Log("OpenOrder[OP_BUY] - Ask:" + MarketInfo(symbol,MODE_ASK) + "; Result: "+Result); } if(Type==OP_SELL) { SL = 0; TP = 0; if(ECN == false && stopLoss > 0){SL=MarketInfo(symbol,MODE_BID)-stopLoss;} if(AccountFreeMarginCheck(symbol,OP_SELL,LotOpenValue)<=(AccountEquity()*MarginPercent/100) || GetLastError()==134) { return(-1); } //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(symbol,OP_SELL,LotOpenValue,MarketInfo(symbol,MODE_BID),Slippage,SL,TP,"Charles_"+VER,MagicNumber,0,Red); Log("OpenOrder[OP_SELL] - Bid:" + MarketInfo(symbol,MODE_BID) + "; Result: "+Result); } if( (Type==OP_SELLLIMIT||Type==OP_BUYSTOP) && Price!=0 && Price>MarketInfo(symbol,MODE_ASK)) { SL = 0; TP = 0; if(ECN == false && stopLoss > 0){SL=Price-stopLoss;} if(AccountFreeMarginCheck(symbol,OP_SELL,LotOpenValue)<=(AccountEquity()*MarginPercent/100) || GetLastError()==134) { return(-1); } while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(symbol,Type,LotOpenValue,Price+MarketInfo(symbol,MODE_SPREAD)*MarketInfo(symbol,MODE_POINT),Slippage,SL,TP,"Charels_"+VER,MagicNumber,0,Blue); Log("OpenOrder["+Type+"] - Ask: " + (Price+MarketInfo(symbol,MODE_SPREAD)*MarketInfo(symbol,MODE_POINT)) + "; Result: "+Result); } if( (Type==OP_BUYLIMIT||Type==OP_SELLSTOP) && Price!=0 && Price 0){SL=Price+stopLoss;} if(AccountFreeMarginCheck(symbol,OP_BUY,LotOpenValue)<=(AccountEquity()*MarginPercent/100) || GetLastError()==134) { return(-1); } while (!IsTradeAllowed()) Sleep(100); RefreshRates(); Result=OrderSend(symbol,Type,LotOpenValue,Price-MarketInfo(symbol,MODE_SPREAD)*MarketInfo(symbol,MODE_POINT),Slippage,SL,TP,"Charels_"+VER,MagicNumber,0,Blue); Log("OpenOrder["+Type+"] - Bid: " + (Price-MarketInfo(symbol,MODE_SPREAD)*MarketInfo(symbol,MODE_POINT)) + "; Result: "+Result); } } //----------------------- if(Result==-1){Error=GetLastError();Log("LastError = "+Error);} else {Error=0;} //----------------------- return(Result); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void CheckTrailingStop(int ticket,int index,bool isGaining=false) { RefreshRates(); if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { if(OrderStopLoss()==0 && stopLoss>0) { switch(OrderType()) { case OP_BUY: //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-stopLoss, OrderTakeProfit(), 0, Blue)==false) { Error=GetLastError(); Log("LastError [CheckTrailingStop;OP_BUY::UpdateStopLoss]= "+Error+" - OrderOpenPrice# "+OrderOpenPrice()+" - StopLoss# "+stopLoss+" - New Stop# "+(OrderOpenPrice()-stopLoss)); } else { Log("[ECN Order BUY#"+OrderTicket()+"] StopLoss# "+stopLoss+" updated to # "+(OrderOpenPrice()-stopLoss) ); break; } case OP_SELL: //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+stopLoss, OrderTakeProfit(), 0, Red)==false) { Error=GetLastError(); Log("LastError [CheckTrailingStop;OP_SELL::UpdateStopLoss]= "+Error+" - OrderOpenPrice# "+OrderOpenPrice()+" - StopLoss# "+stopLoss+" - New Stop# "+(OrderOpenPrice()+stopLoss)); } else { Log("[ECN Order SELL#"+OrderTicket()+"] StopLoss# "+stopLoss+" updated to # "+(OrderOpenPrice()+stopLoss) ); break; } } } Sleep(100); RefreshRates(); double profitPips, increments, sl; double chgFromOpen; //MaloMax: inoltre il tuo ea fai un traling strettissimo ad ogni Point. // potresti inserire un tralingstep=0.0001 // // if( sl-tralingstep > NormalizeDouble(OrderStopLoss(), MarketInfo(CurrentSymbol,MODE_DIGITS)) ) { // // cosi che lo SL viene spostato solo ogni pips double tralingstep = 0;//0*MarketInfo(OrderSymbol(),MODE_POINT); if( OrderType() == OP_BUY ) { if( MaxOpenHours>0 && (TimeCurrent()-OrderOpenTime())/60 >= MaxOpenHours*PERIOD_H1 && OrderProfit()+OrderSwap()+OrderCommission()<0) { //if(MathAbs(Sells-Buys)<=MaxOpenOrders)OpenOrder(OrderSymbol(),normPrice(OrderLots()*xFactor),OP_SELL); return( OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), Slippage, Blue) ); } if(((TimeCurrent()-OrderOpenTime())/60 >= PERIOD_H1) && OrderProfit()+OrderSwap()+OrderCommission()<0 && takeProfit>0) { //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); //return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), MarketInfo(OrderSymbol(),MODE_BID)+takeProfit, 0, Blue) ); if(UsePivots==true && isCals[index]==true) { double chgFromSupport1=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - Support1[index], MarketInfo(OrderSymbol(),MODE_DIGITS)); double chgFromSupport2=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - Support2[index], MarketInfo(OrderSymbol(),MODE_DIGITS)); double chgFromSupport3=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - Support3[index], MarketInfo(OrderSymbol(),MODE_DIGITS)); //Log("[Order# "+ticket+"] BID# "+MarketInfo(OrderSymbol(),MODE_BID)+" - takeProfit# "+takeProfit+" - chgFromSupport1# "+chgFromSupport1+" - chgFromSupport2# "+chgFromSupport2+" - chgFromSupport3# "+chgFromSupport3); if(chgFromSupport3<0 && MathAbs(chgFromSupport3)>=takeProfit && (OrderTakeProfit()==0 || OrderTakeProfit()>(Resist1[index]+takeProfit))) { /*if(MathAbs(chgFromSupport3)>=1.5*takeProfit && (OrderStopLoss()==0 || OrderStopLoss()=takeProfit && (OrderTakeProfit()==0 || OrderTakeProfit()>(Resist2[index]+takeProfit))) { Log("[Order# "+ticket+"] Modifying takeprofit to "+(Resist2[index]+takeProfit)); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), Resist2[index]+takeProfit, 0, Blue) ); } if(chgFromSupport1<0 && MathAbs(chgFromSupport1)>=takeProfit && (OrderTakeProfit()==0 || OrderTakeProfit()>(Resist3[index]+takeProfit))) { Log("[Order# "+ticket+"] Modifying takeprofit to "+(Resist3[index]+takeProfit)); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), Resist3[index]+takeProfit, 0, Blue) ); } } } //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); chgFromOpen = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID) - OrderOpenPrice(), MarketInfo(OrderSymbol(),MODE_DIGITS)); //Log("["+OrderSymbol()+"] isGaining#"+isGaining+"; chgFromOpen#"+chgFromOpen+"; trailStart#"+trailStart+"; StopLevel#"+(StopLevel * MarketInfo(OrderSymbol(),MODE_POINT)) ); // move to break even if(isGaining==true && chgFromOpen >= trailStart && chgFromOpen > (StopLevel * MarketInfo(OrderSymbol(),MODE_POINT)) && (OrderStopLoss()==0 || NormalizeDouble(OrderStopLoss(),MarketInfo(OrderSymbol(),MODE_DIGITS)) < NormalizeDouble(OrderOpenPrice(), MarketInfo(OrderSymbol(),MODE_DIGITS))) && trailStart != 0 ) { Log("["+OrderSymbol()+"] Moving stop to breakeven on order " + OrderTicket() + ". chgFromOpen is " + chgFromOpen + ", OrderOpenPrice is " + OrderOpenPrice() + " and Bid is " + DoubleToStr( MarketInfo(OrderSymbol(),MODE_BID), MarketInfo(OrderSymbol(),MODE_DIGITS) ) + ", Trail start is " + DoubleToStr( trailStart, MarketInfo(OrderSymbol(),MODE_DIGITS) ) ); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Blue) ); } profitPips = MarketInfo(OrderSymbol(),MODE_BID) - ( trailStart + OrderOpenPrice() ) ; if( trailAmount != 0) increments = MathFloor( profitPips / trailAmount ); else increments = 0; if (isGaining==true && increments >= 1 && MarketInfo(OrderSymbol(),MODE_BID) >= OrderOpenPrice() + trailStart + ( increments * trailAmount ) ) { sl = NormalizeDouble( OrderOpenPrice() + ( (increments-1) * trailAmount ), MarketInfo(OrderSymbol(),MODE_DIGITS)); if( OrderStopLoss()==0 || sl-tralingstep > NormalizeDouble(OrderStopLoss(), MarketInfo(OrderSymbol(),MODE_DIGITS)) ) { //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); if( OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, Blue ) ){ Log("Trailng stop updated. Total increments: " + DoubleToStr(increments, MarketInfo(OrderSymbol(),MODE_DIGITS)) ); return(true); } } } } if( OrderType() == OP_SELL ) { if( MaxOpenHours>0 && (TimeCurrent()-OrderOpenTime())/60 >= MaxOpenHours*PERIOD_H1 && OrderProfit()+OrderSwap()+OrderCommission()<0) { //if(MathAbs(Sells-Buys)<=MaxOpenOrders)OpenOrder(OrderSymbol(),normPrice(OrderLots()*xFactor),OP_BUY); return( OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), Slippage, Red) ); } if(((TimeCurrent()-OrderOpenTime())/60 >= PERIOD_H1) && OrderProfit()+OrderSwap()+OrderCommission()<0 && takeProfit>0) { //return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), MarketInfo(OrderSymbol(),MODE_ASK)-takeProfit, 0, Red) ); if(UsePivots==true && isCals[index]==true) { double chgFromResist1=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK) - Resist1[index], MarketInfo(OrderSymbol(),MODE_DIGITS)); double chgFromResist2=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK) - Resist2[index], MarketInfo(OrderSymbol(),MODE_DIGITS)); double chgFromResist3=NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK) - Resist3[index], MarketInfo(OrderSymbol(),MODE_DIGITS)); //Log("[Order# "+ticket+"] BID# "+MarketInfo(OrderSymbol(),MODE_BID)+" - takeProfit# "+takeProfit+" - chgFromResist1# "+chgFromResist1+" - chgFromResist2# "+chgFromResist2+" - chgFromResist3# "+chgFromResist3); if(chgFromResist3>0 && MathAbs(chgFromResist3)>=takeProfit && (OrderTakeProfit()==0 || OrderTakeProfit()<(Support1[index]-takeProfit))) { /*if(MathAbs(chgFromResist3)>=1.5*takeProfit && (OrderStopLoss() == 0 || OrderStopLoss()>Resist3[index])) { Log("[Order# "+ticket+"] WARNING! Too low. Hedging and modifying takeprofit to "+normPrice(MarketInfo(OrderSymbol(),MODE_ASK)+takeProfit)); //OpenOrder(OrderSymbol(),NormalizeDouble(OrderLots()*xFactor,MarketInfo(OrderSymbol(),MODE_DIGITS)),OP_BUY); return( OrderModify( OrderTicket(), OrderOpenPrice(), normPrice(MarketInfo(OrderSymbol(),MODE_ASK)+takeProfit), OrderTakeProfit(), 0, Red) ); } else {*/ Log("[Order# "+ticket+"] Modifying takeprofit to "+(Support1[index]-takeProfit)); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), Support1[index]-takeProfit, 0, Red) ); /*}*/ } if(chgFromResist2>0 && MathAbs(chgFromResist2)>=takeProfit && (OrderTakeProfit()==0 || OrderTakeProfit()<(Support2[index]-takeProfit))) { Log("[Order# "+ticket+"] Modifying takeprofit to "+(Support2[index]-takeProfit)); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), Support2[index]-takeProfit, 0, Red) ); } if(chgFromResist1>0 && MathAbs(chgFromResist1)>=takeProfit && (OrderTakeProfit()==0 || OrderTakeProfit()<(Support3[index]-takeProfit))) { Log("[Order# "+ticket+"] Modifying takeprofit to "+(Support3[index]-takeProfit)); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderStopLoss(), Support3[index]-takeProfit, 0, Red) ); } } } //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); chgFromOpen = NormalizeDouble(OrderOpenPrice() - MarketInfo(OrderSymbol(),MODE_ASK), MarketInfo(OrderSymbol(),MODE_DIGITS)); //Log("["+OrderSymbol()+"] isGaining#"+isGaining+"; chgFromOpen#"+chgFromOpen+"; trailStart#"+trailStart+"; StopLevel#"+(StopLevel * MarketInfo(OrderSymbol(),MODE_POINT)) ); // move to break even if(isGaining==true && chgFromOpen >= trailStart && chgFromOpen > (StopLevel * MarketInfo(OrderSymbol(),MODE_POINT)) && (OrderStopLoss()==0 || NormalizeDouble(OrderStopLoss(),MarketInfo(OrderSymbol(),MODE_DIGITS)) > NormalizeDouble(OrderOpenPrice(), MarketInfo(OrderSymbol(),MODE_DIGITS))) && trailStart != 0 ) { Log("["+OrderSymbol()+"] Moving stop to breakeven on order " + OrderTicket() + ". chgFromOpen is " + chgFromOpen + ", OrderOpenPrice is " + OrderOpenPrice() + " and Ask is " + DoubleToStr( MarketInfo(OrderSymbol(),MODE_ASK), MarketInfo(OrderSymbol(),MODE_DIGITS) ) + ", Trail start is " + DoubleToStr( trailStart, MarketInfo(OrderSymbol(),MODE_DIGITS) ) ); return( OrderModify( OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, Red) ); } profitPips = ( OrderOpenPrice()- trailStart ) - MarketInfo(OrderSymbol(),MODE_ASK) ; if( trailAmount != 0) { increments = MathFloor( profitPips / trailAmount ); } else { increments = 0; } if (isGaining==true && increments >= 1 && MarketInfo(OrderSymbol(),MODE_ASK) <= OrderOpenPrice() - trailStart - ( increments * trailAmount ) ) { sl = NormalizeDouble(OrderOpenPrice() - ( (increments-1) * trailAmount ), MarketInfo(OrderSymbol(),MODE_DIGITS)); if( OrderStopLoss()==0 || sl-tralingstep < NormalizeDouble(OrderStopLoss(), MarketInfo(OrderSymbol(),MODE_DIGITS)) ) { //MaloMax: la chiusura di molti ordini puo dare problemi per la lentezza di esecuzione. Tra una chiusura e l'altra potresti inserire questo codice while (!IsTradeAllowed()) Sleep(100); RefreshRates(); if( OrderModify( OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0, Red) ) { Log("Trailng stop updated. Total increments: " + DoubleToStr(increments, MarketInfo(OrderSymbol(),MODE_DIGITS)) ); return(true); } } } } } } //+------------------------------------------------------------------+ //| initialization of Calspivot function | //+------------------------------------------------------------------+ bool isCalsPivot(string theSymbol, int index) { int tHour; double hLine; double lLine; int i,k; /*if ( TimeHour(iTime(theSymbol,PERIOD_H1,1))== 0 ) {*/ tHour = TimeHour(iTime(theSymbol,PERIOD_H1,2)); k= tHour+1; //Log(theSymbol + " - tHour: " + tHour); //Log(theSymbol + " - K: " + k); hLine = iHigh(theSymbol,PERIOD_H1,tHour); lLine = iLow(theSymbol,PERIOD_H1,tHour); for (i = tHour+1; i > 0; i--) { if (iLow(theSymbol,PERIOD_H1,i+1) < lLine) lLine = iLow(theSymbol,PERIOD_H1,i+1); if (iHigh(theSymbol,PERIOD_H1,i+1) > hLine) hLine = iHigh(theSymbol,PERIOD_H1,i+1); //Log(theSymbol + " - i# "+i+" lLine# "+ lLine+ " Low# "+ iLow(theSymbol,PERIOD_H1,i+1)+ " hLine #"+ hLine+ " High #"+ iHigh(theSymbol,PERIOD_H1,i+1)+ " time #" + TimeHour(iTime(theSymbol,PERIOD_H1,i+1))+ " day #"+ TimeDay(iTime(theSymbol,PERIOD_H1,i+1))); } pPoint[index] = (lLine + hLine + iClose(theSymbol,PERIOD_H1,2)) / 3; r1[index] = 2 * pPoint[index] - lLine; s1[index] = 2 * pPoint[index] - hLine; r2[index] = pPoint[index] + (r1[index] - s1[index]); s2[index] = pPoint[index] - (r1[index] - s1[index]); r3[index] = hLine + 2 * (pPoint[index] - lLine); s3[index] = lLine - 2 * (hLine - pPoint[index]); CalsPivot(theSymbol, index); isCals[index] = true; return (true); /* } return (false);*/ } //+------------------------------------------------------------------+ //| Cals Pivot function | //+------------------------------------------------------------------+ void CalsPivot(string theSymbol, int index) { Pivot[index] =NormalizeDouble(pPoint[index],MarketInfo(theSymbol,MODE_DIGITS)); Resist1[index] =NormalizeDouble(r1[index],MarketInfo(theSymbol,MODE_DIGITS)); Resist2[index] =NormalizeDouble(r2[index],MarketInfo(theSymbol,MODE_DIGITS)); Resist3[index] =NormalizeDouble(r3[index],MarketInfo(theSymbol,MODE_DIGITS)); Support1[index] =NormalizeDouble(s1[index],MarketInfo(theSymbol,MODE_DIGITS)); Support2[index] =NormalizeDouble(s2[index],MarketInfo(theSymbol,MODE_DIGITS)); Support3[index] =NormalizeDouble(s3[index],MarketInfo(theSymbol,MODE_DIGITS)); //Log(theSymbol + " - Pivot# "+Pivot[index]+" Resist1# "+Resist1[index]+" Support1# "+Support1[index]); //Log(theSymbol + " - Pivot# "+Pivot[index]+" Resist2# "+Resist2[index]+" Support2# "+Support2[index]); //Log(theSymbol + " - Pivot# "+Pivot[index]+" Resist3# "+Resist3[index]+" Support3# "+Support3[index]); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- double normPrice (double price) { return(NormalizeDouble(price,2)); } //--------------------------------------------------------------------------- void startFile() { int handle; handle=FileOpen("Charles-"+VER+".log", FILE_BIN|FILE_READ|FILE_WRITE); if(handle<1) { Print("can't open file error-",GetLastError()); return(0); } FileSeek(handle, 0, SEEK_END); //---- add data to the end of file string str = "----------------------------------------------------------------------------------------------------------------------------------------\n" + "-- Charles v."+VER+" - Log Starting... --\n" + "----------------------------------------------------------------------------------------------------------------------------------------\n"; FileWriteString(handle, str, StringLen(str)); FileFlush(handle); FileClose(handle); } //--------------------------------------------------------------------------- void Log(string str) { str = "["+Day()+"-"+Month()+"-"+Year()+" "+Hour()+":"+Minute()+":"+Seconds()+"] "+str+"\n"; if(LogToFile) { int handle; handle=FileOpen("Charles-"+VER+".log", FILE_BIN|FILE_READ|FILE_WRITE); if(handle<1) { Print("can't open file error-",GetLastError()); return(0); } FileSeek(handle, 0, SEEK_END); //---- add data to the end of file FileWriteString(handle, str, StringLen(str)); FileFlush(handle); FileClose(handle); } else { Print(str); } } //--------------------------------------------------------------------------- string TimeStr(int taim) { string sTaim; int HH=TimeHour(taim); // Hour int MM=TimeMinute(taim); // Minute if (HH<10) sTaim = StringConcatenate(sTaim,"0",DoubleToStr(HH,0)); else sTaim = StringConcatenate(sTaim,DoubleToStr(HH,0)); if (MM<10) sTaim = StringConcatenate(sTaim,":0",DoubleToStr(MM,0)); else sTaim = StringConcatenate(sTaim,":",DoubleToStr(MM,0)); return(sTaim); } //+------------------------------------------------------------------+ int StringFindCount(string str, string str2) //+------------------------------------------------------------------+ // Returns the number of occurrences of STR2 in STR // Usage: int x = StringFindCount("ABCDEFGHIJKABACABB","AB") returns x = 3 { int c = 0; for (int i=0; iz1+1) a[i] = StringSubstr(str,z1+1,z2-z1-1); if (z2 >= StringLen(str)-1) break; z1 = z2; } return(StringFindCount(str,delim)); } //+------------------------------------------------------------------+ string StringTrim(string str) //+------------------------------------------------------------------+ // Removes all spaces (leading, traing embedded) from a string // Usage: string x=StringUpper("The Quick Brown Fox") returns x = "TheQuickBrownFox" { string outstr = ""; for(int i=0; i 0) return(StringSubstr(str,StringLen(str)-n,n)); if (n < 0) return(StringSubstr(str,-n,StringLen(str)-n)); return(""); }