Como codificar? - página 305

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

Desculpe - eu estava na verdade olhando para meu outro Stoch onde tais pontos estão presentes. O sugerido em resposta ao meu primeiro post estava OK. Obrigado!

 

Talvez apenas um conselho :

Quando você tiver um "tijolo" (uma função, um trecho, uma parte do código) que funcione bem, não o altere. As funções são boas porque você pode mudar suas entradas e elas funcionam de acordo com as entradas. E, uma vez testadas as funções em todos os tipos de situações, você não precisa pensar se elas funcionam bem. Dessa forma, você pode restringir o código que você tem que ver ao procurar por erros (e isso pode acelerar imensamente o tempo de desenvolvimento).

crsnape@btinternet.com:
Olá, 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 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.

Abraço :-)
 

Algo que eu não tenho certeza é sobre os colchetes de funções e o que vai dentro deles.

Se eu escrever uma função dentro de uma função, preciso colocar este nome de função dentro dos colchetes?

Por exemplo, se eu tiver uma função LastOpenTicket() e esta for chamada dentro de uma função chamada GetLots, preciso colocar LastOpenTicket() entre colchetes, como GetLots (LastOpenTicket())?

Eu também preciso colocar o () lá também? E se seu LastOpenTicket (número int, dígito int, outro intone), tudo isso é colocado na função GetLots Bracket também neste caso, por exemplo, GetLots (número int, dígito int, outro intone... e quaisquer outras variáveis na função etc?)

 

...

1. Imagine o par {} entre parênteses como "início" e "fim".

2. Você não pode escrever funções aninhadas em mql (pascal permite isso, mas mql não permite - funções aninhadas estariam declarando uma função dentro do corpo de outras funções. Veja aqui : Função aninhada - Wikipedia, a enciclopédia livre). Você pode fazer uma chamada para qualquer função em qualquer parte de seu código.

3. você pode usar essa forma de chamada (uma chamada direta, como seu exemplo GetLots (LastOpenTicket())) ou você pode atribuir o retorno do LastOpenTicket() a alguma variável e depois usá-lo como argumento em uma chamada para GetLots()

crsnape@btinternet.com:
Algo que eu não tenho certeza é sobre os parênteses das funções e o que vai dentro delas.

Se eu escrever uma função dentro de uma função, preciso colocar este nome de função dentro dos parênteses?

Por exemplo, se eu tiver uma função LastOpenTicket() e esta for chamada dentro de uma função chamada GetLots, preciso colocar LastOpenTicket() entre colchetes, como GetLots (LastOpenTicket())?

Também preciso colocar o () lá dentro? E se seu LastOpenTicket (número int, dígito int, outro intone), tudo isso for colocado na função GetLots Bracket também neste caso, por exemplo, GetLots (número int, dígito int, outro intone... e quaisquer outras variáveis na função etc?)
 

Qual é a diferença entre estes dois? Existe alguma?

duplo GetLots (número int, int call, int specialcall, int order)

{

e...

duplo GetLots ()

{

número int;

int chamada;

int chamada especial;

ordem int;

?

 

...

A primeira é uma função que aceita argumentos

A segunda é uma função sem argumentos para que você não possa alterar os valores "número", "chamada", "chamada especial" e "ordem" fora do corpo da função

Mais algumas informações úteis sobre funções de declaração podem ser encontradas neste tópico : https://www.mql5.com/en/forum/173005

crsnape@btinternet.com:
Qual é a diferença entre estes dois? Existe alguma?

duplo GetLots (número int, int call, int specialcall, int order)

{

e...

duplo GetLots ()

{

número int;

int chamada;

int chamada especial;

ordem int;

?
 

Tenho brincado com minhas funções nos últimos dois dias e ainda estou obtendo resultados em branco. Estou literalmente arrancando meus cabelos.

Mudei a função para calcular o RiskSize como você sugeriu (concordo que agora é um sistema melhor) e usei isso em minha função GetLots. É isso mesmo:

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

duplo GetLotsLong (duplo SLDistanceLong)

{

RefreshRates();

duplo MinLots, MaxLots, LotStep;

duplo LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

MinLots = 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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

retorno (LotsLong);

}

Também reclama RiskLong - variável não definida. Mas isto é definido sob a função GetRiskLong, que é sua vocação.

Se é difícil ajudar apenas com o código que coloquei, poderia eu enviá-lo a você?

 

...

Antes de mais nada, não há necessidade de fazer lotes separados para um longo e para um curto. Use uma função (que já foi fornecida a você) para ambos os tipos de pedidos (calcular o tamanho do lote para ambos, curto e longo, deve ser exatamente o mesmo) Basta alterar o risco ou a distância de stop loss, se você desejar um cálculo diferente

O erro que você está recebendo é porque as variáveis declaradas dentro das funções são "visíveis" apenas dentro das funções. Não importa que você esteja chamando a função que tem uma variável chamada o nome que você está dizendo: ela é local apenas para a função chamada, outras partes do código não "sabem" sobre ela e não podem acessá-la.

crsnape@btinternet.com:
Tenho brincado com minhas funções nos últimos dois dias e ainda estou obtendo resultados em branco. Estou literalmente arrancando meus cabelos.

Mudei a função para calcular o RiskSize como você sugeriu (concordo que agora é um sistema melhor) e usei isso em minha função GetLots. É isto mesmo:

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

duplo GetLotsLong (duplo SLDistanceLong)

{

RefreshRates();

duplo MinLots, MaxLots, LotStep;

duplo LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

MinLots = 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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

retorno (LotsLong);

}

Também reclama RiskLong - variável não definida. Mas isto é definido sob a função GetRiskLong, que é sua vocação.

Se é difícil ajudar apenas com o código que coloquei, poderia enviá-lo a você?
 
mladen:
Primeiro é uma função que aceita argumentos

A segunda é uma função sem argumentos para que você não possa alterar os valores "número", "chamada", "chamada especial" e "ordem" fora do corpo da função

Mais algumas informações úteis sobre funções de declaração podem ser encontradas neste tópico : https://www.mql5.com/en/forum/173005

Obrigado por isso. Então, se estou chamando uma função chamada GetRisk de dentro de uma função chamada GetLots, eu precisaria colocar as variáveis da função GetRisk nos colchetes (...) da GetLots porque os valores são calculados fora da função GetLots?

 

...

Deixe-me tentar desta forma :

2 perguntas (assumindo que conhecemos o estado atual da conta) :

pergunta 1 : estou disposto a arriscar (não sei)% com (não sei) pips stop loss. Qual deveria ser o tamanho dos meus lotes?

pergunta 2 : Estou disposto a arriscar 1% com 100 pips stop loss. Qual deve ser o tamanho do meu lote?

É óbvio que a resposta à primeira pergunta é impossível, pois você não sabe o percentual de risco que estou disposto a arriscar nem o stop loss que vou usar. Mas no segundo exemplo é possível calcular o tamanho do lote, uma vez que você conhece todos eles. Agora esses são argumentos: como prevemos que rsik% e stop loss podem variar, fornecemos esses para o cálculo do tamanho do lote como argumentos variáveis que serão "ditos" para a função cada vez que a função for chamada

Espero que isto esclareça para que servem os argumentos (parâmetros) em funções. Cada função funciona sobre o mesmo princípio: se você prevê que alguma parte do cálculo pode ser feita, coloque-a como um argumento para a função

Aqui estão mais alguns exemplos de funções de codificação : https://en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
Obrigado por isso. Então, se estou chamando uma função chamada GetRisk de dentro de uma função chamada GetLots, eu precisaria colocar as variáveis da função GetRisk nos colchetes (...) da GetLots porque os valores são calculados fora da função GetLots?