roScalper





//+------------------------------------------------------------------+
//|                                                    roScalper.mq4 |
//|                                              @2009 Desynced Tech |
//|                                     http://desynced.no-ip.org/fx |
//+------------------------------------------------------------------+
#property copyright "@2009 Desynced Tech"
#property link      "http://desynced.no-ip.org/fx"


#include <mysql.mqh>

extern int takeprofit = 60;
extern double lots = 0.1;
extern int MAGIC = 85;
extern int trailingStep = 40;
extern int profTarget = 25;
extern int stoploss = 0;


int maxprofit = 0;



#define MABULL 1
#define MABEAR -1

datetime lastOrder;

double max = 0 ;

int ticket;

double tp ;

double dsStopLoss = 0 ;
double dbStopLoss = 0 ;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
  
  Print(max);
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

bool canTrade() {

   //if ( Minute() == 0) return(false);

   if ( Hour() >= 1 && Hour() < 2 || (Hour() == 2 && Minute() < 20 )  ) return (false);
   
   if ( Hour() >= 9 && Hour() < 10 || (Hour() == 10 && Minute() < 20 ) ) return (false);
   
   if ( Hour() >= 13 && Hour() < 14 || ( Hour() == 14 && Minute() < 20 )) return (false);
   
   if ( Hour() == 17 ) return(false);
   
   return (true);

}





void trailingProfit( int tp , int profittarget, int step) {
   
   int tik = getNumberTrades ();

   if ( tik == -1 ) return;
   
   if ( OrderType() == OP_BUY && OrderProfit() > 0 ) {
         
       //  Print(" diff  " ,OrderProfit() , " = > " ,((OrderTakeProfit() - Ask)/Point));
         
         if ( ((OrderTakeProfit() - Ask)/Point) <= profittarget ) OrderModify(tik,OrderOpenPrice(),Bid-step*Point,Ask+step*Point,0,Blue);
   
   }
   
   if ( OrderType() == OP_SELL && OrderProfit() > 0 ) {
   
            if ( (  (OrderTakeProfit()-Bid)/Point)*(-1) <= profittarget ) OrderModify(tik,OrderOpenPrice(), Ask+step*Point,Bid-step*Point,0,Red);
   }
   

}


void checkTicket (int tik) {
   
   
     int hstTotal=OrdersHistoryTotal();
     if(OrderSelect(tik,SELECT_BY_TICKET,MODE_HISTORY) !=false ) {
     
     
     Print(tik, " max profit was " , maxprofit);
         lastOrder = OrderCloseTime();
         ticket =0;
         maxprofit = 0 ;
             
     }  
     
}



datetime PreviousBar;      // record the candle/bar time
bool NewBar()
{
   if(PreviousBar<Time[0])
   {
      PreviousBar = Time[0];
      return(true);
   }
   else
   {
      return(false);
   }
   return(false);    // in case if - else statement is not executed
}




int start()
  {








int tik = getNumberTrades ();
if ( tik != -1 ) {
   
   /*
   if ( OrderProfit() > maxprofit ) maxprofit = OrderProfit();
   
   if ( OrderType() == OP_BUY && OrderProfit() > 0 ) {
         
       //  Print(" diff  " ,OrderProfit() , " = > " ,((OrderTakeProfit() - Ask)/Point));
         
         if ( ((OrderTakeProfit() - Ask)/Point) <= 6 ) OrderModify(tik,OrderOpenPrice(),Bid-takeprofit*Point,Ask+50*Point,0,Blue);
   
   }
   
   if ( OrderType() == OP_SELL && OrderProfit() > 0 ) {
   
  
   
   
            if ( (  (OrderTakeProfit()-Bid)/Point)*(-1) <= 6 ) OrderModify(tik,OrderOpenPrice(), Ask+takeprofit*Point,Bid-50*Point,0,Red);
   
   
           // Print(" diff sell " ,OrderProfit() , " = > " ,(  (OrderTakeProfit()-Bid)/Point)*(-1));
   }
   
*/

}
else {

   if ( ticket != 0 )   checkTicket(ticket);

}



//if ( AccountBalance() > 2300 ) lots = 0.2;


if ( !canTrade()  ) {
         
            Comment("no trade time");
            return(0);
         }
         else Comment("");


//if ( x1 != 0 && x1< 0.7 && x2 < 2  && getNumberTrades () == -1 && stoch == 1 && demarker < 0.36 && (TimeCurrent() - lastOrder) > (60*60*4) ) {

 //if(NewBar() == false ) return(0);

double demarker = iDeMarker(NULL,0,14,0);





double idx0 = iCustom(NULL, 0, "stc_plot_dcec",0,0);
double idx1 = iCustom(NULL, 0, "stc_plot_dcec",0,1);



if ( stoploss > 0 ) {
   
   dsStopLoss = Ask+stoploss*Point   ;
   dbStopLoss = Bid-stoploss*Point;
   
   

}
else {

      dsStopLoss = 0 ;
      dbStopLoss = 0 ;
}


if ( idx1 < 15 && idx0 > 15 &&  getNumberTrades () == -1 && (TimeCurrent() - lastOrder) > (60*60*4)  && demarker < 0.36) {




  // Print (x1, " " , x2 , " ", stoch, " " , demarker, " " );
    if ( takeprofit > 0 ) {
              
                  tp = Ask+takeprofit*Point;
         }
         else tp = 0;

        ticket =  OrderSend(Symbol(),OP_BUY, 0.1, Ask, 3, dbStopLoss, tp,"", MAGIC, 0, Red); 
        
        if ( ticket > 0 ) {
        /*
       
                            mysql_connect("192.168.0.3","forex","forex","forex",3306);
 									 insertOrderDb(ticket,Symbol(),Bid,0, tp,MAGIC,"roScalper",OP_BUY, TimeCurrent());
 									mysql_close(mysql);
      */
        
         lastOrder = TimeCurrent();
         return(0);
        }

}

if ( idx1 > 85 && idx0 < 85 &&  getNumberTrades () == -1 &&  (TimeCurrent() - lastOrder) > (60*60*4) && iDeMarker(NULL,0,14,0) < 0.7) {
      Print ("possible SELL ",iDeMarker(NULL,0,14,0) , " " ,( (TimeCurrent() - lastOrder)/(60*60*4)) );
      
      if ( takeprofit > 0 ) {
              
                  tp = Bid-takeprofit*Point;
              }
              else tp = 0;
             
              ticket =  OrderSend(Symbol(),OP_SELL, lots, Bid, 3, dsStopLoss, tp,"", MAGIC, 0, Red); 
      
      if ( ticket > 0 ) {
      
      
                      /*  
                            mysql_connect("192.168.0.3","forex","forex","forex",3306);
 									 insertOrderDb(ticket,Symbol(),Bid,0, tp,MAGIC,"roScalper",OP_SELL, TimeCurrent());
 									mysql_close(mysql);
       */
        
         lastOrder = TimeCurrent();
         return(0);
        }

}


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


  int stochasticAlert() {

   double mainLine;
   double prevMainLine;
   double signalLine;
   double prevSignalLine;
      
   for(int a=0;a<=4 ;a++)
   {
      mainLine=iStochastic(0,0,14,3,3,MODE_SMA,0,MODE_MAIN,a);
      prevMainLine=iStochastic(0,0,14,3,3,MODE_SMA,0,MODE_MAIN,a+1);
      signalLine=iStochastic(0,0,14,3,3,MODE_SMA,0,MODE_SIGNAL,a);
      prevSignalLine=iStochastic(0,0,14,3,3,MODE_SMA,0,MODE_SIGNAL,a+1);
 
      if(prevMainLine<prevSignalLine && mainLine>signalLine) {
        // Print("buy " , mainLine , " " , signalLine );
         return (MABULL);
        }
      if(prevMainLine>prevSignalLine && mainLine<signalLine) {
      
      //   Print("sell " , mainLine , " " , signalLine );
         return (MABEAR);
        }
   }
   return(0);




}




int getNumberTrades()
{   
   int total = OrdersTotal();
   int numords = 0;
      
   for(int cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() &&  OrderMagicNumber() == MAGIC) 
      return (OrderTicket());
   }
   return(-1);
} 



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:

DeMarker indicator

Stochastic oscillator


Custom Indicators Used:
stc_plot_dcec

Order Management characteristics:

It can change open orders parameters, due to possible stepping strategy
Checks for the total of closed orders
It automatically opens orders when conditions are reached
Checks for the total of open orders

Other Features:

It issuies visual alerts to the screen