# trade only one time a day

25

I have written a breakthrough EA,after a month test,I found that sometimes it loses several times within a day.

Therefore,I want to revise my EA,to make it trade only one time a day.Could anyone show me how to realize that?Thanks

25

GumRai,thank you very much.

I will have a try.

Moderator
28198

kevin2708176:

GumRai,thank you very much.

I will have a try.

Wait up a bit, I'm doing a change as made a mistake and removed earlier post - sorry
Moderator
28198

Try to see if this is useful

```datetime midnight = TimeCurrent()-(TimeCurrent() % (PERIOD_D1*60));

for(int i =OrdersHistoryTotal( )-1 ;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if( OrderMagicNumber( ) ==MagicNumber )
{
if ( OrderOpenTime()>= midnight)
return(0);
}
}
```
25

thanks again
6788

GumRai:

Try to see if this is useful

It's not...

only the EA has to trade one time a day

it can't trade at all if some other trade is closed other Symbol() same MagicNumber( )

you can check this way only OrdersTotal after Start

before the EA has opened his first

```//+------------------------------------------------------------------+
//|                                                   ExampleTwo.mq4 |
//| //trading once each day                                                                 |
//+------------------------------------------------------------------+

int    MagicNumber = 123;
int    Slippage.Pips = 3;

datetime now,bod,opentimelastmarket;

//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digits.pips;      // DoubleToStr(dbl/pips2dbl, Digits.pips)
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
now = Time[0];
bod = now - now % 86400;  // Beginning of the day
//----
if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
{pips2dbl = Point*10; pips2points = 10;   Digits.pips = 1;}
else {pips2dbl = Point;    pips2points =  1;   Digits.pips = 0;}
// OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
//----
for(int i= OrdersHistoryTotal()-1; i>=0 ; i--) //count down if you check trades !!!
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)break;
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!= MagicNumber ||OrderType()>1) continue;
if(OrderOpenTime() > bod)
{
opentimelastmarket = OrderOpenTime();
break;
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
//----
Comment("");
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
now = Time[0];
bod = now - now % 86400;  // Beginning of the day
static datetime opentimelastmarket = 0;

//----
{
for(int i= OrdersTotal()-1; i>=0 ; i--) //count down if you check trades !!!
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!= MagicNumber ||OrderType()>1) continue;
if(OrderOpenTime() > opentimelastmarket)opentimelastmarket = OrderOpenTime();
{
}
if(OrderType()==OP_SELL)
{
}
}
}
//---- end closing check open trades
//if(opentimelastmarket >= Time[0])return(0); //one time each Bar
if(opentimelastmarket >= bod)return(0);       //one time each Day

if(Open[0] < 1.35)OrderSend(Symbol(),OP_SELL,0.1,Bid,Slippage.Pips * pips2points,0,0,"ExampleTwoSell",MagicNumber,0,Red);

//----
return(0);
}
//+------------------------------------------------------------------+```
Moderator
28198

deVries:

It's not...

only the EA has to trade one time a day

it can't trade at all if some other trade is closed other Symbol() same MagicNumber( )

you can check this way only OrdersTotal after Start

before the EA has opened his first

I wouldn't have thought that anyone would usually have 2 EAs with the same magic number running at the same time, but who knows :)

I was in a bit of a hurry to go out when I posted before, corrected the mistake, but still forgot to include the scan of open trades.

Are you saying that this will not work at all?

```datetime midnight = TimeCurrent()-(TimeCurrent() % (PERIOD_D1*60));

for(int i =OrdersHistoryTotal( )-1 ;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if( OrderMagicNumber( ) ==MagicNumber )
{
if ( OrderOpenTime()>= midnight)
return(0);
}
}
for(i =OrdersTotal( )-1 ;i>=0;i--)
{
if( OrderMagicNumber( ) ==MagicNumber )
{
if ( OrderOpenTime()>= midnight)
return(0);
}
}```

Maybe it would be better to assign a value to a variable instead of return() ?

Then check the variable to see if any new trades could be opened.

That would still allow the EA to modify any open trade if necessary.

6788

GumRai:

I wouldn't have thought that anyone would usually have 2 EAs with the same magic number running at the same time, but who knows :)

I was in a bit of a hurry to go out when I posted before, corrected the mistake, but still forgot to include the scan of open trades.

Are you saying that this will not work at all?

Maybe it would be better to assign a value to a variable instead of return() ?

Then check the variable to see if any new trades could be opened.

That would still allow the EA to modify any open trade if necessary.

You can place EA on different, charts trading the Symbol of the attached chart only, in that case if you check also the Symbol then there is no need to have other magicnumber

After Start() you can do check every tick all the trades you had done on your account but you make your EA slow doing that...

It is simple to me to change the code that way that it does ordermodify the trades when it is needed i gave this as example for trading once a day

you can check my way it is not needed to check OrdersHistoryTotal() inside Start()

Moderator
28198

deVries:

You can place EA on different, charts trading the Symbol of the attached chart only, in that case if you check also the Symbol then there is no need to have other magicnumber

After Start() you can do check every tick all the trades you had done on your account but you make your EA slow doing that...

It is simple to me to change the code that way that it does ordermodify the trades when it is needed i gave this as example for trading once a day

you can check my way it is not needed to check OrdersHistoryTotal() inside Start()

I will look through your code and will hopefully learn from it. :)

I think that you made a bit of a typo in init

```for(int i= OrdersHistoryTotal()-1; i>=0 ; i--) //count down if you check trades !!!
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!= MagicNumber ||OrderType()>1) continue;
if(OrderOpenTime() > bod)
{
opentimelastmarket = OrderOpenTime();
break;
}
}```

you assign OrdersHistory total to int i, but then scan open orders.

6788

GumRai:

I will look through your code and will hopefully learn from it. :)

I think that you made a bit of a typo in init

you assign OrdersHistory total to int i, but then scan open orders.

thanks good point mode_history it has to be

will edit original code

Moderator
28198

deVries,

that is excellent. I see what you mean, that closed trades only have to be scanned in init.

Just a couple of points. If an OrderSelect fails, the code will exit the loop and will discontinue the checking.

I must admit, that I am pretty useless at error handling and often see in peoples code

if(OrderSelect() ) but usually this error is ignored and continues with the next order position. I really don't know what to do when OrderSelect() fails as I would be concerned that simply restarting the loop would repeat the failure and the program will be stuck.

That can't be good, but then again, exiting the loop or just using the data from the loop when OrderSelect() doesn't fail can't be particularly good either.

The other point

```if(EATrades != OrdersTotal())
{
for(int i= OrdersTotal()-1; i>=0 ; i--) //count down if you check trades !!!
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!= MagicNumber ||OrderType()>1) continue;
if(OrderOpenTime() > opentimelastmarket)opentimelastmarket = OrderOpenTime();
{
}
if(OrderType()==OP_SELL)
{
}
}
}   ```

Unlikely, I know, but it is possible that at the same time that the EA is opening a trade a different trade is being closed.

That would mean that at the next tick, EATrades would still == OrdersTotal(), so opentimelastmarket would not be updated and another trade will be opened.

Would it be a good idea to check that the OrderSend is successful and if it is, then update opentimelastmarket there?