Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2305

 
Tretyakov Rostyslav #:

Спасибо, работает...но не корректно

Вы не подскажите, как можно реализовать такой поиск свечей

Когда последняя закрытая свеча >= size, мне нужно перебором найти вторую и третью свечу >= size, а все которые меньше пропускать. В итоге получить номер третьей свечи.


/// Nth-ная свеча где high-low больше size, по умолчанию начиная с 0 и на глубину depth (по умолчанию - сколько есть баров)

int PrevCandleGreaterThen(string symbol,ENUM_TIMEFRAMES tf,int size,int nth=1, int from=0 , int depth=-1) 

{

if (symbol==NULL || symbol=="") symbol=_Symbol; // по умолчанию - текущий символ

if (tf==PERIOD_CURRENT) tf=_Period; // так просто чуть быстрее

int limit=iBars(symbol,period,tf); // сколько всего есть баров

if (depth<0) depth=limit-from; // ограничиваем глубину поиска

        double point = SymbolInfoDouble(symbol,SYMBOL_POINT) // размер пункта

        int found=0; // сколько свечей подсчитали

for(int shift=0;shift<depth && from+shift<limit; shift++) {

            // перебираем бары, считаем только те у которых high-low >=points

     double high = iHigh(symbol,tf,from+shift);

          double low = iLow(symbol,tf,from+shift);

    // тут надо проверит корректность, но пропустим
            // длина свечи
            long points = (long)MathRound((high - low)/point);  

            if (points>=size) {

                 // свечка подходящего размера

                 // считаем такие

                 found++;

                 // если начитали сколько надо - результат достигнут

                if (found == nth) {

                       // отдаём её индекс от 0 

                       return from+shift

                }

            }

}

// пробежали весь depth, нифига не нашли

         // отдаём например -1, сигнализируя неудачу

        return -1;

}

PS/ 5 лет web-деятели не могут прикрутить не то чтобы подсветку синтаксиса в стиль "код" , а просто корректные monospace и pre; 

 

Помогите, пожалуйста!

сразу закрывает сделку и открывает новую в том же направлении, а не выжидает 3 бара

в глобальных переменных объявлено:

int bars = iBarShift( Symbol(), PERIOD_M1, OrderOpenTime() );

//------------------------

if(условия)

  {

  if (OrdersTotal()<1)

    {

  ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, slippage, 0, 0,NULL, Magic,0, Red);

      if (ticket>0)

     {

     SL = NormalizeDouble(Ask - stoploss*Point, Digits);

     TP = NormalizeDouble(Bid + takeprofit*Point, Digits);

     if (OrderSelect(ticket,SELECT_BY_TICKET))

     if(OrderModify(ticket, OrderOpenPrice(),SL, TP,0))

           Print ("Ошибка модификации ордера");

 }

}


if ( iTime( Symbol(), PERIOD_M1, bars ) > OrderOpenTime() ) { bars ++; }


if ( bars >3) 

{

ticket =  OrderClose(OrderTicket(),OrderLots(),Bid,3,White);

}

 
Maxim Kuznetsov #:

PS/ 5 лет web-деятели не могут прикрутить не то чтобы подсветку синтаксиса в стиль "код" , а просто корректные monospace и pre; 

Спасибо.
 
hp0007 #:

Помогите, пожалуйста!


int bars;
//------------------------
if(условия)
  {
  if (OrdersTotal()<1)
      {
      ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, slippage, 0, 0,NULL, Magic,0, Red);
      if (ticket>0)
         {
         bars=TimeCurrent()+3*_Period*60;
         SL = NormalizeDouble(Ask - stoploss*Point, Digits);
         TP = NormalizeDouble(Bid + takeprofit*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(),SL, TP,0))
            Print("Ошибка модификации ордера");
         }
      }
   if(TimeCurrent()>bars)
      {
      ticket =  OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
      }
 
Tretyakov Rostyslav #:

Скажите пожалуйста, а вот у меня вверху кода глобальная переменная правильно прописана?

int bars = iBarShift(Symbol(), PERIOD_M1, OrderOpenTime() );
 
Tretyakov Rostyslav #:

А то мне в тестере выдает: 2023.10.22 20:05:36.628 2023.07.18 17:16:54  AANDS18 EURUSD,M1: unknown ticket 494 for OrderClose function


 
Tretyakov Rostyslav #:

Если просто как Вы написали оставить

int bars;

Ошибка пропадает но сделка через три бара не закрывается

 
hp0007 #:

Если просто как Вы написали оставить

Ошибка пропадает но сделка через три бара не закрывается

Я не все поправил, так надо

int bars;
//------------------------
if(условия)
  {
  if (OrdersTotal()<1)
      {
      ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, slippage, 0, 0,NULL, Magic,0, Red);
      if (ticket>0)
         {
         bars=TimeCurrent()+3*_Period*60;
         SL = NormalizeDouble(Ask - stoploss*Point, Digits);
         TP = NormalizeDouble(Bid + takeprofit*Point, Digits);
         if(OrderSelect(ticket,SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(),SL, TP,0))
            Print("Ошибка модификации ордера");
         }
      }
   if(TimeCurrent()>bars)
      {
      if(OrderClose(ticket,OrderLots(),Bid,3,White)) Print("OK");
      else Print("NOT OK");
      }

и int bars; должен стоять в глобальных переменных

 
Tretyakov Rostyslav #:

Я не все поправил, так надо

и int bars; должен стоять в глобальных переменных

int bars;

//-----------------

//--------------------------------------------------------------------
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
   takeprofit*=10;
   stoploss*=10;
   slippage*=10;
}
return (INIT_SUCCEEDED);
}
void OnTick()
{

   for (int i=0; i<OrdersTotal(); i++)
        if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber()) return;
   
    double SL,TP;
    int ticket;

int bars; правильно? в самом верху?

 
hp0007 #:

int bars; правильно? в самом верху?

Да
Причина обращения: