tudasuda06





/*
ñîâåòíèê ïîñòðîåí íà ïðèíöèïå "êà÷åëåé"
âõîäèì â ðûíîê, åñëè öåíà èäåò â íàïðàâëåíèè ñäåëêè, òî ïîëó÷àåì ïðîôèò
åñëè íåò, òî ÷åðåç koridor îòêðûâàåì ñäåëêó â ïðîòèâîïîëîæåííîì íàïðàâëåíèè îáúåìîì *mul è ò.ä.
à âûõîäèòü ïî ðàçíîìó ìîæíî, ðåàëèçîâàíî íåñêîëüêî âàðèàíòîâ
âîîáùåì ìàðòèíãåéë, íî â îòëè÷èå îò èëàíà çäåñü ñòðàøíî êîãäà ôëåò
*/

#property copyright "runik"
#property link      "ngb2008@mail.ru"

//---- input parameters
extern string  g1="Îñíîâíûå ïàðàìåòðû";
extern int       koridor=40;       // øàã â ïóíêòàõ ÷åðåç êîòîðûé ýêñïåðò îòêðûâàåò ñäåëêè
extern int       sl=80;          // ñòîïëîññ â ïóíêòàõ
extern int       tp=40;          // òåéêïðîôèò â ïóíêòàõ
extern double    mul=4;         // ìóëüòèïëèêàòîð ëîòîâ, êàæäàÿ ñëåäóþùàÿ ñäåëêà â ñåðèè áîëüøå ïðåäûäóùåé â mul ðàç(à)
extern int       last=1;        // åñëè = 1 òî óìíîæàåì íå ïîñëåäíèé ëîò à âñå îòêðûòûå
extern int nh1=10; // äíåâíûå ÷àñû ðàáîòû, íà÷àëî ðàáîòû
extern int nh2=21; // êîíåö ðàáîòû, åñëè íå ðàâíû 0, òî îòêðûâàåì ñåðèè ñäåëîê òîëüêî ïî íî÷àì

extern string  gg="Óïðàâëåíèå äåíüãàìè";
extern double percent=0; // % îò ñ÷åòà êîòîðûì òîðãóåì, ïåðâàÿ ñäåëêà, åñëè 0, òî Lots=0.1
extern double    Lots=0.1;           // ðàçìåð ëîòà ïåðâîé ñäåëêè â ñåðèè, ïðîãðàììà ñàìà ñêîððåêòèðóåò çíà÷åíèå åñëè ñëèøêîì ìàëåíüêîå èëè ñëèøêîì áîëüøîå, ò.å. äö íå ïîääåðæèâàåò
extern int       maxtrades=10;      // ìàêñèìàëüíîå êîëè÷åñòâî ñäåëîê â ñåðèè
extern int       LotLim=1000;         // ìàêñèìàëüíûé ñóììàðíûé îáúåì ëîòîâ îòêðûòûõ ïîçèöèé
int       bezub=0;          // åñëè 1, ïåðåíîñÿòñÿ ñòîïû â áåçóáûòîê, à ïîòîì âñå òðàëèòñÿ 
extern int       TrailingStop=30; // òðåéëèíãñòîï 0 èëè >0
double    SpeedCoeff=0;
extern double    profit=0;          //  â âàëþòå äåïîçèòà, åñëè ïî ñåðèè ñäåëîê ïðîôèò äîñòèã îïðåäåëåííîé âåëè÷èíû, òî âûõîäèì
extern int       locprofit=0;      // â ïóíêòàõ,   åñëè ïî ñåðèè ñäåëîê äîñòèãíóò óðîâåíü áåçóáûòêà + 15 ïóíêòîâ, âûõîäèì è çàêðûâàåìñÿ, åñëè =0 òî âûõîäèì ïî ñòîïó è ïðîôèòó
extern int       locprofitexpo=0;   // â ïóíêòàõ,  åñëè locprofit >0 (íàïðèìåð locprofit=40) è =5 ïóíêòîâ, ò.å. ÷åì áîëüøå ñäåëîê îòêðûòî òåì áûñòðåå íàì íàäî âûéòè !!!  
                                    //ò.å. óìåíüøàåì locprofit íà ýòó âåëè÷èíó ïðè îòêðûòèè êàæäîé ñëåäóþùåé ñäåëêè
extern int       runotsuda=0;       // åñëè ìû îòêðûëè íàïðèìåð 5 ñäåëêó, òî íàäî óõîäèòü ñ ðûíêà è çàêðûâàåìñÿ åñëè âûõîäèì â +
extern double    minsum=100;       // åñëè íà äåïîçèòå ñóììà ìåíüøå, òî ýêñïåðò ïåðåñòàåò ðàáîòàòü

extern string  bb="Ìàëîçíà÷èìûå ïåðåìåííûå";
extern int       mn=575;        // ìàãè÷åñêîå ÷èñëî
extern int       slipage=2;    // ïðîñêàëüçûâàíèå
extern int       clod=0;      // ïðè =1 çàêðûâàþòñÿ âñå ñäåëêè, èñïîëüçóåòñÿ â ïðîãðàììå è áûâàåò íóæíî âñå çàêðûòü, à ðóêàìè ëåíü
extern int       NumberOfTries=10; // êîëè÷åñòâî ïîïûòîê ïîñòàíîâêè îðäåðà

int BrokerDecimal = 1;
double allb=0; double alls=0;
double allbn=0; double allsn=0;
double nulpoint=0; int onepoint=1;
double LastSL=0; double LastTP=0;
int opentrades=0;
int lastok=0;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

// Åñëè áðîêåð äàåò êîòèðîâêè ïî âàëþòå ñ òî÷íîñòüþ â ïÿòü çíàêîâ - ïèïñ áóäåò ìåíüøå ñòàíäàðòíîãî â 10 ðàç - ââîäèì ìíîæèòåëü   
if(Digits==3 || Digits==5) BrokerDecimal=10; 
// Ïåðåìíîæèòü âñå óðîâíè â ïèïñàõ íà ìíîæèòåëü
koridor      = koridor * BrokerDecimal;
sl           = sl * BrokerDecimal; 
tp           = tp * BrokerDecimal;
slipage      = slipage*BrokerDecimal;
onepoint     = onepoint*BrokerDecimal;
TrailingStop = TrailingStop*BrokerDecimal;
locprofit    = locprofit*BrokerDecimal;
locprofitexpo= locprofitexpo*BrokerDecimal; 
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

//if (sl<koridor || tp<koridor) return(0);

if(DayOfWeek()==0 || DayOfWeek()==6)  return(0);// íå ðàáîòàåò â âûõîäíûå äíè.



if(AccountFreeMargin()<minsum) // äåíüãè êîí÷èëèñü 
  {Print("We have no money. Free Margin = ", AccountFreeMargin());return(0);} 
   
int ot=MyOrdersTotal(mn); //îïðåäåëÿåì êîëè÷åñòâî îðäåðîâ äàííîãî ýêñïåðòà ïî èíñòðóìåíòó

if (clod==1) {CloseOrders(mn);}

if (ot<1) // íà÷èíàåì !
  {
if (nh1!=nh2 && nh1!=0 && (Hour()<nh1 || Hour()>nh2)) return(0);  
  opentrades=0;
  clod=0;
  if (Close[0]>Close[1])
    {
    if (percent>0) {Lots=AccountBalance()/1000*percent/100;}
    int ticket=OrderSend(Symbol(),OP_BUY,LotSiz(Lots),Ask,slipage,Ask-sl*Point,Ask+tp*Point,"1",mn,0,Green) ;        
    if (ticket>0){lastok=0;opentrades=opentrades+1;}
    if (ticket<0){lastok=lastok+1;}
    return(0);
    }
    else
    {
    ticket=OrderSend(Symbol(),OP_SELL,LotSiz(Lots),Bid,slipage,Bid+sl*Point,Bid-tp*Point,"1",mn,0,Red);               
    if (ticket>0){lastok=0;opentrades=opentrades+1;}
    if (ticket<0){lastok=lastok+1;}
    return(0);
    }    
  }

int cnt=0;
int mode=0; 

double buylot=0;double buyprice=0;double buystoplot=0;double buystopprice=0;double buylimitlot=0;double buylimitprice=0;
double selllot=0;double sellprice=0;double sellstoplot=0;double sellstopprice=0;double selllimitlot=0;double selllimitprice=0;
string sstc=""; string bstc="";
double buysl=0;double buytp=0;double sellsl=0;double selltp=0;
datetime buystoptime=0; datetime sellstoptime=0;
int bt=-1;int bst=-1;int blt=-1;int st=-1;int sst=-1;int slt=-1;
allb=0; alls=0;

double ol=0;
if (ot>0)////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
{

  for(cnt=0;cnt<OrdersTotal();cnt++)   // çàïîìèíàåì ïàðàìåòðû îðäåðîâ
    {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    mode = OrderType(); 
    if (OrderMagicNumber() != mn || OrderSymbol()!=Symbol()) continue;       
      
    if (mode==OP_BUY && OrderMagicNumber() == mn && OrderSymbol()==Symbol())        
      {
      ol=OrderLots();
      allb=allb+ol;
      if (buylot<=ol)  // çàïîìèíàåì ïàðàìåòðû ñàìîãî áîëüøîãî îòêðûòîãî îðäåðà èëè òàêîãî æå ðàçìåðà îðäåðà, íî ñ áîëüøèì íîìåðîì òèêåòà
        {     buylot=ol;
              buyprice=OrderOpenPrice();
              bt=OrderTicket(); 
              buysl=OrderStopLoss(); 
              buytp=OrderTakeProfit(); 
               
        }  
      }     
           
           
    if (mode==OP_BUYSTOP && OrderMagicNumber() == mn && OrderSymbol()==Symbol() )    
      {       
      buystoplot=OrderLots();    
      buystopprice=OrderOpenPrice();    
      bst=OrderTicket();  
      buystoptime=OrderOpenTime(); 
      bstc=OrderComment();
      }         
    
    if (mode==OP_SELL && OrderMagicNumber() == mn && OrderSymbol()==Symbol() )       
      { 
      ol=OrderLots();
      alls=alls+ol;
      if (selllot<=ol)      // çàïîìèíàåì ïàðàìåòðû ñàìîãî áîëüøîãî îòêðûòîãî îðäåðà èëè òàêîãî æå ðàçìåðà îðäåðà, íî ñ áîëüøèì íîìåðîì òèêåòà
         {    selllot=ol;       
              sellprice=OrderOpenPrice();       
              st=OrderTicket(); 
              sellsl=OrderStopLoss();    
              selltp=OrderTakeProfit();  
               
         }      
      }     
    
    if (mode==OP_SELLSTOP && OrderMagicNumber() == mn && OrderSymbol()==Symbol() )   
       {       
       sellstoplot=OrderLots();   
       sellstopprice=OrderOpenPrice();   
       sst=OrderTicket();  
       sellstoptime=OrderOpenTime();
       sstc=OrderComment();
       }    
    }   
    

if (TrailingStop>0 && SpeedCoeff>0)
{
for(cnt=0;cnt<OrdersTotal();cnt++)    
      {    
            OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            
            if (OrderMagicNumber() != mn || OrderSymbol()!=Symbol()) continue; 
            if (OrderMagicNumber() == mn && OrderSymbol()==Symbol()) 
              {
              KillLoss(OrderTicket(),SpeedCoeff);
              }
  }
}    

if (TrailingStop>0 && SpeedCoeff==0)
{
              Tral();
}    


        double SLotsBuy, SLotsSell;
           SLotsBuy = Balance("buy","Lot");
           SLotsSell = Balance("sell","Lot");
if (ot<maxtrades && opentrades<maxtrades && LotLim>(SLotsBuy+SLotsSell) && buystoplot==0 && sellstoplot==0) 
   {   
   if (st<bt) // ïîñëåäíåé îòêðûòà ñäåëêà áàé 
     {
     double ls1;

     if (last==1) ls1=LotSiz((SLotsBuy+SLotsSell)*mul);
     if (last!=1) ls1=LotSiz(buylot*mul);
     for(int c = 0 ; c < NumberOfTries ; c++)
     {     
     ticket=OrderSend(Symbol(),OP_SELLSTOP,ls1,buyprice-koridor*Point,slipage,buyprice-koridor*Point+sl*Point,buyprice-koridor*Point-tp*Point,"STOPLIMIT",mn,0,Red);
     if (ticket>0){opentrades=opentrades+1;break;}
     if (ticket<0){lastok=lastok+1;}
     }
     return(0);
     }
     else
     {
     if (last==1) ls1=LotSiz((SLotsBuy+SLotsSell)*mul);
     if (last!=1) ls1=LotSiz(selllot*mul);
     
     for(c = 0 ; c < NumberOfTries ; c++)
     {
     ticket=OrderSend(Symbol(),OP_BUYSTOP,ls1,sellprice+koridor*Point,slipage,sellprice+koridor*Point-sl*Point,sellprice+koridor*Point+tp*Point,"BUYSTOP",mn,0,Green);
     if (ticket>0){lastok=0;opentrades=opentrades+1;break;}
     if (ticket<0){lastok=lastok+1;}
     }
     return(0);
     }
   }

  if (locprofit>0 && locprofitexpo==0) Close0();
  if (locprofit>0 && locprofitexpo>0) CloseE0();  
  if (profit>0) CloseP();
  if (runotsuda>0 && runotsuda<ot) CloseRun(); 
  
  
  if (ot==1 && buylot==0 && selllot==0) // êîãäà âñå ñðàáîòàëî, íî âèñèò îòëîæåííûé
  {
  if (bst>0) {OrderDelete(bst);      return(0);    }  
  if (sst>0) {OrderDelete(sst);      return(0);    }            
  } 

  
} //if (OrdersTotal()>0)


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

double Balance(string OrdType, string inf)
{
   double result=0, FProf = 0;
   int trade;
   for(trade=OrdersTotal()-1;trade>=0;trade--)
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=mn) continue;
      if(OrderSymbol()==Symbol()&&OrderMagicNumber()==mn)
      {
         if (OrdType == "buy")
         {
            if(OrderType()==OP_BUY)
            {
               if (inf=="Balance") result=result+OrderProfit()-OrderSwap()-OrderCommission();
               if (inf=="Lot")     result=result+OrderLots();
               //if (inf=="FP") result=result + (OrderLots()*100000*(OrderTakeProfit()-OrderOpenPrice())/AccountLeverage());
               
            }
         }
         
         if (OrdType == "sell")
         {
            if(OrderType()==OP_SELL )
            {
               if (inf=="Balance") result=result+OrderProfit()-OrderSwap()-OrderCommission();
               if (inf=="Lot")     result=result+OrderLots();
               //if (inf=="FP")  result=result + (OrderLots()*100000*(-OrderTakeProfit()+OrderOpenPrice())/AccountLeverage());     
            }
         }
         
         
      }   
   }
  return(result);    
}

int CloseOrders(int mn) //  ïðîöåäóðà çàêðûòèÿ âñåõ îðäåðîâ
{
  int total  = OrdersTotal();
  
  for (int cnt = total-1 ; cnt >= 0 ; cnt--)
  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == mn && OrderSymbol()==Symbol())
    {
    //Print(cnt);
      if (OrderType()==OP_BUY)
      {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);
      }
      
      if (OrderType()==OP_SELL)
      {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
      }
      if (OrderType()==OP_BUYSTOP)
      {
        OrderDelete(OrderTicket());
      }
      
      if (OrderType()==OP_SELLSTOP)
      {
        OrderDelete(OrderTicket());
      }      
    }
  }
  return(0);
}  


int MyOrdersTotal(int mn) // ïðîöåäóðà ïîäñ÷åòà âñåõ îðäåðîâ äàííîãî ýêñïåðòà ïî äàííîìó èíñòðóìåíòó
{
  int c=0;
  int total  = OrdersTotal();

  for (int cnt = 0 ; cnt < total ; cnt++)
  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderMagicNumber() == mn && OrderSymbol()==Symbol())
    {
      c++;
    }
  }  
  return(c);
}


double LotSiz(double ltt)
{
double ls=0;
double minlot=MarketInfo(Symbol(), MODE_MINLOT);
double maxlot=MarketInfo(Symbol(), MODE_MAXLOT);
double steplot=MarketInfo(Symbol(), MODE_LOTSTEP);

int LotsDigits = MathCeil(MathAbs(MathLog(steplot)/MathLog(10)));
ls = NormalizeDouble(ltt,LotsDigits);

if (ltt<minlot)    {   ls=minlot;  }
if (ltt>maxlot)    {   ls=maxlot;  }

//int LotsDigits = MathCeil(MathAbs(MathLog( MarketInfo(Symbol(),MODE_MINLOT))/MathLog(10)));
//Êîëè÷åñòâî çíà÷àùèõ öèôð ïîñëå çàïÿòîé â ðàçìåðå ïîçèöèè. 


return(ls);
}

double nulfunc(int mn) // äëÿ ïîäñ÷åòà òî÷êè áåçóáûòî÷íîñòè âñåõ îòêðûòûõ îðäåðîâ (åñëè âñå èõ çàêðûòü ïî ýòîé öåíå òî ïîëó÷èì 0)
  {
    double np=0;double f=0; double p=0;double l=0; int m=0;
    for(int t1=0;t1<OrdersTotal();t1++)    
    {
    OrderSelect(t1, SELECT_BY_POS, MODE_TRADES); 
    m = OrderType();p=OrderOpenPrice();l=OrderLots();if (m==OP_BUY){l=-l;}
    if  ((m==OP_BUY || m==OP_SELL) && OrderMagicNumber() == mn && OrderSymbol()==Symbol()) 
      {
      np=np+l*p;  
      f=f+l;
      }
    }
    if (f>0) np=NormalizeDouble(MathAbs(np/f), Digits);    
   // Print(np);
    return (np);
  }
  
double CalculateProfit(int mn)
{

   double Profit=0;
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=mn)
     continue;
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn)
     if(OrderType()==OP_BUY || OrderType()==OP_SELL)  
      {
       Profit=Profit+OrderProfit();
      }
   }

  return(Profit);
}  


int Close0()
{
double nf=nulfunc(mn);
double p=CalculateProfit(mn);
if (p>0 && nf+locprofit*Point<Bid) CloseOrders(mn);
if (p>0 && nf-locprofit*Point>Ask) CloseOrders(mn);
}

int CloseE0()
{
int nloc=locprofit-locprofitexpo*MyOrdersTotal(mn)-2;
double nf=nulfunc(mn);
double p=CalculateProfit(mn);
if (p>0 && nf+nloc*Point<Bid) CloseOrders(mn);
if (p>0 && nf-nloc*Point>Ask) CloseOrders(mn);
}

int CloseP()
{
double p=CalculateProfit(mn);
if (p>profit) CloseOrders(mn);
}

int CloseRun()
{
double p=CalculateProfit(mn);
if (p>0) CloseOrders(mn);
}


//+------------------------------------------------------------------+
//| ÒÐÅÉËÈÍÃ KillLoss                                                |
//| Ïðèìåíÿåòñÿ íà ó÷àñòêå ëîññîâ. Ñóòü: ñòîïëîññ äâèæåòñÿ íàâñòðå÷ó |
//| êóðñó ñî ñêîðîñòüþ äâèæåíèÿ êóðñà õ êîýôôèöèåíò (dSpeedCoeff).   |
//| Ïðè ýòîì êîýôôèöèåíò ìîæíî "ïðèâÿçàòü" ê ñêîðîñòè óâåëè÷åíèÿ     |
//| óáûòêà - òàê, ÷òîáû ïðè áûñòðîì ðîñòå ëîññà ïîòåðÿòü ìåíüøå. Ïðè |
//| êîýôôèöèåíòå = 1 ñòîïëîññ ñðàáîòàåò ðîâíî ïîñðåäèíå ìåæäó óðîâ-  |
//| íåì ñòîïëîññà è êóðñîì íà ìîìåíò çàïóñêà ôóíêöèè, ïðè êîýôô.>1   |
//| òî÷êà âñòðå÷è êóðñà è ñòîïëîññà áóäåò ñìåùåíà â ñòîðîíó èñõîä-   |
//| íîãî ïîëîæåíèÿ êóðñà, ïðè êîýôô.<1 - íàîáîðîò, áëèæå ê èñõîäíî-  |
//| ìó ñòîïëîññó.     I_D / Þðèé Äçþáàí      http://www.mymmk.com/                                         |
//+------------------------------------------------------------------+
void KillLoss(int iTicket,double dSpeedCoeff)
   {   
   // ïðîâåðÿåì ïåðåäàííûå çíà÷åíèÿ
   if ((iTicket==0) || (!OrderSelect(iTicket,SELECT_BY_TICKET)) || (dSpeedCoeff<0.1))
      {      
      //Print("Òðåéëèíã ôóíêöèåé KillLoss() íåâîçìîæåí èç-çà íåêîððåêòíîñòè çíà÷åíèé ïåðåäàííûõ åé àðãóìåíòîâ.");
      return(0);
      }           
      
   double dStopPriceDiff; // ðàññòîÿíèå (ïóíêòîâ) ìåæäó êóðñîì è ñòîïëîññîì   
   double dToMove; // êîë-âî ïóíêòîâ, íà êîòîðîå ñëåäóåò ïåðåìåñòèòü ñòîïëîññ   
   // òåêóùèé êóðñ
   double dBid = MarketInfo(OrderSymbol(),MODE_BID);
   double dAsk = MarketInfo(OrderSymbol(),MODE_ASK);      
   
   // òåêóùåå ðàññòîÿíèå ìåæäó êóðñîì è ñòîïëîññîì
   if (OrderType()==OP_BUY) dStopPriceDiff = dBid - OrderStopLoss();
   if (OrderType()==OP_SELL) dStopPriceDiff = (OrderStopLoss() + MarketInfo(OrderSymbol(),MODE_SPREAD)*MarketInfo(OrderSymbol(),MODE_POINT)) - dAsk;                  
   
   // ïðîâåðÿåì, åñëè òèêåò != òèêåòó, ñ êîòîðûì ðàáîòàëè ðàíüøå, çàïîìèíàåì òåêóùåå ðàññòîÿíèå ìåæäó êóðñîì è ñòîïëîññîì
   if (GlobalVariableGet("zeticket")!=iTicket)
      {
      GlobalVariableSet("sldiff",dStopPriceDiff);      
      GlobalVariableSet("zeticket",iTicket);
      }
   else
      {                                   
      // èòàê, ó íàñ åñòü êîýôôèöèåíò óñêîðåíèÿ èçìåíåíèÿ êóðñà
      // íà êàæäûé ïóíêò, êîòîðûé ïðîõîäèò êóðñ â ñòîðîíó ëîññà, 
      // ìû äîëæíû ïåðåìåñòèòü ñòîïëîññ åìó íà âñòðå÷ó íà dSpeedCoeff ðàç ïóíêòîâ
      // (íàïðèìåð, åñëè ëîññ óâåëè÷èëñÿ íà 3 ïóíêòà çà òèê, dSpeedCoeff = 1.5, òî
      // ñòîïëîññ ïîäòÿãèâàåì íà 3 õ 1.5 = 4.5, îêðóãëÿåì - 5 ï. Åñëè ïîäòÿíóòü íå 
      // óäà¸òñÿ (ñëèøêîì áëèçêî), íè÷åãî íå äåëàåì.      
      
    //  Print("dStopPriceDiff: ",dStopPriceDiff,", sldiff: ",GlobalVariableGet("sldiff"));
      
      // êîë-âî ïóíêòîâ, íà êîòîðîå ïðèáëèçèëñÿ êóðñ ê ñòîïëîññó ñ ìîìåíòà ïðåäûäóùåé ïðîâåðêè (òèêà, ïî èäåå)
      dToMove = (GlobalVariableGet("sldiff") - dStopPriceDiff) / MarketInfo(OrderSymbol(),MODE_POINT);
      
      // çàïèñûâàåì íîâîå çíà÷åíèå, íî òîëüêî åñëè îíî óìåíüøèëîñü
      if (dStopPriceDiff<GlobalVariableGet("sldiff"))
      GlobalVariableSet("sldiff",dStopPriceDiff);
      
      // äàëüøå äåéñòâèÿ íà ñëó÷àé, åñëè ðàññòîÿíèå óìåíüøèëîñü (ò.å. êóðñ ïðèáëèçèëñÿ ê ñòîïëîññó, óáûòîê ðàñòåò)
      if (dToMove>0)
         {       
         // ñòîïëîññ, ñîîòâåòñòâåííî, íóæíî òàêæå ïåðåäâèíóòü íà òàêîå æå ðàññòîÿíèå, íî ñ ó÷åòîì êîýôô. óñêîðåíèÿ
         dToMove = MathRound(dToMove * dSpeedCoeff) * MarketInfo(OrderSymbol(),MODE_POINT);            
      
      //   Print("dToMove: ",dToMove);
      
         // òåïåðü ïðîâåðèì, ìîæåì ëè ìû ïîäòÿíóòü ñòîïëîññ íà òàêîå ðàññòîÿíèå
         if (OrderType()==OP_BUY)
            {
            if (dBid - (OrderStopLoss() + dToMove)>MarketInfo(OrderSymbol(),MODE_STOPLEVEL)* MarketInfo(OrderSymbol(),MODE_POINT))
            OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() + dToMove,OrderTakeProfit(),OrderExpiration());            
            }
         if (OrderType()==OP_SELL)
            {
            if ((OrderStopLoss() - dToMove) - dAsk>MarketInfo(OrderSymbol(),MODE_STOPLEVEL) * MarketInfo(OrderSymbol(),MODE_POINT))
            OrderModify(iTicket,OrderOpenPrice(),OrderStopLoss() - dToMove,OrderTakeProfit(),OrderExpiration());
            }      
         }
      }            
   }
   
int Tral()
{     
   if (Ask>TrailingStop*Point) // öåíà óøëà ââåðõ
      {                
      for(int cnt=0;cnt<OrdersTotal();cnt++)    
      {    
            OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            int mode = OrderType();
            if (OrderMagicNumber() != mn || OrderSymbol()!=Symbol()) continue; 
            if (mode==OP_BUY && OrderMagicNumber() == mn && OrderSymbol()==Symbol()) 
              {
              if (Bid-OrderStopLoss()>TrailingStop*Point+onepoint*Point) 
                  {
                 OrderModify(OrderTicket(),Bid,Bid-TrailingStop*Point,OrderTakeProfit(),0,Green);return(0);      
                  }   
              }

       }// for
   }//Ask 
   
      if (Bid<TrailingStop*Point) // öåíà óøëà âíèç
      {               
      for(cnt=0;cnt<OrdersTotal();cnt++)    
      {    
            OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
            mode = OrderType();
            if (OrderMagicNumber() != mn || OrderSymbol()!=Symbol()) continue; 
            if (mode==OP_SELL && OrderMagicNumber() == mn && OrderSymbol()==Symbol()) 
              {
              if (OrderStopLoss()-Ask>TrailingStop*Point+onepoint*Point) 
                  {
                 OrderModify(OrderTicket(),Ask,Ask+TrailingStop*Point,OrderTakeProfit(),0,Red);return(0);      
                  }   
              }
       }// for
   }//Bid 

}   



Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:



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
It can change open orders parameters, due to possible stepping strategy

Other Features:


BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.81 Total Net Profit:-2978.04

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

BackTest : GBPUSD on H1

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

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.35 Total Net Profit:-9607.78

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.10 Total Net Profit:-10010.38

BackTest : USDCAD on H1

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

BackTest : USDCHF on H1

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

BackTest : USDJPY on H1

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

Request Backtest for tudasuda06


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

Pair: Period: