TitanicSmall_v1_1

Author: Alex
Profit factor:
0.00
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself
1 Views
0 Downloads
0 Favorites
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) ;
   }

Comments