Como codificar? - página 304

 

...

1. Em geral, não, não adianta verificar, pois a maioria das vezes você terá muito mais barras do que precisa para uma média móvel "estabilizar" . Não é um bug antigo, mas é uma simples verificação de quantas barras há na história

2. Sim. Apenas tenha em mente que desde iClose() (são as similares iOpen(), iHigh() e iLow()) são funções enquanto Close[],Open,High[],Low[] é uma matriz simples com acesso muito, muito mais rápido aos valores, então você tem que pesar se você realmente precisa da flexibilidade da função sobre a velocidade e simplicidade do acesso às matrizes

zzz:
Olá, sou novo em programação, mas não sou novo em negociação. Eu não postei nada por um tempo e agora, desde que comecei a desenvolver meu EA, tenho muitas perguntas. Comecei a construir um indicador primeiro, e uma vez que ele faça o que eu quero, irei mais longe. Li todos os manuais que pude encontrar, então agora é hora de seguir em frente com a codificação.

Desculpe, se for um tópico errado - por favor, me avise onde devo postar tais perguntas então.

Eu tenho 2 perguntas básicas, provavelmente, por enquanto, por favor:

1. Em muitos indicadores que usam MAs vejo linhas que verificam quantas barras estão no gráfico. Então, se eu precisar do MA200 e o gráfico tiver, digamos, apenas 100 barras, o iMA200 funcionaria então? Eu acho que sim - eu verifiquei e qualquer MA é desenhado sem qualquer problema em qualquer gráfico, então eu acho que este é um erro antigo que Metaquotes corrigido agora. Então, há algum ponto de verificar quantas barras há no gráfico para desenhar MA ou usar a função iMA?

2. Qual é a diferença entre Close e iClose? Meu entendimento é que Close pode retornar um fechamento das barras somente no gráfico atual, e iClose pode retornar qualquer fechamento de qualquer par de moedas e qualquer período de tempo. E em ambos os casos, a fim de obter uma última barra fechada, tenho que usar índice [1]. Estou vendo isso corretamente?

Obrigado.
 

DoubleStochastic para MT4, verdadeiro DoubleStochastic

Olá pessoal - novo usuário do MT4.

Estou lutando para encontrar o indicador DoubleStochastic para o MT4. Era o meu indicador favorito na plataforma VTT. E quero dizer DoubleStochastic REAL - não o DoubleStochastic Bressert que dá uma indicação totalmente diferente do DoubleStochastic original. Veja arquivo anexo - o Double do VTT dá indicações um pouco diferentes do Double do MT4:

Alguém pode me ajudar a codificar o DoubleStochastic do VTT'2 para MT4? Aqui está o código e a lógica do VTT:

Fast %K = ((Fechado hoje - Mais baixo em %K Períodos) / (Mais alto alto em %K Períodos - Mais baixo em %K Períodos)) * 100

Abrandamento %K = Média móvel do período N de Fast %K

Duplo %K = ((Abrandamento de hoje %K - Abrandamento mais baixo %K em %K Períodos %K) / (Abrandamento mais alto %K em %K Períodos %K - Abrandamento mais baixo %K em %K Períodos %K) * 100

Dupla desaceleração %K = média móvel do período N Dupla %K

%D = média móvel simples de 3 períodos de Dupla Abrandamento %K

e o próprio código:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLLV(St,K))/(HHV(St,K)-LLLV(St,K)))*100,Sl,Mt);

DStD:= Mov((DSt,D,MtD));

Alguém fluente em MT4?

Eu me acostumei tanto à versão do VTT que não posso usar outra.

 

...

... gmailer

Postado um estocástico duplo aqui : https://www.mql5.com/en/forum/177239/page28 (a fim de manter todas as versões de estocástico em um só lugar)

Eu acho que é o que você está procurando

gmailer:
Olá pessoal - novo usuário do MT4.

Estou lutando para encontrar o indicador DoubleStochastic para MT4. Era o meu indicador favorito na plataforma VTT. E quero dizer DoubleStochastic REAL - não o DoubleStochastic Bressert que dá uma indicação totalmente diferente do DoubleStochastic original. Veja arquivo anexo - o Double do VTT dá indicações um pouco diferentes do Double do MT4:

Alguém pode me ajudar a codificar o DoubleStochastic do VTT'2 para MT4? Aqui está o código e a lógica do VTT:

Fast %K = ((Fechado hoje - Mais baixo em %K Períodos) / (Mais alto alto em %K Períodos - Mais baixo em %K Períodos)) * 100

Abrandamento %K = Média móvel do período N de Fast %K

Duplo %K = ((Abrandamento de hoje %K - Abrandamento mais baixo %K em %K Períodos %K) / (Abrandamento mais alto %K em %K Períodos %K - Abrandamento mais baixo %K em %K Períodos %K) * 100

Dupla desaceleração %K = média móvel do período N Dupla %K

%D = média móvel simples de 3 períodos de Dupla Abrandamento %K

e o próprio código:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLLV(St,K))/(HHV(St,K)-LLLV(St,K)))*100,Sl,Mt);

DStD:= Mov((DSt,D,MtD));

Alguém fluente em MT4?

Acostumei-me tanto à versão do VTT que não posso usar outra.
 

^ Obrigado - talvez seja isso. Você sabe como se livrar daqueles "pontos verdes e rosados" na parte de baixo e no topo?

 

obrigado mladen. faz sentido.

 

Olá a todos,

Estou me esforçando para encontrar uma maneira de desencadear o comércio quando minha linha estocástica cruza dentro da região de overbrought(80) ou oversold(20). Sou capaz de acionar um comércio quando minha linha cruza, porém não sou capaz de configurá-lo para acionar um comércio SOMENTE quando ele está na região de overbrought ou overbrought(20). Alguém tem alguma idéia de como eu posso fazer isso ou há algum outro lugar onde eu possa me referir?

Encontrei alguns sites que disseram algo sobre definir alguns valores para 20,1 e 80,1, mas nada mais.

Por favor, ajude-me a lançar alguma luz. Obrigado.

Cumprimentos

Terrance

 

...

... Terrance,

Aqui está um tópico com algum código prático que poderia ser usado como exemplo para o que você precisa : https://www.mql5.com/en/forum/179114

tkuan77:
Olá a todos,

Estou me esforçando para encontrar uma maneira de desencadear o comércio quando minha linha estocástica cruza dentro da região de overbrought(80) ou oversold(20). Sou capaz de acionar um comércio quando minha linha cruza, porém não sou capaz de configurá-lo para acionar um comércio SOMENTE quando ele está na região de overbrought ou overbrought(20). Alguém tem alguma idéia de como eu posso fazer isso ou existe algum outro lugar onde eu possa me referir?

Encontrei alguns sites que disseram algo sobre definir alguns valores para 20,1 e 80,1, mas nada mais.

Por favor, ajude-me a lançar alguma luz. Obrigado.

Cumprimentos

Terrance
 

Olá, corrigi as funções e estou feliz com elas agora. Parece bom. No entanto, o registro de resultados comerciais quando eu faço o backtest contém apenas 1 ordem de compra. Acho que pode ter a ver com minha função GetLots, mas não estou 100%, apesar de ter olhado várias vezes para ela - você se importaria de olhar para ela e me avisar se você encontrar algo errado? Obrigado.

//--- Função para calcular lotes para posições longas

duplo GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

duplo MinLots, MaxLots, LotStep;

int LotDigit = 2;

duplo LotsLong = 0;

MinLotes = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lotes precisam ser normalizados para acomodar o LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // A normalização não arredonda, mas corta qualquer parte do lote que seja maior que LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Dessa forma, o risco é um pouco menor.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotStep == 1,00) LotDigit = 0;

if (LotStep == 0,10) LotDigit = 1;

if (LotStep == 0,01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

se (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

retorno (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

se (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

retorno (LotsLong);

}

 

...

GetLots() no formulário que afixei é testado e funciona como deveria. Não há necessidade de nenhuma alteração. Use-o como uma função que determinará o tamanho do lote no momento da abertura do pedido. Mantenha o resto da lógica fora dela (essa função deve fazer apenas isso: descobrir o tamanho do pedido dependendo do risco, parar a perda e o estado atual da conta ).

Sem o resto do código, não posso ajudá-lo. Seria como se eu pudesse olhar através de um pequeno buraco e ver o mundo inteiro. Impossível. Se você quiser manter o resto do código em segredo, tudo o que eu posso ajudar é com o código que você postou aqui, e repito: tenha certeza de que GetLots() na forma original funciona como deveria e deve ser usado em sua forma original.

Se você quiser usá-lo com resultados variáveis, altere o risco ou o stop loss feed para ele dinamicamente ("decida" o risco ou o stop loss no código antes de GetLots() e então o chame com aqueles riscos alterados ou stop loss - a função calculará corretamente para determinados inputs aletered) Não há necessidade de alterar o código da função

crsnape@btinternet.com:
Olá, corrigi as funções e estou feliz com elas agora. Parece bom. No entanto, o registro de resultados comerciais quando eu faço o backtest contém apenas 1 ordem de compra. Acho que pode ter a ver com minha função GetLots, mas não estou 100%, apesar de ter olhado várias vezes para ela - você se importaria de olhar para ela e me avisar se você encontrar algo errado? Obrigado.

//--- Função de cálculo de lotes para posições longas

duplo GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

duplo MinLots, MaxLots, LotStep;

int LotDigit = 2;

duplo LotsLong = 0;

MinLotes = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lotes precisam ser normalizados para acomodar o LotStep.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // A normalização não arredonda, mas corta qualquer parte do lote que seja maior que LotStep.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Dessa forma, o risco é um pouco menor.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotStep == 1,00) LotDigit = 0;

if (LotStep == 0,10) LotDigit = 1;

if (LotStep == 0,01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

se (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

retorno (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

se (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

retorno (LotsLong);

}
 

Oi mladen concordo inteiramente com você, a função GetLots que você forneceu funciona como deveria; testei-a como parte do meu código e funcionou.

Fiz mudanças nele simplesmente porque quero mudar meu perímetro de risco, dependendo se estou ganhando ou perdendo. Basicamente, elaborei o código existente (ou tentei de qualquer forma) incorporando regras adicionais de gerenciamento de dinheiro.

Posso dizer honestamente que meu código não é secreto; tenho certeza que muitos outros consideraram e implementaram em código o que estou tentando fazer; mas suponho que haja um elemento de privacidade porque eu pessoalmente passei muito tempo desenvolvendo-o.

Vou continuar revendo meu código, obviamente quero tentar resolver qualquer problema eu mesmo, pois tenho orgulho de aprender e fazer as coisas a partir do zero.

Mas entendo seu parágrafo final; usarei uma variável "Risco" e mudarei este risco de acordo com o resultado de uma função.

De qualquer forma, obrigado por responder mais uma vez, este fórum honestamente não seria o mesmo sem você; você já me ajudou inúmeras vezes.

Saúde :-)