Problema com o código EA 2 (gerente SL)

 

Olá,

Obrigado novamente com sua ajuda enquanto eu estou aprendendo MQL.

Aqui está meu próximo problema.... Eu sou SOOOOO perto desta.... Tenho-o fazendo tudo o que eu quero. Entretanto, ele está modificando os SLs em TODOS OS TODOS se o GAP estiver acima deste critério, em vez de apenas EXECUTAR UMA VEZ...

É um código muito simples, e um problema muito simples que eu não sou capaz de resolver nesta fase, e qualquer ajuda ajudaria meu aprendizado...

Este é apenas o carimbo BUY SIDE, porém escrevi subsídios para o IFGAP para o lado OP_SELL para mais tarde.


A função desta EA é a de:

1. Iniciar uma operação de compra se não existir uma.

2. em TP nível 1, mova SL para cima.... em TP nível 2, mova SL para cima novamente.... em TP nível 3, mova SL para cima mais uma vez da última vez. Muito simples e agradável...


O problema do noob que estou tendo é:

1. Ele executa meu OrderModify EVERYTICK se sobre GAP... Não consigo pensar como mudar a lógica, mas uma vez que me for mostrado, saberei para o futuro...


Obrigado de antemão.

Amáveis Cumprimentos e felizes pips a todos.


int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
    if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10;
    if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_2 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_2*PipValue*Point))) ||
            ((Gap_Level_2 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_2*PipValue*Point)))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_2*PipValue*Point, price + BuyTakeprofit_Level_2*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_3 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_3*PipValue*Point))) ||
            ((Gap_Level_3 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_3*PipValue*Point)))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_3*PipValue*Point, price + BuyTakeprofit_Level_3*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == InitialOrderType && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
    double SL = Ask - InitialBuyStoploss*PipValue*Point;
    if (BuyStoploss_Level_3 == 0) SL = 0;
    double TP = Ask + Initial_Takeprofit*PipValue*Point;
    if (Initial_Takeprofit == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, 0, 0, "My Expert", BUY_Magic, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, SL, TP, "My Expert", BUY_Magic, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (ClearAllObjects) ObjectsDeleteAll();
    
    
}

 
Funky:

O problema do noob que estou tendo é:

1. Ele executa meu OrderModify EVERYTICK se sobre GAP... Não consigo pensar como mudar a lógica, mas uma vez que me seja mostrado, saberei para o futuro...

Se você não quiser executá-lo para cada tick quando você quiser executá-lo ? você quer dizer cada tick mas apenas uma vez ? para fazer isso basta verificar se o SL & TP já foi ajustado ...

Um outro comentário . . . IfGap_Level_1() loops através de todos os pedidos abertos procurando por aqueles que combinam Symbol e Magic number, então verifica se o pedido está em lucro uma certa quantia, etc . . se é chamado de BuyOrderModifyLevel_1(), esta função loops através de todos os pedidos abertos procurando por aqueles que combinam Symbol e Magic number e é um Buy . . . vê uma pequena repetição aqui ? por que você não simplesmente passa o número do Ticket do IfGap_Level_1() para BuyOrderModifyLevel_1() ?

 
Funky:

Olá,

Obrigado novamente com sua ajuda enquanto eu estou aprendendo MQL.

Aqui está meu próximo problema.... Eu sou SOOOOO perto desta.... Tenho-o fazendo tudo o que eu quero. Entretanto, ele está modificando os SLs em TODOS OS TODOS se o GAP estiver acima deste critério, ao invés de apenas EXECUTAR UMA VEZ...

É um código muito simples, e um problema muito simples que eu não sou capaz de resolver nesta fase, e qualquer ajuda ajudaria meu aprendizado...

Este é apenas o carimbo BUY SIDE, porém escrevi subsídios para o IFGAP para o lado OP_SELL para mais tarde.


A função desta EA é a de:

1. Iniciar uma operação de compra se não existir uma.

