Please don't post randomly in any section. Topic has been moved to the section: Expert Advisors and Automated Trading
Sorry Fernando
of opening market orders - no pending orders) This is outputting the data fine.
The issue I would like help with, using the example above is there a way I could retrieve the CLOSING dealTicketIDs and amend it to my CSV file ??!? (I know its tricky because the closing deals are not created until further down - the logic for my 'for loop' is ideally what i require assistance with )
Any help would be greatly appreciated
Something like this may work - give it a try
void OnTradeTransaction(const MqlTradeTransaction &transaction, const MqlTradeRequest &request, const MqlTradeResult &result) { ulong dealID = 0; if(HistorySelectByPosition(request.position)) { int dealsTotal = HistoryDealsTotal(); for(int i=0; i<dealsTotal; i++) { dealID = HistoryDealGetTicket(i); //Parse deal records as needed } } }
Hey so sorry for responding so late (have been trying to get this thing to work). Thanks for the help R4tna C but unfortunately that did not work.
My issue is that the 'closing' deal does not appear straight away but at a later time, hence I would like to update the row in my csv file with
- the opening deal ticket, opening order ticket and the 'closing deal ticket'
However, whenever a trade transaction occurs i only get the information for the deal 'at that time' hence have to wait for its closing ticket and then add that to the row when it arrives.
I have been trying to see if I create an array and send all the details to that and then output the array details to my csv file.
If this is a good avenue to go down, or if anyone can help or point me in the right direction that would be extremely helpful.
try to get what you need on all funtions before when a new tick shows .
for example :
put all code such as "update the row to your csv file " on Ontick() first line
Recently, I have also been studying those trade funtions , There are many hidden issues here .
In a simple way , Print all Positions in OnTradeTransaction() you will see It doesn't always print correctly because of the queuen .
//---
the documentation says:
When transactions are processed by the EA's OnTradeTransaction() handler, the terminal goes on handling the incoming trade transactions. Thus, the trading account status may change at the course of OnTradeTransaction() operation. For example, while an MQL5 program handles adding a new order, it can be executed, deleted from the list of open orders and moved to history. The program is notified of all these events.
//---
It means that the deal you want to process , may not have received its information yet .
Another thing , before handling the issue , perhaps you should confirm the " ENUM_TRADE_TRANSACTION_TYPE type; // Trade transaction type " first .
Because an deal will enter this OnTradexxxx() funtion at least 4 times or more .
Hey so sorry for responding so late (have been trying to get this thing to work). Thanks for the help R4tna C but unfortunately that did not work.
My issue is that the 'closing' deal does not appear straight away but at a later time, hence I would like to update the row in my csv file with
- the opening deal ticket, opening order ticket and the 'closing deal ticket'
However, whenever a trade transaction occurs i only get the information for the deal 'at that time' hence have to wait for its closing ticket and then add that to the row when it arrives.
I have been trying to see if I create an array and send all the details to that and then output the array details to my csv file.
If this is a good avenue to go down, or if anyone can help or point me in the right direction that would be extremely helpful.
I think it could work if you wait until you detect a closing deal (see ENUM_DEAL_ENTRY). The loop will thus process the the IN record and the OUT record so you can collect all data on closure. I do that in my code - it was fiddly to get right but it works for my requirement.
In terms of an array, I do that also (for other reasons) - again it took some effort to get it right but for my need it was worth it.
Not sure if these approaches fit your scenario, but I believe you can make it work the way you want
- 2023.05.16
- www.mql5.com
I think it could work if you wait until you detect a closing deal (see ENUM_DEAL_ENTRY). The loop will thus process the the IN record and the OUT record so you can collect all data on closure. I do that in my code - it was fiddly to get right but it works for my requirement.
In terms of an array, I do that also (for other reasons) - again it took some effort to get it right but for my need it was worth it.
Not sure if these approaches fit your scenario, but I believe you can make it work the way you want
On second thoughts, it may be enough to just check if the ticket is still live before executing - you will have to experiment
void OnTradeTransaction(const MqlTradeTransaction &transaction, const MqlTradeRequest &request, const MqlTradeResult &result) { if(!PositionSelectByTicket(request.position)) //Do not process if ticket is still live { ulong dealID = 0; if(HistorySelectByPosition(request.position)) { int dealsTotal = HistoryDealsTotal(); for(int i=0; i<dealsTotal; i++) { dealID = HistoryDealGetTicket(i); //Parse deal records as needed } } } }
Hi R4tna C #
Thanks for the advice. I have resolved trying to get IN and OUT trades as shown below
void OutputTrades() { //--- set the start and end date to request the history of deals datetime startDate = (TimeCurrent() - (PeriodSeconds(PERIOD_W1) * 2)); // from 2 weeks ago datetime endDate = TimeCurrent(); // till the current moment ulong dealOutTicket = -1; ulong dealInTicket = -1; // create array to hold trades struct_TradeDetails tradesArray[]; // RETRIEVE: ALL orders & deals for the previous TWO weeks if(HistorySelect(startDate, endDate)) { // RETRIEVE: ONLY deals for the previous TWO weeks int totalDealsLoop = HistoryDealsTotal(); // LOOP: if "dealOutTicket = HistoryDealGetTicket(i)" AND the deal is an 'OUT' trade for( int i = totalDealsLoop; i >= 0; i-- ) { if((dealOutTicket = HistoryDealGetTicket(i)) > 0 && HistoryDealGetInteger(dealOutTicket, DEAL_ENTRY) == DEAL_ENTRY_OUT) { // RETRIEVE: GET DEAL 'OUT' DATA ulong positionID = HistoryDealGetInteger(dealOutTicket, DEAL_POSITION_ID); ulong closeDealID = HistoryDealGetInteger(dealOutTicket, DEAL_TICKET); string symbolID = HistoryDealGetString(dealOutTicket, DEAL_SYMBOL); // RETRIEVE: ONLY deals with the previous CLOSING position ID & is an 'IN' trade for( int j = totalDealsLoop; j >= 0; j-- ) { if( (dealInTicket = HistoryDealGetTicket(j) ) > 0 && HistoryDealGetInteger(dealInTicket, DEAL_ENTRY) == DEAL_ENTRY_IN && HistoryDealGetInteger(dealInTicket, DEAL_POSITION_ID) == positionID) { // RETRIEVE: GET DEAL 'IN' DATA ulong openOrderID = HistoryDealGetInteger(dealInTicket, DEAL_ORDER); ulong openDealID = HistoryDealGetInteger(dealInTicket, DEAL_TICKET); datetime openDealTime = (datetime)HistoryDealGetInteger(dealInTicket, DEAL_TIME); } } } } } }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
of opening market orders - no pending orders) This is outputting the data fine.
The issue I would like help with, using the example above is there a way I could retrieve the CLOSING dealTicketIDs and amend it to my CSV file ??!? (I know its tricky because the closing deals are not created until further down - the logic for my 'for loop' is ideally what i require assistance with )
Any help would be greatly appreciated