Проблемы с проверкой открытой торговли - страница 6

 

Я никогда не пробовал, но не думаю, что это действует...

OrderType()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
OrderMagicNumber()==(Mnumber1||Mnumber1))    // The orders magic number is the same as the magic number used in this ea

Я думаю, что вам нужно сделать это...

((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber2))    // The orders magic number is the same as the magic number used in this ea

Причина, по которой я так думаю... чему это равносильно? (OP_BUYSTOP||OP_SELLSTOP) Это может сработать, если переменные будут bool... но я не думаю, что это может работать с int.

И еще одна мелочь: вам не нужен OderSelect перед OrderDelete. Вообще, OrderSelect нужен только тогда, когда вы используете функцию Order, которая не использует int ticket. Например, OrderComment( ), OrderCommission( ) и т.д.

 
Ок, спасибо Raptor, я только что обновил код в своем посте. Я просто вспомнил, как вы, ребята, упоминали, что нехорошо использовать бары для счетчика, поэтому я изменил его на использование времени бара. Я подправлю логику и посмотрю, работает ли она.
 

Я исправил логику. Но ордера по-прежнему не удаляются.


Как я уже говорил, я менял счетчик от баров к барам...


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour(TimeCurrent());


   if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 

dazamate:
Спасибо, Раптор, я только что обновил код в своем посте. Я просто вспомнил, как вы, ребята, упоминали, что нехорошо использовать бары для счетчика, поэтому я изменил его на использование времени бара. Я подправлю логику и посмотрю, работает ли она.
"Бары ненадежны (как только вы достигнете максимального количества баров на графике, он не изменится и код сломается.) Volume[0]==1 ненадежен, если вы пропустите тик, код сломается. Всегда используйте время".

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

int Bars 

Number of bars in the current chart

но это не значит, что вы не можете использовать номера баров вместо количества часов. Например, как ваш код будет работать в пятницу вечером и в воскресенье? Будет ли pendinglimit равен 4 часам или 4 барам?

Также, что произойдет, если сделка будет размещена в 22:00? 22 + 4 = 26?

if(TimeHour(TimeCurrent()) > (bartraded + pendinglimit) && Tradeopen()==true)      // Check to see if pending orders have expired
 

Хорошо, я вижу проблему с временной стратегией. Но если мы используем бары в качестве счетчика, как только график достигнет максимального количества баров, это тоже приведет к неудаче, верно?

Я вернусь к этому и посмотрю, что смогу придумать...

 

Хорошо, как насчет такого подхода


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;
 
// * EVERYTIME A TRADE GETS TRIGGERED* 

bartraded = 0;


  if (Time0 == Time[0]) return; Time0 = Time[0];          // make sure each bar is only scanned once
       {   
//-----------------------------------------------------------------------------------------------------------------------------------------------
//TRADE COUNTER
   

   bartraded++;  // Each time a new bar opens add 1 to the counter

//------------------------------------------------------------------------------------------------------------------------------------------------
// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 'pendinglimit'

   if(bartraded > pendinglimit && Tradeopen()==true)      // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&               // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))       // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
dazamate:

Хорошо, я вижу проблему с временной стратегией. Но если мы используем бары в качестве счетчика, как только график достигнет максимального количества баров, то и здесь произойдет сбой, верно?


Нет, текущий бар H1 всегда бар 0 ... через 60 минут текущий бар H1 будет бар 0 ...проблема с барами заключается в том, используете ли вы Bars, то есть общее количество баров на вашем графике, или если вы смотрите на бары в крайней левой части вашего графика.

Номер бара для TimeHour(TimeCurrent () равен 0, вы можете получить номер бара для времени, когда ваша сделка была размещена (вы должны вычислить это, а не хранить!!!), используя iBarShift ,затем сделайте что-то вроде этого....

if (iBarShift(symbol, TF, Time_order_Placed)+1 >  pendinglimit) && Tradeopen()==true)  
 

Хорошо, в третий раз повезло. Мне потребовалось время, чтобы понять, что вы хотели сказать. Вот что я сделал. Но заказы по-прежнему не удаляются >:(


static datetime tradeopened;


//Everytime a trade is opened I run
 tradeopened = TimeCurrent();


 if((iBarShift(hothand(),60 ,tradeopened)>pendinglimit) && Tradeopen()==true)          // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)                  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
             ((OrderType()==OP_BUYSTOP)|| (OrderType()== OP_SELLSTOP)) &&     // The order selected is either a pending buy on stop order or a buy on sell order
             ((OrderMagicNumber()== Mnumber1) || (OrderMagicNumber()==Mnumber3)))     // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderDelete(tnumber);                                                 // Delete it
               }
        }
     }
 
Да, я только что перечитал ваш комментарий еще раз, и то, что я сделал, неправильно,
tradeopened = TimeCurrent()
не дает мне время открытия бара, мне нужно использовать Time[0]?
 

Попробуйте ;-)

OrderDelete(OrderTicket( ) );                    // Delete it