st+L+2stor-V1-1





//+------------------------------------------------------------------+
//|                                                      Starter.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
//#include <Tracert.mqh>
extern double  Lots           = 0.1;
extern double  MaximumRisk    = 0.03;
extern double  DecreaseFactor = 3;
extern int     Stop           = 10;
extern int     SL             = 0;   //Äëÿ "ýñòåòîâ" èç ôîðóìó StopLoss
//extern double Lots = 4;
//Ïàðàìåòðû Laguerre
extern double  GammaP         = 0.7; // Íåêàÿ "Ãàììà" èç ïàðàìåòðîâ "Laguerre"
extern double  StopL          = 0.1; // "Ïîðîã" "Laguerre" äëÿ çàêðûòèÿ ïîçèöèè
extern int     ShftL          = 0;   // Áàð, íà êîòîðîì ðàññ÷èòûâàåòñÿ "Laguerre"
//Ïàðàìåòðû CCI
extern int     CCIperiod      = 14;  // Ñîáñòâåííî ïåðèîä CCI
extern int     TypeCCI        = 0;   // "Öåíîâûå êîíñòàíòû" äëÿ ðàñ÷òåèà CCI 
                                     // 0-Close, 1-Open, 2-High, 3-Low, 4-Median, 
                                     // 5-Typical, 6-WEIGHTED
extern int     DAlpha         = 0;   // Äåëüòà CCI - "ïîðîã èçìåíåíèÿ ñêîðîñòè CCI" 
                                     // â ïðîöåíòàõ
extern int     CCILevel       = 100; // Êëàññè÷åñêè - óðîâåíü, êîòîðûé äîëæíà 
                                     // ïåðåñå÷ü CCI, ÷òîáû äàòü ñèãíàë. 
                                     // Êëàññèêà +/-100, 0, â îðèãèíàëüíîì 
                                     // starter'å +/-5. ß çàêîììåíòèðîâàë, ò.ê.....
extern int     ShftA1         = 0;   // Áàð äëÿ ðàñ÷åòà "òåêóùåé" CCI
extern int     ShftA2         = 1;   // Áàð äëÿ ðàñ÷åòà "ïðåäûäóùåé" CCI
//Ïàðàìåòðû MA
extern double  MAPeriod       = 120; // Ñîáñòâåííî ïåðèîä MA
extern int     TypeMA         = 0;   // "Öåíîâûå êîíñòàíòû" äëÿ ðàñ÷òåèà MA 
                                     // 0-Close, 1-Open, 2-High, 3-Low, 4-Median, 
                                     // 5-Typical, 6-WEIGHTED
extern int     ShftMA         = 0;   // Áàð äëÿ ðàñ÷åòà "òåêóùåé" MA (Áàð äëÿ 
                                     // "ïðåäûäóùåé" MA = ShftMA+1 (â îòëè÷èè îò CCI))
extern double  DeltaMA        = 0.1; // Äåëüòà MA ("òåêóùåãî" è "ïðåäûäóùåãî" áàðà) â "ïèïñàõ"
//MagicNubber
extern int     MagicNumber    = 20051016; // ß âñåãäà âûíîøó, ÷òîáû ìîæíî áûëî, 
                                          // ÍÀÏÐÈÌÅÐ, òîðãîâàòü íà îäíîé ïàðå 
                                          // ñ ðàçíûìè ïàðàìåòðàìè
int handle;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   handle = FileOpen("StarterDebug.csv",  FILE_CSV | FILE_WRITE);
   FileWrite(handle, "Time[0]", "TradeType", "Laguerre", "MA", 
             "MA1", "DMA", "Alpha1", "Alpha2", "DAlpha");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   FileClose(handle);  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot = Lots;
   int    orders = HistoryTotal(); // history orders total
   int    losses = 0;              // number of losses orders without a break
//---- select lot size
   lot = NormalizeDouble(AccountFreeMargin()*MaximumRisk / 500, 1);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor > 0)
     {
       for(int i = orders - 1; i >= 0; i--)
         {
           if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) 
             { 
               Print("Error in history!"); 
               break; 
             }
           //----
           if(OrderSymbol() != Symbol() || OrderType() > OP_SELL) 
               continue;
           //----
           if(OrderProfit() > 0) 
               break;
           //----
           if(OrderProfit() < 0) 
               losses++;
         }
       //----
       if(losses > 1) 
           lot = NormalizeDouble(lot - lot*losses / DecreaseFactor, 1);
     }
//---- return lot size
   if(lot < 1) 
       lot = 1;
//----
   if(lot > 1000) 
       lot = 1000;
   return(lot);
  }  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+  
double LaGuerre(double gamma, int shift)
  {
	  double RSI;
	  double L0[100];
	  double L1[100];
	  double L2[100];
	  double L3[100];
	  double CU, CD;
//----
	  for(int i = shift + 99; i >= shift; i--)
	    {
		     L0[i] = (1.0 - gamma)*Close[i] + gamma*L0[i+1];
		     L1[i] = -gamma*L0[i] + L0[i+1] + gamma*L1[i+1];
		     L2[i] = -gamma*L1[i] + L1[i+1] + gamma*L2[i+1];
		     L3[i] = -gamma*L2[i] + L2[i+1] + gamma*L3[i+1];
		     CU = 0;
		     CD = 0;
		     if(L0[i] >= L1[i])  
		         CU = L0[i] - L1[i];
		     else
		         CD = L1[i] - L0[i];
		     //----
       if(L1[i] >= L2[i])  
		         CU = CU + L1[i] - L2[i];
		     else
		         CD = CD + L2[i] - L1[i];
		     //----
       if(L2[i] >= L3[i])  
		         CU = CU + L2[i] - L3[i];
		     else
		         CD = CD + L3[i] - L2[i];
		     //----
       if(CU + CD != 0)		
		         RSI = CU / (CU + CD);
	    }
   return(RSI);
  }  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   double Laguerre;
   double SLstop;
   double Alpha1, Alpha2;
   double MA, MA1;
//+--   double Juice;
   int cnt, ticket, RealTotal, total;
//  Laguerre=iCustom(NULL, 0, "Laguerre", 0, 0);
   Laguerre = LaGuerre(GammaP, 0);
   Alpha1 = iCCI(NULL, 0, CCIperiod, TypeCCI, ShftA1);
   Alpha2 = iCCI(NULL, 0, CCIperiod, TypeCCI, ShftA2);
   MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, TypeMA, ShftMA);
   MA1 = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, TypeMA, ShftMA + 1);
//+--  Juice=iCustom(NULL,0,"Juice",0,0);
   total = OrdersTotal();
// Èùåì ðåàëüíîå ÷èëî òîðãîâûõ îðäåðîâ äëÿ íàøåãî MagicNumber íà íàøåé ïàðå, 
// ÷òîáû äàòü òîðãîâàòü ñåáå è äðóãèì ñîâåòíèêàì
   for(cnt = 0; cnt < total; cnt++)
     {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       if(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
           RealTotal = RealTotal + 1;
     }
   if(RealTotal < 1) 
     {
       // no opened orders identified
       if(AccountFreeMargin() < (1000*Lots))
         {
           Print("We have no money. Free Margin = ", AccountFreeMargin());
           return(0);  
         }
       // check for long position (BUY) possibility
       if(//Èç "îðèãèíàëà" 
          (Laguerre==0) && 
          //Íå ïðîñòî ðîñò MA, íî è ìèíèìóì íåêîòîðóþ äåëüòó
          (MA - MA1 > DeltaMA * Point) && 
          //Ðîñò CCI
          (Alpha2 < Alpha1) && 
          //Ïåðåñå÷åíèå íåêîòîðîãî óðîâíÿ +/-100, 0 "Ñíèçó-ââåðõ"
          (Alpha1 > -1 * CCILevel && Alpha2 < -1 * CCILevel) && 
          // && // îðèãèíàëå (åñëè ÷åñòíî - íå ïîíÿë. ÈÌÕÎ èìåëîñü ââèäó ïåðåñå÷åíèå 
          // èëè "ïîäõîä" ê) 0, íî, åñëè ñìîòðåòü îòëàäî÷íûé ôàéë, òî òàì ....
          // (Alpha1 < -5)
          //Ðîñò CCI â % áîëüøå ïîðîãà
          (MathAbs(Alpha1 - Alpha2) / MathMax(MathAbs(Alpha1), MathAbs(Alpha2))*100 > DAlpha)
          ) //+-- && Juice>JuiceLevel)
         {
           FileWrite(handle, "Buy", Time[0], Laguerre, MA, MA1, MA-MA1, Alpha1, Alpha2, 
                     MathAbs(Alpha1 - Alpha2) / MathMax(MathAbs(Alpha1), 
                     MathAbs(Alpha2))*100 );
           FileFlush(handle);
           //Äëÿ "ýñòåòîâ" StopLoss
           if(SL == 0)
               SLstop = 0;
           else
               SLstop = Ask - SL * Point;
           ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 3, SLstop, 0, 
                              "starter", MagicNumber, 0, Green);
         }
       // check for short position (SELL) possibility
       if(//Èç "îðèãèíàëà"
          (Laguerre==1) && 
          //Íå ïðîñòî ïàäåíèå MA, íî è ìèíèìóì íåêîòîðóþ äåëüòó
          (MA - MA1 < -1 * DeltaMA * Point) && 
          //Ïàäåíèå CCI
          (Alpha2 > Alpha1) && 
          //Ïåðåñå÷åíèå íåêîòîðîãî óðîâíÿ +/-100, 0 "Ñâåðõó-âíèç"
          (Alpha1 < CCILevel && Alpha2 > CCILevel)
//      && // îðèãèíàëå (åñëè ÷åñòíî - íå ïîíÿë. ÈÌÕÎ èìåëîñü ââèäó ïåðåñå÷åíèå (èëè "ïîäõîä" ê) 0, íî, åñëè ñìîòðåòü îòëàäî÷íûé ôàéë, òî òàì ....
//         (Alpha1 > 5)
      && //Ðîñò CCI â % áîëüøå ïîðîãà
         (MathAbs(Alpha1 - Alpha2)/MathMax(MathAbs(Alpha1),MathAbs(Alpha2))*100 > DAlpha)
        ) //+-- && Juice>JuiceLevel)
        {
         FileWrite(handle, "Sell", Time[0], Laguerre, MA, MA1, MA-MA1, Alpha1, Alpha2, MathAbs(Alpha1 - Alpha2)/MathMax(MathAbs(Alpha1),MathAbs(Alpha2))*100 );
         FileFlush(handle);
         //Äëÿ "ýñòåòîâ" StopLoss
         if (SL == 0)
          SLstop = 0;
         else
          SLstop = Bid + SL * Point;
         ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,SLstop,0,"starter",MagicNumber,0,Red);
        } 
     }
// it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol() &&  // check for symbol
         OrderMagicNumber() == MagicNumber)  // check for MagicNumber (×òîáû ðóëèòü òîëüêî ñâîèìè ñäåëêàìè ñâîåãî ñîâåòíèêà)
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(Laguerre>1-StopL)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for stop
            if(Stop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*Stop)
                 {
                   OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                   return(0);
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(Laguerre<StopL)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for stop
            if(Stop>0)  
              {                 
               if(OrderOpenPrice()-Ask>Point*Stop)
                 {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
                   return(0);
                 }
              }
           }
        }
     }
     
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Commodity channel index
Moving average indicator


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders
It automatically opens orders when conditions are reached
It Closes Orders by itself

Other Features:

Uses files from the file system
It writes information to file

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.00 Total Net Profit:1342.00

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:7.38 Total Net Profit:746.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:1642.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:331.76

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:64.28

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:209.78

Request Backtest for st+L+2stor-V1-1


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: