TitanicSmall_v1_1





//+------------------------------------------------------------------+
//|                                                     $Titanic.mq4 |
//|                                                             Alex |
//|                                                    al5@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Alex"
#property link      "al5@yandex.ru"
/* â ñîâåòíèêå çàëîæåíà ìûñëü ,÷òî ðûíîê íàõîäèòñÿ â êâàçèóñòîé÷èâîì ñîñòîÿíèè íåêîòîðîå âðåìÿ â ïðîñòîíàðîäèè 
   òðåíä è ôëåò , ê ýòèì ïîíÿòèÿì íàäî äîáàâèòü åùå ïóøèñòîñòü ðûíêà .ò å åñëè äâèæåíèå íà÷àëîñü 
   òî îíî ñêîðåå âñåãî ïðîäîëæèòñÿ è ó êàæäîãî äâèæåíèÿ áóäåò îòêàò âîïðîñ çàêëþ÷àåòñÿ  â ïðàâèëüíîñòè
   ïàðàìåòðîâ ñòîïîâ è ïðîôèòîâ äëÿ ýòîé ôàçû ðûíêà è ïðèìåíåíèèè ñòðàòåãèè íà îòêàòàõ èëè íà ïðîäîëæåíèè äâèæåíèÿ.
   ×òîáû íå äóìàòü ïðî îïòèìèçàöèþ âåäåòñÿ âèðòóàëüíî ñðàçó 640 âîçìîæíûõ êîìáèíàöèé,òî ÷òî ÿâëÿåòñÿ ëó÷øèì îòáèðàåòñÿ 
   äëÿ ðåàëüíîé òîðãîâëè . Äëÿ óìåíüøåíèÿ êîë-âà ñòðàòåãèé ñòîï ëîññ òàêæå ÿâëÿåòñÿ òðåéëèíãîì ,êîòîðûé íà÷èíàåò äâèæåíèå 
   ñðàçó íå äîæèäàÿñü ïðîôèòà .
*/
double   Resultat_v[256,644] ;// ìàññèâ ðåçóëüòàòîâ òîðãîâëè
double   Torgovlya_v[7,644] ;// ìàññèâ îïèñàíèÿ îðäåðîâ 
// òîðã îïåðàöèÿ, öåíà îòêðûòèÿ, ñòîï ëîññ, òåéê ïðîôèò, ôëàã ñîñòîÿíèÿ ïîçèöèè, ìàãèê, ïðèáûëü çàêðûòîãî îðäåðà

int      Flag[644] ;// ìàññèâ ôëàãîâ äëÿ êîíòðîëÿ ïîçèöèè
double   ExpectPayoff[644]; // ìàññèâ ìàòåìàòè÷åñêèõ îæèäàíèé ïî 10 ïîñëåäíèì ñäåëêàì
int      Strategi[100,2] ; //ìàññèâ â êîòîðîì õðàíÿòñÿ íîìåðà ñòðàòåãèé .
double   Lot=0.1 ;
//====================================================================
int init()
  {
//èíèöèàëèçàöèÿ ìàññèâà îðäåðîâ
   for (int i=0 ; i<=643 ;i++)
    {
      Torgovlya_v[0,i]=-1.0;
      ExpectPayoff[i]=-1 ;
    }
    for ( i=0 ; i<=9 ;i++)
    { 
      Strategi[i,0]=-2 ;
      Strategi[i,1]=-5 ;
    }
   
//----
   return(0);
  }
//====================================================================
int deinit()
  {

   return(0);
  }
//===================================================================
int start()
  { 
  int regim,SL,cde,aaa,MagicReal,regim_1 ;
  double    OpenPrice,Magic_Long,Magic_Short_Real,Magic_Short,Magic_Long_Real,ClosePrice ;
  bool ccc  ;
  static int ddd=-1 ;
  //Print("ôóíêöèÿ ñòàðò íà÷àëà ðàáîòû");
      for (int i=40 ;i<=120 ; i++)
        {
            Magic_Long=10000+i ;
            Magic_Short_Real=20000+i ;
            Magic_Short=30000+i ;
            Magic_Long_Real=40000+i ;
            if ( Digits==3 || Digits==5 )  SL=i*10 ;
               else SL=i ;
            regim_1=TipeOrder_v(Magic_Long) ;
       //     Print("Magic_Long",Magic_Long);
       //     Print("regim",regim);
            switch (regim_1)
               {
                 case -1 : //Âûñòàâèòü îòëîæåííûé îðäåð íà ïîêóïêó åñëè îðäåðîâ íà ïîêóïêó íåò 
                           // Çàêðûòü îðäåð íà ïðîäàæó ñ Magic_Short_Real
                 OrderSend_v(4.0,Ask+SL*Point,Ask,Ask+2*SL*Point,0.0,Magic_Long,0.0) ;
                 cde=TipeOrder_v(Magic_Short_Real) ;
                 aaa=index_v(Magic_Short_Real) ;
                 Flag[aaa]=0 ;
                 if (cde==1 )// åñëè èìååòñÿ îòêðûòûé îðäåð íà ïðîäàæó ñ Magic_Short_Real çàêðûâàåì åãî
                  {
                     OrderClose_v(Magic_Short_Real) ;
            //         Print("Çàêðûâàåòñ Magic_Short_Real ñ ",Magic_Short_Real) ;
            //         Print("ïðèáûëü " ,Torgovlya_v[6,aaa]*1000);
                  }
                 break ;
                 case 4:  // ìîäèôèêàöèÿ îòëîæåííîãî îðäåðà 
                  OpenPrice=OrderOpenPrice_v(Magic_Long) ;
                  if ((OpenPrice- Ask)> (SL+50)*Point) 
                    {
                   //  Print("ìîäèôèêàöèÿ îòëîæåííîãî îðäåðà",Magic_Long);
                     OrderModify_v(Magic_Long,Ask+SL*Point,Ask,Ask+2*SL*Point) ;
                    }
                 break ;
                 case 0:
                  /*
                     åñëè îòëîæåííûé îðäåð Buy_Stop ñðàáàòûâàåò ñòàíîâèòñÿ îðäåðîì Buy òî åãî ìîäèôèöèðóåì ïî ñòîï ëîññó
                     è åñëè ôëàã êîðîòêîé ïîçèöèè =1 òî åå çàíîâî íå îòêðûâàåì , ýòî çíà÷èò ÷òî êîðîòêàÿ ïîçà ëîâÿùàÿ îòêàò
                     áûëà çàêðûòà íà òðåíäå ïî ñòîïó è îòêðûâàòü åå çàíîâî íå íàäî 
                  */
                  ClosePrice=OrderStopLoss_v(Magic_Long) ;
                  if ((Ask-ClosePrice) > (SL+50)*Point)
                     OrderModify_v(Magic_Long,0.0,Ask-SL*Point,0.0) ;
                  regim=TipeOrder_v(Magic_Short_Real) ; // ïðîâåðêà íàëè÷èÿ êîðîòêîé ïîçû
                  aaa=index_v(Magic_Short_Real) ;
                  if (regim==1  || Flag[aaa]==1) 
                     break ;
                  OrderSend_v(1.0,Bid,Bid+SL*Point,0.0,0.0,Magic_Short_Real,0.0) ;
                  Flag[aaa]=1 ;
               //   Print("îòêðûâàåì Magic_Short_Real ñ ",Magic_Short_Real) ;
                 break ;           
               }
               ///////////////////////////////////////////////////////////////////////////////////////
            regim_1=TipeOrder_v(Magic_Short);
            switch (regim_1) 
               {
                case -1:
                  OrderSend_v(5,Bid-SL*Point,Bid,Bid-2*SL*Point,0.0,Magic_Short,0.0) ;
                  cde=TipeOrder_v(Magic_Long_Real) ;
                  aaa=index_v(Magic_Long_Real);
                  Flag[aaa]=0 ;   
                  if (cde==0)
                   {
                     OrderClose_v(Magic_Long_Real) ;
                   }
                case 5:
                  OpenPrice=OrderOpenPrice_v(Magic_Short);
                  if ((Bid-OpenPrice)> (SL+50)*Point)
                     OrderModify_v(Magic_Short,Bid-SL*Point,Bid,Bid-2*SL*Point) ;
                break ;
                case 1:
                 ClosePrice=OrderStopLoss_v(Magic_Short) ;
                 if ((ClosePrice-Bid)>(SL+50)*Point)
                   OrderModify_v(Magic_Short,0.0,Bid+SL*Point,0.0) ;
                   regim=TipeOrder_v(Magic_Long_Real);
                   aaa=index_v(Magic_Long_Real) ;
                   if (regim==0 || Flag[aaa]==1)
                     break ;
                 OrderSend_v(0,Ask,Ask-SL*Point,0,0,Magic_Long_Real,0) ;
                 Flag[aaa]=1;
                break ;         
              }    
        }
//----
   
   Vedeniepozi();
   ResTorgovlya_v(); 
   aaa=Expected_Payoff_v(); // âîçâðàò èíäåêñà ñòðàòåãèè ãäå ìàò îæèäàíèå áîëüøå âñåãî  
//  Çäåñü çàïîëíÿþòñÿ ñòàðøèå ÿ÷åéêè ìàññèâà ñòðàòåãèé ïîñëåäíåé ïðèøåäøåé ñòðàòåãèåé 
//    ñ ìàêñèìàëüíûì ìàòåìàòè÷åñêèì îæèäàíèåì 
   if (aaa!=ddd)
      {
         int   www=OrdersTotal() ;
         Print(" Âñåãî îðäåðîâ â äåëå ðàçðåøåíà óñòàíîâêà îòëîæåííèêîâ ",www);
         Print("Ìàòîæèäàíèå ",ExpectPayoff[aaa]) ;
         for ( i=1 ; i<=99 : ; i++)
          {
            Strategi[i-1,0]=Strategi[i,0] ;
            Strategi[i-1,1]=Strategi[i,1] ;
          }
         if (aaa==0) MagicReal=MathRand()+1 ;
            else MagicReal=aaa ;
         ccc=true ;
         while ( ccc)
          {
            for ( i=0 ;i<=99 ; i++)
               {
                  if ( MagicReal==Strategi[i,1] )
                     {
                        ccc=true ;
                        MagicReal=MagicReal+MathRand()+1 ;
                        break ;
                     }
                     ccc=false ;
               }
          }
         Strategi[99,0]=aaa ;
         Strategi[99,1]=MagicReal ;
       ddd=aaa ;
      }
     // åñëè ìàò æèäàíèåïîñëåäíåé ñòðàòåãèè ïîëîæèòåëüíî òî åå êîïèðóåì â ðåàëüíóþ ñäåëêó 
   if ( aaa >= 0 )
      {
         Copy_Position_r(Strategi[99,0],Strategi[99,1]) ; 
      }
   for ( i=0 ; i<=98 ; i++ )
      {
// åñëè íåò ðåàëüíîãî îðäåðà ñ òàêèì ìàãèêîì òî îñâîáîæäàåì ÿ÷åéêó â ìàññèâå Strategi
        if ( Type_Order_r(Strategi[i,1]) < 0)
         {
            Strategi[i,0]=-2 ;
            Strategi[i,1]=-1 ;
            continue ;
         }
// åñëè ðåàëüíûé îðäåð ñ òàêèì ìàãèêîì ÿâëÿåòñÿ îòëîæåííûì òî åãî óäàëÿåì 
        if (Type_Order_r(Strategi[i,1]) >1 )
         {
            Delete_Position_r(Strategi[i,0],Strategi[i,1]) ;
            continue ;
         }
        Copy_Position_r(Strategi[i,0],Strategi[i,1]) ;
      }
// Óäàëåíèå èç ìàññèâà âñåõ îòðàáîòàííûõ ñòðàòåãèé ñî ñäâèãîì âïðàâî â ðåçóëüòàòå  â ñòàðøèõ èíäåêñàõ íàõîäÿòñÿ
// ìàãèêè èíäåêñû ñòðàòåãèé êîòîðûå â äàííûé ìîìåíò ðàáîòàþò 
   for ( i=99 ;i<=1 ;i--)
      {
         if ( Strategi[i,0]==-2 )
            {
               for ( int j=i ; j<=1 ; j-- )
                  {
                     Strategi[j,0]=Strategi[j-1,0] ;
                     Strategi[j,1]=Strategi[j-1,1] ;
                  }
              Strategi[0,0]=-2 ;
              Strategi[0,1]=-1 ;
            }
      }
   return(0);
  }
//===================================================================        
        
int  index_v( int magic)
// ôóíêöèÿ âîçâðàùàåò èíäåêñ äëÿ ìàññèâà ïî ìàãèêó
   {
      int index=0,aaa,bbb,ccc ;
      aaa=magic/10000.0 ;
      if (aaa==1)
         return(magic-aaa*10000-40) ;
      if (aaa==2)
         return(magic-aaa*10000-40+161) ;
      if (aaa==3)
         return(magic-aaa*10000-40+322) ;
      if (aaa==4)
         return(magic-aaa*10000-40+483) ;
return(index) ;
   }
//====================================================================         
void  OrderModify_v(int magic,double OpenPrice,double StopLoss,double TeikProfit)
   {
      int index=index_v(magic) ;
      int aaa ;
      aaa=Torgovlya_v[0,index] ;
      switch (aaa)
     {
// ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà Buy
      case 0:
        if ((Torgovlya_v[0,index]==0.0 && TeikProfit!=0.0 && Ask > TeikProfit) ||
            (Torgovlya_v[0,index]==0.0 && StopLoss!=0.0 && Ask < StopLoss))
           {
              Print("Îøèáêà ìîäèôèêàöèè îðäåðà Buy ñ ìàãèêîì ",magic);
           }
           break ;
// ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà Sell
      case 1:
       if ((Torgovlya_v[0,index]==1.0 && TeikProfit!=0.0 && Bid < TeikProfit) ||
          (Torgovlya_v[0,index]==1.0 && StopLoss!=0.0 && Bid > StopLoss))
          {
             Print("Îøèáêà ìîäèôèêàöèè îðäåðà Buy ñ ìàãèêîì ",magic);
          }
            break ;
// ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà BuyLimit
      case 2:
         if ((Torgovlya_v[0,index]==2.0 && Ask < OpenPrice) || 
           (Torgovlya_v[0,index]==2.0 && TeikProfit!=0.0 && TeikProfit < OpenPrice) ||
           (Torgovlya_v[0,index]==2.0 && StopLoss!=0.0 && StopLoss > OpenPrice))
             {
              Print("Îøèáêà ìîäèôèêàöèè îðäåðà BuyLimit ñ ìàãèêîì ",magic);
             }
             break ;
// ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà SellLimit 
      case 3:
         if ((Torgovlya_v[0,index]==3.0 && Bid > OpenPrice) || 
             (Torgovlya_v[0,index]==3.0 && TeikProfit!=0.0 && TeikProfit > OpenPrice) ||
             (Torgovlya_v[0,index]==3.0 && StopLoss!=0.0 && StopLoss < OpenPrice))
             {
              Print("Îøèáêà ìîäèôèêàöèè îðäåðà SellLimit ñ ìàãèêîì ",magic);
             }
             break ;
// ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà BuyStop
      case 4:
         if ((Torgovlya_v[0,index]==4.0 && Ask > OpenPrice) || 
            (Torgovlya_v[0,index]==4.0 && TeikProfit!=0.0 && TeikProfit < OpenPrice) ||
            (Torgovlya_v[0,index]==4.0 && StopLoss!=0.0 && StopLoss > OpenPrice))
               {
                 Print("Îøèáêà ìîäèôèêàöèè îðäåðà BuyLimit ñ ìàãèêîì ",magic);
               }
               break ;
// ïðîâåðêà íà âøèâîñòü ìîäèôèêàöèè îðäåðà SellStop
      case 5:
        if ((Torgovlya_v[0,index]==5.0 && Bid < OpenPrice) || 
            (Torgovlya_v[0,index]==5.0 && TeikProfit!=0.0 && TeikProfit > OpenPrice) ||
            (Torgovlya_v[0,index]==5.0 && StopLoss!=0.0 && StopLoss < OpenPrice))
              {
               Print("Îøèáêà ìîäèôèêàöèè îðäåðà SellLimit ñ ìàãèêîì ",magic);
              }
               break ;
     }
//Óñòàíîâêà öåíû îòêðûòèÿ ñòîïà è òåéêà äëÿ îòëîæåííûõ îðäåðîâ 
      if (Torgovlya_v[0,index] > 1 )
         {
            Torgovlya_v[1,index]=NormalizeDouble(OpenPrice,Digits) ;
            Torgovlya_v[2,index]=NormalizeDouble(StopLoss,Digits) ;
            Torgovlya_v[3,index]=NormalizeDouble(TeikProfit,Digits) ;
            Torgovlya_v[4,index]=0.0 ;
            Torgovlya_v[6,index]=0.0 ;
            return (0) ;
         }
      if (StopLoss != 0.0 )
         Torgovlya_v[2,index]=NormalizeDouble(StopLoss,Digits) ;
      if (TeikProfit != 0.0)
         Torgovlya_v[3,index]=NormalizeDouble(TeikProfit,Digits) ; 
      return(0) ;  
   }
//=======================================================================
// Ôóíêöèÿ ïåðâîíà÷àëüíîé óñòàíîâêè âèðòóàëüíûõ îðäåðîâ 
void  OrderSend_v(double TorgOperation,double OpenPrice,double StopLoss,double TeikProfit,double FlagWork,double magic,double Pribil)
   {   
      int index=index_v(magic) ;
//ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà Buy
      if (TorgOperation==0.0 && (TeikProfit!=0.0 && TeikProfit < OpenPrice) ||
         (StopLoss!=0.0 && StopLoss > OpenPrice))
         {
            Print("Îøèáêà óñòàíîâêè îðäåðà Buy ñ ìàãèêîì ",magic);
            deinit() ;
         }
//ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà Sell
      if (TorgOperation==1.0 && (TeikProfit!=0 && TeikProfit > OpenPrice) ||
         (StopLoss!=0.0 && StopLoss < OpenPrice))
         {
            Print("Îøèáêà óñòàíîâêè îðäåðà Sell ñ ìàãèêîì ",magic);
            deinit() ;
         }
//ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà BuyLimit
      if (TorgOperation==2.0 && (Ask < OpenPrice ||
         (TeikProfit!=0.0 && TeikProfit < OpenPrice) ||
         (StopLoss!=0.0 && StopLoss > OpenPrice)))
         {
            Print("Îøèáêà óñòàíîâêè îðäåðà BuyLimit ñ ìàãèêîì ",magic);
            deinit() ;
         }
//ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà SellLimit    
      if (TorgOperation==3.0 && (Bid > OpenPrice ||
         (TeikProfit!=0.0 && TeikProfit > OpenPrice) ||
         (StopLoss!=0.0 && StopLoss < OpenPrice)))
         {
            Print("Îøèáêà óñòàíîâêè îðäåðà SellLimit ñ ìàãèêîì ",magic);
            deinit() ;
         }
//ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà BuyStop
      if (TorgOperation==4.0 && (Ask > OpenPrice ||
         (TeikProfit!=0.0 && TeikProfit < OpenPrice) ||
         (StopLoss!=0.0 && StopLoss > OpenPrice)))
         {
            Print("Îøèáêà óñòàíîâêè îðäåðà BuyStop ñ ìàãèêîì ",magic);
            deinit() ;
         }  
//ïðîâåðêà íà âøèâîñòü óñòàíîâêè îðäåðà SellStop 
       if (TorgOperation==5.0 && (Bid < OpenPrice ||
          (TeikProfit!=0.0 && TeikProfit > OpenPrice) ||
          (StopLoss!=0.0 && StopLoss < OpenPrice)))
         {
            Print("Îøèáêà óñòàíîâêè îðäåðà SellStop ñ ìàãèêîì ",magic);
            deinit() ;
         }
       Torgovlya_v[0,index]=TorgOperation ;  
       Torgovlya_v[1,index]=OpenPrice ;
       Torgovlya_v[2,index]=StopLoss ;  
       Torgovlya_v[3,index]=TeikProfit ;
       Torgovlya_v[4,index]=0.0 ;
       Torgovlya_v[5,index]=magic ;  
       Torgovlya_v[6,index]=0.0 ;  
       return (0) ;      
   }
//==============================================================================================
void  Vedeniepozi()
   {
//ôóíêöèÿ êîòîðàÿ ïðîáåãàåò ïî ìàññèâó ïîçèöèé , çàêðûâàåò ïîçû ïî òåéêó èëè ñòîïó ,ïåðåâîäèò îòëîæåííûå îðäåðà â 
// ñðàáîòàâøèå çàïèñûâàåò â ñîîòâåòñòâóþùóþ ÿ÷åéêó ïðèáûëü/ óáûòîê è óñòàíàâëèâàåò ôëàãè äëÿ óïðàâëåíèÿ ïîçèöèÿìè 
         for(int index=0 ;index<=643 ; index++)
         {
//Ïîçèöèÿ Buy òîëüêî ÷òî óñòàíîâëåíà íåîáõîäèìî ñîâåðøèòü ïîêóïêó ïî òåêóùåìó Ask
         if (Torgovlya_v[0,index]==0.0 && Torgovlya_v[4,index]==0.0)
          {
            Torgovlya_v[1,index]=Ask ;
            Torgovlya_v[4,index]=1.0 ;
            continue ;
          }
//Ïîçèöèÿ Sell òîëüêî ÷òî óñòàíîâëåíà íåîáõîäèìî ñîâåðøèòü ïðîäàæó ïî òåêóùåìó Bid
         if (Torgovlya_v[0,index]==1.0 && Torgovlya_v[4,index]==0.0)
          {
            Torgovlya_v[1,index]=Bid ;
            Torgovlya_v[4,index]=1.0 ;
            continue ;
          }
//Ïîçèöèÿ Buy àêòèâíà íåîáõîäèìî åå ïðîâåðèòü íà ñòîïû è ïðîôèò
         // ïðîâåðêà íà ïðîôèò  
         if(Torgovlya_v[0,index]==0.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[3,index]!=0.0 && 
            Bid > Torgovlya_v[3,index])
          {
            Torgovlya_v[6,index]=Torgovlya_v[3,index]-Torgovlya_v[1,index] ;
            Torgovlya_v[4,index]=2.0 ;
            continue ;
          }
         // ïðîâåðêà íà ñòîï 
         if(Torgovlya_v[0,index]==0.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[2,index]!=0.0 && 
            Bid < Torgovlya_v[2,index])
          {
            Torgovlya_v[6,index]=Torgovlya_v[2,index]-Torgovlya_v[1,index] ;
            Torgovlya_v[4,index]=2.0 ;
            continue ;
          }
//Ïîçèöèÿ Sell àêòèâíà íåîáõîäèìî åå ïðîâåðèòü íà ñòîïû è ïðîôèò
         // ïðîâåðêà íà ïðîôèò  
         if(Torgovlya_v[0,index]==1.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[3,index]!=0.0 && 
            Ask < Torgovlya_v[3,index] )
          {
            Torgovlya_v[6,index]=Torgovlya_v[1,index]-Torgovlya_v[3,index] ;
            Torgovlya_v[4,index]=2.0 ;
            continue ;
          }
         // ïðîâåðêà íà ñòîï  
         if(Torgovlya_v[0,index]==1.0 && Torgovlya_v[4,index]==1.0 && Torgovlya_v[2,index]!=0.0 && 
            Ask > Torgovlya_v[2,index] )
          {
            Torgovlya_v[6,index]=Torgovlya_v[1,index]-Torgovlya_v[2,index] ;
            Torgovlya_v[4,index]=2.0 ;
            continue ;
          }
//Ïðîâåðêà îòëîæåííûé îðäåð BuyLimit ñðàáîòàë ñòàë îðäåðîì Buy
         if (Torgovlya_v[0,index]==2.0 && Ask < Torgovlya_v[1,index] && 
             Torgovlya_v[4,index]!=2.0 ) 
          {
            Torgovlya_v[0,index]=0.0 ;
            Torgovlya_v[4,index]=1.0 ;
            continue ;
          }         
//Ïðîâåðêà îòëîæåííûé îðäåð BuyStop ñðàáîòàë ñòàë îðäåðîì Buy
         if (Torgovlya_v[0,index]==4.0 && Ask > Torgovlya_v[1,index] && 
             Torgovlya_v[4,index]!=2.0 ) 
          {
            Torgovlya_v[0,index]=0.0 ;
            Torgovlya_v[4,index]=1.0 ;
            continue ;
          }
//Ïðîâåðêà îòëîæåííûé îðäåð SellLimit ñðàáîòàë ñòàë îðäåðîì Sell
         if (Torgovlya_v[0,index]==3.0 && Bid > Torgovlya_v[1,index] && 
             Torgovlya_v[4,index]!=2.0 ) 
          {
            Torgovlya_v[0,index]=1.0 ;
            Torgovlya_v[4,index]=1.0 ;
            continue ;
          }
//Ïðîâåðêà îòëîæåííûé îðäåð SellStop ñðàáîòàë ñòàë îðäåðîì Sell
         if (Torgovlya_v[0,index]==5.0 && Bid < Torgovlya_v[1,index] && 
             Torgovlya_v[4,index]!=2.0 ) 
          {
            Torgovlya_v[0,index]=1.0 ;
            Torgovlya_v[4,index]=1.0 ;
            continue ;
          }                            
        }
      //}
      return(0) ;
   }
//===============================================================================
int TipeOrder_v(int magic) // âîçâðàùàåò òèï âèðòóàëüíîãî îðäåðà ïî åãî ìàãèêó 
   {
      int index=index_v(magic) ;
      if (Torgovlya_v[0,index]==0.0) return(0) ;
      if (Torgovlya_v[0,index]==1.0) return(1) ;
      if (Torgovlya_v[0,index]==2.0) return(2) ;
      if (Torgovlya_v[0,index]==3.0) return(3) ;
      if (Torgovlya_v[0,index]==4.0) return(4) ;
      if (Torgovlya_v[0,index]==5.0) return(5) ;
      return(-1);      
   }
//================================================================================
void OrderClose_v(int magic) //ôóíêöèÿ çàêðûâàåò ïîçèöèþ ïî ðûíêó åñëè 
//ïîçà îòëîæåííàÿ òî ïðîñòî óäàëÿåò îðäåð .
   {
      int index=index_v(magic) ;
      if (TipeOrder_v(magic) >1 )
         {  //îòëîæåííûé îðäåð îáíóëÿåì ÿ÷åéêó
            Torgovlya_v[4,index]=-2.0 ;
         }
         // îðäåðà è òàê íåò ,íà õðåí ýòà çàïèñü íå çíàþ
      if (TipeOrder_v(magic) ==-1 )
         return(0) ;
         // äåéñòâóþùèé Buy îðäåð 
      if (TipeOrder_v(magic) ==0 )
         {
            Torgovlya_v[6,index]=Bid-Torgovlya_v[1,index] ;
            Torgovlya_v[4,index]=2.0 ;
            return(0) ;
         }
         //Äåéñòâóþùèé Sell îðäåð 
      if (TipeOrder_v(magic) ==1 )
         {
            Torgovlya_v[6,index]=Torgovlya_v[1,index]-Ask ;
            Torgovlya_v[4,index]=2.0 ;
            
            return(0) ;
         }
      return(0) ;
   }
//===============================================================================
void  ResTorgovlya_v()
//Ôóíêöèÿ ïðîáåãàåò ïî âñåìó ìàññèâó îðäåðîâ è åñëè åñòü çàêðûòûå (îòðàáîòàííûå)
// îðäåðà ïðèáûëü/óáûòîê çàïèñûâàåòñÿ â ñîîòâåòñâóþùóþ ÿ÷åéêó â ìàññèâ òîðãîâëè 
// ïîñëå ýòîãî î÷èùàåò ÿ÷åéêó îðäåðà ðàñ÷èòûâàåò ìàò îæèäàíèå ïî 10 ïîñëåäíèì ñäåëêàì
//çàïîëíÿåò ñîîòâ ÿ÷åéêó ìàññèâà ExpectPayoff
 {  
   int aaa ,ProfitTrades,LossTrades ,k ;
   double res ,GrossProfit,GrossLoss,ExpPayof;
   for (int i=0 ; i<=643 ; i++)
    {
      if (Torgovlya_v[4,i]==2.0 && Torgovlya_v[6,i]!=0.0)
       {
         aaa=SvobodYacheyca_v(i) ;
         Resultat_v[aaa,i]=Torgovlya_v[6,i] ;
         if ( aaa > 10 )// åñëè çàïîëíÿåìàÿ ÿ÷åéêà â ìàññèâå ðåçóëüòàòîâ èìååò èíäåêñ áîëüøå 10 ðàñ÷èòûâàì ìàò îæèäàíèå äëÿ ýòîé ñòðàòåãèè 
            {
               for (int j=aaa-10 ;j<=aaa ; j++)
                  {
                     
                     if (Resultat_v[j,i] > 0.0)
                        {
                           GrossProfit=GrossProfit + Resultat_v[j,i];
                           ProfitTrades++;
                        } 
                      else
                        {
                           LossTrades++;
                           GrossLoss=GrossLoss+Resultat_v[j,i];
                        }
                  }
          ExpectPayoff[i]=ProfitTrades / 10 * GrossProfit - LossTrades / 10 * GrossLoss;
            }
         ProfitTrades=0; GrossProfit=0.0 ; LossTrades=0 ; GrossLoss=0.0 ;
         Torgovlya_v[0,i]=-1.0 ;
         for ( k=1 ;k<=6 ;k++) 
            Torgovlya_v[k,i]=0.0;
       }
      if (Torgovlya_v[4,i]==2.0 && Torgovlya_v[6,i]==0.0)
         {
            Torgovlya_v[0,i]=-1.0 ;
            for ( k=1 ;k<=6 ;k++) 
            Torgovlya_v[k,i]=0.0;
         }
    }
    return (0) ;
  }
//==============================================================================
int SvobodYacheyca_v(int i)
//ôóíêöèÿ âîçâðàùàåò èíäåêñ ñâîáîäíîé ÿ÷åéêè â ìàññèâå ðåçóëüòàòîâ
   {
    for (int j=0; j<=255 ; j++)
      {
         if ( Resultat_v[j,i]==0.0 )
            { return(j); }
         if( j==255 && Resultat_v[j,i]!=0.0 )
            {  // åñëè âåñü ìàññèâ çàïîëíåí ñäâèãàåì âëåâî ñ ïîòåðåé ñàìîãî ñòàðøåãî ðåçóëüòàòà
               for( int k=1 ; k<=255 ; k++)
                   { Resultat_v[k-1,i]=Resultat_v[k,i] ; }
            }
      }  
    return(255) ;
   }
//=============================================================================
int Expected_Payoff_v()
//ôóíêöèÿ âîçâðàùàåò èíäåêñ ñòðàòåãèè ñ ìàêñèìàëüíûì ïîëîæèòåëüíûì ìàò îæèäàíèåì äëÿ çàêëþ÷åíèÿ ðåàëüíûõ ñäåëîê 
// åñëè òàêîé ñòðàòåãèè íåò âîçâðàùàåò -1 
   {
      int bbb=-1;
      double aaa=0.0;
      for (int i=0 ;i<= 643 ; i++)
         if ( ExpectPayoff[i]> aaa && (Torgovlya_v[0,i] >= 0)) // || Torgovlya_v[0,i] == 1))
            {
               aaa=ExpectPayoff[i];
               bbb=i ;
            }
      return(bbb);
   }
//=============================================================================
double   OrderOpenPrice_v(int magic)
//Ôóíêöèÿ âîçâðàùàåò çíà÷åíèå öåíû îòêðûòèÿ âûáðàííîé ïîçèöèè
   {
      int  index=index_v(magic) ;
      return (Torgovlya_v[1,index]);   
   }
//=============================================================================
double   OrderStopLoss_v(int magic)
//ôóíêöèÿ âîçâðàùàåò çíà÷åíèå ñòîï ëîñà âûáðàííîé ïîçèöèè
   {
      int  index=index_v(magic) ;
      return (Torgovlya_v[2,index]);
   }
   /*
      Expected payoff, ìàòåìàòè÷åñêîå îæèäàíèå âûèãðûøà ðàññ÷èòûâàåòñÿ ïî ñëåäóþùåé ôîðìóëå:
Expected Payoff = (ProfitTrades / TotalTrades) * (GrossProfit / ProfitTrades) - (LossTrades / TotalTrades) * (GrossLoss / LossTrades)ãäå:
TotalTrades - îáùåå êîëè÷åñòâî ñäåëîê;
ProfitTrades - êîëè÷åñòâî ïðèáûëüíûõ ñäåëîê;
LossTrades - êîëè÷åñòâî óáûòî÷íûõ ñäåëîê;
GrossProfit - îáùàÿ ïðèáûëü;
GrossLoss - îáùèé óáûòîê.
ExpectPayoff
*/
//====================================================================================================
int Type_Order_r(int Magic)
//Ôóíêöèÿ âîçâðàùàåò òèï îðäåðà ðåàëüíîé ïîçèöèè ïî åãî ìàãèêó 
     {
      int pos ,ticket;
      int total=OrdersTotal();
      for (pos=0;pos<total;pos++)
         {
            if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true)
               {
                     if(OrderMagicNumber()!=Magic) continue ;//âûáðàííûé îðäåð íå íàø
                        ticket=OrderTicket();
                        if (OrderType()==OP_BUY)  return(0) ;
                        if (OrderType()==OP_SELL)  return(1) ;
                        if (OrderType()==OP_BUYLIMIT)  return(2) ;
                        if (OrderType()==OP_SELLLIMIT) return(3) ;
                        if (OrderType()==OP_BUYSTOP)  return(4) ;
                        if (OrderType()==OP_SELLSTOP) return(5) ;
               }
             else   Print("Îøèáêà â ôóíêöèè Type_Order_r ",GetLastError());
         }
         return(-1); 
   } 
//===============================================================================================  
void  Copy_Position_r( int index ,int magic)
   {
//Ôóíêöèÿ êîïèðîâàíèÿ âèðòóàëüíîãî îðäåðà â ðåàëüíûé  çäåñü index èíäåêñ ðàáî÷åé ñòðàòåãèè 
// õàðàêòåðèñòèêè îðäåðà áåðóòñÿ èç ìàññèâà Torgovlya_v , Magic ýòî ìàãèê êîòîðûé íóæíî ïðèñâîèòü ðåàëüíîìó îðäåðó 
      double   teik_profit ;
      double   stopp_loss ;
      double   open_price;
      double   stop_level=MarketInfo(Symbol(),MODE_STOPLEVEL) ;
      double   bbb=7* Point;
      int      operation ;
               operation = Torgovlya_v[0,index] ;
               teik_profit=Torgovlya_v[3,index] ;
               stopp_loss=Torgovlya_v[2,index] ;
               open_price=Torgovlya_v[1,index];
      if (Digits == 5 || Digits ==3 )
         {
            bbb=bbb*10 ;
         }
// åñëè òèï âèðòóàëüíîãî îðäåðà íå ðàâåí òèïó ðåàëüíîãî îðäåðà òî ðåàëüíûé îðäåð óäàëÿåì
      //Print("ìàãèê ,òåéê ïðîôèò, ñòîï ,îòêðûòèå, îïåðàöèÿ ",magic," ",teik_profit," ",stopp_loss," ",open_price," ",operation);
      //Print("",) ; 
      int aaa=Type_Order_r(magic) ;
      if (operation!=aaa && aaa>=0)
       {
         Delete_Position_r(index,magic) ;
         return(0) ;
       }
// âûáèðàåì îðäåð ñ ìàãèêîì magic  äëÿ äàëüíåéøèõ îïåðàöèé ïîòðåáóåòñÿ åãî ticket
      int pos ,ticket=-1;
      int total=OrdersTotal();
      for (pos=0;pos<total;pos++)
         {
           if(OrderMagicNumber() != magic) continue ;//âûáðàííûé îðäåð íå íàø
             ticket=OrderTicket();
             break ;
         }
      if ( ticket!=-1) 
// òåïåðü çíàåì ìàãèê îðäåðà è åãî òèêåò è âûáðàëè òî÷íî òî ÷òî íàì íóæíî
      OrderSelect(ticket,SELECT_BY_TICKET) ;
      //Print("äîáðàëèñü äî óñòàíîâêè ïîçèöèè ñ èíäåêñîì ",index) ;
// âû÷èñëÿåì øàã ìîäèôèêàöèè ÷òîáû íå äåðãàòüñÿ ïî êàæäîìó òèêó
      switch ( operation )
         {
// ðàáîòàåì ñ ðåàëüíûì îðäåðîì íà ïîêóïêó  ñðàâíèâàåì åãî ïðîôèò ,ëîññ è ïðè íåîáõîäèìîñòè ìîäèôèöèðóåì
            case 0:
// åñëè íåò ðåàëüíîãî îðäåðà íà ïîêóïêó óñòàíàâëèâàåì åãî 
               if ( aaa == -1 && MathAbs(Ask- open_price) < bbb)
                  {
                     ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,50,stopp_loss,teik_profit,0,magic,0,CLR_NONE);
                     if (ticket==-1)
                        Print("îøèáêà îòêðûòèÿ îðäåðà íà ïîêóïêó ",GetLastError()) ;
                     break;
                  }
               if(stopp_loss!=OrderStopLoss() && stopp_loss!=0.0 && MathAbs(Bid-OrderStopLoss()) > stop_level) 
                {
                  if (OrderModify(ticket,0,stopp_loss,0,0,CLR_NONE)== false)
                     {
                        Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 2 ",GetLastError()) ;
                        Print("Âèðòóàëüíûé ñòîï ëîññ= ",stopp_loss," Ðåàëüíàÿ öåíà ïðåäëîæåíèÿ= ",Bid) ;
                     }
                }  
                break ;
// òî æå ñàìîå äëÿ îðäåðà íà ïðîäàæó 
            case 1:
               if ( aaa == -1 && MathAbs(Bid - open_price)< bbb)
                  {
                     ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,50,stopp_loss,teik_profit,0,magic,0,CLR_NONE);
                     if (ticket == -1)
                      Print("îøèáêà îòêðûòèÿ îðäåðà íà ïðîäàæó ",GetLastError()) ;
                     break;
                  }
               if(stopp_loss!=OrderStopLoss() && stopp_loss!=0.0 && MathAbs(Ask-OrderStopLoss()) > stop_level) 
                {
                  if (OrderModify(ticket,0,stopp_loss,0,0,CLR_NONE)== false)
                     {
                        Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 4 ",GetLastError()) ;
                        Print("Âèðòóàëüíûé ñòîï ëîññ= ",stopp_loss," Ðåàëüíàÿ öåíà ñïðîñà=  ",Bid) ;
                     }
                }  
                break ;
            case 2:
//äëÿ îðäåðà Buy_Limit üîäèôèêàöèÿ åñëè èçìåíèëñÿ óðîâåíü îòêðûòèÿ öåíû äëÿ ëèìèòíèêîâ âñå îäèíàêîâîå   
               if (aaa == -1)
                {
                  OrderSend(Symbol(),OP_BUYLIMIT,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE);
                  Print("óñòàíàâëèâàåì BUYLIMIT") ;  
                  break ;
                }
               if (open_price != OrderOpenPrice() && MathAbs(Ask-OrderOpenPrice()) > stop_level)
                  {    
                     if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false )
                        Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 5 ",GetLastError()) ;
                  }
                  break ;
            case 3:
               if (aaa == -1)
                {
                  OrderSend(Symbol(),OP_SELLLIMIT,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE);
                  Print("óñòàíàâëèâàåì SELLLIMIT") ;
                  break ;
                }
               if (open_price != OrderOpenPrice() && MathAbs(Bid-OrderOpenPrice()) > stop_level)              
                  {    
                     if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false )
                        Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 6 ",GetLastError()) ;
                  }
                  break ;
            case 4:
               if (aaa == -1)
                {
                  OrderSend(Symbol(),OP_BUYSTOP,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE);
                  Print("óñòàíàâëèâàåì BUYSTOP") ;
                  break ;
                }
               if (open_price != OrderOpenPrice() && MathAbs(Ask-OrderOpenPrice()) > stop_level)               
                  {    
                     if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false )
                        Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 7 ",GetLastError()) ;
                  }
                  break ;
            case 5:
               if (aaa == -1)
                {
                  OrderSend(Symbol(),OP_SELLSTOP,Lot,open_price,0,stopp_loss,teik_profit,0,magic,0,CLR_NONE);
                  Print("óñòàíàâëèâàåì SELLSTOP") ;
                  break ;
                }
               if (open_price != OrderOpenPrice() && MathAbs(Bid-OrderOpenPrice()) > stop_level)               
                  {    
                     if (OrderModify(ticket,open_price,stopp_loss,teik_profit,0,CLR_NONE)==false )
                        Print ("îøèáêà ìîäèôèêàöèè ëèíèÿ 8 ",GetLastError()) ;
                  }
                  break ;
         }    
     return(0) ;
   }
//=========================================================================================================
void Delete_Position_r(int index,int magic)
   {
// Ôóíêöèÿ óäàëåíèÿ îðäåðîâ ðåàëüíûõ ïîçèöèé åñëè îðäåð îòëîæåííûé òî îí ïðîñòî óäàëÿåòñÿ 
// åñëè ñðàáîòàâøèé òî çàêðûâàåòñÿ ïî ðûíêó .
      int operation ;
      operation=Type_Order_r(magic) ;
      int pos ,ticket;
      int total=OrdersTotal();
      for (pos=0;pos<total;pos++)
         {
           if(OrderMagicNumber() != magic) continue ;//âûáðàííûé îðäåð íå íàø
             ticket=OrderTicket();
             break ;
         }      
      if ( operation > 1)
         {
           OrderDelete(ticket) ;
           return(0) ;
         }
      if (operation == 0)
         {
            OrderClose(ticket,Lot,Bid,50,CLR_NONE) ;
            return(0) ;
         }
      if (operation ==1)
         {
            OrderClose(ticket,Lot,Ask,50,CLR_NONE) ;
            return(0) ;
         }
      return(0) ;
   }



Sample





Analysis



Market Information Used:



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

Other Features: