Função TrailingStop - questionável
5 respostas
Mike H.
9 anos atrás #112526
Quando visualizei a função TrailingStop no Editor, percebi que o código era idêntico
tanto para o tipo de ordem BUY quanto para o tipo de ordem SELL.
Eu estava me perguntando por que minhas regras de TrailingStop para minhas negociações a descoberto não estavam sendo ativadas...
A seguir, mostramos como o Assistente de EA escreve a Função: (sublinhei os segmentos em questão) (observe os MagicNumbers diferentes)
double getOrderTrailingStop(int orderMagicNumber, int orderType, double price) {
double value = 0;
se (orderMagicNumber == 2456) {
value = ( 11 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
valor = lance - valor;
{} else {
valor = Ask + valor;
}
}
O mesmo acontece com o OrderBreakEven:
}
Se (orderMagicNumber == 3798) {
value = ( 11 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
valor = lance - valor;
{} else {
valor = Ask + valor;
}
}
}
return(NormalizeDouble(value, Digits));
}
O mesmo acontece com o OrderBreakEven:
double getOrderBreakEven(int orderMagicNumber, int orderType, double price) {
double value = 0;
se (orderMagicNumber == 2456) {
value = ( 7 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
valor = lance - valor;
{} else {
valor = Ask + valor;
}
}
}
Se (orderMagicNumber == 3798) {
value = ( 7 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
valor = lance - valor;
{} else {
valor = Ask + valor;
}
}
}
return(NormalizeDouble(value, Digits));
}
Prezado Mark, em vez de ter que esperar por uma atualização do Assistente do EA, você poderia me mostrar como fazer as alterações no Editor?
??? Alterar BUY para SELL e valor = ???
Mike H.
9 anos atrás #126086
Caro Mark, eu não podia esperar, então já fiz as alterações necessárias...
Se (orderMagicNumber == 3978) {
value = ( 11 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_SELL || orderType == OP_SELLSTOP || orderType == OP_SELLLIMIT) {
valor = Ask + valor;
{} else {
valor = lance - valor;
Se (orderMagicNumber == 3798) {
value = ( 0 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_SELL || orderType == OP_SELLSTOP || orderType == OP_SELLLIMIT) {
valor = Ask + valor;
{} else {
valor = lance - valor;
As funções TrailingStop e BreakEven funcionam bem agora...
Mais tarde, Mike H.
Marca Fric
9 anos atrás #126096
Olá Mike,
Desculpe-me, mas euSe eu não estiver enganado, esses são funcionalmente equivalentes.
if(orderType == OP_SELL || orderType == OP_SELLSTOP || orderType == OP_SELLLIMIT) {
valor = Ask + valor;
{} else {
valor = lance - valor;
}
é funcionalmente o mesmo que:
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
valor = lance - valor;
{} else {
valor = Ask + valor;
}
A condição If reconhece se a ordem é de compra ou de venda e usa o valor apropriado. O que você fez foi alterar apenas a verificação, mas ela deve funcionar exatamente da mesma forma.
Portanto, se ele funcionar repentinamente, talvez tenha sido causado por algo diferente disso.
Marcar
EstratégiaQuant arquiteto
Mike H.
9 anos atrás #126108
Olá, Mark. A primeira postagem deste tópico mostra como o Assistente de EA está gerando o código...
O Assistente de EA gera o código da seguinte forma:
double getOrderTrailingStop(int orderMagicNumber, int orderType, double price) {
double value = 0;
se (orderMagicNumber == 2456) {
value = ( 11 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
valor = lance - valor;
{} else {
valor = Ask + valor;
}
}
O mesmo acontece com o OrderBreakEven:
}
Se (orderMagicNumber == 3798) {
value = ( 11 * getPointCoef(orderMagicNumber));
se (valor > 0) {
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
valor = lance - valor;
{} else {
valor = Ask + valor;
}
}
}
return(NormalizeDouble(value, Digits));
}
O que vejo é que não há condição de VENDA... Os dois IFs são idênticos...
Acima está a forma como o Assistente de EA está escrevendo o código >>> IFs sublinhados idênticos para números mágicos diferentes...
Marca Fric
9 anos atrás #126147
Sim, mas a lógica está correta. Se a ordem for de compra, ela calcula o preço de uma forma; caso contrário (a ordem deve ser de venda), o preço é calculado de outra forma.
if(orderType == OP_BUY || orderType == OP_BUYSTOP || orderType == OP_BUYLIMIT) {
Isso significa que é uma ordem de compra
…
{} else {
Isso significa que é uma ordem de venda
…
}
Realmente não parece haver nenhum erro no EA, ele foi testado em ambos os lados.
Marcar
EstratégiaQuant arquiteto
Mike H.
9 anos atrás #126157
Agora estou vendo e entendendo... Obrigado, Mark!!!
Visualizando 5 respostas - 1 até 5 (de um total de 5)