2. no TP nível 1, mover SL para cima.... no TP nível 2, mover SL para cima novamente.... no TP nível 3, mover SL para cima mais uma vez da última vez. Muito simples...


O problema noob que eu estou tendo é:

1. Ele executa meu OrderModify EVERYTICK se sobre GAP... Não consigo pensar em como mudar a lógica, mas uma vez que me seja mostrado, saberei para o futuro...


Obrigado de antemão.

Carinhoso Cumprimentos e felizes pips a todos.


Você não é um NOOB. A julgar pela habilidade elegante de ser capaz de escrever e depois chamar funções, da maneira como você fez. Você deve ser capaz de ver por si mesmo, que suas chamadas de função (profundidade de lógica, etc.) podem ser simplificadas talvez para 1-2 funções.

Em vez de:

OrderOpenPrice() 

em seu estado:

if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||

você já considerou/testou usando OrderStopLoss()?

 
RaptorUK:

Se você não quer executá-lo para cada tick quando você quer executá-lo ? você quer dizer cada tick mas apenas uma vez ? para fazer isso basta verificar se o SL & TP já foi ajustado . .

Um outro comentário . . . IfGap_Level_1() loops através de todos os pedidos abertos procurando por aqueles que combinam Symbol e Magic number, então verifica se o pedido está em lucro uma certa quantia, etc . . se é chamado de BuyOrderModifyLevel_1(), esta função loops através de todos os pedidos abertos procurando por aqueles que combinam Symbol e Magic number e é um Buy . . . vê uma pequena repetição aqui ? por que você não simplesmente passa o número do Ticket do IfGap_Level_1() para BuyOrderModifyLevel_1() ?

Olá novamente Raptor, obrigado novamente pelo seu tempo. Da maneira que eu disse, isso parece confuso. Acho que estou tendo problemas para unir todos estes componentes corretamente. No momento, o principal problema que estou tendo é "está modificando as ordens em cada tick", no entanto, agora posso ver alguns outros problemas também após seus comentários. Com a última parte do que você disse, se eu o entendi, você pretende inserir o código BuyOrderModify dentro do IfGap_Level_1 dentro de um {} depois de verificar se o Gap foi atingido e não em seu próprio {}? Como neste exemplo abaixo?


void OverGap1_soModify()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
               {
                double price = Ask;
                if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice();
                 }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

E você sabe, estou me sentindo como dejavue com minha outra EA de certa forma agora que essa caixa está tomando forma (aqui https://forum.mql4.com/42870 - similaridade não intencional, já que é uma EA diferente com um propósito diferente, porém isso está apontando para as mesmas áreas que preciso aprender, como incluir duas funções juntas, prometo que não estava tentando preencher o fórum com redundância)...

Posso, portanto, perguntar se uma variável IFNEWORDEREXIST = TRUE no mesmo local resolveria outro problema. Veja que eu quero que a última Open Trade que foi feita na ModeTrades seja aquela que estou comparando com o IfGap_Level_X o tempo todo (acho que essa parte é semelhante à minha outra).


Uma vez corrigido esse erro com OrderModify acontecendo em TODOS OS TÍTICOS enquanto ele estiver preso dentro daquele {}, se aquela caixa acima não estiver correta, e lidar com a última questão de Order Select, eu serei então confrontado com o próximo drama que enquanto IfGap_Level_3 estiver satisfeito, também o IfGap_Level_2, e IfGap_Level_1.

Eu quero que a EA atue como gerente do SL e (apesar da ordem de compra inicial única) vou usá-la para gerenciar várias operações. A primeira compra foi apenas para que eu pudesse voltar atrás, ok. Eu gostaria que este código fosse assim:

Se o Pips do pedido chegar ao IfGap_Level_1, quero que ele vá para BuyOrderModifyLevel_1, depois modifique os pedidos existentes, e esqueça esta parte do código.

Se o IfOrder's Pips chegar ao IfGap_Level_2, eu quero que ele vá ao BuyOrderModifyLevel_2, depois modifique os pedidos existentes e esqueça esta parte do código.

Se o Pips do pedido chegar ao IfGap_Level_3, eu quero que ele vá ao BuyOrderModifyLevel_3, depois modifique os pedidos existentes e esqueça esta parte do código

Espero não estar muito longe, a princípio pareceu simples.

Eu esperava poder simplesmente inserir uma "pausa"; ou algo no final de cada bloco e escapar com este código...
diostar:

Você não é um NOOB. A julgar pela habilidade elegante de ser capaz de escrever e depois chamar funções, da maneira como você fez. Você deve ser capaz de ver por si mesmo, que suas chamadas de função (profundidade de lógica, etc.) podem ser simplificadas talvez para 1-2 funções.

Em vez de:

na sua condição:

você já considerou/testou usando OrderStopLoss()?

Ah, obrigado diostar, você é muito gentil com seus comentários. Estou bem em escrever scripts básicos, porém não estou longe desse nível, e agora juntando tudo isso está me causando dor de cabeça. Mas obrigado pelo incentivo, as fórmulas e as coisas fazem sentido para mim, não tanto o programa grammer/syntax.

Acredito que você possa estar correto no que está dizendo, condensando o código até as funções 1-2, só não sei como...

Se eu tivesse a experiência, eu teria o IFGAP e o MODIFY ORDER no único bloco como eu acho que tanto você como o Raptor estão sugerindo, no entanto, eu estava jogando seguro nesta fase... Acho que se eu fosse um profissional, eu teria os TPs em um array ou switch, e definiria o antigo TP=oldTP+TPincrement_Level, e poderia ter tudo isso em um bloco em cerca de 10 linhas de código... Eventualmente farei isso no último If Gap & ModifyOrder {} para que o incremento do SL seja intensificado em intervalos programáveis, porém os primeiros que eu quiser deixar para definir manualmente dependendo das condições do mercado...

Ainda não considerei o uso de OrderStopLoss() na fórmula. Acho que, como vou variar um pouco os SLs para os primeiros movimentos, eu realmente quero que seja baseado no OrderOpenPrice e os Pips que ele aumentou desde que foi aberto. Eu não tinha explicado muito bem o EA, desculpe-me. Obrigado por seu tempo também companheiro, muito apreciado.

 
Funky:

Olá novamente Raptor, obrigado novamente pelo seu tempo. Da maneira que eu disse, isso parece confuso. Acho que estou tendo problemas para unir todos estes componentes corretamente. No momento, o principal problema que estou tendo é "está modificando as ordens em cada tick", no entanto, agora posso ver alguns outros problemas também após seus comentários. Com a última parte do que você disse, se eu o entendi, você pretende inserir o código BuyOrderModify dentro do IfGap_Level_1 dentro de um {} depois de verificar se o Gap foi atingido e não em seu próprio {}? Como neste exemplo abaixo?

Você poderia fazer isso, mas não é realmente o que eu quis dizer...

Dê uma olhada nisto para ver se faz sentido...

          (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}

A outra coisa que mencionei foi sobre verificar se a Ordem já tinha sido modificada, olhando para ver o que eram SL & TP, em outras palavras, se você já modificou a Ordem no último tick, não o faça novamente neste tick . . . é que o que você estava procurando fazer . .

 
RaptorUK:

Você poderia fazer isso, mas não é realmente o que eu quis dizer . . .

Dê uma olhada nisto para ver se faz sentido...

A outra coisa que mencionei foi sobre verificar se o pedido já tinha sido modificado, olhando para ver o que eram SL & TP, em outras palavras, se você já modificou o pedido no último tick não o faça novamente neste tick . . . é que o que você estava procurando fazer ?


Isto é ótimo para o meu aprendizado... Eu não sabia que se podia colocar (OrderTicket()) depois de um nome de função em primeiro lugar, legal. Então isso atribui o número do meu último Ticket Open Order, legal. Esta é uma dica muito útil para as coisas que me interessam, obrigado.

(OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }

e aqui eu vejo que você fez a variável Ticket. Na verdade, eu não sabia que se podia declarar uma variável nesta parte do código. Isto pode ser feito porque foi dado um valor naquela última parte acima? Eu entendo como isso poderia funcionar, então, ele usa aqui o número deste último Ticket de Pedido do Comércio em vez do meu Ticket de Pedido 'não específico'(). Isso faz sentido. Será muito mais preciso do que OrderSelect(i++... etc.) para mim.

void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}


É quase uma da manhã aqui, então amanhã vou dar uma olhada de perto, obrigado pelo seu tempo.... Tenho a sensação de que talvez tenha que inserir esta lógica no bloco "If_Gap_Levels{}" em vez do bloco "BuyModify{}". Eu não tinha explicado isso de forma muito clara, desculpas. Acho que esta dica me ajudará a verificar aquele último bilhete para GAP, e depois MODIFICAR TODOS os pedidos anteriores com aquele OP_BUY e BUY_Magic etc.

A outra coisa que mencionei foi sobre verificar se o pedido já tinha sido modificado, olhando para ver o que eram SL & TP, em outras palavras, se você já modificou o pedido no último tick não o faça novamente neste tick . . . é que o que você estava procurando fazer ?

Sim, é exatamente aqui que estou preso na verdade... Só não tenho certeza de como especificar isto... Eu faço um valor de Bool de NeedsModifying = false, e depois converto para True quando o critério IfGap é atendido? Posso pensar na lógica, apenas não na sintaxe, mas aprendi com suas dicas para mim em minha última EA para poder até mesmo sugerir minha última frase. Mais uma vez, obrigado Raptor.

 
Funky:

Isto é ótimo para o meu aprendizado... Eu não sabia que se podia colocar (OrderTicket()) depois de um nome de função em primeiro lugar, legal. Então isso atribui meu Ticket que atende o critério de Gap a essa função BuyOrderModifyLevel_1? Esta é uma dica muito útil para as coisas que me interessam, obrigado.

e aqui eu vejo que você fez a variável Ticket. Na verdade eu não sabia que se podia declarar uma variável nesta parte do código. Isto pode ser feito porque foi dado um valor naquela última parte acima? Eu entendo como isso poderia funcionar, então, ele usa aqui o número deste último Ticket de Pedido do Comércio em vez do meu Ticket de Pedido 'não específico'(). Isso faz sentido. Será muito mais preciso do que OrderSelect(i++... etc.) para mim.

Faz parte da definição da função ... assim como qualquer uma das funções padrão, por exemplo OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify é uma função e você passa variáveis para ela, um mínimo de 5 variáveis, a 6ª é opcional. você pode fazer exatamente o mesmo com suas próprias funções . . .

Você é bem-vindo. Boa noite.

 
RaptorUK:

Faz parte da definição da Função . . como qualquer uma das Funções padrão, por exemplo, OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify é uma função e você passa variáveis para ela, um mínimo de 5 variáveis, a 6ª é opcional. você pode fazer exatamente o mesmo com suas próprias Funções . . .

Você é bem-vindo. Boa noite.


Obrigado Raptor.... ah você me pegou enquanto eu estava editando a última frase naquele post, pois sim, você estava certo com o que eu queria...

Obrigado por me lembrar novamente daquele .doc... é engraçado que eu tenha lido aquele .doc em particular na OrderMofidy tantas vezes... Costumava me parecer chinês aquele manual, no entanto, à medida que avançava, mais dicas avançadas se destacavam. Vou lê-lo novamente agora, e aposto que será tão claro quanto a luz do dia que você mencionou para mim, no entanto, obrigado por me apontar isso para que eu soubesse procurá-lo.

--copiado de cima, pois eu tinha editado essa última parte sem saber enquanto você escrevia....

A outra coisa que mencionei foi sobre verificar se a Ordem já tinha sido modificada, olhando para ver quais eram SL & TP, em outras palavras, se você já modificou a ordem no último tick, não a faça novamente neste tick . . . é que o que você estava procurando fazer ?

Sim, é exatamente aqui que eu estou preso na verdade... Só não tenho certeza de como especificar isto... Eu faço um valor bool de NeedsModifying = falso, e depois converto para True quando o critério IfGap for cumprido? Posso pensar na lógica, apenas não na sintaxe, mas aprendi com suas dicas para mim na minha última EA para poder até mesmo sugerir minha última frase. Mais uma vez, obrigado Raptor.

G'night de Downunder.

 
RaptorUK:

Faz parte da definição da Função . . como qualquer uma das Funções padrão, por exemplo, OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify é uma função e você passa variáveis para ela, um mínimo de 5 variáveis, a 6ª é opcional. você pode fazer exatamente o mesmo com suas próprias Funções . . .

Você é bem-vindo. Boa noite.


Oi Raptor,

Levei as coisas um pouco mais longe usando as idéias que você me mostrou. Percebi que seu código consertaria meu problema, mas depois que as ordens atingirem meu segundo nível de TP, será difícil de administrar...

Eu não percebi que poderia abandonar o OrderSelect i++ e simplesmente escolher meu próprio Ticket nessa equação, então eu tentei isso, pois isso resolverá todos os meus problemas com múltiplas negociações... Será que isso funcionaria?

Se alguém puder confirmar por mim que este código funcionaria, eu ficaria encantado... obrigado novamente pelo apoio ;)

void BuyPendingOrder_1()
{
    int expire = TimeCurrent() + 60 * 0;
    double price = NormalizeDouble(Ask, NDigits) + PriceOffset_1*PipValue*Point;
    double SL = price - BuyStoploss_1*PipValue*Point;
    if (BuyStoploss_1 == 0) SL = 0;
    double TP = price + BuyTakeprofit_1*PipValue*Point;
    if (BuyTakeprofit_1 == 0) TP = 0;
    if (0 == 0) expire = 0;
    int PendingOrderTicket_1 = OrderSend(Symbol(), OP_BUYSTOP, BuyLots_1, price, 4, SL, TP, "EA_Pending_Order1", BUY_Magic, expire, Blue);
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == -1)
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    
}

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1() 
{
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            
    }
    
}
 

Há um problema em fazer o que você está sugerindo . . . .

Imagine que seu EA está funcionando . . . então seu MT4 é interrompido por qualquer motivo, falha de energia, falha do MT4, o PC precisa de um reboot, etc . . seu código não pode pegar de onde parou porque não tem mais o valor correto para PendingOrderTicket_1

 
RaptorUK:

Há um problema em fazer o que você está sugerindo . . . .

Imagine que seu EA está funcionando . . . então seu MT4 é interrompido por qualquer motivo, falha de energia, falha do MT4, o PC precisa de um reboot, etc . . seu código não pode pegar de onde parou porque não tem mais o valor correto para PendingOrderTicket_1


Olá Raptor, obrigado mais uma vez.

Esse é o único problema com o código acima??? Acho que na pior das hipóteses o PendingOrderTicket_1 não seria modificado, e fecharia em seu SL.

Está tudo bem como eu usei a função OrderSelect?

 if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

O grande problema que eu acho que terei, é que quando OrderTicket_1 estiver acima do primeiro Gap_Level1, ele ainda modificará a ordem EM TODOS OS TODOS os critérios que este critério for atendido.

É esse o caso? Em caso afirmativo, o código abaixo o consertaria?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
      {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             HasBeenExecuted = false;
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            {
            HasBeenExecuted = true;
            }
     }    
   
}


Ou eu faria isso com o CheckGapLevel_1, para que ele só verifique lá uma vez? E se for o caso, eu o fiz corretamente abaixo???? Existe algum lugar onde eu deveria colocar uma "pausa"?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            HasBeenExecuted = false;
            {
            HasBeenExecuted = true;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Obrigado novamente ;)

Razão: