А что именно не так? Немного не понятно, что вы хотите сделать, но с точки зрения работоспособности, ваш код должен функционировать. Единственно, переменная
day должна быть глобальной или лучше
static
Позволю свой вариант:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void StopTrade(double maxProfit, double maxLoss)
{
static MqlDateTime tdDay= {0};
MqlDateTime tdCurrent;
TimeToStruct(TimeCurrent(),tdCurrent);
if(tdDay.day!=tdCurrent.day)
{
tdDay=tdCurrent;
double Balanse=NormalizeDouble(AccountBalance(),Digits);
if((AccountEquity() < (Balanse-maxLoss)) || (AccountEquity() > (maxProfit+Balanse)))
{
CloseOrder();
return;
}
}
}
Но мне кажется, что вы хотите сделать закрытие текущих ордеров по некоему условию, которое проверяете раз в день с наступлением новых суток.
Для этого принято проверять факт открытия нового бара на D1:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void StopTradeByNewDay(double maxProfit, double maxLoss)
{
static datetime dtLastbarD1=0;
datetime dtCurrentBarD1=iTime(_Symbol,PERIOD_D1,0);
if(dtLastbarD1!=dtCurrentBarD1)
{
dtLastbarD1=dtCurrentBarD1;
double Balanse=NormalizeDouble(AccountBalance(),Digits);
if((AccountEquity() < (Balanse-maxLoss)) || (AccountEquity() > (maxProfit+Balanse)))
{
CloseOrder();
return;
}
}
}
Это если я всё правильно понял, конечно.