Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
У тебя есть торговый сигнал? Опубликуй его и на своем блоге!
Петро
13
Петро 2014.04.04 06:34 

Доброго времени суток, уважаемые форумчане, просьба посмотреть опытным глазом код советника. Он чрезвычайно прост, идея такова: 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);
  }
//+------------------------------------------------------------------+
Ahmad Mehdiyev
478
Ahmad Mehdiyev 2014.04.08 10:16  
1. Если вы действительно хотите чтобы "опытные" глаза посмотрели ваш код, то пожалейте их хотя бы и используйте SRC при публикации своего кода.
2. Такие системы как ваша существуют в открытом доступе, не один раз встречал здесь на форуме. Возможно они отработаны лучше вашей, возможно нет, но найти единомышленников или новые идеи сможете лучше всего именно таким образом. Ссылку не просите, дать не смогу т.к. данной системой не интересуюсь, но поиск рулит. Удачи.
Victor Nikolaev
Модератор
14030
Victor Nikolaev 2014.04.08 10:23  
murchel:

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

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


Для кода есть кнопка SRC
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий