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 - page 2

 
Marco's method:

After testing I realized that it still does not do what I actually want. It misses some signals and also open more than one trade between signals.
 
Hello Tony,
Can you please insert your idea into the code and let us see if it works? 
I got to learn this 
 
Oliver Gideon Amofa Appiah:
Hello Tony,
Can you please insert your idea into the code and let us see if it works? 
I got to learn this 

your logic about buy or sell condition wrong

you need to find crossing stoch

 
Ahmet Metin Yilmaz:

your logic about buy or sell condition wrong

you need to find crossing stoch

or you should try Tony's way

both will be ok 

 
Marco vd Heijden:

You have 8 market products and a forex website.

Why are you not able to solve it ?

And I agree with Marco :)

 
My first time in the forum, it's great here! 
I like how quickly someone responded to my post. 

However, sometimes you think you know the easy solution or fix but until you get down to it,  to actually do it, you don't solve anything. 

The actual thing I wanted fixed remain the same. I tried the suggestions but ended up not what I really wanted. 

Thank you guys all the same for your help. 
The EA is for educational purposes only. It's not profitable. I was trying to use that to learn something here. 
 

If that happens it will be because your params are causing a very fast ob/os/ob situations or they are the result of a failed ordersend.

 
Oliver Gideon Amofa Appiah:

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

If you mean you want to wait for the next signal you will have to pull your trade flag high and after the order is opened you will have to pull it low again.

Then, when the order is closed, you have to pull the trade flag high again.

Like this:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                                                  |
//+------------------------------------------------------------------+
#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=1;// Trade Flag
//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+

int start()
  {

   if(TotalOrdersCount()==0)// all orders closed ?
     {
      Trade=1; // new orders allowed
     }

   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==1) // new order allowed ?
           {
            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);
               Trade=0;// No more new orders allowed from now
              }
            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)// new order allowed ?
           {
            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);
               Trade=0; // no more new orders allowed
              }
            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);
  }
//+------------------------------------------------------------------+
 
Marco vd Heijden:

If you mean you want to wait for the next signal you will have to pull your trade flag high and after the order is opened you will have to pull it low again.

Then, when the order is closed, you have to pull the trade flag high again.

Like this:

Using orderstotal() might block other trades if he wants many trades and not just one at a time.

 
Tonny Obare:

Using orderstotal() might block other trades if he wants many trades and not just one at a time.

He wants:

Oliver Gideon Amofa Appiah:

 
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.

Thank you


And i didn't use OrdersTotal().

Reason: