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

 

Este link aqui está 'caminho' acima de mim nesta fase, porém posso ver como eu poderia fazer um arquivo de biblioteca legal para resolver meus problemas... https://www.mql5.com/en/articles/1390. Estou um pouco nervoso, estou esperando poder contornar isso por enquanto... já que quando eu modifico, é apenas todo aquele par e mágico etc...

Eu fiz tudo corretamente antes de chegar à seção Modificar. Ele seleciona por bilhete corretamente, e depois passa para o bloco Modificar... essa parte é ótima.

Só não consigo ver "se as coisas ficam presas nesta seção Modificar" ou estou com problemas porque "precisa passar por estas seções para pegar a próxima ordem".

Eu esperava poder enviá-lo para o bloco de modificação e conseguir que ele modificasse todas as ordens daquele Número Mágico e Símbolo. É por isso que tentei uma pequena mudança verdadeira ou falsa.

Se for preciso passar por estas seções cada uma delas, "para selecionar a próxima ordem", eu posso estar em apuros.

Talvez eu pudesse apenas nomear manualmente os bilhetes que precisam ser modificados, mas não acho que este seja o problema, pois os recebe corretamente, ele apenas cicla cada tick, e eu sou um noob para saber o porquê...

Seria esta outra opção?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

Seria uma continuação;, retorno(), ou pausa; útil em algum lugar?

 

Ah, vi um erro em um dos meus exemplos anteriores...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

Eu acho que deveria ser:

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    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 == FALSE)
        { 
            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()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

Isso deve isolá-lo naquela seção... são 5h da manhã, ainda para testar... (perdido uma hora, maldita economia de luz do dia haha)

Se eu o deixar passar para esta seção de uma maneira, ele envia ordens modificadas em cada tick com a última ordem... e se eu o deixar passar da outra maneira ele rola as ordens corretamente, mas ainda assim modifica o cache de ordens em cada tick...

Eu posso fazer as ordens rolar para trás 5,4,3,2,1 ou para frente 1,2,3,4,5, mas não consigo pensar em uma maneira de deixar passar para modificar todas as ordens sem fazer spam.

Eu me pergunto 1) preciso deixar passar uma vez para modificar todas as ordens que passam..., ou 2) precisa passar cada vez que precisa selecionar uma nova ordem?

Eu ainda estou aprendendo que é tudo... Se ninguém puder me guiar na direção certa, tentarei esta linha acima, com uma pausa e o fim e verei se isso termina.... tem que ser tudo tão simples...

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

Você NÃO cometeu nenhum erro. O primeiro é BOM...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


Eu posso ter tido uma esfera bastante semelhante antes, se eu ler tudo isso corretamente. Eu estava tentando criar minhas próprias "modificar as ordens de parada/limite pelo nível mínimo MODE_STOP, se Bid/Ask se afastar x Pips...".

Seu caso é similar?

 
diostar:

Você NÃO cometeu nenhum erro. O primeiro é BOM...


Eu posso ter tido uma esfera bastante semelhante antes, se eu ler tudo isso corretamente. Eu estava tentando criar minhas próprias "modificar as ordens de parada/limite pelo nível mínimo MODE_STOP, se Bid/Ask se afastar x Pips...".

O seu caso é semelhante?



Graças a Diostar, eu estou tentando fazer uma espécie de pilha com as Ordens Pendentes, então, ao chegar à próxima Ordem Pendente bem sucedida, traga as paradas antigas.

Vou tentar com o ! novamente então... tantas combinações para tentar... e vejo que devo usar "falso" para o valor booleano ao invés de FALSO... sim, ele compilou e trabalhou bem ainda, mas o mesmo problema. Talvez eu encontre esse rascunho novamente e tente com "falso"... Nesse exemplo 2, ele não percorria as ordens, e modificava cada tick, então eu vou tentar novamente com esta variável alterada.

Posso fazer com que ele passe para o bloco modificado e gire as ordens para frente ou para trás, mas ele modifica cada tick, e se eu colocar um filtro verdadeiro ou falso depois de modificado, ele só modifica a primeira ordem no cache....

para mim isto sugere que a EA precisa chegar a este bloco cada tick para obter a próxima ordem (não tinha certeza se quando chegasse a este bloco, se eu poderia simplesmente selá-lo aqui e fazer com que ele girasse as ordens uma vez)...

isto me apresenta um problema, pois qualquer pergunta verdadeira ou falsa não está deixando passar...

Acho que se eu aprendesse a fazer um cache de pedidos e selecionasse através deles eu ainda teria o mesmo problema... Já tive todas as combinações acontecendo, mas não todas ao mesmo tempo. Consegui modificá-lo uma vez e depois seguir em frente, mas ele só recebeu a primeira ordem e parou... então estou me perguntando se eu deveria usar isso com uma chave com cada ordem realmente especificada... Eu não tinha certeza se meu bool OrderTicket() para relatar minha mensagem de erro, estragou a declaração de um Pending_OrderTicket_XX também... Tem que ser algo simples...

como você resolveu este problema no seu?

 
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 && !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;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


Independentemente de como eu declare nas variáveis globais...

bool IfGap_SELLLevel_00AlreadyExe;

...parece modificar uma vez, MAS apenas uma das ordens, eu assumo a última ordem com a forma como eu rolo as ordens.

Eu também tirei o ret00 antes de pedir o bilhete, no caso de...

Pelo menos não é todo tick, eu poderia usar este exemplo SE ele ainda rolaria por minhas ordens quando as condições para o primeiro fórum forem verdadeiras (mas em nem todo tick 'spamming modifica' depois de rolar ok, como minha tentativa mais bem sucedida faz...)

Esta tentativa também não funcionou:

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

Eu mostro mais claramente o que estou tentando fazer de qualquer forma, eu gostaria que isto acima funcionasse, se assim fosse...

Espero estar no caminho certo de qualquer maneira... Ainda não entendo porque meu exemplo 1 antes estava errado, bobagem faz exatamente o que eu quero, mas cada carrapato... Eu não consigo nem fazer com que funcione quando programo nos pedidos, então estou totalmente perdido novamente...

Alguma dica?


EDIT: Estou ficando realmente exausto, mas só de pensar nisso, no entanto, terei que tentar mais tarde, pois o tempo acabou...

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              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_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

você está lidando com ponto de fracionamento?

 
diostar:

você está lidando com ponto de fracionamento?


Acho que dobrei o valor do SL e TP, se é isso que você quer dizer, para que lhe seja atribuído o preço para definir o SL e TP. Espero não ter me enganado ao fazer isto.

Eu só preciso do MT4 para chegar a esse bloco, e depois esquecer.... Tenho a sensação de que a expressão vai ser muito complicada para o MT4, mas vou continuar tentando...

 
Funky:


Acho que dobrei o valor do SL e TP, se é isso que você quer dizer, para que lhe seja atribuído o preço para definir o SL e TP. Espero não ter me enganado ao fazer isto.

Eu só preciso do MT4 para chegar a esse bloco, e depois esquecer.... Tenho a sensação de que a expressão vai ser muito complicada para o MT4, mas vou continuar tentando...

Não, o que quero dizer é: você está lidando com 4/5 dígitos - 0,0001, ou 0,00001 Ponto?
 
diostar:
Não, o que quero dizer é: você está lidando com 4/5 dígitos - 0,0001, ou 0,00001 Ponto?


Ah 5 dígitos... Eu uso isto antes...

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



E eu estava pensando antes, eu poderia tentar virar este Detect Digits como minha primeira inserção na biblioteca, hehe, mas um passo de cada vez, eu tenho que aprender a rastejar primeiro, hehe.

Eu não estou recebendo nenhuma mensagem de erro 130 preço para fechar ou qualquer coisa.... Gostaria que fosse algo simples assim...

Na última página eu tinha o exemplo 1 funcionando, e muitos outros exemplos semelhantes, eu só queria poder deixar que ele se modificasse uma vez por tique...

Em vez de tentar obter todas as minhas ordens de VENDA anteriores de uma vez, eu me pergunto se eu deveria apenas fazer uma nova caixa para cada uma delas... sim, eu estou realmente perdido como percorrer todas as minhas VENDAS antigas em qualquer uma das minhas tentativas, e modificá-las uma vez.


&& (OrderStopLoss() < Stoploss_Level_00)

em vez de

!IfGap_SELLLevel_00AlreadyExe

Você sabe que sugere algo mais cedo que o Diostart me fez pensar...

Estou me perguntando se uma idéia !IfGap_SELLLLLevel_00AlreadyExe não vai funcionar (se não vai pegar todas as ordens e modificá-las na mesma passagem antes de eu trancar aquele bloco), eu me pergunto se eu uso sua idéia antes, e coloco uma pergunta como esta lá dentro... Eu voltarei se funcionar.

Se eu estiver no caminho errado, por favor, me avise, saúde ;)

 
Funky:


Ah 5 dígitos... Eu uso isto antes...



E eu estava pensando antes, eu poderia tentar virar este Dígitos de Detecção como minha primeira inserção na biblioteca, hehe, mas um passo de cada vez, eu tenho que aprender a rastejar primeiro, hehe. <- sábio movimento. Você está rastejando. Com bibliotecas, você vai acabar andando.

Não estou recebendo nenhuma mensagem de erro 130 preço para fechar ou qualquer coisa.... Eu gostaria que fosse algo simples como isso...

Na última página eu tinha o exemplo 1 funcionando, e muitos outros exemplos semelhantes, eu só gostaria de poder deixá-lo modificar uma vez por carrapato... <--- veja abaixo

Em vez de tentar obter todas as minhas ordens de VENDA anteriores de uma vez, eu me pergunto se eu deveria apenas fazer uma nova caixa para cada uma delas... sim, eu estou realmente perdido como percorrer todas as minhas VENDAS antigas em qualquer uma das minhas tentativas, e modificá-las uma vez.<--- veja abaixo


Espero que isso possa oferecer alguma ajuda.

Inicialmente, meus símbolos tinham 4 dígitos, todos os trailing stops, ordens de parada/limite modificadas, foram exatamente como esperado. Então, meu corretor decidiu ir fracionário. Eu fiz as mudanças necessárias e vi meus pips ficarem como -3,4, -4,5, 0,1, 4,6, 7,3, etc, etc. Pensei que estava tudo bem, mas na verdade não: Suponha que eu estabelecesse meu limite=7, e digamos, o novo tick 1,tick 2,tick 3 acontece sequencialmente:

1) 7,3>limite, então o pedido é modificado... corretor preenche 1 deslize...

2) 7,5>limite, depois o pedido é modificado.... corretor preenche 0 derrapagem...

3) 7.1>limite, depois o pedido é modificado...corretor preenche 2 deslizes...

Assim, no total, recebo meus pedidos modificados 3 vezes para todos os 3 carrapatos. Tendo percebido isso, decidi usar MathRound() para arredondar aqueles para o inteiro mais próximo, então 1,2,3 torna-se

1) matemático(7.3) =7 >limite, NÃO VERDADEIRO, não modificado

2) matemático(7.5)=8 >limite, VERDADEIRO, a ordem é modificada

3) matemático(7.1)=7>limite, NÃO VERDADEIRO, não modificado

Na verdade, ainda estou trabalhando em como melhorar o acima... até agora eles estão trabalhando bem, mas acho que deve haver maneiras melhores, do que a minha.