Help me fix my EA so that it trades once per signal when it hit either SL, TP or trailing stop. I want it to wait for next signal

 
#property copyright " "
#property link      " "
#property description   "Stochastic EA"
#property version   "1.0"
#property strict

extern int MagicNumber=10001;
extern double Lots =0.1;
extern double StopLoss=50;
extern double TakeProfit=100;
extern int TrailingStop=30;
extern int Slippage=3;

//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+

int start()
{
  double MyPoint=Point;
  if(Digits==3 || Digits==5) MyPoint=Point*10;
  
  double TheStopLoss=0;
  double TheTakeProfit=0;
  if( TotalOrdersCount()==0 ) 
  {
     int result=0;
     if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)>iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // Here is your open buy rule
     {
        result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Stoch EA",MagicNumber,0,Blue);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
         OrderSelect(result,SELECT_BY_TICKET);
         OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
     if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)<iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // Here is your open Sell rule
     {
        result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Stoch EA",MagicNumber,0,Red);
        if(result>0)
        {
         TheStopLoss=0;
         TheTakeProfit=0;
         if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
         if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
         OrderSelect(result,SELECT_BY_TICKET);
         OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
        }
        return(0);
     }
  }
  
  for(int cnt=0;cnt<OrdersTotal();cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol() &&
         OrderMagicNumber()==MagicNumber 
         )  
        {
         if(OrderType()==OP_BUY)  
           {
              if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)<iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) //here is your close buy rule
              {
                   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
                if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)>iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // here is your close sell rule
                {
                   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
                }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
}

int TotalOrdersCount()
{
  int result=0;
  for(int i=0;i<OrdersTotal();i++)
  {
     OrderSelect(i,SELECT_BY_POS ,MODE_TRADES);
     if (OrderMagicNumber()==MagicNumber) result++;

   }
  return (result);
}
Files:
 

You have 8 market products and a forex website.

Why are you not able to solve it ?

 

The EA keeps opening trades when current one is closed by either SL, TP or Trailing Stop, because conditions remain valid. 
I want help to make EA trade only once per signal. It should wait for next signal before opening trade when the current trade is closed; even if trade conditions remain valid.

Please find the source code and insert for me if possible. 

Thank you

 
Marco vd Heijden:

You have 8 market products and a forex website.

Why are you not able to solve it ?

I have not encountered this problem before. I tried but it ended up something else. Embarrassing, I know.

But it's always right to ask for help 

 

you can always wrap if orderstotal()==0 around the orderloop then it will only order when there are no open orders.

It's a quick fix.

 
Oliver Gideon Amofa Appiah:

I have not encountered this problem before. I tried but it ended up something else. Embarrassing, I know.

But it's always right to ask for help 

Add a string global variable called something like LastSignal. After it trades a buy signal set the value to buy and after trading sell set value to sell. Then set to only trade buy if LastSignal value not buy and vice versa.
 
//+------------------------------------------------------------------+
#property copyright " "
#property link      " "
#property description   "Stochastic EA"
#property version   "1.0"
#property strict

extern int MagicNumber=10001;
extern double Lots=0.1;
extern double StopLoss=50;
extern double TakeProfit=100;
extern int TrailingStop=30;
extern int Slippage=3;
static input ENUM_TIMEFRAMES timeframe=PERIOD_D1;// One trade per bar...

datetime time;
//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+

int start()
  {
   if(time!=iTime(_Symbol,timeframe,0))
     {
      double MyPoint=Point;
      if(Digits==3 || Digits==5) MyPoint=Point*10;

      double TheStopLoss=0;
      double TheTakeProfit=0;
      if(TotalOrdersCount()==0)
        {
         int result=0;
         if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)>iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // Here is your open buy rule
           {
            result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Stoch EA",MagicNumber,0,Blue);
            if(result>0)
              {
               TheStopLoss=0;
               TheTakeProfit=0;
               if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
               if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
               OrderSelect(result,SELECT_BY_TICKET);
               OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
              }
            return(0);
           }
         if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)<iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // Here is your open Sell rule
           {
            result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Stoch EA",MagicNumber,0,Red);
            if(result>0)
              {
               TheStopLoss=0;
               TheTakeProfit=0;
               if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
               if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
               OrderSelect(result,SELECT_BY_TICKET);
               OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
              }
            return(0);
           }
        }
      time=iTime(_Symbol,timeframe,0);
     }
   for(int cnt=0;cnt<OrdersTotal();cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && 
         OrderSymbol()==Symbol() && 
         OrderMagicNumber()==MagicNumber
         )
        {
         if(OrderType()==OP_BUY)
           {
            if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)<iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) //here is your close buy rule
              {
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else
           {
            if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)>iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // here is your close sell rule
              {
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TotalOrdersCount()
  {
   int result=0;
   for(int i=0;i<OrdersTotal();i++)
     {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber()==MagicNumber) result++;

     }
   return (result);
  }
//+------------------------------------------------------------------+

Added a time filter one trade per bar for example.

 
//+------------------------------------------------------------------+
#property copyright " "
#property link      " "
#property description   "Stochastic EA"
#property version   "1.0"
#property strict

extern int MagicNumber=10001;
extern double Lots=0.1;
extern double StopLoss=50;
extern double TakeProfit=100;
extern int TrailingStop=30;
extern int Slippage=3;
bool trade=0;
//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+

int start()
  {
   double MyPoint=Point;
   if(Digits==3 || Digits==5) MyPoint=Point*10;

   double TheStopLoss=0;
   double TheTakeProfit=0;
   if(TotalOrdersCount()==0)
     {
      int result=0;
      if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)>iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // Here is your open buy rule
        {
         if(trade==0)
           {
            trade=1;
            result=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"Stoch EA",MagicNumber,0,Blue);
            if(result>0)
              {
               TheStopLoss=0;
               TheTakeProfit=0;
               if(TakeProfit>0) TheTakeProfit=Ask+TakeProfit*MyPoint;
               if(StopLoss>0) TheStopLoss=Ask-StopLoss*MyPoint;
               OrderSelect(result,SELECT_BY_TICKET);
               OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
              }
            return(0);
           }
        }
      if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)<iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // Here is your open Sell rule
        {
         if(trade==1)
           {
            trade=0;
            result=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"Stoch EA",MagicNumber,0,Red);
            if(result>0)
              {
               TheStopLoss=0;
               TheTakeProfit=0;
               if(TakeProfit>0) TheTakeProfit=Bid-TakeProfit*MyPoint;
               if(StopLoss>0) TheStopLoss=Bid+StopLoss*MyPoint;
               OrderSelect(result,SELECT_BY_TICKET);
               OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(TheStopLoss,Digits),NormalizeDouble(TheTakeProfit,Digits),0,Green);
              }
            return(0);
           }
        }
     }

   for(int cnt=0;cnt<OrdersTotal();cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && 
         OrderSymbol()==Symbol() && 
         OrderMagicNumber()==MagicNumber
         )
        {
         if(OrderType()==OP_BUY)
           {
            if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)<iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) //here is your close buy rule
              {
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>MyPoint*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-MyPoint*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*MyPoint,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else
           {
            if((iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_MAIN,0)>iStochastic(NULL,0,34,55,3,MODE_EMA,1,MODE_SIGNAL,0))) // here is your close sell rule
              {
               OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,Red);
              }
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(MyPoint*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+MyPoint*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+MyPoint*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TotalOrdersCount()
  {
   int result=0;
   for(int i=0;i<OrdersTotal();i++)
     {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber()==MagicNumber) result++;

     }
   return (result);
  }
//+------------------------------------------------------------------+

Or you can add a trade flag like this.

 
What I really want is nothing but ONE TRADE PER SIGNAL. And when that trade closes by whatever means, EA must wait for the next signal before opening trade.

The whole idea is the crossing of the stochastic oscillator. Example when working, EA opens buy when stochastic oscillator crosses up, and vice versa. I realized that as long as this condition is true, EA opens another trade again even if current one is closed. I DON'T WANT THAT. 
I want EA to wait for next signal (in this case, crossing of stoch) before opening any trade.
 
It does that already go try.
 
I'm going to try. Thanks 
I'll be back 
Reason: