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

 

Olá, você poderia me dizer por que não está funcionando? Sem erros, mas as ordens não se abrem no testador. Estou tentando escrever um EA para a quebra de alto e baixo de um castiçal diário como uma ferramenta de treinamento.


extern int      TimeCandle   = 1440;      //таймфрейм свечи, которую пробиваем 
extern int      HourStart=10; // час начала торговли
extern double   Lots=0.1;     // лот торговли   
extern int      StopLoss=100; // стоплосс
extern int      TakeProfit=100; // тайкпрофит
extern int      znak=5;     // количество знаков котировки
extern int      magik=54321;     // магик 

double minprice; // минимальная цена
double maxprice;// максимальная цена


void OnTick()
  {
  double SL, TP;
  int ticket;
 
   minprice = iLow(Symbol(),TimeCandle,1);
   maxprice = iHigh(Symbol(),TimeCandle,1);   
   
   if (TimeHour(TimeCurrent()==HourStart))
   { 
    if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
    TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
    
    if (ticket <0)
    Print ("Не удалось открыть ордер на покупку");
    }
    
    
     if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(minprice + StopLoss*Point,znak);
    TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
        
    if (ticket <0)
    Print ("Не удалось открыть ордер на продажу");
    }
    
    }
    Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak)); 
  }
   
  // проверяем есть ли байлимит ордера с конца
  int BuyLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
    return(count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
  int SellLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
   // проверяем есть ли бай ордера с конца
  int BuyCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
  // проверяем есть ли селл ордера с конца
  int SellCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
    return(count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby:

Olá, você poderia me dizer por que não está funcionando? Sem erros, mas as ordens não se abrem no testador. Estou tentando escrever um EA para a quebra de alto e baixo de um castiçal diário como uma ferramenta de treinamento.


Não abre, ou seja, não tenta ou tenta mas falha? O que eles dizem no diário de bordo?

 
nelenaby:

Olá, você poderia me dizer por que não está funcionando? Sem erros, mas as ordens não se abrem no testador. Estou tentando escrever um EA para a quebra de alto e baixo de um castiçal diário como uma ferramenta de treinamento.


Analise esta sua expressão

if (TimeHour(TimeCurrent()==HourStart))
        {
          ........
        }

Não entendo o significado desta expressão e talvez eu esteja errado. Mas você deveria pelo menos substituir "(TimeCurrent()==HourStart)" por "(TimeCurrent() - HourStart)".

 

A seguir, se eu entendi corretamente - você está tentando fazer um pedido BuyLimit se não houver BuyLimitOrder AND BuyPosition. Observe o exato "E". Ou seja, a presença de qualquer um deles separadamente lhe convém, assim, a uma posição desejada do preço atual você receberá um número infinito de ByLimits, um em cada tick, até que pelo menos um deles acione e a primeira posição se abra. Além disso, você não se importa onde o preço está agora. Assim que a estranha condição de pontualidade for cumprida (logo acima do correio), eu acho que há um erro, mas não importa. De qualquer forma, se você desconsiderar isso, a EA começará a fazer pedidos errados no primeiro tick, até que o preço atinja o alto de ontem, porque você está usando o alto de ontem como o preço para fazer o pedido. O limite de compra é fixado abaixo do preço atual, o que significa que o preço atual deve estar acima do alto de ontem, mas até lá o pedido falhará.

Portanto, a única situação que lhe convém é quando o preço subiu acima do alto de ontem, não há limite de bye-limit, e não há negociações abertas. Esta é uma combinação rara. Além disso, não afetará a fuga, mas irá saltar após a fuga (porque há um bylimit), e irá lançar muitos erros, a partir do primeiro tick acima do máximo de ontem (que é outro erro). A condição já está preenchida, o consultor especializado lança a ordem, mas também há um spread, a distância mínima permitida do mercado, etc.

 
Sergey Voytsekhovsky:

Estou tendo dificuldade para entender o significado desta expressão, talvez esteja errado, mas no mínimo substitua "(TimeCurrent()==HourStart)" por "(TimeCurrent() - HourStart)".

Isso mesmo, há aqui um erro. Você precisa se (TimeHour(TimeCurrent())==HourStart)

Agora o pedido abre às vezes, mas gera mais erros (OrderSend error 130).

O erro aqui não é correto em relação às ordens de limite.

 
nelenaby:

Isso mesmo, há aqui um erro. Precisa se (TimeHour(TimeCurrent())==HourStart)

Agora abre transações às vezes, mas lança mais erros (OrderSend error 130).

Não é certo sobre ordens de limite.

Aqui está um roteiro para trabalhar com o tempo.

É antigo, mas funciona corretamente.

Arquivos anexados:
 

Olá.

Por favor, ajude-me a entender como trabalhar com arquivos.

Quando o programa está em execução, eu salvo os dados recebidos em um arquivo e leio o CSV.

O arquivo aumenta, a velocidade cai. Eu tentei atualizar (sobrescrever) alguns dos elementos das linhas. De jeito nenhum!

Você não pode apagar uma linha selecionada! Não posso acrescentar um novo elemento a uma linha antiga!

Isto é muito estranho! Você pode apagar facilmente um arquivo ou um objeto gráfico, etc. Mas quando se trata de trabalhar com um arquivo criado, é um impasse absoluto!

Nos fóruns há apenas uma recomendação: "Leia o arquivo na memória, altere ou apague a linha e salve o novo arquivo com o nome antigo".

Esta não me parece ser a solução correta. Deve ter-me escapado alguma coisa. Por favor, ajude-me a descobrir.

 
im-zvv:

Isso não me parece ser a decisão correta. Provavelmente está me faltando algo. Por favor, ajude-me a descobrir.

Você deve ser contratado urgentemente pela Microsoft para finalmente consertar esta"solução errada" para o manuseio dearquivos.


A manipulação de arquivos não é como editar um arquivo em um editor de arquivos, é mais como fazer uma palavra a partir de dados com letras individuais.
Se você precisar inserir uma nova carta, todos os cubos que a seguem precisam ser movidos para a direita.
Se você quiser remover uma carta antiga, todos os dados que se seguem devem ser movidos para a esquerda.
Portanto, se o arquivo não for grande e o trabalho não exigir acesso ao arquivo, é realmente mais fácil escrever os dados em um novo arquivo, apagar o antigo e renomear o novo arquivo para o nome do antigo.

Se não estou enganado, a única coisa que falta na MQL quando se trabalha com arquivos é a capacidade de aparar o comprimento do arquivo até o tamanho exigido.


 
Alekseu Fedotov:

Aqui está um roteiro para trabalhar com o tempo.

É antigo, mas funciona corretamente.

Eu também costumava usar a função de Kim, então encontrei tempo para escrever a minha própria função:

//_______________________________________________________________________
class CWorkTime
  {
private:
   int               mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime          mstarttime,mstoptime;
   bool              UseThisSession;
   void inittime()
     {
      mday=Day();
      MqlDateTime dtstart,dtstop;
      TimeToStruct(TimeCurrent(),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime(dtstart);
      mstoptime=StructToTime(dtstop);
     }
public:
   void              CWorkTime(void){};
   void              ~CWorkTime(void){};
   void              CWorkTime(int hstart,int mstart,int hstop,int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour<0 || mstophour<0 || mstarthour>23 || mstophour>23) ? false : true;
      UseThisSession=(mstartmin<0 || mstopmin<0 || mstartmin>59 || mstopmin>59) ? false : true;
      if(UseThisSession) inittime(); else Print("Время работы советника не используется");
     };

   bool              Disable()
     {
      bool result=false;
      if(UseThisSession)
        {
         if(mday!=Day()) inittime();
         datetime t=TimeCurrent();
         result=t>=mstarttime && t<=mstoptime ? false : true;
        }
      return(result);
     };
  }
*Work;


.....

int OnInit()
{
   Work=new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick()
  {

if(Work.Disable())
{
 Comment("Не торговое время!!! Сопровождение открытых ордеров");
 }
else
{......
desativar o tempo de execução - você tem que inserir dados inválidos ao inicializar o construtor, por exemplo, 25 horas ou 70 minutos
 
Sergey Dzyublik:

Você precisa ser contratado urgentemente pela Microsoft para que eles finalmente consertem esta"solução errada" para o manuseio de arquivos.


Trabalhar com arquivos não é como editar um arquivo em um editor de arquivos, é mais como fazer uma palavra a partir de dados com letras individuais.
Se você precisar inserir uma nova carta, todos os cubos que a seguem precisam ser movidos para a direita.
Se você quiser remover uma carta antiga, todos os dados que se seguem devem ser movidos para a esquerda.
Portanto, se o arquivo não for grande e o trabalho não exigir acesso ao arquivo, é realmente mais fácil escrever os dados em um novo arquivo, apagar o antigo e renomear o novo arquivo para o nome do antigo.

Se não estou enganado, a única coisa que falta na MQL quando se trabalha com arquivos é a capacidade de aparar o comprimento do arquivo até o tamanho exigido.


Obrigado. Bom esclarecimento. Infelizmente meu arquivo é muito grande e, portanto, terei que trabalhar com "cubos".
Razão: