Hey, I´ve been searching quite some time now but didnt find anything, so I hope anyone can help me here
I want to close an order after 24 Hours, but it should be at the end of the current bar(Dailyperiod), not at the start of the new one, in case of gaps.
And I dont want to close all open trades, I want the ea to specifiy which trade´s open time is= 24hours
Thanks in advance
Working with the idea of the end of a bar is difficult, because you never know which tick will be the last one in for that bar. Workarounds include using timers and/or various time functions, but they are all just that - workarounds and prone to issues. You end up balancing how close to the line you want to push it (milliseconds? seconds? minutes?) versus the risk of missing the end of the bar.
I am a little confused - do you want the orders closed at the end of the D1 bar in which the order was placed, or after 24 hours of being opened?
If you wanted to close at 5 minutes before Midnight (assuming that there is a tick within the last 5 minutes)
datetime NextMidnight=TimeCurrent() -(TimeCurrent()%(PERIOD_D1*60))+PERIOD_D1*60;
datetime CloseTime=NextMidnight-300;
if(TimeCurrent()>=CloseTime)
{
//code to close trades
}
Working with the idea of the end of a bar is difficult, because you never know which tick will be the last one in for that bar. Workarounds include using timers and/or various time functions, but they are all just that - workarounds and prone to issues. You end up balancing how close to the line you want to push it (milliseconds? seconds? minutes?) versus the risk of missing the end of the bar.
I am a little confused - do you want the orders closed at the end of the D1 bar in which the order was placed, or after 24 hours of being opened?
What part of their posts about "end of a bar is difficult" was unclear? Closing at 23:59:59 is not possible.
There might be a tick in the last 5 minutes, there might not. There is a 99.99% probably that there will not be in the last second.
Even if it was, it takes time to close an order (live). It's likely that the order will be closed after midnight due to transmission delays, server delays, possible disconnects.
Well,
What if i want to close it, at the beginning of the new bar?
skyblazer: What if i want to close it, at the beginning of the new bar?
| What about it? |
Hello,
i am a experienced programmer but I am newish to mql 4 and mql 5 i have been trying to add some code to my EA so it can close orders after three day but this not working.
I have created one of my first EA that is profitable, but there is a big flaw in this EA. it has massive drawdown, which cut massive profit, I found that that the orders that do this can be fixed through two rules, order max open time and higher timeframe filters, both options will be implemented but the closing order older then three days would be the best first fix. other features like trailing take profit and compounding lots size will further increase profits.
It is late and I need some sleep, but i would love it if someone could help me with this i have so amazing backrest with this EA as the rules are simple..
the next set of feature i am trying to add is...
trailing takeprofit in step of 50 points
higher trend filters up, down consolidation so trade, wait
close trades after three days.
this is the function code...
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Open new buy order if none exist if(OrdersTotal() == 0) { int buyTicket = OrderSend(_Symbol, OP_BUY, 0.01, Ask, 3, 0, Ask+10*_Point, NULL, 0, 0, clrGreen); if(buyTicket < 0) { Print("Buy order failed. Error: ", GetLastError()); } else { Print("Buy order opened. Ticket: ", buyTicket); } } // Check and close orders older than 60 minutes int maxDuration = 60 * 60; // 60 minutes in seconds for(int i = OrdersTotal()-1; i >= 0; i--) // Loop backwards for safety { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == _Symbol) // Only process orders for this symbol { int duration = TimeCurrent() - OrderOpenTime(); if(duration >= maxDuration) { // Determine correct close price based on order type double closePrice = (OrderType() == OP_BUY) ? Bid : Ask; // Attempt to close the order bool closed = OrderClose( OrderTicket(), OrderLots(), closePrice, 5, // Slippage clrRed // Closing arrow color ); if(!closed) { Print("Failed to close order #", OrderTicket(), " Error: ", GetLastError(), " Type: ", OrderType(), " Ask: ", Ask, " Bid: ", Bid); } else { Print("Closed order #", OrderTicket(), " after ", duration/60, " minutes"); } } } } else { Print("OrderSelect failed for index ", i, " Error: ", GetLastError()); } } } //+------------------------------------------------------------------+
the ea code....
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Print initialization message Print("EA initialized successfully"); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ // --- input parameters input int HigherTimeframeIndex = 1; // e.g., 1 for H1 if current timeframe is M5 input int TimeframeLength = 1; // e.g., 1 if current timeframe is M5 (5 minutes) input int HigherTimeframePeriod = 60; //e.g., 60 minutes for H1 timeframe string INDICATOR_CALC_ERROR; string INDICATOR_CALC_FINISHED; string INDICATOR_REQUIRED_MORE_DATA; void OnTick() { double previous_high = iHigh(_Symbol,_Period,1); double previous_low = iLow(_Symbol,_Period,1); double current_high = iHigh(_Symbol,_Period,1); double current_low = iLow(_Symbol,_Period,1); double current_Open = iOpen(_Symbol,_Period,0); double current_Close = iClose(_Symbol,_Period,0); int trendStatus = GetHigherTimeframeTrend(PERIOD_H4); string HTS = ""; //--- Debugging information static int lastTickTime = 0; if(TimeCurrent() == lastTickTime) return; // Only run once per tick lastTickTime = TimeCurrent(); string TradingSignal = CheckEntryEMA(); string Filter = CheckEntrySTOCHASTIC(); //--- Print signals for debugging Print("EMA Signal: ", TradingSignal, " | Stochastic Filter: ", Filter); //---- check higher time frame //--- Buy condition if((TradingSignal == "buy") && (Filter == "buy") && (OrdersTotal() <= 0)) { double stopLoss = Ask - 1500 * _Point; double takeProfit = Ask + 50 * _Point; if(current_high>=previous_high && current_low<previous_low && current_Close >= current_Open){ int ticket = OrderSend(_Symbol, OP_BUY, 0.03, Ask, 3, stopLoss, takeProfit, "EMA+Stoch Buy", 0, 0, Green); if(ticket < 0) { Print("Buy Order Failed. Error: ", GetLastError()); } else { Print("Buy Order Placed. Ticket: ", ticket); } } } //--- Sell condition if((TradingSignal == "sell") && (Filter == "sell") && (OrdersTotal() <= 0)) { stopLoss = Bid + 1500 * _Point; takeProfit = Bid - 50 * _Point; if(previous_high<=current_high && previous_low>=current_low){ ticket = OrderSend(_Symbol, OP_SELL, 0.03, Bid, 3, stopLoss, takeProfit, "EMA+Stoch Sell", 0, 0, Red); if(ticket < 0) { Print("Sell Order Failed. Error: ", GetLastError()); } else { Print("Sell Order Placed. Ticket: ", ticket); } } } } //+------------------------------------------------------------------+ string CheckEntryEMA() { string signal = ""; double ma20 = iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE, 0); double ma50 = iMA(NULL, 0, 13, 0, MODE_EMA, PRICE_CLOSE, 0); double ma20_prev = iMA(NULL, 0, 8, 0, MODE_EMA, PRICE_CLOSE, 1); double ma50_prev = iMA(NULL, 0, 13, 0, MODE_EMA, PRICE_CLOSE, 1); if(ma20 > ma50 && ma20_prev <= ma50_prev) signal = "buy"; else if(ma20 < ma50 && ma20_prev >= ma50_prev) signal = "sell"; return signal; } // Higher time frame trend Reversal, consolidation and breakout. string CheckEntrySTOCHASTIC() { string signal = ""; double K0 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0); double D0 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0); double K1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1); double D1 = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 1); if(K0 < 35 && D0 < 35 && K0 > D0 && K1 < D1) signal = "buy"; else if(K0 > 65 && D0 > 65 && K0 < D0 && K1 > D1) signal = "sell"; return signal; } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Function to get higher time frame trend direction | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Function to analyze higher timeframe trend | //+------------------------------------------------------------------+ /* Returns: 1 = Strong Uptrend 2 = Weak Uptrend 0 = Ranging/No Clear Trend -1 = Weak Downtrend -2 = Strong Downtrend */ int GetHigherTimeframeTrend(int higherTimeframe, int maPeriod = 50, double rangeThreshold = 0.005) { // hts string HTS = ""; // Get moving averages double maFast = iMA(NULL, higherTimeframe, maPeriod, 0, MODE_EMA, PRICE_CLOSE, 0); double maSlow = iMA(NULL, higherTimeframe, maPeriod*2, 0, MODE_EMA, PRICE_CLOSE, 0); double currentPrice = iClose(NULL, higherTimeframe, 0); // Get recent price range (last 20 bars) double highestHigh = iHigh(NULL, higherTimeframe, iHighest(NULL, higherTimeframe, MODE_HIGH, 20, 0)); double lowestLow = iLow(NULL, higherTimeframe, iLowest(NULL, higherTimeframe, MODE_LOW, 20, 0)); double rangeSize = (highestHigh - lowestLow) / lowestLow; // Check for ranging market if(rangeSize < rangeThreshold) { return 0; // Market is ranging } // Determine trend strength if(currentPrice > maFast && maFast > maSlow) { // Strong uptrend conditions if(currentPrice > maFast * (1 + rangeThreshold/2) && maFast > maSlow * (1 + rangeThreshold/2)) return 2; // Strong uptrend return 1; // Weak uptrend HTS = "buy"; return HTS; printf(HTS); } else if(currentPrice < maFast && maFast < maSlow) { // Strong downtrend conditions if(currentPrice < maFast * (1 - rangeThreshold/2) && maFast < maSlow * (1 - rangeThreshold/2)) return -2; // Strong downtrend return -1; // Weak downtrend HTS = "sell"; return HTS; printf(HTS); } return HTS = "NoTrade"; return 0; // No clear trend }

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hey, I´ve been searching quite some time now but didnt find anything, so I hope anyone can help me here
I want to close an order after 24 Hours, but it should be at the end of the current bar(Dailyperiod), not at the start of the new one, in case of gaps.
And I dont want to close all open trades, I want the ea to specifiy which trade´s open time is= 24hours
Thanks in advance