How to get trades by comment?

Hi everybody

I am trying to find one or more positions among other positions by their comment or comments assigned to them before, and close them if they are in certain amount of profit. I know relying on comment is not a safe way but I really need it for backtesting purposes not trading real money.

I tried several ways and searched a lot through net but couldn’t find something.

Forgot to mention, I need this to be done in mql5 coding.

Any advice would be appreciated.

Thanks in advance

I think it’s not a unsafe procedure to group/categorize your positions based on comments, since you’re dealing with open positions, and comments of open positions are SUPPOSED to be the same strings you set when sending orders. the unsafe part is of course looking into comments of closed positions.

on your problem :
loop through open positions using a for loop ( loop limit set by PositionsTotal() ) , and using PositionInfoString(), read their comment, and if the comment is the one you’re looking for, (or more safely, if position comment string contains the string you’re looking for ) then check its profit using PositionInfoDouble() function. and close it if conditions are met

Thank you for your replying, I tried to do what you said but again it doesn’t work. For sure I did something wrong. Guess some examples make it clear if you mind to give some.

you definitely need to read the mql5 docs, and a few scripts/experts codes, which hundreds of them can be found easily.

int all = PositionsTotal();
if(all>0)
{
        for(int i=0; i<all; i++)
        {
                if(PositionGetSymbol(i)!=_Symbol) continue;                     // optional filter
                if(PositionGetInteger(POSITION_MAGIC) != MyMagic) continue;     // optional
                if(PositionGetString(POSITION_COMMENT) != "BLA BLA") continue;
                if(PositionGetDouble(POSITION_PROFIT)>1000000) // don't settle for less that $ 1 Million :)
                {
                        // close position here :
                        ulong TickeT = (ulong)PositionGetInteger(POSITION_TICKET);
                        // use standard libraries , or whatever,  and close position with the TickeT
                }
        }
}

The first check is redundant since the for loop will never enter if all is <= 0. Also, selecting a position by symbol and magic number is already built into CPositionInfo. Finally, it is not necessary to use continue statements combined with not conditions. Since MT4 build 600 expressions stop being evaluated after it is evident that the if control statement will resolve to false, so you can just use one singe if statement.

Example:

  CPositionInfo pi;
   CTrade trade;
   if(pi.SelectByMagic(_Symbol, MAGIC)
      && pi.Comment() == "BLA BLA"
      && pi.Profit()  >  max_profit
   ){
      if(!trade.PositionClose(pi.Ticket()))
         Print(_LastError);
   }

Great! Thank you so much

Yeah you are right I need to study, train and work!

Another question: I use baskets in my strategy, I need to calculate the profit of let say 3 symbols together which have the same comment. How can I do that?

And at last I don’t forget your command, for sure never settle the profit to less than one million dollars :wink:

Thanks for your comment, but this code is for MT5

But that is what @tbillingso gave you! He gave you OOP code for MQL5!

Yes and it works fine! Thank you @tbillingso
But I have another problem I need to calculate more than one positions’ profit with the same comment, I print the profit and it is printing 0 value repeatedly.

For God’s sake man, take some pride in your work. That indentation is pure cringe. Also, just like stackoverflow and any other site you’d use to talk programming, post code not screenshots of code!

  1. As you see, I even hesitated to exemplify standard libs functions implication, to not to raise more questions/confusion in his head. (So I didn’t use C… stuff)
  2. I think the OP ,more than anything else, needs to learn how to tweak with others codes, change them, and see what each code line does. your suggested fine touches are for later.
  3. I Copy/Pasted that snipped from another EA, so of course he can edit it to match his needs. (example: use the process only if 10 or more positions are open…) so : if(all>10) makes sense there.
  4. I believe every question should be answered from the viewpoint of questioner, with a thinking/skills closer to his mind. of course it’s his/her obligation to improve beyond that raw answers.

ok sorry, here it is.

double totalProfitCal(void){
   
 double totalPrf=0; 
    CPositionInfo pi;
        CTrade trade;

           ulong Magic=PositionGetInteger(POSITION_MAGIC);
           
               if (pi.SelectByMagic(_Symbol,Magic )&&pi.Comment() =="M0"&&pi.Profit()>=totalProfit)
                    totalPrf += pi.Profit();//+PositionGetDouble(POSITION_SWAP); //*********//commision is omited 
                        PrintFormat("PROFIT= %d",totalPrf);
  
      return totalPrf;

                           }

Hey thanks alot. That was very kind of you

solved!

thank you guys.

bool closeAllPositions(void)
{
  int i;
    
    for(i=0;i<CROSS_NUMBER;i++){
       int k =PositionSelectByTicket(baseTickets[i][0])-1;
       
    while(k>=0){
       if(!closeObj.PositionClose(PositionGetSymbol(k))){
          PrintFormat("Position Close Error = %d",GetLastError());
          return(false);   
       }else{
          k-- ;
       } 
          }
             }
                
         return(true);  
}

hey guys

I think I have the same problem with selecting more than one position among all positions with some specific properties like Comments, tickets or buy or sell. I use the code attached but it seems it doesn’t work correctly. for selecting one position its ok but more than one position with the same identifiers it is showing wrong outcomes.

I want to select all buy positions which have “B1” comment with different Symbols (for example, EURUSD, GBPUSD and USDJPY) and calculate their profit.

//+------------------------------------------------------------------+
//|B1 profit calculator Function                                 |
//+------------------------------------------------------------------+
double B1profit(void){

  CPositionInfo pi;
  CTrade trade;
  double B1Prf=0;
  int i,j;
  for(i=0;i<CROSS_NUMBER;i++){
  for(j=0;j<MAX_LEVEL;j++){
  
  if(pi.SelectByTicket(baseTickets[i][j])&&pi.Comment()=="B1"&&pi.PositionType()==POSITION_TYPE_BUY){
     B1Prf += pi.Profit();//+PositionGetDouble(POSITION_SWAP); //*********//commision is omited 
  }
      }
          }
  return B1Prf;

}

//+-----------------------------------------------

Do you really seriously code like this? Please tell me you’re trolling… you’re trolling, right?

I am a newbie, that’s it! What’s the problem in this code I really don’t know. :neutral_face::slightly_frowning_face:

Your style is all over the place. There is no consistency to the indentation and brace placement. You really need to read a C++ style guide and pick an indentation style and stick to it!

Ok sure, I will do that, I didn’t know anything about it thank you.
But my problem is not with indentation and place of braces for now

You will find that if you continue to post poorly formatted and difficult to parse code that those in a position to help you will ignore you.