Problema com o código EA 2 (gerente SL) - página 2

 
Funky:

Olá Raptor, obrigado mais uma vez.

1. 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.

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

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.

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

Obrigado novamente ;)

1. É apenas algo que saltou para cima de mim que vai quebrar seu código.


2. Seu pedidoSelect está errado ( https://docs.mql4.com/trading/OrderSelect ) se você vai selecionar usando o número do bilhete que você tem que usar SELECT_BY_TICKET e não SELECT_BY_POS

3. Acho que não, o que você fez, eu acho, só significa que essa função só é chamada uma vez ... o que acontece quando você tem a próxima Ordem que precisa ser modificada ? o que acontece se você tiver duas ordens abertas ao mesmo tempo ?

Eu não estou 100% familiarizado com o que você está fazendo, não tenho tempo para olhar seu código com detalhes suficientes para fazer isso . . . mas, eu tenho uma pergunta.

Você não pode olhar para o OrderOpenPrice() de uma ordem, é OrderStopLoss() e OrderTakeProfit() e determinar se ela foi modificada para o nível 1 2 ou 3 ?

 
RaptorUK:

1. É apenas algo que saltou para cima de mim e que vai quebrar seu código.


2. Seu pedidoSelect está errado ( https://docs.mql4.com/trading/OrderSelect ) se você vai selecionar usando o número do bilhete que você tem que usar SELECT_BY_TICKET e não SELECT_BY_POS

3. Acho que não, o que você fez, eu acho, só significa que essa função só é chamada uma vez ... o que acontece quando você tem a próxima Ordem que precisa ser modificada ? o que acontece se você tiver duas ordens abertas ao mesmo tempo ?

Eu não estou 100% familiarizado com o que você está fazendo, não tenho tempo para olhar seu código com detalhes suficientes para fazer isso . . . mas, eu tenho uma pergunta.

Você não pode olhar para o OrderOpenPrice() de uma ordem, é OrderStopLoss() e OrderTakeProfit() e determinar se ela foi modificada para o nível 1 2 ou 3 ?

Obrigado Raptor, sua visão tem sido muito útil para mim...

Eu também entendo totalmente com restrições de tempo, seu tempo e dicas tem sido muito apreciado.... Eu não estava tentando pedir a ninguém para escrever para mim, então eu não fui a grandes detalhes... o que apresenta o problema de que sem muitos detalhes é difícil oferecer ajuda, então desculpe..... Neste caso, era mais o código que me preocupava enquanto aprendia e suas dicas têm sido ótimas para mim

1. Eu tenho me esforçado para conseguir que se junte para testar, então talvez conserte o problema da falta de energia mais tarde, quando eu tiver mais experiência.

2. Vou mudar para SELECT_BY_TICKET, em vez de POS, muito obrigado.

3. Eu quero que o GAP_Level1 seja chamado apenas uma vez, então talvez eu esteja correto com a maneira como eu amarrei tudo junto.... Para responder à sua pergunta, estou tentando olhar o último Ticket de Pedido Pendente, para ver se ele ultrapassa minha marca TradeUp. Quando isso acontecer, eu gostaria que ele arrastasse todos os meus pedidos anteriores para cima (desta vez selecionando por número mágico para obtê-los todos)... Nesta etapa, eu tenho outro pedido pendente aberto, e quando chegar ao Gap_Level2, terei um bloco BuyModify_Level2, com o mesmo código.... Plausível??

Espero estar escrevendo com minha lógica, eu realmente sentei com papel, como você sugeriu desta vez, para tirar o papel... ;)

 
Funky:


3. Eu quero que o GAP_Level1 seja chamado apenas uma vez, então talvez eu esteja correto com a maneira como eu amarrei tudo junto.... Para responder à sua pergunta, estou tentando ver o último Ticket de Pedido Pendente, para ver se ele ultrapassa minha marca TradeUp. Quando isso acontecer, eu gostaria que ele arrastasse todos os meus pedidos anteriores para cima (desta vez selecionando por número mágico para obtê-los todos)... Nesta etapa, eu tenho outro pedido pendente aberto, e quando chegar ao Gap_Level2, terei um bloco BuyModify_Level2, com o mesmo código.... Plausível??


Como (ou onde em seu código) você definirá HasBeenExecuted = falso ; para que IfGap_Level_1() seja executado para o 2º conjunto de negociações ?
 
RaptorUK:
Como (ou onde em seu código) você definirá HasBeenExecuted = falso; para que IfGap_Level_1() seja executado para o 2º conjunto de negociações ?

Boa pergunta mate.

Eu ia boolar essa variável no início das variáveis internas abaixo das que eu exporto. Eu ia fazer um GAP_Level_1, GAP_Level_2, GAP_Level_3, GAP_Level_4, GAP_Level_5 etc. Assim, uma vez atingido o GAP_Level_1, ele pode esquecer este primeiro nível de lacuna.

O senhor me fez pensar, muito apreciado. Eu vejo um problema agora.

Percebi que quando uma negociação atinge um SL, e começa de novo, quero que a primeira negociação procure Gap_Level_1 novamente e gire através. E, sim, isso vai causar um problema, já que eu ia amarrar PendingOrder_1 com GAP_Level_1, PendingOrderLevel_Level_2 com GAP_Level2.

Acho que ainda posso conseguir, mas eu não pensaria nisso a menos que você mencionasse ......

Posso pensar em três soluções... A primeira se adapta um pouco melhor ao meu poder cerebral ;)

