Como codificar? - página 302

 

...

Sim, você pode

A única limitação é que você não se depara com uma "chamada circular" quando esta terminaria com um ciclo morto. Fora isso, nenhuma outra limitação para chamadas de função

crsnape@btinternet.com:
Bem visto. Vou dar uma olhada nisso.

Uma pergunta sobre funções, é possível chamar uma função dentro de uma função? Por exemplo, eu tenho esta função:

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

se (... etc...)

Do que mais tarde eu o chamo:

duplo GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)
 

Introduzi este código para recuperar a última ordem aberta:

//--- Função para calcular o número do bilhete da última ordem aberta

na LastOpenTicket()

{

data/hora últimaTempo = 0;

últimoTicket = -1; // Nenhum aberto.

int pos;

para (pos = OrderTotal() - 1; pos >= 0; pos--)

se (OrderSelect(pos, SELECT_BY_POS) // Somente meus pedidos c/

&& OrderMagicNumber() == MagicNumber // meu número mágico

&& OrderSymbol() == Symbol() // e meu par.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

retorno (lastTicket);

}

É uma função que é chamada a partir de minha função GetLots - o compilador está livre de erros, mas quando eu faço um backtest, a seção de resultados é completamente clara. Não há trocas. Isto se deve ao fato de que a primeira operação não tem nenhuma operação anterior a ser chamada no código acima?

No diário, ele consegue carregar as variáveis externas (das quais carrega o mágico número 42, mas no meu código seu 42552...?) mas nada depois disso.

 

...

Qual é a declaração de seu número mágico ( deve ser int MagicNumber; )

crsnape@btinternet.com:
Introduzi este código para recuperar a última ordem aberta:

//--- Função para calcular o número do bilhete do último pedido aberto

na LastOpenTicket()

{

data/hora últimaTempo = 0;

últimoTicket = -1; // Nenhum aberto.

int pos;

para (pos = OrderTotal() - 1; pos >= 0; pos--)

se (OrderSelect(pos, SELECT_BY_POS) // Somente meus pedidos c/

&& OrderMagicNumber() == MagicNumber // meu número mágico

&& OrderSymbol() == Symbol() // e meu par.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

retorno (lastTicket);

}

É uma função que é chamada a partir de minha função GetLots - o compilador está livre de erros, mas quando eu faço um backtest, a seção de resultados é completamente clara. Não há trocas. Isto se deve ao fato de que a primeira operação não tem nenhuma operação anterior a ser chamada no código acima?

No diário, ele carrega as variáveis externas (das quais carrega o mágico número 42, mas em meu código é 42552...?) mas depois nada mais.
 

Sim, é int MagicNumber = 42557

 

...

Então eu não posso dizer pelo código que você postou porque ele está fazendo errado (porque ele está recebendo o MagicNumber errado, por exemplo). O código deve funcionar se houver alguma ordem aberta com o MagicNumber especificado (ele vai fazer loop através de ordens abertas) Se não houver nenhuma ordem aberta ou os números e símbolos MagicNumbers não corresponderem, ele retornará -1 (como você espera) para que o código esteja correto (teste-o agora, e ele funciona como deveria)

Desculpe, mas como tudo o que posso fazer a partir do código que você postou

crsnape@btinternet.com:
Sim, é int MagicNumber = 42557
 

O que aconteceria no caso de não ter sido aberta nenhuma ordem anterior e esta é a primeira? Eu sei que ele retorna -1 mas o código EA não funcionaria porque minha função GetLots depende de chamar o número do último pedido aberto.

 

Se depender da existência de pelo menos uma ordem previamente aberta, então ela falhará

Acrescente algo como isto em seu estado :

se (LastOpenOrder()==-1)

... então você pode abrir a ordem se todas as demais condições forem atendidas

senão

... verificar a última ordem aberta como antes mais o resto das condições

(apenas fazendo um jogo de adivinhação selvagem como você escreveu suas condições EA agora)

crsnape@btinternet.com:
O que aconteceria no caso de não ter sido aberta nenhuma ordem anterior e esta é a primeira? Eu sei que ele retorna -1 mas o código EA não funcionaria porque minha função GetLots depende de chamar o número do último pedido aberto.
 

Olá, Mladen,

Você sabe como definir o comércio aberto quando a linha estocástica atravessa o nível 20 ou 80?

Por exemplo

Quando a linha estocástica se cruza no nível 20 (sobre-vendido), Longo

Quando o estocástico se cruza no nível 80 (em excesso), Short

Cumprimentos

Ryan

 

Eu acrescentei algumas linhas a este código - é o que usa a função LastOpenTicket() mas ainda não gosta dele. Eu acrescentei a opção -1. Alguma coisa parece errada para você aqui?

//--- Deterime se a ordem de venda anterior é rentável

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

se (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

retornar (WinLossPreviousShort);

}

se ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

retornar (WinLossPreviousShort);

}

}

}

 

...

Por que você não adiciona mais um resultado possível dessa função: algo como quando LastOpenTicket() == -1 então WinLossPreviousShort="Na"

crsnape@btinternet.com:
Eu acrescentei algumas linhas a este código - é o que usa a função LastOpenTicket() mas ainda não gosta dele. Eu acrescentei a opção -1. Alguma coisa parece errada para você aqui?

//--- Deterime se a ordem de venda anterior é lucrativa

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

se (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

retornar (WinLossPreviousShort);

}

se ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

retornar (WinLossPreviousShort);

}

}

}
Razão: