Erros, bugs, perguntas - página 1521

 
Ilya Malev:
Inserir o texto no OnCalculate do indicador padrão criado no redactor. Coloque-o em qualquer gráfico. Verá o funcionamento do indicador no canto superior esquerdo da janela do gráfico. Após seleccionar "Eliminar" da lista de indicadores, não deixará de funcionar, vê-lo-á no canto superior esquerdo. Continuará mesmo depois de a janela estar fechada. Depois de abrir uma nova janela, ela continuará na nova janela. Esta janela não tem necessariamente o mesmo símbolo que a que tinha no início :)
O trabalho do indicador só pára quando o terminal está fechado. E não sei se pára ou não - só tive de remover manualmente o terminal através do Gestor de Tarefas para o reiniciar...

Ao mesmo tempo, a ajuda da função IsStopped diz que a operação do programa é terminada à força após 3 segundos, se houver um comando para terminar o programa mql.

E se while(true) for substituído por while(!IsStopped()), o indicador termina com sucesso quando removido do gráfico.

Tudo é claro. Fizemos uma indulgência para a eliminação normal.

Quando o terminal fechar, será difícil. Não mais do que 3 segundos.

E não tenho a certeza se vamos escrever isto na documentação, 1. de modo a não nos entregarmos a escrever indicadores tão imprudentes (escreveu isto para verificar?) 2. Como se afrouxou, tão apertado.

 
Alexandre:

Uma causa engraçada do erro interno do compilador (função utilizada no indicador):

...

A cura é óbvia, mas concordo - uma falha muito engraçada. :)))

Obrigado pelo correio!

Escreveu-te uma mensagem privada.
 
Olá. Não consigo escrever um código que abra uma posição em n-números debarras depois de a posição anterior ter sido aberta. Tentei usar Time[i], iBarShift, iTime. Não tive sorte com tudo isto. Sou principiante em programação. A pesquisa não rendeu nada.
 

Dmitri Custurov:
Здравствуйте. Не получается написать код, который открывал бы позицию через n-количество баров после открытия предыдущей позиции. Пробовал использовать Time[i], iBarShift, iTime. Все безуспешно. В программировании новичок. Поиск ничего не дал.

Saudações, para que possa obter ajuda para encontrar o erro - precisa de anexar pelo menos o código. Ninguém aqui escreverá por si - é costume aqui ajudá-lo a encontrar o erro e a corrigi-lo com conselhos. Ou - contactar um freelancer.
 

Aqui está o código:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)&&(Signal===1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Temporizador=Tempo[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

se ((TimerNull>=n)&&(z===1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Também tentei desta forma:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)&&(Signal===1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Temporizador=Tempo[0];}

TimerNull=Time[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //as um exemplo aqui coloquei 2700 segundos em vez de n, o que em testes significou 3 velas de 15 minutos) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

E assim também:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)&&(Signal===1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Temporizador=Tempo[0];}

TimerNull=Time[0];

if ((CurrentTime()>=(Timer+2700))&&(z===1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); // Neste caso, quando removi 2700 a segunda transacção foi aberta logo após a primeira no mesmo bar, faz sentido. E mesmo quando coloquei qualquer valor até 600 em vez de 2700, o segundo negócio foi aberto no mesmo bar. Com um valor superior a 600, o segundo comércio nunca abriu. Não consigo compreender qual é o problema. Ficar-lhe-ia muito grato pela sua ajuda.

Os parâmetros Timer e TimerNull estão no formato de data/hora.


 

no seu exemplo não há enumeração de, por exemplo, posições

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)&&(Signal===1)))

por conseguinte, selecciona sempre a posição 0.

 
Ainda estou a escrever um rascunho para que a lógica básica funcione. Depois disso, vou aperfeiçoá-lo. Neste caso, posso estar errado, o problema está na segunda parte do código.
 
Slawa:

Tudo isto faz sentido. Fez uma indulgência para a eliminação normal.

Quando se fecha o terminal, será difícil. Não mais do que 3 segundos.

E não tenho a certeza se vamos escrever isto na documentação, 1. de modo a não nos entregarmos a escrever indicadores tão imprudentes (escreveu isto para verificar?) 2. À medida que o afrouxamos, apertemo-lo.

Por isso, aperte-o já, ou fixe a referência. Não ceder a ceder não é uma conversa séria. O que os programadores esperam de si não é "codificar", mas um software claro e bem documentado.

É claro que este código não tem outro objectivo que não seja uma demonstração, que você mesmo pediu. E é bastante inofensivo, inofensivo funcionaria se o Sono fosse removido e o Comentário substituído por Impressão. Não existe protecção contra o spamming de gigabytes de impressão no log in do Quarteto ou do Quarteto 5.

 
Dmitri Custurov:

Aqui está o código:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)&&(Signal===1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Temporizador=Tempo[0];}

TimerNull=iBarShift(NULL,0,Timer,false);

se ((TimerNull>=n)&&(z===1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

Também tentei desta forma:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)&&(Signal===1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Temporizador=Tempo[0];}

TimerNull=Time[0];

if ((TimerNull>=(Timer+2700))&&(z==1)) //as um exemplo aqui coloquei 2700 segundos em vez de n, o que em testes significou 3 velas de 15 minutos) {int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red);

z=2;}

E assim também:

se ((OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)&&(Signal===1)))
{int send1=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 1, 0, Red);
z=1;

Temporizador=Tempo[0];}

TimerNull=Time[0];

if ((CurrentTime()>=(Timer+2700))&&(z===1))

{int send2=OrderSend(Symbol(), OP_SELL, Volume_, Bid, 0, 0, 0, NULL, 2, 0, Red); // Neste caso, quando removi 2700 a segunda transacção foi aberta logo a seguir à primeira no mesmo bar, faz sentido. E mesmo quando coloquei qualquer valor até 600 em vez de 2700, o segundo negócio foi aberto no mesmo bar. Com um valor superior a 600, o segundo comércio nunca abriu. Não consigo compreender qual é o problema. Ficar-lhe-ia muito grato pela sua ajuda.

Os parâmetros Timer e TimerNull estão no formato de data/hora.


Esta é uma das implementações possíveis. Esta EA deve abrir uma ordem após o número especificado de barras. E aprender como inserir correctamente o código EA, o botão SRC na barra de mensagens.

//+------------------------------------------------------------------+
//|                                                          111.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int nymber_bar=10;
input double Volume_=0.01;
int send1;
int send2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(Total_orders(_Symbol,OP_SELL)==0 && send1<=0)
     {
      send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
     }

   if(OrderSelect(send1,SELECT_BY_TICKET))
     {
      if(iBarShift(NULL,0,OrderOpenTime())>=nymber_bar)
        {
         send1=OrderSend(Symbol(),OP_SELL,Volume_,Bid,0,0,0,NULL,1,0,Red);
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+

111

 

A questão é provavelmente para os criadores do website ou para os administradores de serviços Freelance

---

Costumava ser: 568 empregos concluídos, 75% pessoais

Acrescentou 13 postos de trabalho (todos pessoais) e tornou-se: concluído 581, 75% pessoal

---

Portanto a questão: decifrar por favor, o que significa 75%?