Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 721

 
sile:

Olá.

Por favor, ajudem.

Sinal quando as linhas indicadoras são cruzadas na primeira barra.

A posição abre correctamente na primeira barra se o turno ma_shiftT = 0 e ma_shiftD = 0. Se o turno ma_shiftT = -1 e ma_shiftD = 1, a posição abre na terceira ou quarta barra.

O que devo fazer para abrir uma posição se ela for cruzada no primeiro compasso?


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
   }
  }

Primeiro: Porquê copiar 5 valores indicadores se só se usa um?

Segundo: A posição das linhas indicadoras não indica o seu cruzamento.

É suficiente copiar 2 valores, a partir do primeiro.

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

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

A única forma de determinar se existe um cruzamento é comparar a posição das linhas na segunda barra e na primeira. PARA A TAREFA EM MÃOS.

É necessário considerar a direcção da indexação da matriz. Neste caso, obteremos

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

Se a condição for cumprida, o facto da intersecção é óbvio. A direcção da intersecção pode ser determinada por si mesmo.


ps; Oh, certo... Não olhei cuidadosamente para a definição do facto de intersecção. Bem, em qualquer caso não são necessários valores extra. Foram provavelmente eles que o despistaram.

 
sile:

Olá.

Por favor, ajudem.

Sinal quando as linhas indicadoras são cruzadas na primeira barra.

A posição abre correctamente na primeira barra se o turno ma_shiftT = 0 e ma_shiftD = 0. Se o turno ma_shiftT = -1 e ma_shiftD = 1, a posição abre na terceira ou quarta barra.

O que devo fazer para abrir uma posição quando atravessa na primeira 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
   }
  }

Anexei um exemplo para o ajudar - neste exemplo não estou a copiar múltiplos valores, mas um de cada vez. Ao comparar o que o meu exemplo retorna e o que o seu exemplo retorna, deverá ver - como a indexação ocorre nas matrizes do seu exemplo (ou seja, deverá compreender onde um elemento da barra 1 é armazenado na matriz e onde um elemento da barra 2 é armazenado).

Como trabalhar com o meu exemplo:

Criei e guardei um modelo de gráfico especificamente para as configurações de exemplo com o mesmo nome do exemplo - "Two iMA Shift minus shift plus.tpl". Guarde este modelo na pasta de templates do seu terminal. Agora, quando executar o testador, o testador pegará neste modelo e terá uma imagem tão agradável no testador:

Sem título

Quando detecta uma intersecção, o testador pára na 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();
     }

e poderá no testador, usando "Crosshair" para se mover sobre as barras e ver os valores dos indicadores na barra 1 e barra 2 (pré-incluir a "Janela de dados").

 

Olá!

Tenho uma pergunta sobre a propagação em FOREX.

Quando o spread se alarga, o ASK aumenta, o BID diminui ou ambos se movem simetricamente em direcções diferentes?

 
Sergey Zhukov:

Olá!

Tenho uma pergunta sobre a propagação em FOREX.

Quando o spread se alarga, será que o ASK sobe, o BID desce ou ambos se movem simetricamente em direcções diferentes?

Pode ser de qualquer maneira. Uma coisa continua a ser a mesma - o spread é a diferença entre o preço Ask e o preço Bid.
 
Vladimir Karputov:
Pode ser qualquer coisa que se goste. Uma coisa continua a ser a mesma - o spread é a diferença entre o preço Ask e o preço Bid.
Será que percebi correctamente que quando a propagação começa a diminuir, eles podem mover-se um para o outro ao mesmo tempo?
 
Sergey Zhukov:
Será que percebi correctamente que quando a propagação começa a diminuir, eles podem mover-se um para o outro ao mesmo tempo?

"Uma coisa permanece a mesma - o spread é a diferença entre o preço Ask e o preço Bid".

Não existem outras leis.

 
Vladimir Karputov:

"Uma coisa permanece a mesma - o spread é a diferença entre o preço Ask e o preço Bid".

Não existem outras leis.

O que acham, se eu tiver uma compra e o spread começar a aumentar, Ask sobe e Bid desce, devo fechar a posição ou esperar por Ask para descer?
 
Sergey Zhukov:
O que pensa, se eu tiver uma compra e o spread começar a aumentar, Ask sobe e Bid desce, devo fechar a posição ou esperar até que Ask desça?

Uma compra (posição COMPRAR) é fechada ao preço de Licitação.

Outra coisa que provavelmente está a perguntar é "o que fazer em períodos de ultra-alta volatilidade". A resposta é que todos decidem de forma diferente.

 
Vladimir Karputov:

Uma compra (posição COMPRAR) é fechada ao preço de Licitação.

Outra coisa que provavelmente está a perguntar é "o que fazer em períodos de ultra-alta volatilidade". A resposta é que todos decidem de forma diferente.

Sim, é isso mesmo, era o que eu queria dizer com ultra-alta volatilidade, vou tentar procurar no fórum, obrigado.
 
Vladimir Karputov:

Uma compra (posição COMPRAR) é fechada ao preço de Licitação.

Outra coisa que provavelmente está a perguntar é "o que fazer em períodos de ultra-alta volatilidade". A resposta é que todos decidem de forma diferente.

Sim, bem... Onde encontrar um tal corretor... Pode dar-me um link?