Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 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:
Obrigado!
 
Olá, e quanto ao OrderTotal()?
Eu sempre soube que ele contém o número de ordens -1, ou seja, OrdensTotal()-1 e tudo estava funcionando, mas comecei a escrever um programa e de repente, uma ordem não é mais contada, pedi OrdensTotal() e ele me deu o número total de ordens = 3, ao invés de 3-1.
O que acontece?

A forma usual do laço na ajuda:

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

Ou seja, a primeira ordem é igual a zero.

Mas não, de fato, a primeira ordem é 1, o que significa que devemos começar a busca a partir de 1 e não a partir de zero?
As metaquotas fizeram algo errado ou eu sou estúpido?

Документация по MQL5: Торговые функции / OrdersTotal
Документация по MQL5: Торговые функции / OrdersTotal
  • www.mql5.com
Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.
 
Maksim Mihajlov:
Olá, o que se passa com OrderTotal()?
Eu sempre soube que ele contém o número de ordens -1, ou seja, OrdensTotal()-1, e tudo estava funcionando, mas comecei a escrever um programa e de repente uma ordem não é contada. Eu pedi OrdensTotal() e ele diz ordens totais = 3, ao invés de 3-1.
O que acontece?

A forma usual do laço na ajuda:

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

Ou seja, a primeira ordem é igual a zero.

Mas não, de fato, a primeira ordem é 1, o que significa que devemos começar a busca a partir de 1 e não a partir de zero?
As metaquotas fizeram algo errado, ou eu sou estúpido?

Você misturou os PEDIDOS RELACIONADOS e POISÕES. Leia a referência. Seja mais específico em sua pergunta: o que você está tentando contar: PEDIDOS REMOVIDOS ou POSIÇÕES? E sim, nada mudou - o primeiro índice de elementos começa com '0'.


Acrescentado: exemplo

Exemplo: Calcular Posições e Ordens Pendentes

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:

Você misturou os PEDIDOS RELACIONADOS e as POSIÇÕES. Leia a referência. Formar sua pergunta mais precisamente: o que você está tentando contar: PEDIDOS RETIRADOS ou POSIÇÕES? E sim, nada mudou - o primeiro índice de elementos começa com '0'.


Acrescentado: exemplo

Exemplo: Calcular Posições e Ordens Pendentes

Quero dizer MQL4, não MQL5, não há diferença entre ordens pendentes e de mercado!

 
Maksim Mihajlov:

Quero dizer MQL4, não MQL5, não há divisão em pendentes e pendentes de mercado!

Você está escrevendo no fórum MQl5. Você está escrevendo na seção principal. Você posta no fórum da MQL5 - e você receberá respostas sobre a MQL5.

As perguntas sobre o terminal antigo são dirigidas à seção especial: MQL4 e MetaTrader 4. De agora em diante, escreva lá. Transferirei suas perguntas para ele.

 

Comparei duas variantes, na primeira, usei OrderTotal()-1 e comecei a busca a partir do zero - recebi o erro
. Na segunda variante, comecei com uma e peguei toda a OrderTotal() - sem erro desta vez

Nas telas, você pode ver que OrdersTotal() mostra o número real de pedidos, não OrdersTotal()-1 ...

A questão é
por que OrdensTotal() mostra o número real de ordens, em vez de -1, deveria ser assim ou é algo novo?
Porque, neste caso, devemos começar a busca não a partir de zero, mas a partir de um!

Arquivos anexados:
4.png  181 kb
2.png  186 kb
 
Maksim Mihajlov:

Comparei duas variantes, na primeira, usei OrderTotal()-1 e comecei a busca a partir do zero - recebi o erro
. Na segunda variante, comecei com uma e peguei toda a OrderTotal() - sem erro desta vez

Nas telas, você pode ver que OrdersTotal() mostra o número real de pedidos, não OrdersTotal()-1 ...

A questão é
por que OrdensTotal() mostra o número real de ordens, em vez de -1, deveria ser assim ou é algo novo?
Porque, neste caso, devemos começar a busca não a partir de zero, mas a partir de um!

Acho que entendi meu erro, desculpe...
Há um offset de -1 nesta condição:
if (OrderSelect(i-1,SELECT_BY_POS)==verdadeiro){}
Desculpe por ser grosseiro, eu tirei a string de outro programa e não prestei atenção ao offset!

 
Olá. Preciso de sua ajuda para corrigir o indicador. A essência do indicador é a seguinte. Calcule a magnitude do aumento de preço em relação à barra anterior. Para zero leva uma barra estelar. Ou seja, o preço de abertura é igual ao preço de fechamento. Ao compilar sem erros, mas ao testar um erro na linha 80 20 caracteres. Alinha de sinaltambém édesenhada incorretamente. Mas acho que esta é a razão para o cálculo incorreto do tampão principal. Por favor, ajude-me a consertá-lo.
//+------------------------------------------------------------------+
//|                                                         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 для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.
Razão: