expert





//+------------------------------------------------------------------+
//|                                                       expert.mq4 |
//|                                                    Denis Janulis |
//|                                                  denis.j@mits.lv |
//+------------------------------------------------------------------+
#property copyright "Denis Janulis"
#property link      "denis.j@mits.lv"

#import "dpnn.dll"                                         // DPNN.DLL - ïîäêëþ÷àåì ñåòü
//--------------------------------------------------------------------
extern double MinW = 0.00100200;                           // êðèòåðèé ñëàáîñòè íåéðîíîâ.     Åñëè 0, òî æèâóò âå÷íî     
extern double LifeTime = 500;                              // âðåìÿ æèçíè íåéðîíîâ (â áàðàõ). Åñëè 0, òî æèâóò âå÷íî
extern double MinTV = 0.2;                                 // Ïîðîã êîíôëèêòîâ
extern double MaxTV = 0.95;                                // Ïîðîã èíäèâèäóàëüíîñòè
//--------------------------------------------------------------------
                                                           // Îñíîâíûå íåîáõîäèìûå ôóíêöèè ðàáîòû ñ ñåòüþ                                                          
    double CreateNet(string NN, int InputVectorSize,       // Ñîçäàåò ñåòü ñ êîëè÷åñòâîì íåéðîíîâ âî âõîäíîì âåêòîðå <i>. 
                     double MinTV, double MaxTV,           // è âîçâðàùàåò íîìåð ñåòè, ïîä êîòîðûì ñîçäàëàñü
                     double MW , int NL);          
    int    DestroyNet(string NN);                          // Óíè÷òîæàåò ñåòü <NetName>, âîçâðàùàåò êîëè÷åñòâî îñòàâøèõñÿ ñåòåé
    double TrainNet(string NetName,double& iX[],int T,datetime sT);    // Îáó÷àåò ñåòü íà ïðèìåðå Õ[InputVectorSize] c îòâåòîì Ò
    double GetPredict(string NetName,double& iX[],datetime sT);        // Âîçâðàùàåò ïðåäñêàçàíèå ñåòè 0<=Out<=1
    void   Shrink(string NetName);                         // ÏÎÊÀ ÓÏÐÀÂËßÅÒÑß ÂÐÓ×ÍÓÞ!!! - íàäî çàïóñêàòü ïîñëå îáó÷åíèÿ
    void   WReset(string NetName);                         // (A) - ÏÎÊÀ ÓÏÐÀÂËßÅÒÑß ÂÐÓ×ÍÓÞ!!! - íàäî çàïóñêàòü ïîñëå îáó÷åíèÿ
    void   AEqual(string NetName);                         // (A) - ÏÎÊÀ ÓÏÐÀÂËßÅÒÑß ÂÐÓ×ÍÓÞ!!! - íàäî çàïóñêàòü ïîñëå îáó÷åíèÿ
    void   CW(string NetName);                             // (w) - ÏÎÊÀ ÓÏÐÀÂËßÅÒÑß ÂÐÓ×ÍÓÞ!!! - íàäî çàïóñêàòü ïîñëå îáó÷åíèÿ                        
    int SizeOfNet(string NetName);                         // Âîçâðàùàåò êîëè÷åñâî Ãàóññîâñêèõ íåéðîíîâ
    void KillWeaks(string NetName); 
    void KillOlds(string NetName,datetime sT);
//-------------------------------------------------------------------
int InputVectorSize = 24;                                  // Ðàçìåðíîñòü âõîäíîãî âåêòîðà
double X[24];                                              // Âõîäíîé âåêòîð ñåòè
//-------------------------------------------------------------------
extern int    n = 10;                                      // Ïàðàìåòðû äëÿ "ó÷èòåëÿ" ñì. èíäèêàòîð djama
extern int    p = 2;                                       
extern int    q = 2;
extern bool   allowTrailingStop   = true;                  // Ðàçðåøàåì òðàëû
extern bool   allowPostTraining   = true;                  // Ðàçðåøàåì äîîáó÷åíèå
extern int    StopLoss            =   50;                   
extern int    TakeProfit          =  400;
extern int    TrailingStop = 150;
extern int    HistoryBars         = 1000;                  // Íà ñêîëüêèõ áàðàõ ïðîâîäèòü ïðåäâàðèòåëüíîå îáó÷åíèå
extern int    Repetitions         =    5;                  // Ñêîëüêî ðàç ïðîãíÿòü îáó÷åíèå ñåòè ????                                            
extern int    Activation_n = 100;                          // Ïàðàìåòðû äëÿ "àêòèâàöèîííîé ôóíêéèè" ñì. èíäèêàòîð djama   
extern int    Activation_p = 2;                            
extern int    Activation_q = 30;                    
extern double ActivationMax = 0.95;
extern double ActivationMin = 0.6;
extern double ActivationK  = 15000;  

       double ActivationBuy;
       double ActivationSell; 
//--------------------------------------------------------------------
       double Lots                =  0.1;
       int    MinMargin           =  200;   // Ìèíèìàëüíàÿ ìàðæà
     datetime prevtime            =    0;
       double Out;                          // Ðåçóëüòàò ðàáîòû ñåòåé 
bool existent = false;                                 
//********************************************************************
void BuildX(int FinishBar)                  // Ìîäóëü ñîáèðàåò è ïîäãîòàâëèâàåò äàííûå äëÿ çàãðóçêè â ñåòü
 {                                          // FinishBar - Ñ êàêîãî áàðà ñíèìàòü çíà÷åíèÿ.
 int B = InputVectorSize;
 double rD[24][24];
 double Min[24];
 double Max[24];
 if (FinishBar > Bars)
    { 
     Print("MaxBars Error = ",Bars);
     return;
    }
 for (int i=B-1;i>=0;i--)
      {
      rD[i][0] = iMA(NULL,0,2,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,2,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][1] = iMA(NULL,0,4,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,4,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][2] = iMA(NULL,0,6,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,6,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][3] = iMA(NULL,0,8,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,8,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][4] = iMA(NULL,0,10,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,10,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][5] = iMA(NULL,0,12,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,12,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][6] = iMA(NULL,0,14,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,14,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][7] = iMA(NULL,0,16,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,16,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][8] = iMA(NULL,0,18,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,18,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][9] = iMA(NULL,0,20,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,20,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][10] = iMA(NULL,0,22,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,22,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][11] = iMA(NULL,0,24,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,24,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][12] = iMA(NULL,0,26,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,26,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][13] = iMA(NULL,0,28,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,28,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][14] = iMA(NULL,0,30,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,30,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][15] = iMA(NULL,0,32,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,32,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][16] = iMA(NULL,0,34,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,34,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][17] = iMA(NULL,0,36,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,36,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][18] = iMA(NULL,0,38,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,38,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][19] = iMA(NULL,0,40,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,40,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][20] = iMA(NULL,0,42,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,42,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][21] = iMA(NULL,0,44,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,44,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][22] = iMA(NULL,0,46,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,46,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      rD[i][23] = iMA(NULL,0,48,0,MODE_EMA,PRICE_WEIGHTED,i+FinishBar)-iMA(NULL,0,48,0,MODE_EMA,PRICE_WEIGHTED,i+1+FinishBar);
      }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  for (int n = 0; n <= B-1; n++)                      // Îïðåäåëÿåì ìèíèìàëüíûå è ìàêñèìàëüíûå âåëè÷èíû
  {
   Min[n] = rD[0][n];
   Max[n] = rD[0][n];
   for ( i = 0; i <= B-1; i++)
   {
   if (rD[i][n] > Max[n]) Max[n] = rD[i][n];
   if (rD[i][n] < Min[n]) Min[n] = rD[i][n];
   }
  } 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  for ( n = 0; n <= B-1; n++)                                              // Íîðìèðóåò âõîäíîé âåêòîð íà 1
  {
    if (Max[n]== Min[n]) 
        {
         for ( i = 0; i <= B-1; i++) X[i] = Max[n];
         return;
        }
 X[n] = (rD[0][n] - Min[n])/(Max[n]-Min[n]);                               // Âõîäíîé âåêòîð, íîðìèðîâàííûé íà 1    
  }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  
return;   
 }
//-------------------------------------------------------------------------------------------------------------------
int BuildT(int i)                                                          // Òóò ïîëó÷àåì ïðàâèëüíûé îòâåò ïî ïåðåêóïëåííîñòè 
{                                                                          // èëè ïåðåïðîäàííîñòè
  int T= 0;

  double Previous = djama(n,p,q,i+1);    
  double Current = djama(n,p,q,i);
  double Next = djama(n,p,q,i-1);
  
  if ((Current > Previous) && (Current > Next)) T = -1;
  if ((Current < Previous) && (Current < Next)) T =  1;  
  return (T);
}
//*******************************************************************************************************************
int Create(string NetName,int InputVectorSize)                             // Ñîçäàåò ñåòü ñ èìåíåì <NetName> è âõîäíûì âåêòîðîì ðàçìåðà
{                                                                          // InputVectorSize. Âûâîäèò íîìåð ñåòè (òóò îí æå îáùåå êîëè÷åñòâî
 int NeuronLife = Period()*60*LifeTime;                                    // ñåòåé) â áèáëèîòåêå. 
 int Out =  CreateNet(NetName,InputVectorSize,MinTV,MaxTV,MinW,NeuronLife);     
return(Out);
}
//-------------------------------------------------------------------------------------------------------------------
int Destroy(string NetName)                                                // Óíè÷òîæàåò ñåòü ñ èìåíåì <NetName> è âîçâðàùàåò îáùåå
{                                                                          // êîëè÷åñòâî ñåòåé îñòàâøèõñÿ â áèáëèîòåêå
return(DestroyNet(NetName));
}
//-------------------------------------------------------------------------------------------------------------------
double Train(string NetName,double& iX[],int T)                            // Ïîäàåò â ñåòü <NetName> âåêòîð X è îòâåò T äëÿ îáó÷åíèÿ íà ïðèìåðå i
{                                                                          // Âîçâðàùàåò Out cåòè
 double Out =  TrainNet(NetName,iX,T,iTime(Symbol(),0,1));                                    // Out=1, ñåòü äîáàâèëà íîâûé îáðàç. Out =2 - ñåòü ðàñïîçíàëà îáðàç è ïîäïðàâèëàñü.
return(Out);
} 

//-------------------------------------------------------------------------------------------------------------------
double Predict(string NetName)                                             // Ïîäàåò â ñåòü <NetName> âåòîð X äëÿ ïðåäñêàçàíèÿ    
{ 
 BuildX(1);                                       
 double Out =  GetPredict(NetName,X,iTime(Symbol(),0,1));                                      // Âîçâðàùàåò Out cåòè
return(Out);
}
//--------------------------------------------------------------------------------------------------------------------
double PostTraining(string NetName,int ST)
{
 int T = BuildT(2);                                                        // Ñ÷èòûâàåì ïðàâèëüíûé îòâåò
    if (T == ST)                                                           // Îáó÷àåì òîëüêî íà òîì ïðèìåðå, êîòîðûé ïîäõîäèò äëÿ îáó÷åíèÿ
     {
      BuildX(2);                                                           // Ôîðìèðóåì âõîäíîé îáó÷àþùèé âåêòîð
      Train(NetName,X,T);                                                  // Îáó÷àåì ñåòü íà êîíêðåòíîì ïðèìåðå
      Print("New neurons amount: ",SizeOfNet("OverBought")," ; ",SizeOfNet("OverSold"));
     } 
return (0);
}     
//-------------------------------------------------------------------------------------------------------------------
double InitialTraining(string NetName,int HistoryBars,int ST)              // Ðóêîâîäèò çàãðóçêîé äàííûõ â ñåòü äëÿ ïåðâè÷íîãî îáó÷åíèÿ
{                                                                          // çà ïåðèîä HistoryBars
  for ( int i = HistoryBars-1; i > 6; i--)                                 // ïî áàðàì
   {
    int T = BuildT(i);                                                     // Ñ÷èòûâàåì ïðàâèëüíûé îòâåò
    if (T == ST)                                                           // Îáó÷àåì òîëüêî íà òîì ïðèìåðå, êîòîðûé ïîäõîäèò äëÿ îáó÷åíèÿ
     {
      BuildX(i);                                                           // Ôîðìèðóåì âõîäíîé îáó÷àþùèé âåêòîð
      Train(NetName,X,T);                                                  // Îáó÷àåì ñåòü íà êîíêðåòíîì ïðèìåðå
     } 
    } 
return (0);
}
//-------------------------------------------------------------------------------------------------------------------
int init()
{
 NetInitialTraining();  
} 
//********************************************************************
int start()
  {
if (AccountFreeMargin() < MinMargin) return(0); 
if(prevtime == Time[0]) return(0);
   prevtime = Time[0];
//-------------------------------------------------------------------
if (allowPostTraining)
{
 if (LifeTime > 0) KillOlds("OverBought",iTime(Symbol(),0,1));          // Óáèâàåì ñòàðûå íåéðîíû 
 PostTraining("OverBought",-1);                                         // Äîîáó÷àåì ïî õîäó äåëà 
 Shrink("OverBought");                                                  // Ìîäåðíèçèðóåì ñåòü
 //AEqual("OverBought");                                                // Óñòàíàâëèâàåì âñå A =1
 CW("OverBought");                                                      // Ðàññ÷èòûâàåì âåñà
 KillWeaks("OverBought");                                               // Óáèâàåì ñëàáûå íåéðîíû
 CW("OverBought");                                                      // Ðàññ÷èòûâàåì âåñà
 
 if (LifeTime > 0) KillOlds("OverSold",iTime(Symbol(),0,1));            // Óáèâàåì ñòàðûå íåéðîíû 
 PostTraining("OverSold",1);                                            // Äîîáó÷àåì ïî õîäó äåëà
 //AEqual("OverSold");                                                  // Óñòàíàâëèâàåì âñå A =1
 Shrink("OverSold");                                                    // Ìîäåðíèçèðóåì ñåòü
 CW("OverSold");                                                        // Ðàññ÷èòûâàåì âåñà
 KillWeaks("OverSold");                                                 // Óáèâàåì ñëàáûå íåéðîíû
 CW("OverSold");                                                        // Ðàññ÷èòûâàåì âåñà
}
//--------------------------------------------------------------------
double OverBought = Predict("OverBought");
double OverSold   = Predict("OverSold");
Out = (OverBought - OverSold)/(OverBought+OverSold);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Activation(1);
CheckForClose();
if (allowTrailingStop) CheckForTrailingStop();
CheckForOpen();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 return(0);
  }
//+------------------------------------------------------------------+
int deinit()
{
if (!IsOptimization())
{
 Print("Destroying net=>",Destroy ("OverBought"));                           // Óáèâàåì, ÷òî ïîðîäèëè
 Print("Destroying net=>",Destroy ("OverSold"));                             // Óáèâàåì, ÷òî ïîðîäèëè
 }
}

//-------------------------------------------------------------------------------------
void CheckForOpen()
{
double SL = 0;
double TP = 0;
//-----------------------------------------
 if ( Out < (-1)*ActivationBuy)
     {
      SL = Ask - StopLoss*Point;
      TP = Ask + TakeProfit*Point;
      OpenPosition(0,SL,TP,0);
      Print("OverSoldSignal= ",Out);
     }
//-----------------------------------------
 if (Out > ActivationSell)
      {
       SL = Bid + StopLoss*Point;
       TP = Bid - TakeProfit*Point;
       OpenPosition(1,SL,TP,1);
       Print("OutBoughtSignal= ",Out);
      }
//-----------------------------------------
return(0);
}
///////////////////////////////////////////////////////////////////////////////
void CheckForClose()
{
if (Out < (-1)*ActivationBuy) ClosePosition(1);
if (Out > ActivationSell) ClosePosition(0);
return(0);
}
//------------------------------------------
double Activation(int i )
{
double t = (djama(Activation_n,Activation_p,Activation_q,i)-djama(Activation_n,Activation_p,Activation_q,i+Activation_n))/Activation_n;

//~~~~ActivationBuy 
 double M = (ActivationMin-ActivationMax)/(-ActivationK);
 if (t <= 0) ActivationBuy = ActivationMax;
 if (t >= M) ActivationBuy = ActivationMin;
 if ((t > 0) && (t < M)) ActivationBuy = -ActivationK*t+ActivationMax;
//~~~~ActivationSell
 M = (ActivationMin-ActivationMax)/(-ActivationK);
 if (t >= 0) ActivationSell = ActivationMax;
 if (t <= -M) ActivationSell = ActivationMin;
 if ((t < 0) && (t > -M)) ActivationSell = ActivationK*t+ActivationMax;
return(t); 
}
//-------------------------------------------
void NetInitialTraining()
{
int  Size0 = 0;
int  Size1 = 0;

    Print("Net Created with number: ",Create("OverBought",24)); // Ñîçäàåì ñåòü äëÿ ñèãíàëîâ Sell
    Print("Net Created with number: ",Create("OverSold",24));   // Ñîçäàåì ñåòü äëÿ ñèãíàëîâ Buy

//~~
    Print("Initial training started ...");
    for (int R = 1; R <= Repetitions; R++)                                  // Ïðîöåññ ïåðâè÷íîãî îáó÷åíèÿ 
    {                                                                       // íà èñòîðè÷åñêèõ äàííûõ    
     WReset("OverBought");                                                  // Îáíóëÿåì çíà÷åíèÿ À
     InitialTraining("OverBought",HistoryBars,-1);                          // Ïðîãîíÿåì îáó÷åíèå 
     Shrink("OverBought");                                                  // Ìîäåðíèçèðóåì ñåòü
     AEqual("OverBought");                                                  // Óñòàíàâëèâàåì âñå A =1
     CW("OverBought");                                                      // Ðàññ÷èòûâàåì âåñà
     KillWeaks("OverBought");                                               // Óáèâàåì ñëàáûå íåéðîíû
     CW("OverBought");                                                      // Ðàññ÷èòûâàåì âåñà
         
     WReset("OverSold");                                                    // Îáíóëÿåì çíà÷åíèÿ À
     InitialTraining("OverSold",HistoryBars,1);                             // Ïðîãîíÿåì îáó÷åíèå 
     AEqual("OverSold");                                                    // Óñòàíàâëèâàåì âñå A =1
     Shrink("OverSold");                                                    // Ìîäåðíèçèðóåì ñåòü
     CW("OverSold");                                                        // Ðàññ÷èòûâàåì âåñà
     KillWeaks("OverSold");                                                 // Óáèâàåì ñëàáûå íåéðîíû
     CW("OverSold");                                                        // Ðàññ÷èòûâàåì âåñà
          
     Print("Cycle ",R," completed. Neurons: ",SizeOfNet("OverBought")," ; ",SizeOfNet("OverSold"));
     if ((SizeOfNet("OverBought") == Size0) && (SizeOfNet("OverSold") == Size1)) break;
     Size0 = SizeOfNet("OverBought");
     Size1 = SizeOfNet("OverSold");
    }
     Print("Initial training completed.");
}
//-------------------------------------------------------------+
double djama(int n, int p, int q, int i)
{
 return(iCustom(Symbol(),0,"djama",n,p,q,0,i));
} 
//-------------------------------------------------------------+
bool OpenPosition(int cmd, double SL, double TP,int MN)
{
bool OpenPosition = false;
static int MaxTries = 5;
static int OrderInterval = 10;
static int ticket = 0;
if (Positions(0,MN) >= 1 || Positions(1,MN) >= 1) return;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
double Lots = 0.1;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    for (int try=1;try<=MaxTries;try++)
      {
       switch(cmd)
        {
        case 0 : ticket=OrderSend(Symbol(),cmd,Lots,NormalizeDouble(Ask,4),5,NormalizeDouble(SL,4),NormalizeDouble(TP,4),DoubleToStr(MN,0),MN,Blue);          break; // OP_BUY
        case 1 : ticket=OrderSend(Symbol(),cmd,Lots,NormalizeDouble(Bid,4),5,NormalizeDouble(SL,4),NormalizeDouble(TP,4),DoubleToStr(MN,0),MN,Red);           break; // OP_SELL    
        } 
       if (ticket>0)
         {
         OpenPosition = true;
         Print("Opened ",cmd," try N",try," SL ",SL," TP ",TP, " Magic Number: ", MN);
         break;
         }
       Sleep(10000);
       Print("Cannot open ",cmd," try N",try," SL ",SL," TP ",TP);
     } 
return(OpenPosition);         
}
//*******************************************************************
bool ClosePosition(int p)
{
bool ClosePosition;
int MaxTries = 5;
for(int i=0;i<OrdersTotal();i++)
  {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if((OrderSymbol()!=Symbol()) || (OrderType() != p)) continue;
 
    for (int try=1;try<=5;try++)
          {
           if ((p == 0) && (OrderType()==OP_BUY))  ClosePosition = OrderClose(OrderTicket(),OrderLots(),Bid,3,Black);
           if ((p == 1) && (OrderType()==OP_SELL)) ClosePosition = OrderClose(OrderTicket(),OrderLots(),Ask,3,Black);
           if (ClosePosition == true)
            {
             if ( p == 0) Print("Position :",OrderTicket(), "closed  at ",Bid," MN ",OrderMagicNumber()); 
             if ( p == 1) Print("Position :",OrderTicket(), "closed  at ",Ask," MN ",OrderMagicNumber()); 
             break;
            }
           if ( p == 0) Print("Cannot close long position at price, try N ",try," => Bid = ",Bid," ERROR = ",GetLastError());
           if ( p == 1) Print("Cannot close short position at price, try N ",try," => Ask = ",Ask," ERROR = ",GetLastError());
           Sleep(10000);
          } // try
   } //i       
return(ClosePosition);         
}
//**********************************************************************
void CheckForTrailingStop()
{

for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderSymbol()!=Symbol()) continue;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
      if((OrderType()==OP_BUY))
        {
         if(Bid-OrderOpenPrice()>Point*TrailingStop)
           {
            if(OrderStopLoss()<Bid-Point*TrailingStop)
              {
              for (int try=1;try<=5;try++)
               {
                if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
                 { 
                  Print("Position :",OrderTicket()," modified StopLoss to ", OrderStopLoss(), " at try ", try);
                  break;
                 }
               }  
             }
           }   
        }
      if((OrderType()==OP_SELL))
        {
         if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
            {
             if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                {
                 for (try=1;try<=5;try++)
                  {
                   if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
                   {
                    Print("Position :",OrderTicket()," modified StopLoss to ", OrderStopLoss(), " at try ", try);
                    break;
                   }
                  } 
                }
            }
                 
        }
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      
     }        
 return(0);
}
//*******************************************************************
int Positions(int d, int mn)                 //Âîçâðàùàåò êîëè÷åñòâî îòêðûòûõ
{                                            //ïîçèöèé 
   int buys=0,sells=0,positions;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol())
        {
      if(OrderMagicNumber() == mn || mn == 0)
       {  
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;  
       }  
        }
     }
  switch (d)
     {
     case 0 : positions = buys;         break;
     case 1 : positions = sells;        break;
     case 3 : positions = buys +sells;  break;
     }
return(positions);
}



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:

Moving average indicator



Custom Indicators Used:
dpnn
djama

Order Management characteristics:
It automatically opens orders when conditions are reached
Checks for the total of open orders
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features:


BackTest : USDJPY on H1

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

BackTest : USDCHF on H1

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

BackTest : EURUSD on H1

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

BackTest : USDCAD on H1

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

BackTest : EURUSD on H1

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

BackTest : GBPUSD on H1

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

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for expert


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

Pair: Period: