Universal MA Cross EA - página 106

 
BlackCoq:
Obrigado por sua ajuda, Mladen. Eu mexi um pouco no código até conseguir compilá-lo sem erros, mas a EA ainda pára e reverte depois de uma perda. Este é o código exato que estou usando agora: duplo GetLastPL() me dá o seguinte erro: '(' - definição da função inesperada.

BlackCoq

Você deve fazer todas as comparações lógicas dentro do loop porque funções como OrderProfit() estão retornando o lucro da ordem atualmente selecionada a partir de uma lista de ordens fechadas. Se não estiver dentro do laço principal (for(int i=OrdersHistoryTotal()-1;i>=0;i--)) então somente a última ordem selecionada será testada e isso não significa que seja a última ordem (as metaquotas indicam explicitamente em sua documentação que as ordens na lista de ordens fechadas (ou ainda abertas) não precisam estar em nenhuma ordem em particular - é responsabilidade dos codificadores verificar a ordem)

 
mladen:
BlackCoq Você deve fazer todas as comparações lógicas dentro do loop porque funções como OrderProfit() estão retornando o lucro da ordem atualmente selecionada a partir de uma lista de ordens fechadas. Se não estiver dentro do laço principal (for(int i=OrdersHistoryTotal()-1;i>=0;i--)) então somente a última ordem selecionada será testada e isso não significa que seja a última ordem (as metaquotas indicam explicitamente em sua documentação que as ordens na lista de ordens fechadas (ou ainda abertas) não precisam estar em nenhuma ordem em particular - é responsabilidade dos codificadores verificar a ordem)

Após muitas horas falhando com esta tarefa aparentemente fácil, decidi estudar muito mais programação antes de continuar. Obrigado por sua ajuda de qualquer forma!

Quando tentei isso, a EA não abriu nenhuma posição:

{ double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); } } { if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

And with this, it would "stop and reverse" even if last trade was a loss:

[PHP] { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }

Mais uma vez, obrigado.

 
BlackCoq:
Após muitas horas falhando com esta tarefa aparentemente fácil, decidi estudar muito mais programação antes de continuar. Obrigado por sua ajuda de qualquer forma!

Quando eu tentei isso, a EA não abriu nenhuma posição:

{ double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); } } { if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

And with this, it would "stop and reverse" even if last trade was a loss:

[PHP] { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }
Mais uma vez, obrigado.

BlackCoq

Se você usar a função que afixei como está, ele lhe devolverá o lucro exato da última ordem fechada (não há necessidade de alterar nada nela)

 
mladen:
BlackCoqSe você usar a função que coloquei como está, ele lhe devolverá o lucro exato do último pedido fechado (não há necessidade de alterar nada nele)

Quando tento copiar a função, recebo inúmeros erros, não importa como eu tente ajustá-la.

Este código:

{

duplo GetLastPL()

{

duplo TempLastOrderProfit = 0;

data/hora FecharTempo = 0;

for(int i=OrdensHistóriaTotal()-1;i>=0;i--)

{

se (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

{

CloseTime = OrderCloseTime();

TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderComission();

}

}

return(TempLastOrderProfit);

{

if(StopAndReverse===true && subTotalTrade()>0 && TempLastOrderProfit>0)

{

if((LastTrade==="BUY" && SellCondition===verdadeiro) ||| (LastTrade==="SELL" && BuyCondition===verdadeiro))

{

subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl===verdadeiro) Print("STOP AND REVERSE !");

}

}

}

}

Dá-me os erros:

Compilando 'universalMAcrossECNmartingaleSAR.mq4'...

(' - definição da função inesperada (538, 20)

'TempLastOrderProfit' - variável não definida (548, 15)

'TempLastOrderProfit' - variável não definida (551, 15)

TempLastOrderProfit' - variável não definida (553, 52)

 
BlackCoq:
Quando tento copiar a função, recebo inúmeros erros, não importa como eu tente ajustá-la.

Este código:

{ double GetLastPL() { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

Gives me the errors:

[PHP]

Compiling 'universalMAcrossECNmartingaleSAR.mq4'... '(' - function definition unexpected (538, 20)'TempLastOrderProfit' - variable not defined (548, 15)'TempLastOrderProfit' - variable not defined (551, 15)'TempLastOrderProfit' - variable not defined (553, 52)

BlackCoq

Essa função deve ser colada fora de qualquer outra função. Aqui está uma e muito simples que mostra como ela funciona e como deve ser usada

Arquivos anexados:
 
mladen:
BlackCoq Essa função deve ser colada fora de qualquer outra função. Aqui está uma e muito simples que mostra como ela funciona e como deve ser usada

Tenho certeza de que estou perdendo algo aqui, mas mesmo que eu tente copiar a função fora de qualquer outra função na EA, ainda recebo os seguintes erros:

"(' - definição da função inesperada(depois da dupla GetLastPL())

'TempLastOrderProfit' - variável não definida (554, 15)

'TempLastOrderProfit' - variável não definida (557, 15)

 
BlackCoq:
Tenho certeza de que estou perdendo algo aqui, mas mesmo que eu tente copiar a função fora de qualquer outra função na EA, ainda recebo os seguintes erros:

(' - definição da função inesperada (após a dupla GetLastPL())

'TempLastOrderProfit' - variável não definida (554, 15)

'TempLastOrderProfit' - variável não definida (557, 15)

Desculpe, mas sem seu código eu não tenho idéia do que você está fazendo

Como você pode ver pelo teste EA ele funciona sem nenhum problema

 
mladen:
Desculpe, mas sem seu código eu não tenho idéia do que você está fazendoComo você pode ver a partir desse teste EA ele funciona sem nenhum problema

Eu recebo vários erros quando tento compilar a EA que você anexou também. Estamos usando diferentes versões do MT4?

Estou anexando o EA ao qual estou tentando adicionar a função antes de "parar e reverter".

Arquivos anexados:
 
BlackCoq:
Eu recebo vários erros quando tento compilar a EA que você anexou também. Estamos usando diferentes versões do MT4? Estou anexando o EA ao qual estou tentando adicionar a função antes de "parar e reverter".

Se você estiver usando build 509 então substitua "void start(void)" por "void start()" e você não receberá nenhum erro de compilação. Veja os exemplos para ambos builds build 509 e build 610 (a versão do metaeditor para build 610 é 887)

Também anexando a EA com a função GetLastPL() já anexada a ela. Tudo que você precisa fazer é fazer uma chamada para GetLastPL() em um local no código onde você deseja que ela verifique se o lucro do último pedido foi positivo ou negativo.

_________________________

PS: compilará em build 509 assim como em build 610. Em 610 você receberá 3 avisos, mas estes são irrelevantes para a operação da EA

 
mladen:
Se você estiver usando o build 509 então substitua "void start(void)" por "void start()" e você não receberá nenhum erro de compilação. Veja os exemplos para ambos os builds build 509 e build 610 (a versão do metaeditor para build 610 é 887)

Também anexando a EA com a função GetLastPL() já anexada a ela. Tudo que você precisa fazer é fazer uma chamada para GetLastPL() em um local no código onde você deseja que ela verifique se o lucro do último pedido foi positivo ou negativo.

_________________________

PS: compilará em build 509 assim como em build 610. Em 610 você receberá 3 avisos, mas estes são irrelevantes para a operação da EA

Trabalhando perfeitamente agora. Muito obrigado por sua ajuda e paciência!