Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 513

 
mwwm:

¿cómo hacerlo correctamente?

¿Cómo se hace?
 
Artyom Trishkin:
¿Cómo se hace?
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 así, CopyOpen entiendo que es superfluo para OnCalculate, pero ¿para que sólo vea el historial de la ventana de la terminal?

 
mwwm:

Simplificando, CopyOpen es innecesario para OnCalculate, pero ¿para que vea sólo el historial de la ventana de la terminal?

El array mas se crea con tamaño cero en cada tick y no cambia su tamaño en ningún otro lugar. Por lo tanto, cualquier acceso a la misma causará un desbordamiento de la matriz.

Para resolver el problema, debemos redimensionar el tamaño, que contendrá las lecturas de todas las barras de la historia, o vincularlo al buffer del indicador (declarado como una variable global del programa). Si lo he entendido bien, estos valores deberían mostrarse con el indicador.

 
mwwm:

Simplificado, CopyOpen entiendo que es superfluo para OnCalculate, pero ¿para que sólo vea el historial de la ventana del terminal?

Ejemplo:

//+------------------------------------------------------------------+
//|                                                         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:

El array mas se crea con un tamaño cero en cada tick y no cambia su tamaño en ningún otro lugar. Por lo tanto, cualquier referencia a ella provocará la salida del array.

Para resolver el problema, debe redimensionarlo al tamaño que contendrá las lecturas de todas las barras del historial, o vincularlo al buffer del indicador (declarado como una variable global del programa). Si lo he entendido bien, son estos valores los que se deben mostrar con el indicador.

Error mío, mas[] debería ser realmente un array global, pero el buffer de indicadores tampoco es adecuado, será más bien un array multidimensional intermedio. ¿Cuál es la mejor manera de determinar el tamaño óptimo de la matriz para M5, no a través del buffer indicador?

 
mwwm:

Mi imprecisión, mas[] es realmente un array global, pero el buffer indicador tampoco es adecuado, más bien sería un array multidimensional intermedio. ¿Cuál es la mejor manera de determinar el tamaño óptimo de la matriz para M5, no a través del buffer indicador?

No entiendo a qué me refiero con lo de multidimensional. Estamos hablando de un array unidimensional. Además, en MQL4 la dimensión máxima de un array es 4.

Para que la matriz tenga el mismo tamaño que la serie temporal, debemos redimensionarla según el número de barras disponibles en el gráfico para el símbolo y el periodo necesarios:

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

ArraySetAsSeries(fArray, true);
 
mwwm:

Mi imprecisión, mas[] es realmente un array global, pero el buffer indicador tampoco es adecuado, más bien sería un array multidimensional intermedio. ¿Cuál es la mejor manera de determinar el tamaño óptimo de la matriz para M5, no a través de un buffer indicador?

¿Por qué no quieres utilizar matrices como topes indicadores? El subsistema los supervisa, lo que facilita su trabajo.

Y la matriz del buffer de indicadores intermedios es fácil de hacer:

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

Hola.

Los volúmenes de la plataforma son volúmenes de ticks, ¿habrá volúmenes reales?

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

Hola.

En la plataforma, los volúmenes están en marcha, ¿habrá volúmenes reales?

No lo hará. Utilice MT5, algunos corredores proporcionan volúmenes reales allí.

 

¡Buenas tardes!

Por favor, ayuda con el siguiente problema:

1) Cuando se cumplen algunas condiciones, se abre una orden pendiente:

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

Por favor, díganme qué añadir y dónde eliminar una orden pendiente si el precio ya ha pasado el stop loss (de esta orden pendiente).

Perdón por la pregunta estúpida, me perdí en los foros mientras buscaba una respuesta.

Gracias de antemano.

Razón de la queja: