Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 721

 
sile:

Hola.

Por favor, ayuda.

Señal cuando las líneas del indicador se cruzan en la primera barra.

La posición se abre correctamente en la primera barra si el desplazamiento ma_shiftT = 0 y ma_shiftD = 0. Si el desplazamiento ma_shiftT = -1 y ma_shiftD = 1, la posición se abre en la tercera o cuarta barra.

¿Qué debo hacer para abrir una posición si se cruza en la primera barra?


input int      ma_shiftT=-1;
input int      ma_shiftD=1;
int iTEMAHandle;   // хэндл индикатора iTEMA
int iDEMAHandle;    // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений  для каждого бара
double maVal[];  // 

//+------------------------------------------------------------------+
int OnInit()
  {
//---
m_symbol.Name(Symbol());  
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(iTEMAHandle);

   IndicatorRelease(iDEMAHandle);
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  //--- массив значений индикатора
   ArraySetAsSeries(ma1Val,true);

//--- массив значений индикатора
   ArraySetAsSeries(maVal,true);
  
  if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return;
     }
//====
  if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
     {
      Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
      return;
     }

   bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
   bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
  
   if(Sell_Condition_3 && Sell_Condition_4)
   {
   // открываю позицию SELL
   }
  }

Primero: ¿Por qué copiar 5 valores de indicadores si sólo se utiliza uno?

Segundo: La posición de las líneas indicadoras no indica su cruce.

Basta con copiar 2 valores, empezando por el primero.

CopyBuffer(iTEMAHandle, 0, 1, 2, ma1Val)

CopyBuffer(iDEMAHandle, 0, 1, 2, maVal)

La única manera de determinar si hay una intersección es comparar la posición de las líneas en la segunda barra y la primera. PARA LA TAREA EN CUESTIÓN.

Es necesario tener en cuenta la dirección de la indexación del array. En este caso obtendremos

if(maVal[0] <= ma1Val[0] && maVal[1] > ma1Val[1])

Si la condición se cumple, el hecho de la intersección es evidente. La dirección de la intersección puede ser determinada por usted mismo.


ps; Oh, cierto... No me fijé bien en la definición del hecho de la intersección. En cualquier caso, los valores adicionales no son necesarios. Probablemente son lo que te ha despistado.

 
sile:

Hola.

Por favor, ayuda.

Señal cuando las líneas del indicador se cruzan en la primera barra.

La posición se abre correctamente en la primera barra si el desplazamiento ma_shiftT = 0 y ma_shiftD = 0. Si el desplazamiento ma_shiftT = -1 y ma_shiftD = 1, la posición se abre en la tercera o cuarta barra.

¿Qué debo hacer para abrir una posición cuando se cruza en la primera barra?


input int      ma_shiftT=-1;
input int      ma_shiftD=1;
int iTEMAHandle;   // хэндл индикатора iTEMA
int iDEMAHandle;    // хэндл индикатора
double ma1Val[]; // динамические массивы для хранения численных значений  для каждого бара
double maVal[];  // 

//+------------------------------------------------------------------+
int OnInit()
  {
//---
m_symbol.Name(Symbol());  
//--- Получить хэндл индикатора iTEMA
iTEMAHandle=iTEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftT,PRICE_CLOSE);;
//---Получить хэндл индикатора
iDEMAHandle=iDEMA(_Symbol,PERIOD_CURRENT,30,ma_shiftD,PRICE_CLOSE);;
  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(iTEMAHandle);

   IndicatorRelease(iDEMAHandle);
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  //--- массив значений индикатора
   ArraySetAsSeries(ma1Val,true);

//--- массив значений индикатора
   ArraySetAsSeries(maVal,true);
  
  if(CopyRates(_Symbol,_Period,0,5,mrate)<0)
     {
      Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
      return;
     }
//====
  if(CopyBuffer(iTEMAHandle,0,0,5,ma1Val)<0)
     {
      Alert("Ошибка копирования буферов индикатора TEMA - номер ошибки:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(iDEMAHandle,0,0,5,maVal)<0)
     {
      Alert("Ошибка копирования буферов индикатора DEMA - номер ошибки:",GetLastError());
      return;
     }

   bool Sell_Condition_3=(maVal[2]<=ma1Val[2]);
   bool Sell_Condition_4=(maVal[1]>ma1Val[1]);
  
   if(Sell_Condition_3 && Sell_Condition_4)
   {
   // открываю позицию SELL
   }
  }

He adjuntado un ejemplo para ayudarte - en este ejemplo no estoy copiando varios valores, sino uno a la vez. Comparando lo que devuelve mi ejemplo y lo que devuelve el tuyo, deberías ver - cómo se produce la indexación en las matrices de tu ejemplo (es decir, deberías entender dónde se almacena un elemento de la barra 1 en la matriz y dónde se almacena un elemento de la barra 2).

Cómo trabajar con mi ejemplo:

He creado y guardado una plantilla de gráfico específicamente para la configuración del ejemplo con el mismo nombre que el ejemplo - "Two iMA Shift minus shift plus.tpl". Guarde esta plantilla en la carpeta \MQL5\Profiles\Templates de su terminal. Ahora cuando ejecute el probador, el probador recogerá esta plantilla y tendrá una imagen tan bonita en el probador:

Sin título

Cuando detecte una intersección, el probador se detendrá en la directiva

//---
   if(ma_one_1<ma_two_1 && ma_one_2>ma_two_2)
     {
      string text="ma_one_1 = "+DoubleToString(ma_one_1,Digits()+1)+"\n"+
                  "ma_two_1 = "+DoubleToString(ma_two_1,Digits()+1)+"\n"+
                  "ma_one_2 = "+DoubleToString(ma_one_2,Digits()+1)+"\n"+
                  "ma_two_2 = "+DoubleToString(ma_two_2,Digits()+1);
      Comment(text);
      DebugBreak();
     }

y podrá en el probador, mediante el "Crosshair", desplazarse sobre las barras y ver los valores de los indicadores en la barra 1 y en la barra 2 (preincluir la "ventana de datos").

 

¡Hola!

Tengo una pregunta sobre el spread en FOREX.

Cuando el diferencial se amplía, ¿se eleva el ASK y se reduce el BID o ambos se mueven simétricamente en direcciones diferentes?

 
Sergey Zhukov:

¡Hola!

Tengo una pregunta sobre el spread en FOREX.

Cuando el diferencial se amplía, ¿sube el ASK, baja el BID o ambos se mueven simétricamente en distintas direcciones?

Puede ser de cualquier manera. Una cosa sigue siendo la misma: el diferencial es la diferencia entre el precio de compra y el precio de venta.
 
Vladimir Karputov:
Puede ser lo que quieras. Una cosa sigue siendo la misma: el diferencial es la diferencia entre el precio de compra y el precio de venta.
¿He entendido bien que cuando la dispersión comienza a reducirse, pueden acercarse entre sí al mismo tiempo?
 
Sergey Zhukov:
¿He entendido bien que cuando la extensión empieza a reducirse, pueden acercarse al mismo tiempo?

"Una cosa sigue siendo la misma: el diferencial es la diferencia entre el precio de compra y el de venta".

No hay otras leyes.

 
Vladimir Karputov:

"Una cosa sigue siendo la misma: el diferencial es la diferencia entre el precio de compra y el de venta".

No hay otras leyes.

¿Qué opinas, si digamos que tengo una compra y el spread comienza a ampliarse, el Ask sube y el Bid baja, debo cerrar la posición o esperar a que el Ask baje?
 
Sergey Zhukov:
¿Qué opinas, si tengo una compra y el spread comienza a ampliarse, el Ask sube y el Bid baja, debo cerrar la posición o esperar a que el Ask baje?

Una posición de compra (BUY) se cierra al precio Bid.

Otra cosa que probablemente se pregunte es "¿qué hacer en períodos de volatilidad ultra alta?". La respuesta es que cada uno decide de manera diferente.

 
Vladimir Karputov:

Una posición de compra (BUY) se cierra al precio Bid.

Otra cosa que probablemente se pregunte es "¿qué hacer en períodos de volatilidad ultra alta?". La respuesta es que cada uno decide de manera diferente.

Sí, es cierto, a eso me refería con lo de la volatilidad ultra alta, intentaré buscar en el foro, gracias.
 
Vladimir Karputov:

Una posición de compra (BUY) se cierra al precio Bid.

Otra cosa que probablemente se pregunte es "¿qué hacer en períodos de volatilidad ultra alta?". La respuesta es que cada uno decide de forma diferente.

Sí, bueno... Dónde encontrar un corredor de este tipo... ¿Puede darme un enlace?