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

 
Alexey Viktorov #:

Валерий, обрати внимание на строку

в моём коде… Я уже давно использую пятёрочные функции, но вот аналогичная функция

дала ссстакая 0.

Вот и думай где тараканы… А в следствии того, что мт4 поддерживать отказываются, то можно предположить, что исправлено не будет никогда…

Всё остальное надо проверять. Я этим не заморачивался так давно, что и вспоминать не хочется.

хм... Время эмулируется) Надо заморочиться)

int sd;
/*******************Expert initialization function*******************/
int OnInit()
 {
  sd = (int)MarketInfo("EURJPY", MODE_DIGITS);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  datetime lt = iTime(_Symbol, PERIOD_M15, 0);
  static datetime ct = 0;
  if(ct != lt)
  {
   ct = lt;
   Print(DoubleToString(iMA("EURJPY", PERIOD_M15, 21, 0, MODE_SMA, PRICE_CLOSE, 0), sd),
    " Time[0] ",TimeToStr( Time[0])," iTime(EURJPY,0,0) ",TimeToStr(iTime("EURJPY",0,0)));
  }

Результат

2021.09.21 15:30:48.696 2021.08.13 20:15:00  testMulti EURUSD,M15: 129.482 Time[0] 2021.08.13 20:15 iTime(EURJPY,0,0) 2021.08.13 20:15
2021.09.21 15:30:48.632 2021.08.13 20:00:00  testMulti EURUSD,M15: 129.495 Time[0] 2021.08.13 20:00 iTime(EURJPY,0,0) 2021.08.13 20:00
2021.09.21 15:30:48.568 2021.08.13 19:45:00  testMulti EURUSD,M15: 129.512 Time[0] 2021.08.13 19:45 iTime(EURJPY,0,0) 2021.08.13 19:45
2021.09.21 15:30:48.504 2021.08.13 19:30:00  testMulti EURUSD,M15: 129.527 Time[0] 2021.08.13 19:30 iTime(EURJPY,0,0) 2021.08.13 19:30
2021.09.21 15:30:48.440 2021.08.13 19:15:00  testMulti EURUSD,M15: 129.539 Time[0] 2021.08.13 19:15 iTime(EURJPY,0,0) 2021.08.13 19:15

ЗЫ Работает на получении данных баров с других символов))) Но историю надо грузить конкретно, выход за пределы массива только так на не прогруженном инструменте или запросе данных далекого бара.

ЗЫ ЗЫ

Реально работает!!! Пришлось подгрузить архивы котировок всех !!! нужных валютных пар и на минутке с июня 21 года работает, на старших и позже начинает)

 
giros #:

Можете подсказать, где можно изучить MQL5 (на русском языке)?

Тут. Я ничего другого не читал.
Документация по MQL5 - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Документация по MQL5 - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
  • www.mql5.com
Документация по MQL5 - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 


double FindPenultBuyPrice()
{
   int oldticket;
   double oldopenprice=0;
   ticket=0;
   
   for(int i=OrdersTotal()- 2 ; i>=0; i--)
   {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
         {
            oldticket = OrderTicket();
            if (oldticket > ticket)
            {
               ticket = oldticket;
               oldopenprice = OrderOpenPrice();
            }
         }
      }
   }
   return(oldopenprice);
}

Здравствуйте. Пытаюсь найти цену открытия предпоследнего ордера, но нормально работает, если нет ордеров Sell, Подскажите, в чем ошибка? Я так понял он их тоже считает. MQL4

 
makssub #:


Здравствуйте. Пытаюсь найти цену открытия предпоследнего ордера, но нормально работает, если нет ордеров Sell, Подскажите, в чем ошибка? Я так понял он их тоже считает. MQL4

double FindPenultBuyPrice()
{
   int oldticket;
   double oldopenprice=0;
   ticket=0;
   
   for(int i=OrdersTotal()- 2 ; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // внимательней к копипасту) цикл по i а перебираешь cnt))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
         {
            oldticket = OrderTicket();
            if (oldticket > ticket)
            {
               ticket = oldticket;
               oldopenprice = OrderOpenPrice();
            }
         }
      }
   }
   return(oldopenprice);
}
 
Valeriy Yastremskiy #:


double FindPenultBuyPrice()
{
   int oldticket;
   double oldopenprice=0;
   ticket=0;
   
   for(int cnt=OrdersTotal()- 2 ; cnt>=0; cnt--)
   {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
         {
            oldticket = OrderTicket();
            if (oldticket > ticket)
            {
               ticket = oldticket;
               oldopenprice = OrderOpenPrice();
            }
         }
      }
   }
   return(oldopenprice);
}

Спасибо. Перепроверил, по прежнему  считает и Sell тоже(

 
makssub #:


Спасибо. Перепроверил, по прежнему  считает и Sell тоже(

Наверное потому, что вычитаешь из общего количества ордеров

OrdersTotal()- 2 

а ищешь только в 

OP_BUY
 
makssub #:


Спасибо. Перепроверил, по прежнему  считает и Sell тоже(

Распринтуй перед вторым if и внутри второго if номер, тикет и тип ордера.

double FindPenultBuyPrice()
{
   int oldticket;
   double oldopenprice=0;
   ticket=0;
   
   for(int cnt=OrdersTotal()- 2 ; cnt>=0; cnt--)
   {
    if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
Print("Print 1 "," cnt ",cnt," OrderTicket() ",OrderTicket()," OrderType() ",OrderType());
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
         {
Print("Print 2 "," cnt ",cnt," OrderTicket() ",OrderTicket()," OrderType() ",OrderType());
            oldticket = OrderTicket();
            if (oldticket > ticket)
            {
               ticket = oldticket;
               oldopenprice = OrderOpenPrice();
            }
         }
      }
   }
   return(oldopenprice);
}
 
 private:
   CPoint             *startPoint;
   CPoint             *endPoint;

Есть два конструктора. Когда я из второго вызываю первый и задаю значения переменным выше, при возврате из него во второй эти переменные идут в NULL
При этом если просто скопировать код из первого конструктора во второй и не делать вызова, все работает. В чем проблема?

CWave::CWave(string namePref,
             double startPrice,
             datetime startTime,
             double endPrice,
             datetime endTime)
  {
   prevWave = NULL;
   nextWave = NULL;
   name = namePref+"_"+TimeToString(startTime, TIME_DATE|TIME_MINUTES);
   startPoint = new CPoint(startPrice, startTime);
   endPoint = new CPoint(endPrice, endTime);
   dir = startPrice < endPrice ? true : false;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CWave::CWave(string namePref,
             double startPrice,
             datetime startTime,
             double endPrice,
             datetime endTime,
             CWave *prevWave)
  {
   CWave(namePref, startPrice, startTime, endPrice, endTime);
   this.prevWave = prevWave;
   prevWave.nextWave = &this;
  }
 
Roman Sharanov #:

Есть два конструктора. Когда я из второго вызываю первый и задаю значения переменным выше, при возврате из него во второй эти переменные идут в NULL
При этом если просто скопировать код из первого конструктора во второй и не делать вызова, все работает. В чем проблема?


Проблема в MQL.

Я в подобных ситуациях выношу инициализацию в отдельный метод, котрорый дёргаю из разных конструкторов.

---

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

 
Valeriy Yastremskiy #:

Распринтуй перед вторым if и внутри второго if номер, тикет и тип ордера.

Спасибо. Сегодня на днях проверю.