SARKAMA





//+------------------------------------------------------------------+
//|                                                   SARKAMA_v1.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"


//---- input parameters
extern string     Expert_Name    = "---- SARKAMA_v1 ----";

extern int        Magic          = 10000;
extern int        Slippage       =     6;

extern string     Main_data      = " Trade Volume & Trade Method";
extern double     Lots           =   0.1;
extern double     TakeProfit     =     0;    // Take Profit Value 
extern double     InitialStop    =   150;    // Initial Stop Value
extern double     TrailingStop   =    20;    // Trailing Stop Value   

extern string     SAR_inputs     = " Parabolic SAR parameters ";
extern int        MainTimeFrame  =  1440;    // Large Time Frame in min
extern double     Step           =  0.05;    // 
extern double     Maximum        =  0.05;    // 
extern int        BarsBack       =     1;    // 

extern string     KAMA_inputs    = " Kaufman AMA parameters ";
extern int        periodAMA      =     9;
extern int        nfast          =     2;
extern int        nslow          =    30;
extern double     G              =   2.0;
extern double     dK             =   2.0;

extern string     MM_inputs      = " MoneyManagement by L.Williams ";
extern bool       MM             = false;    // ÌÌ Switch
extern double     MMRisk         =  0.15;    // Risk Factor
extern double     MaxLoss        =  1000;    // Maximum Loss by 1 Lot

int    MainTrend=0, Trend=0, MainTrend1=0, Trend1=0, cnt=0, total =0, ticket=0;
double MainSAR, MainClose, SAR, UpKAMA,DnKAMA,UpKAMA1,DnKAMA1, 
       SellStop,BuyStop,SellProfit,BuyProfit;
bool   BuySignal = false, SellSignal = false;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   
//----
   return(0);
  }

// ---- Scan Trades
int ScanTrades()
{   
   int total = OrdersTotal();
   int numords = 0;
      
   for(int cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == Magic) 
   numords++;
   }
   return(numords);
}  

void MainSAR()
{   
   MainSAR   = iSAR(NULL,MainTimeFrame,Step,Maximum,0); 
   MainClose = iClose(NULL,MainTimeFrame,0);
   MainTrend = MainTrend1;
   if ( MainSAR < MainClose ) MainTrend = 1;
   else if( MainSAR > MainClose ) MainTrend = -1;  
   MainTrend1 = MainTrend; 
}

void SAR()
{
   SAR   = iSAR(NULL,0,Step,Maximum,BarsBack); 
   Trend = Trend1;
   if ( SAR < Close[BarsBack] ) Trend = 1;
   else if( SAR > Close[BarsBack] ) Trend = -1;   
   Trend1= Trend; 
}
  



void TradeSignal()
{         

   UpKAMA  = iCustom(NULL,0,"Kaufman", periodAMA, nfast, nslow, G, dK, 1,BarsBack); 
   DnKAMA  = iCustom(NULL,0,"Kaufman", periodAMA, nfast, nslow, G, dK, 2,BarsBack);   
   UpKAMA1 = iCustom(NULL,0,"Kaufman", periodAMA, nfast, nslow, G, dK, 1,BarsBack+1); 
   DnKAMA1 = iCustom(NULL,0,"Kaufman", periodAMA, nfast, nslow, G, dK, 2,BarsBack+1);   
   //Print ( " Kama=",UpKAMA," KamaD=",DnKAMA);
   BuySignal = (  
               UpKAMA > 0
               &&
               MainTrend > 0 
               &&
               Trend > 0
               && 
               UpKAMA1 == NULL   
               );
  
   SellSignal= (  
               DnKAMA > 0
               &&
               MainTrend < 0
               &&
               Trend < 0
               && 
               DnKAMA1 == NULL
               );
} 


double MoneyManagement ( bool flag, double Lots, double risk, double maxloss)
{
   double Lotsi=Lots;
	    
   if ( flag ) Lotsi=Lots*NormalizeDouble(Lots*AccountFreeMargin()*MMRisk/MaxLoss,1);   
     
   if (Lotsi<0.1) Lotsi=0.1;  
   return(Lotsi);
}   


void TrailStop()
{
   for (cnt=0;cnt<OrdersTotal();cnt++)
   { 
   OrderSelect(cnt, SELECT_BY_POS);   
   int mode=OrderType();    
      if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
      {
         if (mode==OP_BUY) 
         {
			BuyStop = Bid - TrailingStop*Point;
			   if( OrderOpenPrice() < BuyStop || OrderStopLoss() == 0 ) 
            {   
			      if ( BuyStop > OrderStopLoss() ) 
			      {
			      bool result = OrderModify(OrderTicket(),OrderOpenPrice(),
			                                NormalizeDouble(BuyStop, Digits),
			                                OrderTakeProfit(),0,LightGreen);
			         if( !result )
                  {
                  Print("BUY: OrderModify failed with error #",GetLastError());
                  }
			      return(0);
               }            
            }
         }   
// - SELL Orders          
         if (mode==OP_SELL)
         {
         SellStop = Ask + Point * TrailingStop;   
            if( OrderOpenPrice() > SellStop) 
            {
               if( OrderStopLoss() > SellStop || OrderStopLoss() == 0 ) 
               {
               OrderModify(OrderTicket(), OrderOpenPrice(),
                           NormalizeDouble(SellStop, Digits),
			                  OrderTakeProfit(),0,DarkOrange);
                  if( !result )
                  {
                  Print("SELL: OrderModify failed with error #",GetLastError());
                  }
               return(0);
               }   
   			}	    
         }
      }
   }     
}

// ---- Open Sell Orders
void SellOrdOpen()
{		     
   double SellPrice = Bid;
   double StopPrice = Ask;
   int    Mode = OP_SELL;
        	  
	  if (InitialStop > 0) SellStop  = StopPrice + InitialStop*Point; 
	                       else SellStop = 0;
     if (TakeProfit  > 0) SellProfit = SellPrice - TakeProfit*Point; 
                          else SellProfit=0;
	ticket = OrderSend( Symbol(),Mode,MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
	                    NormalizeDouble(SellPrice , Digits),
	                    Slippage,
	                    NormalizeDouble(SellStop  , Digits),
	                    NormalizeDouble(SellProfit, Digits),
	                    "sell",Magic,0,Red);
      if(ticket<0)
      {
      Print("SELL: OrderSend failed with error #",GetLastError());
      }
   return(0);
}
// ---- Open Buy Orders
void BuyOrdOpen()
{		     
   double BuyPrice = Ask;
   double StopPrice = Bid;
   int    Mode     = OP_BUY;
      
      if (InitialStop > 0) BuyStop  = StopPrice - InitialStop*Point; 
		                     else BuyStop = 0;
      if (TakeProfit  > 0) BuyProfit= BuyPrice + TakeProfit*Point;  
                           else BuyProfit=0;  
		 
	ticket = OrderSend(Symbol(),Mode, MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
	                   NormalizeDouble(BuyPrice , Digits),
	                   Slippage,
	                   NormalizeDouble(BuyStop  , Digits), 
	                   NormalizeDouble(BuyProfit, Digits),
	                   "buy",Magic,0,Blue);
      if(ticket<0)
      {
      Print("BUY : OrderSend failed with error #",GetLastError());
      }
   return(0);
} 

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   ObjectsDeleteAll();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{

  MainSAR();
  SAR();
  TradeSignal();
  if ( TrailingStop > 0 ) TrailStop();
   
  if (ScanTrades()<1 && BuySignal ) BuyOrdOpen() ;
  if (ScanTrades()<1 && SellSignal) SellOrdOpen();
  
//----
   return(0);
} //start()
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Parabolic Stop and Reverse system



Custom Indicators Used:
Kaufman

Order Management characteristics:
Checks for the total of open orders

It can change open orders parameters, due to possible stepping strategy

Other Features: