Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 219

 
Vitaly Muzichenko:
Vitaly Muzichenko:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return (0);
     ......остальной код, в частности для открытия....
  }


выдает ошибку: 'return' - 'void' function returns a value Vitaly Muzichenko:
 
Oventu:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return;
     ......остальной код, в частности для открытия....
  }
 
Vitaly Muzichenko:
Vitaly Muzichenko:
Спасибо!
 
Здравствуйте, что с OrdersTotal()?
Я всегда знал что она содержит количество ордеров -1, то есть OrdersTotal()-1 и всё работало, но стал писать программу и вдруг, один ордер перестал учитываться, запросил OrdersTotal() и он выдал общее кол-во ордеров = 3, а не 3-1. 
Что происходит?

Обычный вид цикла в справке:

int total=OrdersTotal();  
  for(int pos=0;pos<total;pos++)
    {
    }

То есть первый ордер идёт как нулевое значение.

Но по факту нет, первый ордер и идёт как 1, значит перебор надо начинать с единицы, а не с нуля?
Метаквоты что-то начудили, или я туплю?

Документация по MQL5: Торговые функции / OrdersTotal
Документация по MQL5: Торговые функции / OrdersTotal
  • www.mql5.com
Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.
 
Maksim Mihajlov:
Здравствуйте, что с OrdersTotal()?
Я всегда знал что она содержит количество ордеров -1, то есть OrdersTotal()-1 и всё работало, но стал писать программу и вдруг, один ордер перестал учитываться, запросил OrdersTotal() и он выдал общее кол-во ордеров = 3, а не 3-1. 
Что происходит?

Обычный вид цикла в справке:

int total=OrdersTotal();  
  for(int pos=0;pos<total;pos++)
    {
    }

То есть первый ордер идёт как нулевое значение.

Но по факту нет, первый ордер и идёт как 1, значит перебор надо начинать с единицы, а не с нуля?
Метаквоты что-то начудили, или я туплю?

Вы смешали в кучу ОТЛОЖЕННЫЕ ОРДЕРА и ПОЗИЦИИ. Прочтите справку. Сформилуйте точнее свой вопрос: что именно Вы пытаетесь посчитать: ОТЛОЖЕННЫЕ ОРДЕРА или ПОЗИЦИИ? И таки да, ничего не изменилось - первый индекс элемента начинается с '0'.


ДОбавлено: пример 

Example: Calculate Positions and Pending Orders

How to start with MQL5
How to start with MQL5
  • 2020.03.12
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 
Vladimir Karputov:

Вы смешали в кучу ОТЛОЖЕННЫЕ ОРДЕРА и ПОЗИЦИИ. Прочтите справку. Сформилуйте точнее свой вопрос: что именно Вы пытаетесь посчитать: ОТЛОЖЕННЫЕ ОРДЕРА или ПОЗИЦИИ? И таки да, ничего не изменилось - первый индекс элемента начинается с '0'.


ДОбавлено: пример 

Example: Calculate Positions and Pending Orders

Я имею ввиду MQL4, а не MQL5, тут нет разделения на отложки и рыночные!

 
Maksim Mihajlov:

Я имею ввиду MQL4, а не MQL5, тут нет разделения на отложки и рыночные!

Вы пишите на форуме MQl5. Вы пишете в основном разделе. Вы пишите в теме о MQL5 - естественно ответы получаете про MQL5.

Вопросы по старому терминалу задаются в специальном разделе:  MQL4 и MetaTrader 4. Впредь пишите там. Ваши вопросы перенесу.

 

Вот я сравнил два варианта, в первом применил OrdersTotal()-1 и начал перебор с нуля - получил ошибку
Во втором варианте начал с единицы и взял целиком OrdersTotal(), - ошибки нет в этот раз

Смотрите скрины, там видно что OrdersTotal() отображает фактическое кол-во ордеров, а не  OrdersTotal()-1 ...

Вопрос, почему  OrdersTotal() выдаёт точное количество ордеров, а не -1, так и должно быть или это что то новое?
Ведь в этом случае, перебор надо начинать не с нуля, а с единицы!

Файлы:
4.png  181 kb
2.png  186 kb
 
Maksim Mihajlov:

Вот я сравнил два варианта, в первом применил OrdersTotal()-1 и начал перебор с нуля - получил ошибку
Во втором варианте начал с единицы и взял целиком OrdersTotal(), - ошибки нет в этот раз

Смотрите скрины, там видно что OrdersTotal() отображает фактическое кол-во ордеров, а не  OrdersTotal()-1 ...

Вопрос, почему  OrdersTotal() выдаёт точное количество ордеров, а не -1, так и должно быть или это что то новое?
Ведь в этом случае, перебор надо начинать не с нуля, а с единицы!

Кажется я понял свою ошибку сорри...
В этом условии идёт смещение на -1:
if (OrderSelect(i-1,SELECT_BY_POS)==true){}
Извините за тупость, взял строку из другой программы и не обратил внимание на смещение!

 
Здравстуйте. Нужна ваша помощь в корректировке индикатора. Суть индикатора такова. Рассчитать величину повышения цены относительно предыдущего бара. За ноль берётся бар звезда. То есть цена открытия равно цене закрытия. При компиляции ошибок нет, но при тестировании выдаёт ошибку на строке 80 20 символа. Так же криво отрисовывает сигнальную линию. Но думаю это причина именно в неправильном расчёте основного буфера. Помогите исправить.
//+------------------------------------------------------------------+
//|                                                         MSBB.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrGreen
#property indicator_color2  clrRed
#property  indicator_width1  1
input int            InpMSBBPeriod=3;        // Period
input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA;  // Method
//--- indicator buffers
double         ExtMSBBBuffer[];
double         ExtTempBuffer[];
double         ExtPriceBuffer[];
double         ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
   IndicatorDigits(Digits-2);
//--- drawing settings
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMSBBBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2,ExtTempBuffer);
   SetIndexBuffer(2,ExtPriceBuffer);
   SetIndexDrawBegin(1,InpMSBBPeriod);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")");
   SetIndexLabel(0,"MSBB");
   SetIndexLabel(1,"Signal");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int    i;//limit;
//------
   if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2)
      return(0);
   /*//--- counting from 0 to rates_total
      ArraySetAsSeries(ExtMSBBBuffer,false);
      ArraySetAsSeries(ExtSignalBuffer,false);
      ArraySetAsSeries(open,false);
      ArraySetAsSeries(high,false);
      ArraySetAsSeries(low,false);
      ArraySetAsSeries(close,false);*/
//---
  // limit=rates_total-prev_calculated;
   //if(prev_calculated>0)
     // limit++;
//--- typical price and its moving average
   for(i=0; i<rates_total; i++)
     {
      ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2);
      ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2);
      //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i];
      //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]);
      if(ExtTempBuffer[i]==0)
         ExtMSBBBuffer[i]=0.0;
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open>0 && price_close<0)||(price_open<0 && price_close>0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      //--- signal line counted in the 2-nd buffer
      //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0);
      SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer);
      Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]);
      //--- done
     }
   /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0)
     {
      ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i];
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   if(ExtPriceBuffer[i]==0)
     {
      ExtMSBBBuffer[i] = 0.0;
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   }*/
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Некоторые технические индикаторы имеют несколько отрисовываемых на графике буферов. Нумерация индикаторных буферов начинается с 0. При копировании значений индикатора функцией CopyBuffer() в массив типа double для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.