//+-----------------------------------------------------------------------------------+ //| HMA POWER EA 3.mq4 | //| Copyright © 2005, Alejandro Galindo | //| http://elCactus.com | //| Copyright © 2007, AZAM575 & OILFXPRO & YUSOF786 | //| http://mymefx.com | //+-----------------------------------------------------------------------------------+ ///Please, do not sell this EA because its FREE #property copyright "Copyright © 2007, AZAM575&OILFXPRO&YUSOF786" #property link "MYMEFX.COM" extern string INFO="HMA POWER EA"; extern string OWN="Copyright © 2007, AZAM575&OILFXPRO&YUSOF786"; extern int last_bar= 1; extern bool long = true; extern bool short = true; extern bool ExitWithRSI=False; extern string sb="--TRADE SETTING--"; extern double Lots = 0.1; // We start with this lots number extern int TakeProfit = 32; // Profit Goal for the latest order opened extern double multiply=2.0; extern int MaxTrades=15; // Maximum number of orders to open extern int Pips=22; // Distance in Pips from one order to another extern int StopLoss = 0; // StopLoss extern int TrailingStop = 0;// Pips to trail the StopLoss extern string MM="--MOney Management--"; // (from order 2, not from first order extern string MMSwicth="if one the lots size will increase based on account size"; extern int mm=0; // if one the lots size will increase based on account size extern string riskset="risk to calculate the lots size (only if mm is enabled)"; extern int risk=1; // risk to calculate the lots size (only if mm is enabled) extern string accounttypes="0 if Normal Lots, 1 for mini lots, 2 for micro lots"; extern int AccountType=1; // 0 if Normal Lots, 1 for mini lots, 2 for micro lots extern string magicnumber="--MAgic No--"; extern int MagicNumber=222777; // Magic number for the orders placed //extern int MagicNumber=0; // Magic number for the orders placed extern string so="--CUTLOSS SETTING--"; extern bool MyMoneyProfitTarget=False; extern double My_Money_Profit_Target=50; extern bool SecureProfitProtection=False; extern string SP="If profit made is bigger than SecureProfit we close the orders"; extern int SecureProfit=20; // If profit made is bigger than SecureProfit we close the orders extern string OTP="Number of orders to enable the account protection"; extern int OrderstoProtect=3; // Number of orders to enable the account protection extern string ASP="if one will check profit from all symbols, if cero only this symbol"; extern bool AllSymbolsProtect=False; // if one will check profit from all symbols, if cero only this symbol extern string EP="if true, then the expert will protect the account equity to the percent specified"; extern bool EquityProtection=False; // if true, then the expert will protect the account equity to the percent specified extern string AEP="percent of the account to protect on a set of trades"; extern int AccountEquityPercentProtection=90; // percent of the account to protect on a set of trades extern string AMP="if true, then the expert will use money protection to the USD specified"; extern bool AccountMoneyProtection=False; extern double AccountMoneyProtectionValue=3000.00; string s1="--seting berapa jam dia nak open order--"; bool UseHourTrade = False; int FromHourTrade = 0; int ToHourTrade = 1; extern string TradingTime="--trading time setting--"; extern bool UseTradingHours = false; extern bool TradeAsianMarket = true; extern int StartHour1 = 0; // Start trades after time extern int StopHour1 = 3; // Stop trading after time extern bool TradeEuropeanMarket = true; extern int StartHour2 = 9; // Start trades after time extern int StopHour2 = 11; // Stop trading after time extern bool TradeNewYorkMarket = false; extern int StartHour3 = 15; // Start trades after time extern int StopHour3 = 17; // Stop trading after time extern bool TradeOnFriday=True; extern string OtherSetting="--Others Setting--"; int OrdersTimeAlive=0; // in seconds extern string reverse="if one the desition to go long/short will be reversed"; extern bool ReverseCondition=False; // if one the desition to go long/short will be reversed extern string limitorder="if true, instead open market orders it will open limit orders "; extern bool SetLimitOrders=False; // if true, instead open market orders it will open limit orders int Manual=0; // If set to one then it will not open trades automatically color ArrowsColor=Black; // color for the orders arrows int OpenOrdersBasedOn=16; // Method to decide if we start long or short bool ContinueOpening=True; int OpenOrders=0, cnt=0; int MarketOpenOrders=0, LimitOpenOrders=0; int slippage=5; double sl=0, tp=0; double BuyPrice=0, SellPrice=0; double lotsi=0, mylotsi=0; int mode=0, myOrderType=0, myOrderTypetmp=0; double LastPrice=0; int PreviousOpenOrders=0; double Profit=0; int LastTicket=0, LastType=0; double LastClosePrice=0, LastLots=0; double Pivot=0; double PipValue=0; bool Reversed=False; double tmp=0; double iTmpH=0; double iTmpL=0; datetime NonTradingTime[][2]; bool FileReaded=false; string dateLimit = "2030.01.12 23:00"; int CurTimeOpeningFlag=0; datetime LastOrderOpenTime=0; bool YesStop; // Orest : new variables declaration extern string HedgeSettings="-- Hedging safety strategy settings --"; extern bool Use_Hedging = false; extern int Max_Loss_For_Hedge_pips = 50; //After how many negative pips the hedge is trigered //extern int Max_Days_Hedge_Open = 0; extern double Hedge_Lots_Multiplier = 1.0; extern int Pips_Less_Then_Max_Closing = 10; datetime LastHedgeAction; int Max_SL_pips = 500; // end of new variables declaration //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- // Orest LastHedgeAction=0; if (Hedge_Lots_Multiplier < 1) Hedge_Lots_Multiplier = 1; //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- DeleteAllObjects(); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int cnt=0; bool result; string text=""; string version="VERSI INI DAH EXPIRED...SILA YM xxul_gunturean utk penggantian"; //***============================== // Orest -- Process hedging orders int loss_pips_start = 0; if (Use_Hedging) hedgeManager(); //***============================== // skrip masa trading if (UseTradingHours) { YesStop = true; // Check trading Asian Market if (TradeAsianMarket) { if (StartHour1 > 18) { // Check broker that uses Asian open before 0:00 if (Hour() >= StartHour1) YesStop = false; if (!YesStop) { if (StopHour1 < 24) { if ( Hour() <= StopHour1) YesStop = false; } // These cannot be combined even though the code looks the same if (StopHour1 >=0) { if ( Hour() <= StopHour1) YesStop = false; } } } else { if (Hour() >= StartHour1 && Hour() <= StopHour1) YesStop = false; } } if (YesStop) { // Check trading European Market if (TradeEuropeanMarket) { if (Hour() >= StartHour2 && Hour() <= StopHour2) YesStop = false; } } if (YesStop) { // Check trading European Market if (TradeNewYorkMarket) { if (Hour() >= StartHour3 && Hour() <= StopHour3) YesStop = false; } } if (YesStop) { // Comment ("Trading has been stopped as requested - wrong time of day"); return (0); } } // skrip masa trading if (AccountType==0) { if (mm!=0) { lotsi=MathCeil(AccountBalance()*risk/10000); } else { lotsi=Lots; } } if (AccountType==1) { // then is mini if (mm!=0) { lotsi=MathCeil(AccountBalance()*risk/10000)/10; } else { lotsi=Lots; } } if (AccountType==2) { if (mm!=0) { lotsi=MathCeil(AccountBalance()*risk/10000)/100; } else { lotsi=Lots; } } if (lotsi<0.01) lotsi=0.01; if (lotsi>100) lotsi=100; OpenOrders=0; MarketOpenOrders=0; LimitOpenOrders=0; for(cnt=0;cnt=AccountMoneyProtectionValue) { text = text + "\nClosing all orders and stop trading because account money protection activated.."; Print("Closing all orders and stop trading because account money protection activated.. Balance: ",AccountBalance()," Equity: ",AccountEquity()); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } ////aku masukkan time if (UseHourTrade){ if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) { text = text + "\nORDER TELAH DI TUTUP KERANA MASA DAH TAMAT."; Print("ORDER TELAH DI TUTUP KERANA MASA TAMAT. UNTUNG: ",AccountProfit()," EKUITI: ",AccountEquity()); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } } //set my profit for one Day if (MyMoneyProfitTarget && AccountProfit()>= My_Money_Profit_Target) { text = text + "\nClosing all orders and stop trading because mymoney profit target reached.."; Print("Closing all orders and stop trading because mymoney profit target reached.. Profit: ",AccountProfit()," Equity: ",AccountEquity()); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } // Account equity protection if (EquityProtection && AccountEquity()<=AccountBalance()*AccountEquityPercentProtection/100) { text = text + "\nClosing all orders and stop trading because account money protection activated."; Print("Closing all orders and stop trading because account money protection activated. Balance: ",AccountBalance()," Equity: ", AccountEquity()); //Comment("Closing orders because account equity protection was triggered. Balance: ",AccountBalance()," Equity: ", AccountEquity()); //OrderClose(LastTicket,LastLots,LastClosePrice,slippage,Orange); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } // if dont trade at fridays then we close all if (!TradeOnFriday && DayOfWeek()==5) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text +"\nClosing all orders and stop trading because TradeOnFriday protection."; Print("Closing all orders and stop trading because TradeOnFriday protection."); } // Orders Time alive protection if (OrdersTimeAlive>0 && CurTime() - LastOrderOpenTime>OrdersTimeAlive) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text + "\nClosing all orders because OrdersTimeAlive protection."; Print("Closing all orders because OrdersTimeAlive protection."); } if (PreviousOpenOrders>OpenOrders) { for(cnt=OrdersTotal()-1;cnt>=0;cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { mode=OrderType(); if ((OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber) || AllSymbolsProtect) { if (mode==OP_BUY || mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,ArrowsColor); return(0); } } } } for(cnt=0; cnt=MaxTrades) { ContinueOpening=False; } else { ContinueOpening=True; } if (LastPrice==0) { for(cnt=0;cnt=(MaxTrades-OrderstoProtect) // Modified to make easy to understand if (SecureProfitProtection && MarketOpenOrders>=OrderstoProtect) { Profit=0; for(cnt=0;cnt=SecureProfit) { text = text + "\nClosing orders because account protection with SecureProfit was triggered."; Print("Closing orders because account protection with SeureProfit was triggered. Balance: ",AccountBalance()," Equity: ", AccountEquity()," Profit: ",Profit); PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; return(0); } } myOrderTypetmp=3; switch (OpenOrdersBasedOn) { case 16: myOrderTypetmp=OpenOrdersBasedOnRSI(); break; default: myOrderTypetmp=OpenOrdersBasedOnRSI(); break; } if (OpenOrders<1 && Manual==0) { myOrderType=myOrderTypetmp; if (ReverseCondition) { if (myOrderType==1) { myOrderType=2; } else { if (myOrderType==2) { myOrderType=1; } } } } if (ReverseCondition) { if (myOrderTypetmp==1) { myOrderTypetmp=2; } else { if (myOrderTypetmp==2) { myOrderTypetmp=1; } } } // if we have opened positions we take care of them cnt=OrdersTotal()-1; while(cnt>=0) { if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==false) break; if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) // && Reversed==False) { //Print("Ticket ",OrderTicket()," modified."); // Orest loss_pips_start = getPipsForSL(OrderOpenPrice(),OrderStopLoss(), OrderType()); if (OrderType()==OP_SELL && loss_pips_start < Max_SL_pips) { if (ExitWithRSI&& myOrderTypetmp==2) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text +"\nClosing all orders because Indicator triggered another signal."; Print("Closing all orders because Indicator triggered another signal."); //return(0); } if (TrailingStop>0) { if ((OrderOpenPrice()-OrderClosePrice())>=(TrailingStop*Point+Pips*Point)) { if (OrderStopLoss()>(OrderClosePrice()+TrailingStop*Point)) { result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+TrailingStop*Point,OrderClosePrice()-TakeProfit*Point-TrailingStop*Point,0,Purple); if(result!=TRUE) Print("LastError = ", GetLastError()); else OrderPrint(); return(0); } } } } if (OrderType()==OP_BUY && loss_pips_start < Max_SL_pips) { if (ExitWithRSI && myOrderTypetmp==1) { PreviousOpenOrders=OpenOrders+1; ContinueOpening=False; text = text +"\nClosing all orders because Indicator triggered another signal."; Print("Closing all orders because Indicator triggered another signal."); //return(0); } if (TrailingStop>0) { if ((OrderClosePrice()-OrderOpenPrice())>=(TrailingStop*Point+Pips*Point)) { if (OrderStopLoss()<(OrderClosePrice()-TrailingStop*Point)) { result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-TrailingStop*Point,OrderClosePrice()+TakeProfit*Point+TrailingStop*Point,0,ArrowsColor); if(result!=TRUE) Print("LastError = ", GetLastError()); else OrderPrint(); return(0); } } } } } cnt--; } if (!IsTesting()) { if (myOrderType==3 && OpenOrders<1) { text=text + "\nTIADA KONDISI UTK OPEN ORDER"; } //else { text= text + "\n "; } Comment("HARGA TERAKHIR=",LastPrice," OPEN ODER YG LEPAS=",PreviousOpenOrders,"\nBUKA LAGI=",ContinueOpening," JENISORDER=",myOrderType,"\nLOT=",lotsi,text); } if (OpenOrders<1) OpenMarketOrders(); else if (SetLimitOrders) OpenLimitOrders(); else OpenMarketOrders(); //---- return(0); } //+------------------------------------------------------------------+ void OpenMarketOrders() { int cnt=0; if (myOrderType==1 && ContinueOpening) { if ((Bid-LastPrice)>=Pips*Point || OpenOrders<1) { SellPrice=Bid; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=SellPrice-TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=SellPrice+StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_SELL,mylotsi,SellPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); } // Sleep(6000); ////aku letak // RefreshRates(); } if (myOrderType==2 && ContinueOpening) { if ((LastPrice-Ask)>=Pips*Point || OpenOrders<1) { BuyPrice=Ask; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=BuyPrice+TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=BuyPrice-StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_BUY,mylotsi,BuyPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); } } } void OpenLimitOrders() { int cnt=0; if (myOrderType==1 && ContinueOpening) { //if ((Bid-LastPrice)>=Pips*Point || OpenOrders<1) //{ //SellPrice=Bid; SellPrice = LastPrice+Pips*Point; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=SellPrice-TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=SellPrice+StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_SELLLIMIT,mylotsi,SellPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); //} } if (myOrderType==2 && ContinueOpening) { //if ((LastPrice-Ask)>=Pips*Point || OpenOrders<1) //{ //BuyPrice=Ask; BuyPrice=LastPrice-Pips*Point; LastPrice=0; if (TakeProfit==0) { tp=0; } else { tp=BuyPrice+TakeProfit*Point; } if (StopLoss==0) { sl=0; } else { sl=BuyPrice-StopLoss*Point; } if (OpenOrders!=0) { mylotsi=lotsi; for(cnt=0;cnt12) { mylotsi=NormalizeDouble(mylotsi*multiply,2); } else { mylotsi=NormalizeDouble(mylotsi*multiply,2); } } } else { mylotsi=lotsi; } if (mylotsi>100) { mylotsi=100; } OrderSend(Symbol(),OP_BUYLIMIT,mylotsi,BuyPrice,slippage,sl,tp,"MyMEFx EA"+MagicNumber,MagicNumber,0,ArrowsColor); return(0); //} } } void DeleteAllObjects() { int obj_total=ObjectsTotal(); string name; for(int i=0;i hma420_2 && hma200_1 > hma200_2 && hma200_2 > hma420_2 && hma4_1 > hma6_1 && hma6_1 > hma8_1 && hma8_1 > hma10_1 && hma10_1 > hma20_1 && hma20_1 > hma40_1 && hma40_1 > hma80_1 && hma4_1 > hma4_2 && hma6_1 > hma6_2 && hma8_1 > hma8_2 && hma10_1 > hma10_2 && hma20_1 > hma20_2 && hma40_1 > hma40_2 && hma80_1 > hma80_2 && long ) { myOrderType=2; } //buy order if ( hma420_1 < hma420_2 && hma200_1 < hma200_2 && hma200_2 < hma420_2 && hma4_1 < hma6_1 && hma6_1 < hma8_1 && hma8_1 < hma10_1 && hma10_1 < hma20_1 && hma20_1 < hma40_1 && hma40_1 < hma80_1 && hma4_1 < hma4_2 && hma6_1 < hma6_2 && hma8_1 < hma8_2 && hma10_1 < hma10_2 && hma20_1 < hma20_2 && hma40_1 < hma40_2 && hma80_1 < hma80_2 && short ) { myOrderType=1; } return(myOrderType); } // Hedge orders manager void hedgeManager() { int MagicNumber_hedge_sell = MagicNumber + 1; int MagicNumber_hedge_buy = MagicNumber + 2; bool result = false; double order_sl, sl; int cnt, hedge_sl; int Pips_buy = 0; int Pips_sell = 0; bool result_close=false; string buy_ord_numbers, sell_ord_numbers; double hedge_sell_profit, hedge_buy_profit; // Close Hedge Orders if price goes our direction for(cnt=OrdersTotal()-1;cnt>=0;cnt--) { //1 Pips_buy = 0; Pips_sell = 0; buy_ord_numbers = ""; sell_ord_numbers= ""; result_close = false; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //.... Add closing by date here (hedge and all related orders) if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber_hedge_sell) //Max_Days_Hedge_Open*24*60*60 {//2 hedge_sl = getPipsForSL(OrderOpenPrice(),OrderStopLoss(),OrderType()); hedge_sell_profit = OrderLots()*(OrderOpenPrice() - Ask); // Checking if our main trades improved (sum(pips) > ) for(int cnt_s = OrdersTotal()-1; cnt_s>=0; cnt_s--) {//3 if (OrderSelect(cnt_s, SELECT_BY_POS, MODE_TRADES)) {//4 if (OrderType() == OP_BUY) {//5 order_sl = getPipsForSL(OrderOpenPrice(),OrderStopLoss(),OrderType()); if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && order_sl>0 && order_sl==hedge_sl) {//6 if ((Bid - OrderOpenPrice()) < 0) {//7 if (Pips_buy==0) buy_ord_numbers = ""+ OrderTicket(); else buy_ord_numbers = buy_ord_numbers +","+ OrderTicket(); Pips_buy = Pips_buy + MathAbs(Bid - OrderOpenPrice())/Point; }//7 hedge_sell_profit = hedge_sell_profit + OrderLots()*(Bid - OrderOpenPrice()); }//6 }//5 }//4 }//3 // end for if ((StringLen(buy_ord_numbers)>0 && Pips_buy < (Max_Loss_For_Hedge_pips - Pips_Less_Then_Max_Closing) && Hedge_Lots_Multiplier==1) || (Hedge_Lots_Multiplier>1 && hedge_sell_profit > 0)) {//3 if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {//4 Print("Close SELL Hedge Order==>", OrderTicket()," Orders:",buy_ord_numbers); result_close = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,ArrowsColor); LastHedgeAction = TimeCurrent(); }//4 for(int cnt_bs = OrdersTotal()-1; result_close && cnt_bs>=0; cnt_bs--) {//4 if (OrderSelect(cnt_bs, SELECT_BY_POS, MODE_TRADES)) {//5 if (OrderType() == OP_BUY) {//6 order_sl = getPipsForSL(OrderOpenPrice(),OrderStopLoss(),OrderType()); if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && order_sl>0 && order_sl==hedge_sl) {//7 if (Hedge_Lots_Multiplier>1 && hedge_sell_profit > 0) { //8 result = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,ArrowsColor); } //8 else { //8 if (StopLoss==0) { sl = 0; } else { sl = OrderOpenPrice()-StopLoss*Point;} result=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Purple); if(! result) Print("Error during Modify BUY Hedge linked order: ", GetLastError()); else Print("Modify correspondent BUY Order==>", OrderTicket()); } //8 }//7 }//6 }//5 }//4 // end for }//3 }//2 //.... Add closing by date here (hedge and all related orders) else if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber_hedge_buy) // Max_Days_Hedge_Open*24*60*60 {//2 hedge_sl = getPipsForSL(OrderOpenPrice(),OrderStopLoss(),OrderType()); hedge_buy_profit = OrderLots()*(Bid - OrderOpenPrice()); // Checking if our main trades improved (sum(pips) > ) for(int cnt_b = OrdersTotal()-1; cnt_b>=0; cnt_b--) {//3 if (OrderSelect(cnt_b, SELECT_BY_POS, MODE_TRADES)) {//4 if (OrderType() == OP_SELL) {//5 order_sl = getPipsForSL(OrderOpenPrice(),OrderStopLoss(),OrderType()); if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && order_sl>0 && order_sl==hedge_sl) {//6 if ((OrderOpenPrice() - Ask) < 0) { //7 if (Pips_sell==0) sell_ord_numbers = ""+ OrderTicket(); else sell_ord_numbers = sell_ord_numbers +","+ OrderTicket(); Pips_sell = Pips_sell + MathAbs(OrderOpenPrice() - Ask)/Point; } hedge_buy_profit = hedge_buy_profit + (OrderOpenPrice() - Ask); }//6 }//5 }//4 }//3 // end for if ((StringLen(sell_ord_numbers)>0 && Pips_sell < (Max_Loss_For_Hedge_pips - Pips_Less_Then_Max_Closing) && Hedge_Lots_Multiplier==1) || (Hedge_Lots_Multiplier > 1 && hedge_sell_profit > 0)) {//3 if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {//4 Print("Close BUY Hedge Order==>", OrderTicket()," Orders:",sell_ord_numbers); result_close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,ArrowsColor); LastHedgeAction = TimeCurrent(); }//4 for(int cnt_sb = OrdersTotal()-1; result_close && cnt_sb>=0; cnt_sb--) {//4 if (OrderSelect(cnt_sb, SELECT_BY_POS, MODE_TRADES)) {//5 if (OrderType() == OP_SELL) {//6 order_sl = getPipsForSL(OrderOpenPrice(),OrderStopLoss(),OrderType()); if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && order_sl>0 && order_sl==hedge_sl) {//7 if (Hedge_Lots_Multiplier>1 && hedge_buy_profit > 0) { //8 result = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,ArrowsColor); } //8 else { //8 if (StopLoss==0) { sl=0; } else { sl = OrderOpenPrice()+StopLoss*Point;} result=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Purple); if(! result) Print("Error during Modify BUY Hedge linked order: ", GetLastError()); else Print("Modify correspondent SELL Order==>", OrderTicket()); } //8 }//7 } //6 }//5 }//4 // end for } //3 }//2 // end else }//1 // end for // Here Hedge Orders are open.... // - Open only if Last Open/Close was 2 min ago... int loss_pips = 0; Pips_buy = 0; Pips_sell = 0; int result_open = 0; double Lots_sell = 0; double Lots_buy = 0; buy_ord_numbers = ""; sell_ord_numbers= ""; //Print ("Time diff",TimeCurrent() - LastHedgeAction,Max_Loss_For_Hedge_pips); if (Max_Loss_For_Hedge_pips > 0) // (TimeCurrent() - LastHedgeAction) > 2*60 && { for(cnt=OrdersTotal()-1; cnt>=0; cnt--) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) { loss_pips = getPipsForSL(OrderOpenPrice(),OrderStopLoss(), OrderType()); //Print("Ticket",OrderTicket()," Bid:",(Bid - OrderOpenPrice())/Point,"Ask:",(OrderOpenPrice() - Ask)); //if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && // loss_pips <= Max_SL_pips) // Print ("Ticket ",OrderTicket()," ",OrderSymbol(),",",Symbol(),",",OrderMagicNumber(),",",MagicNumber,",",loss_pips,",",Max_SL_pips); //Print (loss_pips,",",Max_SL_pips); if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && loss_pips < Max_SL_pips) { //Print ("We are here"); if (OrderType()==OP_BUY && (Bid - OrderOpenPrice()) < 0) { if (Pips_buy==0) buy_ord_numbers = ""+ OrderTicket(); else buy_ord_numbers = buy_ord_numbers +","+ OrderTicket(); Pips_buy = Pips_buy + MathAbs(Bid - OrderOpenPrice())/Point; // Here should be loss in pips Lots_sell = Lots_sell + OrderLots(); //Print ("Pips_buy",Pips_buy," Pips_sell",Pips_sell); } else if (OrderType()==OP_SELL && (OrderOpenPrice() - Ask) < 0) { if (Pips_sell==0) sell_ord_numbers = ""+ OrderTicket(); else sell_ord_numbers = sell_ord_numbers +","+ OrderTicket(); Pips_sell = Pips_sell + MathAbs(OrderOpenPrice() - Ask)/Point; // Here should be loss in pips Lots_buy = Lots_sell + OrderLots(); } } } } //if (Pips_buy !=0 || Pips_sell!=0) //Print ("Pips_buy",Pips_buy," Pips_sell",Pips_sell); // Create the Hedge if (Pips_buy >= Max_Loss_For_Hedge_pips) { //Print("Pips_buy:",Pips_buy," Max_Loss_For_Hedge_pips",Max_Loss_For_Hedge_pips); // -- Create 1 SELL order, Lots_sell, SL = Next hedge SL, MAGIC#= +1 int sell_hedge_sl = getNextHedgeSL(); Print("Create new SELL hedge Order==>"); result_open = OrderSend(Symbol(),OP_SELL,getLots(Hedge_Lots_Multiplier*Lots_sell), Bid , slippage,Bid+sell_hedge_sl*Point,0,"MyMEFx-SL:"+sell_hedge_sl+" for:"+buy_ord_numbers, MagicNumber_hedge_sell,0,ArrowsColor); LastHedgeAction = TimeCurrent(); for(int cnt_b_mod =OrdersTotal()-1; result_open>=0 && cnt_b_mod>=0; cnt_b_mod--) { if (OrderSelect(cnt_b_mod, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && OrderType()==OP_BUY && StringFind(buy_ord_numbers,""+OrderTicket(),0)>=0 ) { result=OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice()-sell_hedge_sl*Point,OrderTakeProfit(),0,Purple); if(result!=TRUE) Print("LastError = ", GetLastError()); else Print("Modify SL for correspondent BUY orders==>"); } } } } if (Pips_sell >= Max_Loss_For_Hedge_pips) { // -- Create 1 BUY order, Lots_buy, SL = Next hedge SL, MAGIC#= +2 int buy_hedge_sl = getNextHedgeSL(); Print("Create new BUY hedge Order==>"); result_open=OrderSend(Symbol(),OP_BUY,getLots(Hedge_Lots_Multiplier*Lots_buy), Ask ,slippage, Ask-buy_hedge_sl*Point,0, "MyMEFx-SL:"+buy_hedge_sl,MagicNumber_hedge_buy,0,ArrowsColor); LastHedgeAction = TimeCurrent(); for(int cnt_s_mod =OrdersTotal()-1; result_open>=0 && cnt_s_mod>=0;cnt_s_mod--) { if (OrderSelect(cnt_s_mod, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber() == MagicNumber && OrderType()==OP_SELL && StringFind(sell_ord_numbers,""+OrderTicket(),0)>=0) { result=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+buy_hedge_sl*Point, OrderTakeProfit(),0,Purple); if(result!=TRUE) Print("LastError = ", GetLastError()); else Print("Modify SL for correspondent SELL orders==>"); } } } } } // end of the method } //=============================== int getPipsForSL(double ord_open,double ord_sl, int dir) { int val = 0; if(dir == OP_SELL && ord_sl>0) val=((ord_sl - ord_open)/Point); else if (dir == OP_BUY && ord_sl>0) val=(ord_open - ord_sl)/Point; return(val); } int getNextHedgeSL() { bool ord_exists = false; int ret = 0; for (ret = Max_SL_pips+200; ret > Max_SL_pips; ret--) { for(int cnt_ini = OrdersTotal()-1;cnt_ini >=0;cnt_ini--) { if (OrderSelect(cnt_ini, SELECT_BY_POS, MODE_TRADES)) { ord_exists = false; if (OrderSymbol()==Symbol() && (OrderMagicNumber() == MagicNumber + 1 || OrderMagicNumber() == MagicNumber + 2) && getPipsForSL(OrderOpenPrice(),OrderStopLoss(), OrderType())==ret) { //Print(ret+" exists======>"); ord_exists = true; break; } } } if (ord_exists) break; } if (ord_exists) ret++; if (ret>Max_SL_pips+200) ret= Max_SL_pips; //Print("Final value: "+ret); return(ret); } double getLots(double lot) { double ret_lot; double StepLots=MarketInfo(Symbol(),MODE_LOTSTEP); ret_lot = NormalizeDouble(lot/StepLots,0)*StepLots; return (ret_lot); }