Nicht im Betrieb gestest, evtl. mußt Du noch was anpassen.
Meine Lösung sähe erst mal so aus
Code:
void AdjustAllTPs()
{
double NewestTP =0.0; //TPForTheLastOpenedTrade
datetime NewestTime =TimeCurrent(); //now
// === newest running order has the highest number
for(int i=OrdersTotal()-1; i>=0; i--) //LoopOverAllOrders
{ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) //SelectRunningOrders
{ if( OrderSymbol()==_Symbol //OurMarket
&& OrderMagicNumber()==MagicNumber //OurEA
&& OrderType()<=OP_SELL ) //MarketOrdersOnly
{
if(OrderOpenTime()<NewestTime) NewestTP=OrderTakeProfit(); //1.OpenedBeforeNow:TryToGetTP
if(NewestTP>0.0) break; //HasValidTP:exitLoop
}//OurMarket/EA/MarketOrders
}//SelectRunningOrders
}//LoopOverAllOrders
// === set Newest TP to all
for(int i=OrdersTotal()-1; i>=0; i--) //LoopOverAllOrders
{ if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) //SelectRunningOrders
{ if( OrderSymbol()==_Symbol //OurMarket
&& OrderMagicNumber()==MagicNumber //OurEA
&& OrderType()<=OP_SELL ) //MarketOrdersOnly
{
if( !OrderModify(OrderTicket(), //NothingToChange
OrderOpenPrice(),
OrderStopLoss(),
NormalizeDouble(NewestTP,_Digits), //ForSafetyNormFoundValue
0,clrNONE ) ) //NoExpire,WhateverColor
Print(__FUNCTION__, //Failed:Message
" new TP(",DoubleToStr(NewestTP,_Digits),")",
" for order no ",(int)OrderTicket()," failed" );
}//OurMarket/EA/MarketOrders
}//SelectRunningOrders
}//LoopOverAllOrders
}
Erst mal so, hoffe das hilft Dir als Idee.
AVT