Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 82

 
trader781:
Você terá o último perdedor, o que fazer com ele e que parâmetros ajustar para si mesmo, acho que você vai descobrir

Obrigado, acho que consegui.

Como faço para que o lote volte ao seu valor original depois de ter lucro?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
não funciona dessa forma)
 
wishmast:

Obrigado, acho que consegui.

Como faço para que o lote volte ao seu valor original depois de ter lucro?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
não funciona dessa forma)

Eu tenho o seguinte esquema

se (OrderTotal()==0)

{

aberto com lote inicial

}

senão

...

ou seja, se não houver ordens, não será aberto com o lote antigo

É claro que é possível memorizar cada pedido, mas eles não nos dizem como fazer isso.
 
Vitalie Postolache:
Um contador deve ser iniciado e redefinido para seu valor inicial quando um determinado limite é atingido:

Obrigado.

Ajude-me a resolver um problema.
Há 3 posições de compra, uma posição de venda apareceu, precisamos fechar a posição de venda e a posição de compra mais antiga. Duas posições de compra devem permanecer.
Tenho todos eles fechados.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

Explique por que a função OrderProfit()<0 não funciona?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

quero ver quantas paradas por dia da semana

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

e aqui eu acho que é a mesma razão pela qual não funciona

 
wishmast:

Explique por que a função OrderProfit()<0 não funciona?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

quero ver quantas paradas por dia da semana

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

e aqui eu presumo que é a mesma razão pela qual não funciona

Porque DayOfWeek() devolve o número do pedido do dia da semana do último horário conhecido do servidor.

E você precisa do dia da semana da hora de fechamento do pedido: TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin:

Porque DayOfWeek() devolve o número do pedido do dia da semana do último horário conhecido do servidor.

E você precisa do dia da semana da hora de fechamento do pedido: TimeDayOfWeek(OrderCloseTime());

Mas o resultado é o mesmo, como se ignorandose(OrderProfit()<0) e houver um loop, as variáveis obtêm grandes valores.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

E quanto ao loop com muito? Eu o copiei incorretamente aqui, corrigi o sinalse(OrderProfit()>0&&OrderType()<2), mas ele não muda a essência, o loop funciona corretamente sem esta condição.

 
wishmast:

Mas o resultado é o mesmo, comose(OrderProfit()<0) fosse ignorado e houvesse um loop, as variáveis têm grandes valores.

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

E sobre o loop com muito? copiei-o incorretamente aqui, corrigi o sinalse(OrderProfit()>0&&OrderType()<2), mas não muda a essência, o loop funciona corretamente sem esta condição.

Onde são declarados o dia 1 e o dia 2 ?
 
Artyom Trishkin:
Onde são declarados o dia 1 e o dia 2 ?
como global, no início, antes do OnTick () e antes de todas as funções
 
Artyom Trishkin:
Onde são declarados o dia 1 e o dia 2 ?

Suspeito que estou selecionando o pedido incorretamente, ele não funciona(OrderProfit()<0), preciso ser mais específico sobre qual pedido eu preciso. Eu não sei por que ela salta uma ordem quando a última fechou em Take-Point e não há outras. Talvez, se eu quiser pesquisar através da história, o laço deva ser construído de forma diferente?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

A razão é que os Consultores Especialistas constroem laços com condições similares e trabalham conforme necessário, mas trabalham usandoOrderTotal().

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
Obrigado.

Ajude-me a resolver um problema.
Existem 3 posições de compra, uma posição de venda apareceu, precisamos fechar a posição de venda e a posição de compra mais antiga. Duas posições de compra devem permanecer.
Todos eles estão fechados.

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

Isto não pode ser resolvido dentro de um único ciclo. Neste loop, você deve memorizar os tickers dos pedidos a serem apagados na matriz, no próximo loop, você deve apagá-los por tickers.

Além disso, você tem uma confusão com colchetes, você está trabalhando com pedidos fora do blocoOrderSelect{}, isto é incorreto.