//+------------------------------------------------------------------+
//| Close_Order.mq4 |
//| Copyright 2021, Putra Kuningan Group. |
//| https://www.putrakuningangroup.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Putra Kuningan Group."
#property link "https://www.putrakuningangroup.com"
#property version "1.00"
#property strict
input double MinimalProfit = 0.40;
input double MaxLoss = 3.0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit(){
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick(){
//Menjalakan fungsi close order
CekProfiOrder();
if (Qn_Close()==1)CloseAll(0);
if (Qn_Close()==2)CloseAll(1);
//Menjalankan Fungsi Comment
QnComment ();
}
//+------------------------------------------------------------------+
//=================================================== Fungsi Comment =================================================================
void QnComment (){
int HSpread = (int) MathRound((Ask-Bid)*100);
Comment(
" Informasi Account:",
"\n Name : ", AccountName(), " #", AccountNumber(), " Vol@",Volume[0],
"\n Balance/Equity : " , NormalizeDouble(AccountBalance(),2)," /",NormalizeDouble(AccountEquity(),2), " Spread @",
HSpread, " HSpreadClose @", HSpreadClose (),
"\n Account Server : " , AccountServer(), " Vol : ", Volume[0], " @", Hour(),":", Minute(),":",Seconds(),
"\n Close Order : HAtas@", HAtas(), " HBawah@",HBawah()," Time Order", TimOP()," ProfitOrder@",
NormalizeDouble(CekProfiOrder(),2), " SClose Order @", Qn_Close ()
);
}
//=============================================== ClOSE ORDER SATU TRANSAKSI =========================================================
//Mecari Profit Order
//if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic) continue;
double CekProfiOrder(){
double dp = 0;
int i;
for (i = 0; i < OrdersTotal(); i++) {
if( !OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
dp += OrderProfit();
}
return(dp);
}
//Mencari Time Order
datetime TimOP(){
datetime TimeOrder=0;
for(int i=0; i<OrdersHistoryTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
TimeOrder = OrderOpenTime();
}
}
return(TimeOrder);
}
//Membuat limit Order dengan waktu saat order mengalami rugi
int LimitTimeOP(){
int result = 0;
int tenggangwaktunya=1300;
if(TimeCurrent()>=TimOP()+tenggangwaktunya) result = 1;
return (result);
}
//Membuat limit Order dengan waktu saat order mengalami rugi
int LimitTimeOPReversal(){
int result = 0;
int tenggangwaktunya=1400;
if(TimeCurrent()>=TimOP()+tenggangwaktunya) result = 1;
return (result);
}
//Mencari Nilai Spread
int HSpreadClose (){
int result = (int)MathRound((Ask-Bid)*100);
if((Ask-Bid)*100>60)result = (int) MathRound(((Ask-Bid)*100)/2);
return (result);
}
//Mecari Harga Atas
double HAtas(){
double pMarket=0;
int BAtas = (int) HSpreadClose ();
if(HSpreadClose ()<30) BAtas = (int) HSpreadClose ()+5;
pMarket = Ask;
double HAtas = pMarket+BAtas*Point();
return(HAtas);
}
//Mecari Harga Bawah
double HBawah(){
double pMarket=0;
int BBawah = (int) HSpreadClose ();
if(HSpreadClose ()<30) BBawah = (int) HSpreadClose ()+5;
pMarket = Ask;
double HBawah = pMarket-BBawah*Point();
return(HBawah);
}
int Qn_Close (){
int result = 0;
//Filter Market tidak kuat untuk mendapatkan target profit
if(OrderType()==OP_BUY){
if( LimitTimeOPReversal()==1 && CekProfiOrder()== 0)result= 1; //1= BUYY
}
if(OrderType()==OP_SELL){
if(LimitTimeOPReversal()==1 && CekProfiOrder() == 0 )result= 2; //1= SELL
}
//Filter Market Stagnan && Brekout
if(OrderType()==OP_BUY){
if( LimitTimeOP()==1 && CekProfiOrder()< -1.5)result= 1; //1= BUYY
}
if(OrderType()==OP_SELL){
if(LimitTimeOP()==1 && CekProfiOrder()< -1.5 )result= 2; //1= SELL
}
//Maximal Profit
if(OrderType()==OP_BUY){
if( CekProfiOrder()>MinimalProfit && HAtas() < High[0])result= 1; //1= BUYY
}
if(OrderType()==OP_SELL){
if(CekProfiOrder()>MinimalProfit && HBawah() > Low[0]+(HSpreadClose ()+5)*Point())result= 2; //1= SELL
}
//Stop Loss
if(OrderType()==OP_BUY){
if( CekProfiOrder()< -MaxLoss )result= 1; //1= BUYY
}
if(OrderType()==OP_SELL){
if(CekProfiOrder()< -MaxLoss )result= 2; //1= SELL
}
return(result);
}
//Fungsi Close
//if (OrderSymbol() != Symbol() || OrderMagicNumber()!=Magic2_0|| OrderType()!=m) continue;
void CloseAll(int m) {
for (int i = OrdersTotal() - 1; i >= 0; i--) {
bool hasil= true;
if( !OrderSelect(i,SELECT_BY_POS)) continue;
if (OrderSymbol() != Symbol() || OrderType()!=m) continue;
if (OrderType() > 1) hasil = OrderDelete(OrderTicket());
if (OrderType() == 0) hasil = OrderClose(OrderTicket(), OrderLots(), Bid, 4, CLR_NONE);
if (OrderType() == 1) hasil = OrderClose(OrderTicket(), OrderLots(), Ask, 4, CLR_NONE);
}
}
//=============================================== SELESAI ===========================================================================