1. se eu for SE O ÚLTIMO COMÉRCIO É PERDIDO, então APAGAR TODAS AS PEDIDAS PENDENTE, e reiniciá-las se um comércio atingir um SL. Para que a Ordem Pendente 1 vá para GAP_Level5, ela deixará de ser a Ordem_Pendente5 sendo a próxima ordem aberta que vai para GAP_Level5. Após um SL ser atingido, todas as minhas negociações Abertas serão Fechadas, pois todas elas compartilham o mesmo SL, portanto, fechar minhas Ordens Pendentes e reiniciar a lógica pode ficar bem.

2. A outra opção que posso pensar (graças à sua dica com meu outro problema de código há algumas semanas), é inserir uma variável booleana após a primeira troca chamada NEWTRADE, e depois ter um bloco IFNEWTRADE==1, depois ir para GAP_Level1. Isto me faz pensar, acho que eu poderia ir IFNEWTRADE1 no bloco Ordem Pendente 1, e IFNEWTRADE2 no bloco Ordem Pendente 2 e assim por diante... depois IFNEWTRADE2==1 ir para o GAP_Level2.

EDIT (depois de um café): 3. Eu apenas pensei, e se eu classificasse as ordens por tempo (agora eu sei que se pode classificar várias ordens de muitas maneiras), e atribuir uma variável interger chamada ORD_SELECT_NUMBER com base no TIME. Depois de ORD_SELECT_NUMBER == 1, vá para GAP_Level1, depois veja a próxima ORD_SELECT_NUMBER usando esse comando ORDER_SELECT_NUMBER ++.

Eu estou bem em escrever EAs de ordem única baseados em sinais etc., é apenas este material de ordem múltipla que honestamente me mata... Meu EA está realmente funcionando como está, e obtém bons resultados, é uma loucura de se usar, pois ele se modifica em TUDO, e apenas usa meu menor Gap_Level atm, obviamente, já que estou desde então trabalhando em como amarrá-lo todo junto acima...

Uau, mas obrigado mais uma vez Raptor, assim como CODING KNOWLEDGE eu vejo como é importante o bom LOGIC também, obrigado por me fazer pensar.

 
Funky:

Uau, mas obrigado mais uma vez Raptor, assim como CÓDIGO CONHECIMENTO Vejo como é importante o bom LOGIC também, obrigado por me fazer pensar.

Você tem que o caminho errado . . . todo software, não importa em que linguagem é codificado, C++, Perl, Pascal, Fortran, Assembler, etc., é apenas para resolver problemas. Se a lógica por trás de sua solução for falha, então não importa o quão bom codificador você é . . . a solução vem primeiro, o código vem depois.
 
RaptorUK:
Você tem que o caminho errado ... todo software, não importa em que linguagem é codificado, C++, Perl, Pascal, Fortran, Assembler, etc., é apenas para resolver problemas. Se a lógica por trás de sua solução for falha, então não importa o quão bom codificador você é . . . a solução vem primeiro, o código vem depois.

Eu entendo o que você está dizendo... Um construtor sem planos de construção, não vai longe, mesmo que seja o melhor construtor do mundo. O plano inicial é quase mais importante, eu ouço você.

Você tem sido uma grande ajuda para mim, Raptor, e queria agradecer novamente.

Eu fui com a preguiçosa opção 1 acima.

Foram horas e horas de programação, meu EA está em torno de 85k (portanto, só postou um fragmento), portanto, ainda tenho que relatar como eu fui depois que este dinossauro foi concluído. Estou tendo um pouco de sorte atm, as ordens selecionam corretamente. Estou estudando à medida que vou, pois está longe da ordem única EAs que estou acostumado a escrever. Saltei para o fundo com este projeto e aprendi a nadar. Vou postar de volta como eu vou.

Obrigado novamente Raptor :)

 
Funky:

Eu entendo o que você está dizendo... Um construtor sem planos de construção, não vai longe, mesmo que seja o melhor construtor do mundo. O plano inicial é quase mais importante, eu ouço você.

Você tem sido uma grande ajuda para mim, Raptor, e queria agradecer novamente.

Eu fui com a preguiçosa opção 1 acima.

Foram horas e horas de programação, meu EA está em torno de 85k (portanto, só postou um fragmento), portanto, ainda tenho que relatar como eu fui depois que este dinossauro foi concluído. Estou tendo um pouco de sorte atm, as ordens selecionam corretamente. Estou estudando à medida que vou, pois está longe da ordem única EAs que estou acostumado a escrever. Saltei para o fundo com este projeto e aprendi a nadar. Vou postar de volta como eu vou.

Obrigado mais uma vez Raptor :)

Uma vez que você se veja expandindo em seus recursos de código, e há funções que podem ser tornadas comuns para qualquer uso futuro da EA, considere o uso de biblioteca/incluir, etc.

Uma vez que ele se torna um tiranossauro, seus códigos se perdem em seu próprio Parque Juraissico, especialmente quando você precisa deles novamente para qualquer uso futuro.

 
diostar:

Uma vez que você se veja expandindo em seus recursos de código, e há funções que podem ser tornadas comuns para qualquer uso futuro da EA, considere o uso de biblioteca/incluir, etc.

Uma vez que ele se torna um tiranossauro, os códigos se perdem em seu próprio Parque Juraissico, especialmente quando você precisa deles novamente para qualquer uso futuro.



Haha mate, isso me deu uma risada. Eu vejo como isso pode acontecer.

Para ser honesto, encontrei um encarte da biblioteca chamado 'OrderSendReliable.mqh'. Vou terminar este EA primeiro, depois vou postar de volta como fui com aquele encarte da Biblioteca com aquele outro encarte de código EA que eu tinha feito, pois acreditava que poderia consertar a coisa quente do mercado.

Tive uma risada, porque agora posso ver, como com experiência, haveria todo tipo de #inclui no topo da EA, haha, e você carrega em torno de um cache de 1mb de arquivos para cada EA.

Você sabe que seu comentário me faz pensar, ele simplesmente clicou. Eu acabei de cortar e colar código entre minhas EA quando recebo uma {secção} que eu gosto, e amarrá-las (por exemplo, aquela {secção} Eu estava tendo problemas com aquele outro cargo que mencionei antes). Eu nem tinha pensado em fazer isso como um encarte de biblioteca, e apenas me referir a ele... Estou muito distante desse tipo de coisa... Eu estava prestes a começar minha primeira biblioteca incluir depois deste EA com aquele para ver como eles funcionam.... as possibilidades são tão legais. É bastante viciante este MQL.

Oh sim, tudo está no caminho certo com meu código também, ele funciona perfeitamente para seu propósito, eu estava voltando para dar um grande agradecimento :) ..

Eu realmente aprecio o apoio de vocês, gostaria de poder descrever o quanto em palavras ;)

 

Você pode ter seus próprios conjuntos de funções de biblioteca "núcleo", que eu recomendo fortemente que você considere mais cedo, do que mais tarde.

Também comecei com meu primeiro EA, a mesma coisa, copiar, colar, copiar colar....

O momento decisivo foi quando eu estava fazendo este EA para meu antigo ex-coordenador do serviço militar, já aposentado. Isso mudou tudo, eu comecei a usar a biblioteca pela primeira vez.

Eu ainda mantenho essa biblioteca até hoje. Se ela pode lhe oferecer idéias, ajudando você a entrar... aqui está seu cabeçalho, amigo:

#define PI              3.1415629
#define GOLDEN_RATIO    1.618

#import "command.ex4"
   bool     isInit();
   bool     isFractional(string ins);
   bool     isOrderLimit(int cap);
   bool     isRiskLimit(double risk);
   
   int      ioSession(int h);
   string   ioWkday(datetime d);
   double   ioOrderPriceLvl(string ins, int type, double oPrice);    
   double   ioPriceLvl(string ins,double dPrice);
   bool     ioTrailStop(string ins, int tkt, int type, double oPrice,int lvl, double stop=0);
   int      ioTotalOrd(int magic);
         
   int      opClose(string ins,int ticket,int cmd,double lLot,bool Activate.NO_BREAK_ONE=false);
   int      opOpen(string ins, int cmd, double lLot, double lPrice, double lLoss, double lProfit, string comment,int EA.Id, int lSlip=0, bool Activate.NO_BREAK_ONE=false);
   int      opModify(string ins, int ticket,int cmd,double lPrice,double lLoss,double lProfit,bool Activate.NO_BREAK_ONE=false);   
   double   opStopLvl(string ins,double p);
   double   opNorm(string ins,double price);
   double   opNormL(string ins,double d);   
   double   opPoint(string ins);
   
   double   intelLot(string market, double risk,double stop); 
   double   intelCorrel(string s1,string s2, int f, int type);   
   int      intelPriceMove(string ins, int p, int L);
   int      intelTrend(string ins, int p, int q);   
#import

espero que isto ajude....

 
diostar:

Vocês podem ter seus próprios conjuntos de funções de biblioteca "núcleo", que eu recomendo fortemente que considerem mais cedo, do que mais tarde.

Também comecei com minha primeira EA, a mesma coisa, copiar, colar, copiar colar....

O momento decisivo foi quando eu estava fazendo esta EA para meu antigo ex-coordenador do serviço militar, já aposentado. Isso mudou tudo, eu comecei a usar a biblioteca pela primeira vez.

Eu ainda mantenho essa biblioteca até hoje. Se ela pode lhe oferecer idéias, ajudando você a entrar... aqui está seu cabeçalho, amigo:

espero que isto ajude....


Olá Diostar, isso é muito legal companheiro, obrigado por compartilhar essa informação, eu ainda não tinha lido sobre bibliotecas. Essa parece ser uma maneira fantástica de carregar variáveis e tê-las pré-definidas para mais tarde. Vou pensar sobre isso. Gosto de como você disse "mais cedo do que mais tarde", gosto de dicas como essa, obrigado companheiro. Isso me faz lembrar de como aprender a tocar violão, quando 20 anos depois eu acho que gostaria de fazer "assim e assim" desde o início, isso tornaria os últimos 20 anos mais fáceis, rs. Vou analisar isso mais a sério, obrigado.

Ah, justamente quando eu pensava que estava em chamas, eu tenho um drama, que não consigo pensar em resolver. Estou tendo problemas para selecionar as ordens corretas nestas duas seções de junção:

Posso mostrar dois dos meus exemplos, e mostrar os efeitos, meu cérebro não vai clicar neste...

Exemplo 1:

SCROLLS através de ordens anteriores exatamente como eu quero, como quer que seja, modifica-as em TODOS

(o drama original com ordem selecionou Raptor me ajudou a impedir que os Níveis entrassem em conflito, então o SL inclinou-se por essa razão também antes. Senti que esta última parte era fácil de ser resolvida, mas há dias que me sinto tentando impedir que isso aconteça a cada tique).

void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                IfGap_SELLLevel_00AlreadyExe = false;
            }
            if (IfGap_SELLLevel_00AlreadyExe == false)
            {
                IfGap_SELLLevel_00AlreadyExe = true;
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Exemplo 2:

Este exemplo não é o que eu quero... Eu tentei esta opção para impedir que ele modificasse o envio em cada tick... no entanto ele não percorre as ordens, e apenas modifica um dos tickets corretos em cada tick (ele modifica a primeira ordem, eu acho que a última no cache do índice de ordens).

void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    bool IfGap_SELLLevel_00AlreadyExe = FALSE;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Tenho mais 50 tentativas, tentando um pouco SE EXECUTOU 00 seção primeiro para passá-lo para IFGAP se não for executado antes... entretanto não tive muita sorte inserindo um interruptor antes de hand..... Eu poderia apenas postar este exemplo para mostrar que a opção....

Exemplo 3:

Com um swtich... ainda tem o mesmo efeito do Exemplo 1. Ela percorre as ordens corretamente, mas ainda se modifica a cada tick-tack...

Vejo que a chave continua recebendo um falso novamente, por isso, simplesmente passa novamente... no entanto, outras tentativas não a deixariam passar... devo manter esta opção e tentar declarar IfGap_SELLLLLevel_00AlreadyExe = verdadeiro em outro lugar, se sim, onde?

void IfGap_SELLLevel_00AlreadyBlock()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES))
    {
        IfGap_SELLLevel_00AlreadyExe = false;
    }
    if (IfGap_SELLLevel_00AlreadyExe == false)
    {
        IfGap_SELLLevel_00AlreadyExe = true;
        IfGap_SELLLevel_00();  
    }
}


void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
                
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Então sim, eu realmente tentei caras antes de incomodar a todos novamente.... por horas e horas... Eu estou perdido novamente...

Qualquer ajuda ou indicação seria apreciada ;)

Razão: