Опытным глазом

 

Доброго времени суток, уважаемые форумчане, просьба посмотреть опытным глазом код советника. Он чрезвычайно прост, идея такова: 1) по сигналу accelerator oscillator (хотя это не суть важно, может быть любой другой сигнал) открывается позиция на покупку/продужу. 2) Тут же выставляется отложенный ордер на уровне стоплоса первого ордера с размером лота в два раза больше, в зависимости от того акая позиция была открыта открыта в начале, если на покупку значит отложенный будет sellstop, соответственно если была продажа ставится buystop. 3) Если срабатывает селстоп первого ордера у нас открывается второй ордер и опять выставляется отложенный... Смысл в том что у нас постоянно есть ордера в диапозоне равном уровню стоплоса первого открытого ордера.

Советник работает корректно на демо-счете (хотя возникли проблемы в тестере), поскольку я не разу не программист, просьба посмотреть код и высказать свои замечания по поводу того, что данный подход можно было бы реализовать более корректно с точки зрения программирования.

extern int Lots=1;
extern int Magic=2211;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+

color clOpenBuy,clOpenSell,clModifyBuy,clModifySell;
color clCloseBuy,clCloseSell,clDelete;
int Slippage,StopLoss;
int cro=1;
int schet=1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double level_1=0.00001;
   double level_2=-0.00001;
   int TakeProfit=500;
   int Stop=43;
   int ticket_1,ticket_2,ticket_3,ticket_4;

   if(cro==1)
     {
      if(iAC(NULL,PERIOD_H1,1)>level_1 && iAC(NULL,PERIOD_H1,1)<iAC(NULL,PERIOD_H1,2))
        {
         ticket_2=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+Stop*Point,Bid-TakeProfit*Point,NULL,Magic,0,Red);
         cro++;
        }
      if(iAC(NULL,PERIOD_H1,1)<level_2 && iAC(NULL,PERIOD_H1,1)>iAC(NULL,PERIOD_H1,2))
        {
         ticket_1=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-Stop*Point,Ask+TakeProfit*Point,NULL,Magic,0,Blue);
         cro++;
        }
     }

   if(cro>1 && ExistPositionsOtlosh()==false)
     {
      if(yChStopLimitPos()==1)
        {
         ticket_3=OrderSend(Symbol(),OP_SELLSTOP,GetLotLastPos()*2,PriceOpenLastPos()-Stop*Point,3,PriceOpenLastPos(),PriceOpenLastPos()-TakeProfit*Point-Stop*Point,NULL,Magic,0,OrangeRed);
         cro++;
        }
      if(yChStopLimitPos()==2)
        {
         ticket_4=OrderSend(Symbol(),OP_BUYSTOP,GetLotLastPos()*2,PriceOpenLastPos()+Stop*Point,3,PriceOpenLastPos(),PriceOpenLastPos()+TakeProfit*Point+Stop*Point,NULL,Magic,0,DarkBlue);
         cro++;
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+

//функция возврата наличия отложенных ордеров

bool ExistPositionsOtlosh(string sy="",int op=-1,int mn=2211,datetime ot=0)
  {
   int i,k=OrdersTotal();
   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sy || sy=="")
           {
            if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(ot<=OrderOpenTime()) return(True);
                    }
                 }
              }
           }
        }
     }
   return(False);
  }
//функция возврата вида открытой позиции
int yChStopLimitPos(int mn=2211)
  {
   int i;
   for(i=1; i<=OrdersTotal(); i++)
     {
      if(OrderSelect(i-1,SELECT_BY_POS)==true)
        {
         if(mn<0 || OrderMagicNumber()==mn)
           {
            if(OrderType()==OP_SELL)
              {
               return(2);
              }
            if(OrderType()==OP_BUY)
              {
               return(1);
              }
           }
        }
     }
   return(0);
  }

//функция возврата размера лота последней открытой позиции
double GetLotLastPos(string sy="",int op=-1,int mn=2211)
  {
   datetime o;
   double l=-1;
   int i,k=OrdersTotal();
   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sy || sy=="")
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(o<OrderOpenTime())
                       {
                        o=OrderOpenTime();
                        l=OrderLots();
                       }
                    }
                 }
              }
           }
        }
     }
   return(l);
  }

//функция возврата цены открытия последней открытой позиций
double PriceOpenLastPos(string sy="",int op=-1,int mn=2211)
  {
   datetime t;
   double r=0;
   int i,k=OrdersTotal();
   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==sy || sy=="")
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(t<OrderOpenTime())
                       {
                        t=OrderOpenTime();
                        r=OrderOpenPrice();
                       }
                    }
                 }
              }
           }
        }
     }
   return(r);
  }
//+------------------------------------------------------------------+
 
1. Если вы действительно хотите чтобы "опытные" глаза посмотрели ваш код, то пожалейте их хотя бы и используйте SRC при публикации своего кода.
2. Такие системы как ваша существуют в открытом доступе, не один раз встречал здесь на форуме. Возможно они отработаны лучше вашей, возможно нет, но найти единомышленников или новые идеи сможете лучше всего именно таким образом. Ссылку не просите, дать не смогу т.к. данной системой не интересуюсь, но поиск рулит. Удачи.
 
murchel:

Доброго времени суток, уважаемые форумчане, просьба посмотреть опытным глазом код советника. Он чрезвычайно прост, идея такова: 1) по сигналу accelerator oscillator (хотя это не суть важно, может быть любой другой сигнал) открывается позиция на покупку/продужу. 2) Тут же выставляется отложенный ордер на уровне стоплоса первого ордера с размером лота в два раза больше, в зависимости от того акая позиция была открыта открыта в начале, если на покупку значит отложенный будет sellstop, соответственно если была продажа ставится buystop. 3) Если срабатывает селстоп первого ордера у нас открывается второй ордер и опять выставляется отложенный... Смысл в том что у нас постоянно есть ордера в диапозоне равном уровню стоплоса первого открытого ордера.

Советник работает корректно на демо-счете (хотя возникли проблемы в тестере), поскольку я не разу не программист, просьба посмотреть код и высказать свои замечания по поводу того, что данный подход можно было бы реализовать более корректно с точки зрения программирования.


Для кода есть кнопка SRC