Psar EA only triggers BUY signals and not SELL signals, PLEASE HELP

 

Im a newbie coder so bare with me, written a code that buys when short liner wighted MA crosses above long liner wighted MA and Psar showing an uptreand and sells when when long liner wighted MA crosses below short liner wighted MA and Psar showing an downtreand. but it only opens buy possitions and not sells.

Can some one find the error?

extern int LWMA1period = 0;
extern int LWMA2period = 0;
extern double PsarStepPeriod = 0.01;

extern double Order1Lots = 0.1;
extern double Order2Lots = 0.1;
extern double Order3Lots = 0.1;
extern double Order4Lots = 0.1;
extern double Order1TakeProfit = 15;
extern double Order2TakeProfit = 30;
extern double Order3TakeProfit = 50;
extern double MoveSLafterOrder1 = 0;
extern double MoveSLafterOrder2 = 10;
extern double MoveSLafterOrder3 = 20;
extern double TrailingStopForOrder4 = 30;
extern int StartTradeHour = 0;
extern int EndTradeHour = 24;
extern int MagicNumber = 164783;
extern bool UseEmails = false;
double Psar = 0;

bool cont;
int dig = 1, i, AllOrders, currPos = 0, orderTicket, cycle, j, k;
bool ThereIsOrder1, ThereIsOrder2, ThereIsOrder3, ThereIsOrder4;
datetime prevDate;
string tempTimeComm;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+


int init()
{
if( MarketInfo(Symbol(),MODE_DIGITS) == 3 || MarketInfo(Symbol(),MODE_DIGITS) == 5)
dig = 10;
currPos = 0;
prevDate = Time[0];
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
bool NewBar = isNewBar();

double LWMA1 = iMA(Symbol(), Period(), LWMA1period, 0, MODE_LWMA, PRICE_CLOSE, 1);

double LWMA2 = iMA(Symbol(), Period(), LWMA2period, 0, MODE_LWMA, PRICE_OPEN, 1);

double preLWMA1 = iMA(Symbol(), Period(), LWMA1period, 0, MODE_LWMA, PRICE_CLOSE, 2);

double preLWMA2 = iMA(Symbol(), Period(), LWMA2period, 0, MODE_LWMA, PRICE_OPEN, 2);

Psar = iSAR(NULL, 0, PsarStepPeriod, 0.2, 0);



AllOrders = 0;

for ( i = 0; i < OrdersTotal(); i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
AllOrders++;
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
tempTimeComm = StringSubstr(OrderComment(), StringFind(OrderComment(), "NUM:", 0) + 1, 0);

ThereIsOrder1 = false;
ThereIsOrder2 = false;
ThereIsOrder3 = false;
ThereIsOrder4 = false;

for ( j = 0; j < OrdersTotal(); j++)
{
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
AllOrders++;
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && StringFind(OrderComment(), tempTimeComm, 0) >= 0)
{
if(StringFind(OrderComment(), "Order 1", 0) >= 0 ) ThereIsOrder1 = true;
if(StringFind(OrderComment(), "Order 2", 0) >= 0 ) ThereIsOrder2 = true;
if(StringFind(OrderComment(), "Order 3", 0) >= 0 ) ThereIsOrder3 = true;
if(StringFind(OrderComment(), "Order 4", 0) >= 0 ) ThereIsOrder4 = true;
}
}

for ( k = 0; k < OrdersTotal(); k++)
{
OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

if(!ThereIsOrder1 && ThereIsOrder2 && ThereIsOrder3 && ThereIsOrder4)
{
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && ((OrderType() == OP_BUY && OrderStopLoss() != OrderClosePrice() + MoveSLafterOrder1*Point*dig) || (OrderType() == OP_SELL && OrderStopLoss() != OrderClosePrice() - MoveSLafterOrder1*Point*dig)))
{
if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + MoveSLafterOrder1*Point*dig, OrderTakeProfit(), 0, NULL);
if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - MoveSLafterOrder1*Point*dig, OrderTakeProfit(), 0, NULL);
}
}

if(!ThereIsOrder1 && !ThereIsOrder2 && ThereIsOrder3 && ThereIsOrder4)
{
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && ((OrderType() == OP_BUY && OrderStopLoss() < OrderClosePrice() + MoveSLafterOrder2*Point*dig) || (OrderType() == OP_SELL && OrderStopLoss() > OrderClosePrice() - MoveSLafterOrder2*Point*dig)))
{
if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + MoveSLafterOrder2*Point*dig, OrderTakeProfit(), 0, NULL);
if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - MoveSLafterOrder2*Point*dig, OrderTakeProfit(), 0, NULL);
}
}

if(!ThereIsOrder1 && !ThereIsOrder2 && !ThereIsOrder3 && ThereIsOrder4 && TrailingStopForOrder4 > 0)
{
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && ((OrderType() == OP_BUY && OrderStopLoss() < Bid - TrailingStopForOrder4*Point*dig) || (OrderType() == OP_SELL && OrderStopLoss() > Ask + TrailingStopForOrder4*Point*dig )))
{
if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStopForOrder4*Point*dig, OrderTakeProfit(), 0, NULL);
if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStopForOrder4*Point*dig, OrderTakeProfit(), 0, NULL);
}
}


}

}
}

if (NewBar && Psar == 0.01 && LWMA1 > LWMA2 && preLWMA1 <= preLWMA2 && val > 0 )

{

CloseAll();
Open_BuyMarket(Ask + Order1TakeProfit*Point*dig, Order1Lots, "Order 1");
Open_BuyMarket(Ask + Order2TakeProfit*Point*dig, Order2Lots, "Order 2");
Open_BuyMarket(Ask + Order3TakeProfit*Point*dig, Order3Lots, "Order 3");
Open_BuyMarket(0, Order1Lots, "Order 4");
currPos = 1;
if (UseEmails && !IsTesting() && !IsOptimization()) SendMail("Orders Opened At " + Symbol() + " Buy: " + DoubleToStr(Ask, Digits), TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES));
}

if (NewBar && Psar == 0.01 && LWMA1 < LWMA2 && preLWMA1 >= preLWMA2 && val < 0 )

{
CloseAll();

Open_SellMarket(Bid - Order1TakeProfit*Point*dig, Order1Lots, "Order 1");
Open_SellMarket(Bid - Order2TakeProfit*Point*dig, Order2Lots, "Order 2");
Open_SellMarket(Bid - Order3TakeProfit*Point*dig, Order3Lots, "Order 3");
Open_SellMarket(0, Order4Lots, "Order 4");
currPos = -1;
if (UseEmails && !IsTesting() && !IsOptimization()) SendMail("Orders Opened At " + Symbol() + " Sell: " + DoubleToStr(Bid, Digits), TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES));

}

return(0);

}
void Open_BuyMarket( double orderTP, double orderLots, string orderComm)
{
cont = true;
cycle = 0;
while(cont)
{
orderTicket = OrderSend(Symbol(), OP_BUY, orderLots, Ask, 5*dig, 0, 0, orderComm, MagicNumber, 0, Green );
if(orderTicket<0)
{
Print("retrying ...");
Sleep (1000);
RefreshRates();
cycle++;
if (cycle == 3) cont = false;
}
else
{
if (orderTP > 0)
{
OrderSelect(orderTicket, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(orderTP, Digits), 0, NULL);
}
cont = false;
}
}
}

void Open_SellMarket( double orderTP, double orderLots, string orderComm)
{
cont = true;
cycle = 0;
while(cont)
{
orderTicket = OrderSend(Symbol(), OP_SELL, orderLots, Bid, 5*dig, 0, 0, orderComm, MagicNumber, 0, Red );
if(orderTicket<0)
{
Print("retrying ...");
Sleep (1000);
RefreshRates();
cycle++;
if (cycle == 3) cont = false;
}
else
{
if (orderTP > 0)
{
OrderSelect(orderTicket, SELECT_BY_TICKET);
OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(orderTP, Digits), 0, NULL);
}
cont = false;
}
}
}

bool isNewBar()
{
if( Time[0] != prevDate)
{
prevDate = Time[0];
return(true);
}
return(false);
}

bool CheckTime()
{
if (Hour() >= StartTradeHour && Hour() < EndTradeHour)
return(true);
else
return(false);
}


void CloseAll()
{
for ( i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
{
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 5*dig, Orange);
}
}
}

void CloseOneSize( int orderTypeClose )
{
for ( i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == orderTypeClose)
{
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 5*dig, Orange);
}
}
}

//+------------------------------------------------------------------+

 

Please use this to post code . . . it makes it easier to read.

 
What is val ??
 
extern int LWMA1period = 0;
 extern int LWMA2period = 0;
 extern double PsarStepPeriod = 0.01;

extern double Order1Lots = 0.1;
 extern double Order2Lots = 0.1;
 extern double Order3Lots = 0.1;
 extern double Order4Lots = 0.1;
 extern double Order1TakeProfit = 15;
 extern double Order2TakeProfit = 30;
 extern double Order3TakeProfit = 50;
 extern double MoveSLafterOrder1 = 0;
 extern double MoveSLafterOrder2 = 10;
 extern double MoveSLafterOrder3 = 20;
 extern double TrailingStopForOrder4 = 30;
 extern int StartTradeHour = 0;
 extern int EndTradeHour = 24;
 extern int MagicNumber = 164783;
 extern bool UseEmails = false;
 double Psar = 0;

bool cont;
 int dig = 1, i, AllOrders, currPos = 0, orderTicket, cycle, j, k;
 bool ThereIsOrder1, ThereIsOrder2, ThereIsOrder3, ThereIsOrder4;
 datetime prevDate;
 string tempTimeComm;
 //+------------------------------------------------------------------+
 //| expert initialization function |
 //+------------------------------------------------------------------+


 int init()
 {
 if( MarketInfo(Symbol(),MODE_DIGITS) == 3 || MarketInfo(Symbol(),MODE_DIGITS) == 5)
 dig = 10;
 currPos = 0;
 prevDate = Time[0];
 return(0);
 }
 //+------------------------------------------------------------------+
 //| expert deinitialization function |
 //+------------------------------------------------------------------+
 int deinit()
 {
 //----

 //----
 return(0);
 }
 //+------------------------------------------------------------------+
 //| expert start function |
 //+------------------------------------------------------------------+
 int start()
 {
 bool NewBar = isNewBar();

 double LWMA1 = iMA(Symbol(), Period(), LWMA1period, 0, MODE_LWMA, PRICE_CLOSE, 1);

 double LWMA2 = iMA(Symbol(), Period(), LWMA2period, 0, MODE_LWMA, PRICE_OPEN, 1);

 double preLWMA1 = iMA(Symbol(), Period(), LWMA1period, 0, MODE_LWMA, PRICE_CLOSE, 2);

 double preLWMA2 = iMA(Symbol(), Period(), LWMA2period, 0, MODE_LWMA, PRICE_OPEN, 2);

 Psar = iSAR(NULL, 0, PsarStepPeriod, 0.2, 0); 



AllOrders = 0;

 for ( i = 0; i < OrdersTotal(); i++)
 {
 OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
 AllOrders++;
 if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
 { 
tempTimeComm = StringSubstr(OrderComment(), StringFind(OrderComment(), "NUM:", 0) + 1, 0); 

ThereIsOrder1 = false;
 ThereIsOrder2 = false;
 ThereIsOrder3 = false;
 ThereIsOrder4 = false;

 for ( j = 0; j < OrdersTotal(); j++)
 {
 OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
 AllOrders++;
 if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && StringFind(OrderComment(), tempTimeComm, 0) >= 0)
 { 
if(StringFind(OrderComment(), "Order 1", 0) >= 0 ) ThereIsOrder1 = true;
 if(StringFind(OrderComment(), "Order 2", 0) >= 0 ) ThereIsOrder2 = true;
 if(StringFind(OrderComment(), "Order 3", 0) >= 0 ) ThereIsOrder3 = true;
 if(StringFind(OrderComment(), "Order 4", 0) >= 0 ) ThereIsOrder4 = true;
 }
 }

 for ( k = 0; k < OrdersTotal(); k++)
 {
 OrderSelect(k, SELECT_BY_POS, MODE_TRADES);

 if(!ThereIsOrder1 && ThereIsOrder2 && ThereIsOrder3 && ThereIsOrder4)
 {
 if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && ((OrderType() == OP_BUY && OrderStopLoss() != OrderClosePrice() + MoveSLafterOrder1*Point*dig) || (OrderType() == OP_SELL && OrderStopLoss() != OrderClosePrice() - MoveSLafterOrder1*Point*dig)))
 {
 if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + MoveSLafterOrder1*Point*dig, OrderTakeProfit(), 0, NULL); 
if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - MoveSLafterOrder1*Point*dig, OrderTakeProfit(), 0, NULL); 
}
 }

 if(!ThereIsOrder1 && !ThereIsOrder2 && ThereIsOrder3 && ThereIsOrder4)
 {
 if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && ((OrderType() == OP_BUY && OrderStopLoss() < OrderClosePrice() + MoveSLafterOrder2*Point*dig) || (OrderType() == OP_SELL && OrderStopLoss() > OrderClosePrice() - MoveSLafterOrder2*Point*dig)))
 {
 if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + MoveSLafterOrder2*Point*dig, OrderTakeProfit(), 0, NULL); 
if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - MoveSLafterOrder2*Point*dig, OrderTakeProfit(), 0, NULL); 
}
 }

 if(!ThereIsOrder1 && !ThereIsOrder2 && !ThereIsOrder3 && ThereIsOrder4 && TrailingStopForOrder4 > 0)
 {
 if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && ((OrderType() == OP_BUY && OrderStopLoss() < Bid - TrailingStopForOrder4*Point*dig) || (OrderType() == OP_SELL && OrderStopLoss() > Ask + TrailingStopForOrder4*Point*dig )))
 {
 if (OrderType() == OP_BUY) OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStopForOrder4*Point*dig, OrderTakeProfit(), 0, NULL); 
if (OrderType() == OP_SELL) OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStopForOrder4*Point*dig, OrderTakeProfit(), 0, NULL); 
}
 }


 }

 }
 } 

if (NewBar && Psar == 0.01 && LWMA1 > LWMA2 && preLWMA1 <= preLWMA2 )

 {

 CloseAll();
 Open_BuyMarket(Ask + Order1TakeProfit*Point*dig, Order1Lots, "Order 1");
 Open_BuyMarket(Ask + Order2TakeProfit*Point*dig, Order2Lots, "Order 2");
 Open_BuyMarket(Ask + Order3TakeProfit*Point*dig, Order3Lots, "Order 3");
 Open_BuyMarket(0, Order1Lots, "Order 4");
 currPos = 1;
 if (UseEmails && !IsTesting() && !IsOptimization()) SendMail("Orders Opened At " + Symbol() + " Buy: " + DoubleToStr(Ask, Digits), TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES));
 } 

if (NewBar && Psar == 0.01 && LWMA1 < LWMA2 && preLWMA1 >= preLWMA2 )

 {
 CloseAll();

 Open_SellMarket(Bid - Order1TakeProfit*Point*dig, Order1Lots, "Order 1"); 
Open_SellMarket(Bid - Order2TakeProfit*Point*dig, Order2Lots, "Order 2");
 Open_SellMarket(Bid - Order3TakeProfit*Point*dig, Order3Lots, "Order 3"); 
Open_SellMarket(0, Order4Lots, "Order 4");
 currPos = -1;
 if (UseEmails && !IsTesting() && !IsOptimization()) SendMail("Orders Opened At " + Symbol() + " Sell: " + DoubleToStr(Bid, Digits), TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES));

 } 

return(0);

 }
 void Open_BuyMarket( double orderTP, double orderLots, string orderComm)
 { 
cont = true;
 cycle = 0;
 while(cont)
 {
 orderTicket = OrderSend(Symbol(), OP_BUY, orderLots, Ask, 5*dig, 0, 0, orderComm, MagicNumber, 0, Green );
 if(orderTicket<0)
 {
 Print("retrying ...");
 Sleep (1000);
 RefreshRates();
 cycle++;
 if (cycle == 3) cont = false;
 }
 else
 {
 if (orderTP > 0)
 {
 OrderSelect(orderTicket, SELECT_BY_TICKET);
 OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(orderTP, Digits), 0, NULL);
 }
 cont = false; 
}
 }
 }

void Open_SellMarket( double orderTP, double orderLots, string orderComm)
 {
 cont = true;
 cycle = 0;
 while(cont)
 {
 orderTicket = OrderSend(Symbol(), OP_SELL, orderLots, Bid, 5*dig, 0, 0, orderComm, MagicNumber, 0, Red ); 
if(orderTicket<0)
 {
 Print("retrying ...");
 Sleep (1000);
 RefreshRates();
 cycle++;
 if (cycle == 3) cont = false;
 }
 else
 {
 if (orderTP > 0)
 {
 OrderSelect(orderTicket, SELECT_BY_TICKET);
 OrderModify(OrderTicket(), OrderOpenPrice(), 0, NormalizeDouble(orderTP, Digits), 0, NULL);
 }
 cont = false; 
}
 }
 }

bool isNewBar()
 {
 if( Time[0] != prevDate)
 {
 prevDate = Time[0];
 return(true);
 }
 return(false);
 }

bool CheckTime()
 {
 if (Hour() >= StartTradeHour && Hour() < EndTradeHour)
 return(true);
 else
 return(false);
 }


 void CloseAll()
 {
 for ( i = OrdersTotal() - 1; i >= 0; i--)
 {
 OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
 if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
 {
 OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 5*dig, Orange); 
}
 }
 }

void CloseOneSize( int orderTypeClose )
 {
 for ( i = OrdersTotal() - 1; i >= 0; i--)
 {
 OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
 if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() && OrderType() == orderTypeClose)
 {
 OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 5*dig, Orange); 
}
 }
 }

//+------------------------------------------------------------------+


 

VAl was an RVI i was using, but that wasnt the problem. it worked fine with & without that

 
  1. You have two nested orderSelect loops which are both counting orders - bogus
  2. Indent your code so you can read it.
  3. You must count down in the presence of multiple order (multiple charts)
  4. Always test return codes (OrderSelect) Why are you counting AllOrders, EA should only be concerned with it's own
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
    

  5. StringFind(OrderComment(), tempTimeComm, 0)
    Brokers can change comments, partially or completely.
Reason: