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

 
mila.com:

Leitura, mas nunca teria adivinhado abrir o arquivo antes do laço )

Talvez eu não o tenha lido com atenção )
Há até um exemplo de leitura linha por linha do início ao fim de um arquivo.
 

Há um consultor especializado, que é guiado pelo Pinbar ao negociar. O robô funciona corretamente em moedas e é totalmente imprevisível em CFDs.

Você pode me dizer como isso pode acontecer?

 
RichLux:

Eu escrevi um robô que é baseado em Pinbar quando se comercializa. O robô funciona corretamente em moedas e completamente imprevisível em CFDs.

Você pode me dizer como isso pode acontecer?

Aqui está tudo para o seu caso.
 

Aqui está a função de definição Pinbar

int Pin() { 
  double Close1 = iClose (_Symbol,_Period,1); 
  double Open1 = iOpen (_Symbol,_Period,1); 
  double Low1 = iLow(_Symbol,_Period,1); 
  double High1 = iHigh (_Symbol,_Period,1); 
  double Close2 = iClose (_Symbol,_Period,2); 
  double Open2 = iOpen (_Symbol,_Period,2); 
  double Low2 = iLow(_Symbol,_Period,2); 
  double High2 = iHigh (_Symbol,_Period,2); 
  if (MathAbs(Close1-Open1)/(High1-Low1)<= BodyPercent) 
    { 
       if(Close1>High1 - BodyLocaut*(High1-Low1)&&Open1>High1-BodyLocaut*(High1-Low1)&&Low1<Low2-nose*_Point && High2>High1) 
          return (1); 
       if(Close1<Low1 + BodyLocaut*(High1-Low1)&&Open1<Low1+BodyLocaut*(High1-Low1)&&High1>High2+nose*_Point && Low2<Low1) 
          return (-1); 
    } 
  return(0); 
}

Quando o inseri no Expert Advisor, a função funciona bem (ou seja, o Expert Advisor estabelece acordos na próxima barra após a barra correspondente às condições da função) para pares de moedas. No entanto, as negociações sobre CFD estão abertas em todos os lugares.

Qual é a diferença entre CFDs e pares de moedas para esta função?

 
RichLux:

Aqui está a função de definição Pinbar

Quando o inseri no Expert Advisor, a função funciona bem (ou seja, o Expert Advisor estabelece acordos na próxima barra após a barra correspondente às condições da função) para pares de moedas. No entanto, as negociações sobre CFD estão abertas em todos os lugares.

Qual é a diferença entre CFDs e pares de moedas para esta função?

Primeiro de tudo, substitua todos && por {} para que cada uma das condições esteja em seu próprio bloco - então você pode desimprimir o resultado testado em cada bloco - veja quais valores você obtém no registro.
 
Artyom Trishkin:
Primeiro de tudo, substitua todos && por {} para que cada uma das condições estivesse em seu próprio bloco - depois você pode em cada bloco desenrolar o resultado testado - veja em log que valores você obtém.

Obrigado, segui o conselho e entendi onde eu estava errando. Porque minha EA estava se movendo em 5 dígitos e o CFD é de apenas 2 dígitos e eu esperava que a EA reagisse a um mínimo de 50 pips e obtive a reação de 5 pips. Fiz asneira.

Por favor, ajude-me com este aspecto.

Existe tal parte no código:

MathAbs(Close1-Open1)/(High1-Low1)

Às vezes acontece que High1=Low1. O testador então gera o erro crítico dizendo que não pode dividir por zero.

Como contornar isso?

 
RichLux:

Obrigado, segui o conselho e entendi onde eu estava errando. Porque minha EA estava se movendo em 5 dígitos e o CFD é de apenas 2 dígitos e eu esperava que a EA reagisse a um mínimo de 50 pips e obtive a reação de 5 pips. Fiz asneira.

Por favor, ajude-me com este aspecto.

Existe tal parte no código:

Às vezes acontece que High1=Low1. O testador então gera o erro crítico dizendo que não pode dividir por zero.

Como contornar isso?

Você pode fazer isso sem pensar:

MathAbs((Close1-Open1)/(High1-Low1>0?High1-Low1:0.00001))
 

Olá, encontrei um problema durante a compilação:


nulo OnTick()

{

preço mínimo duplo=99999999, mp, preço máximo=-99999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

se (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

se (mp > maxprice)

maxprice = mp;

}

Comentário ("Minprice: " + DoubleToString(minprice, 5) + "\n" + "\n" +

"Maxprice: " + DoubleToString(maxprice, 5));

}


O código fonte contém funções que o compilador jura por iLow e iHigh e variável Simbol() ali em modo string, mas resolve outro problema no exemplo. O que eu preciso consertar no código acima. Estou preso e não consigo compilar o laço para verificá-lo.

DO LIVRO DIDÁTICO

Se você quiser obter o valor correspondente à barra incompleta atual, então

você pode usar a primeira forma da chamada, especificando start_pos=0 e count=1.

Exemplo:

#property copyright "2009, MetaQuotes Software Corp."

#link da propriedade "https://www.mql5.com"

#propriedade versão "1.00"

#Descrição da propriedade "Exemplo de saída de valores altos[i] e baixos[i]".

#Descrição da propriedade "para barras escolhidas aleatoriamente".

duplo Alto[],Baixo[];

//+------------------------------------------------------------------+

//| Get Low para um determinado número de barras |

//+------------------------------------------------------------------+

duplo iLow(string symbol,ENUM_TIMEFRAMES timeeframe,int index)

{

duplo baixo=0;

ArraySetAsSeries(baixo, verdadeiro);

int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);

if(copy>0 && index<copied) low=Low[index];

retorno(baixo);

}

//+------------------------------------------------------------------+

//| Obtenha Alto para o número de barra dado |

//+------------------------------------------------------------------+

duplo iHigh(string symbol,ENUM_TIMEFRAMES timeeframe,int index)

{

dobro alto=0;

ArraySetAsSeries(alto, verdadeiro);

int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);

if(copy>0 && index<copied) high=High[index];

retorno(alto);

}

//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

Olá, encontrei um problema durante a compilação:


nulo OnTick()

{

preço mínimo duplo=99999999, mp, preço máximo=-99999999;

for(int i=0; i<10; i++)

{

mp = iLow(Simbol(), PERIOD_CURRENT, i);

se (mp < minprice)

minprice = mp;

}


for(int i=0; i<10; i++)

{

mp = iHigh(Simbol(), PERIOD_CURRENT, i);

se (mp > maxprice)

maxprice = mp;

}

Comentário ("Minprice: " + DoubleToString(minprice, 5) + "\n" + "\n" +

"Maxprice: " + DoubleToString(maxprice, 5));

}


O código fonte contém funções que o compilador jura por iLow e iHigh b variável Simbol() está em modo string ali, mas resolve outro problema no exemplo. O que eu preciso consertar no código acima. Estou preso e não consigo compilar o laço para verificá-lo.

DO LIVRO DIDÁTICO

Se você quiser obter o valor correspondente à barra incompleta atual, então

você pode usar a primeira forma da chamada especificando start_pos=0 e count=1.

Exemplo:

#property copyright "2009, MetaQuotes Software Corp."

#link da propriedade "https://www.mql5.com"

#propriedade versão "1.00"

#Descrição da propriedade "Exemplo de saída de valores altos[i] e baixos[i]".

#Descrição da propriedade "para barras escolhidas aleatoriamente".

duplo Alto[],Baixo[];

//+------------------------------------------------------------------+

//| Get Low para um determinado número de barras |

//+------------------------------------------------------------------+

duplo iLow(string symbol,ENUM_TIMEFRAMES timeeframe,int index)

{

duplo baixo=0;

ArraySetAsSeries(baixo, verdadeiro);

int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);

if(copy>0 && index<copied) low=Low[index];

retorno(baixo);

}

//+------------------------------------------------------------------+

//| Obtenha Alto para o número de barra dado |

//+------------------------------------------------------------------+

duplo iHigh(string symbol,ENUM_TIMEFRAMES timeeframe,int index)

{

dobro alto=0;

ArraySetAsSeries(alto, verdadeiro);

int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);

if(copy>0 && index<copied) high=High[index];

retorno(alto);

}

//+------------------------------------------------------------------+


há um erro nesta palavraSimbol() você deve escrever Symbol() ou _Symbol
 
Sergey Gritsay:

Você tem um erro nesta palavraSimbol() - Símbolo() ou _Símbolo deve ser escrito

Obrigado, o erro no Simbol foi corrigido pela ortografia Símbolo corretamente. Eu tenho algo errado com o iLow e iHigh functions.

Adiferença em % entre MQL4 e MQL5 ? caso contrário, terei que coçar minha cabeça toda vez que passar pelos tutoriais em vídeo da MQL4.

Arquivos anexados:
1.png  64 kb
Razão: