ADX проблема

 

написал советника, которы открываеться по индикатору адх, когда адх ниже д- и д+, а затем пересекает д+ --- тогда открываемся на селл. для покупки: адх пересекает д-

закрытие позиций: бай - адх пересекает д+; селл - адх пересекает д- (пересечение снизу в верх). вот код советника

//---- input parameters
extern int       adx_period=13;
extern int       offset=3;
extern double    lots=0.1;
//extern int       TP=10;

int magic = 24022010;
datetime new_time;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
//************************* 1 *************************************
   // определяем данные ADX ==========================================
   double adx_0 = iADX(Symbol(), 0, adx_period, PRICE_CLOSE, MODE_MAIN, 1);  // основная линия адх
   double adx_1 = iADX(Symbol(), 0, adx_period, PRICE_CLOSE, MODE_MAIN, 2);
   double d_pl_0= iADX(Symbol(), 0, adx_period, PRICE_CLOSE, MODE_PLUSDI, 1); // линия Д+
   double d_pl_1= iADX(Symbol(), 0, adx_period, PRICE_CLOSE, MODE_PLUSDI, 2);
   double d_mn_0= iADX(Symbol(), 0, adx_period, PRICE_CLOSE, MODE_MINUSDI, 1); // линия Д-
   double d_mn_1= iADX(Symbol(), 0, adx_period, PRICE_CLOSE, MODE_MINUSDI, 2);
   //=================================================================
//*************************** 2 ***********************************
if(new_time!=Time[0])
   {
   // открытие позиций ===============================================
   if (adx_1<d_pl_1 && adx_1<d_mn_1)      // адх ниже Д- и Д+
      {
       // open BUY
       if(adx_0>d_mn_0 && adx_0<d_pl_0)      // адх пересекает Д- и находиться ниже Д+
         {
          OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask, Digits), 3, /*Bid-10*Point*/0 , /*Ask+10*Point*/0, "ADX buy", magic, 0, CLR_NONE);
         }
       //---------
       // open SELL
       if(adx_0>d_pl_0 && adx_0<d_mn_0)
         {
          OrderSend(Symbol(), OP_SELL, lots, NormalizeDouble(Bid, Digits), 3, /*Ask+10*Point*/0, /*Bid-10*Point*/0, "ADX sell", magic, 0, CLR_NONE);
         }
       //----------
      }
   //=================================================================
   new_time = Time[0];
   }
   // закрытие позиций ===============================================
   int order_type, order_magic;
   int b_orders, s_orders, bs_orders, ss_orders;
   string order_symbol;
   for (int i=1; i<=OrdersTotal(); i++)                    //Цикл по всем ордерам,..     
      {                                                  //отражённым в терминале      
      if(OrderSelect(i-1,SELECT_BY_POS)==true)           //Если есть следующий        
         {                                               // Здесь должен выполняться анализ характеристик ордеров   
          //--------------------
         order_type=OrderType();
         order_magic=OrderMagicNumber();
         order_symbol = OrderSymbol();
            if(order_type==OP_BUY && order_magic==magic && order_symbol==Symbol())             // выбран ордер buy 
               {
                if(adx_1<d_pl_1 && adx_0>d_pl_0)
                  {
                   OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), 3, CLR_NONE);
                  }
               }
            if(order_type==OP_SELL && order_magic==magic && order_symbol==Symbol())             // выбран ордер sell 
               {
                if(adx_1<d_mn_1 && adx_0>d_mn_0)
                  {
                   OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), 3, CLR_NONE);
                  }
               }
            
          //--------------------
         }     
       }
   //=================================================================
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

проблема возникает когда смотришь на результат тестера собенно закрытие. и иногда открытия


 

а в чем собственно сама пороблема?

что должно быть и что не так?

 
sergeev >>:

а в чем собственно сама пороблема?

что должно быть и что не так?

1/ закрытие неправильно

2. иногда не правильно открытие

я ведь приложил код с рисунком, на которм видно (осбоено если расматривать селл позиции)

хотя вроде бы все правильно написано в коде.

 
у вас индикатор ADX точно по PRICE_CLOSE строит? хотя адх это мало влияет
 

double adx_0 = iADX(Symbol(), 0, adx_period, PRICE_CLOSE, MODE_MAIN, 1); - это строка из советника

 
помогите, уже два дня не пойму в чем причина... ????????????
 
dmmikl86 >>:
помогите, уже два дня не пойму в чем причина... ????????????

делайте распринтовку в журнал и сравнивайте пошагово что должно быть а что имеете.

возьмите конкретную сделку и проверьте все значения. только так и поможет.


PS

как найдёте, сюда потом отпишитесь что было :) интересно узнать на чем это можно 2 дня сидеть и не одолеть супостата

 
Должен ли советник открывать позицию если есть уже открытая?
 
sanyooooook >>:
Должен ли советник открывать позицию если есть уже открытая?

да

 

Подскажите как в этом советнике сделать так, чтоб ордера открывались только при смене условий а не каждую еденицу времени?

Другими словами выполнилось условие открылся 1 ордер, потом условия изменились. Ордер закрывается и открывается противоположный.

Спасибо за любую помощь.

 
dmmikl86:
помогите, уже два дня не пойму в чем причина... ????????????

Посмотри, мож чё пригодится из этого....
Файлы:
adxcross.rar  7 kb