Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 513

 
mwwm:

como fazer isso corretamente?

Como você faz isso?
 
Artyom Trishkin:
Como você faz isso?
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &Op[], 
                const double &Hi[], 
                const double &Lo[], 
                const double &Cl[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
   ArraySetAsSeries(time,true); 
   ArraySetAsSeries(Op,true); 
   ArraySetAsSeries(Hi,true); 
   ArraySetAsSeries(Lo,true); 
   ArraySetAsSeries(Cl,true); 
//--- 
double mas[];
   if(prev_calculated==0) 
     { 
      int prices1=CopyOpen(Symbol(),0,0,Bars(_Symbol,_Period),Op);
      int prices2=CopyHigh(Symbol(),0,0,Bars(_Symbol,_Period),Hi); 
      int prices3=CopyLow(Symbol(),0,0,Bars(_Symbol,_Period),Lo); 
      int prices4=CopyClose(Symbol(),0,0,Bars(_Symbol,_Period),Cl); 
      int prices5=CopyTime(Symbol(),0,0,Bars(_Symbol,_Period),time); 

     } 
   else 
     { 

      int prices1=CopyOpen(Symbol(),0,0,1,Op);
      int prices2=CopyHigh(Symbol(),0,0,1,Hi); 
      int prices3=CopyLow(Symbol(),0,0,1,Lo); 
      int prices4=CopyClose(Symbol(),0,0,1,Cl);     
      int prices5=CopyTime(Symbol(),0,0,1,time);     
       }   
      for(int i=rates_total-1;i>=0 && !IsStopped();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------

Simplificado assim, CopyOpen I understand is supfluous for OnCalculate, but so it sees the history from the terminal window?

 
mwwm:

Simplificado, o CopyOpen é desnecessário para a OnCalculate, mas então ele vê apenas a história a partir da janela do terminal?

Array mas é criado com tamanho zero em cada carrapato e não muda seu tamanho em nenhum outro lugar. Portanto, qualquer acesso a ele causará a ultrapassagem da matriz.

Para resolver o problema, devemos redimensioná-lo para o tamanho, que conterá leituras de todas as barras do histórico, ou ligá-lo ao buffer indicador (declarado como uma variável global do programa). Se eu entender corretamente, estes valores devem ser exibidos usando o indicador.

 
mwwm:

Simplificado, CopyOpen I understand is supfluous for OnCalculate, but so it sees the history from the terminal window?

Exemplo:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "Open/Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries(BufferOC,true);
//---
   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[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<1) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total-1;                   // установим начало цикла на начало исторических данных
      ArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(close[i]==0) continue;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko:

A matriz de massa é criada com tamanho zero em cada carrapato e não muda seu tamanho em nenhum outro lugar. Portanto, qualquer referência a ela causará a saída da matriz.

Para resolver o problema, você deve redimensioná-lo para o tamanho que conterá as leituras de todas as barras do histórico, ou ligá-lo ao buffer indicador (declarado como uma variável global do programa). Se eu entendi corretamente, são estes valores que devem ser exibidos usando o indicador.

Meu erro, mas[] realmente deveria ser uma matriz global, mas o tampão indicador também não é adequado, ele será antes uma matriz multidimensional intermediária. Qual é a melhor maneira de determinar o tamanho ideal da matriz para M5, não através de um buffer indicador?

 
mwwm:

Minha imprecisão, mas[] é realmente uma matriz global, mas um tampão indicador também não é adequado, ao contrário, seria uma matriz multidimensional intermediária. Qual é a melhor maneira de determinar o tamanho ideal da matriz para M5, não através de um buffer indicador?

Eu não entendo o que quero dizer com multidimensional. Estamos falando de uma matriz unidimensional. Além disso, na MQL4, a dimensão máxima de uma matriz é 4.

Para fazer a matriz do mesmo tamanho que as séries cronológicas, devemos redimensioná-la de acordo com o número de barras disponíveis no gráfico para o símbolo e período necessários:

double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return;
}

ArraySetAsSeries(fArray, true);
 
mwwm:

Minha imprecisão, mas[] é realmente uma matriz global, mas o tampão indicador também não é adequado, ao invés disso, seria uma matriz multidimensional intermediária. Qual é a melhor maneira de determinar o tamanho ideal da matriz para M5, não através de um buffer indicador?

Por que você não quer usar arrays como amortecedores indicadores? Eles são monitorados pelo subsistema, o que facilita seu trabalho.

E a matriz intermediária de indicadores é fácil de fazer:

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

Olá.

Os volumes na plataforma são volumes de carrapatos, haverá volumes reais?

 
Олег Литинский:

Olá.

Na plataforma, os volumes estão correndo, haverá algum volume real?

Não vai. Use o MT5, alguns corretores fornecem volumes reais lá.

 

Boa tarde!

Por favor, ajude com o seguinte problema:

1) Após algumas condições serem cumpridas, uma ordem pendente é aberta:

{
price=High[1]+OrderPoint*Point;
stoploss=Low[1]-Point;
takeprofit=price+price-stoploss;
OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit);
}

Por favor, diga-me o que acrescentar e onde apagar uma ordem pendente, se o preço já tiver passado, pare a perda (desta ordem pendente).

Desculpe pela pergunta estúpida, eu me perdi nos fóruns enquanto procurava uma resposta.

Obrigado de antemão!

Razão: