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

 
lil_lil:

FileSeek(File,0,SEEK_END); e tudo é escrito no arquivo a partir de uma nova linha.

O problema é que existem 4 arquivos e precisamos escrever dados em quatro posições, cada um em um arquivo separado, cada arquivo tem uma ficha de posição no nome, mas os dados são escritos apenas em um, o último arquivo, os dados na última posição.

Os nomes dos arquivos são formados corretamente? Ao invés de Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; escreveria File name=(string)OrderTicket()+Symbol()+".txt"; e adicionaria #property strict directive no início - ajuda a eliminar erros
 
STARIJ:
Os nomes dos arquivos são formados corretamente? Ao invés de Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; eu escreveria File name=(string)OrderTicket()+Symbol()+".txt"; e adicionaria #property strict directive no início - ajuda a eliminar erros

Obrigado, a formação do nome foi refeita de acordo com sua recomendação, mas ainda escreve apenas os dados do último cargo.

E, os nomes dos novos arquivos não mudaram) suspeito que não seja o nome, o arquivo da última posição foi encontrado de qualquer forma.

Por que ele ignora as posições anteriores?

 

1501896125EURUSD.txt
Tempo Meio Preço BID
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Tempo Meio Preço BID
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
mudou alguma coisa? veja ... isto: string sy="""; int op=-1, mn=-1; pouco necessário ... podemos deixá-lo cair? No laço em vez de aninhado, se() for melhor continuar;

Arquivos anexados:
Fileee.mq4  7 kb
 
STARIJ:

1501896125EURUSD.txt
Time Half BID Price
2018.02.22.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Time Half BID Price
2018.02.22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
mudar qualquer coisa? veja...isto: string sy=""; int op=-1, mn=-1; pouco necessário ... podemos deixá-lo cair? No laço em vez de aninhado, se() for melhor continuar;

Ele não quer escrever sobre todas as posições.

Há 7 posições em aberto. Eu escrevi um arquivo.

Eu o compilei quando minha EA esteve em um gráfico e começou a escrever dados da primeira e da última posições. Agora eu tenho apenas um dado, da primeira posição.

Não consigo ver seis, mas tenho todos os carrapatos emAlert(NameFile).

O que ele precisa...

 
há muitas condições no programa, incluindo uma condição que deve ser cumprida para que o arquivo possa ser escrito:
if(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent()) // uma vez a cada meia hora a partir da abertura do pedido. Isto é necessário?
{
t_pre=TimeCurrent();
O programa contém ramificações:
  for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || 
               OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     _o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
  for(i=0; i<k; i++) 
  {
     if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующему
     if(OrderSymbol()!=sy && sy!="") continue;   // а это вообще надо?
     if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?
     if(op>=0 && OrderType()!=op) continue;
     if(mn>=0 && OrderMagicNumber()!=mn) continue;
     _o_t=OrderOpenTime();
Qual era o propósito de escrevê-lo em uma escada antes? Na versão antiga da MQL4, ela acelerou a execução. Não tem importância agora
A variável _o_t é utilizada apenas em 2 lugares. Se o substituirmos por OrderOpenTime(), o programa se torna mais claro e mais curto em 2 linhas (declaração e atribuição)
datatime _o_t; e
_o_t=OrderOpenTime();
 

Consegui - a contagem regressiva de 60 segundos tem que ser tirada do laço

//+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#property strict
bool RUS=true;
datetime t_pre=0;  // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   if(t_pre+60>=TimeCurrent()) return;      // Дождаться 60 секунд после прошлой обработки
   t_pre=TimeCurrent();                     // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!

   string text;
   for(int i=0; i<OrdersTotal(); i++) 
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
      string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
      Alert(ИмяФайла);
      if(OrderOpenTime()+60>=TimeCurrent()) continue;   // Пропуск молодых которым меньше 1 минуты
      if(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минут
      if(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
      if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}

      // Открытие или создание файла и перемещение указателя в конец
      int Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
      if(Файл == -1) {  Alert("Ошибка при открытии файла ",ИмяФайла);  return; }
      FileSeek(Файл,0,SEEK_END);

      // Если новый файл записать имя файла и строку заголовков колонок
      if(FileSize(Файл)==0)
      {
         FileWrite(Файл,ИмяФайла);
         FileWrite(Файл,"           Время Полу   BID     Цена ");
      }
      // Сбор информации и запись в файл
      FileWrite(Файл, TimeToStr(TimeCurrent()), text,
                dstr(Bid), "  ", dstr(OrderOpenPrice()));
      FileClose(Файл);
   }
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
   if(!RUS) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
Arquivos anexados:
-Fi----.mq4  5 kb
 

Boa tarde, caros usuários do fórum.

Você pode me dizer por que a otimização e os testes das mesmas configurações às vezes produzem resultados diferentes?

Fiz o download de citações do SQ Tick Downloader e as executei através do script

 
Aidar Kaliaskar:

Boa tarde, caros amigos.

Você pode me dizer por que a otimização e os testes das mesmas configurações às vezes produzem resultados diferentes?

Vou lhe dizer mais: ao negociar em uma conta real com um corretor em 2 contas diferentes, podem ser obtidos resultados diferentes.
 
Vladislav Andruschenko:
Vou lhe dizer mais: ao negociar em uma conta real com o mesmo corretor em 2 contas diferentes, pode haver resultados diferentes.

Provavelmente depende mais do corretor. Mas você poderia me dar uma dica sobre a pergunta inicial?

 
Aidar Kaliaskar:

Provavelmente depende mais do corretor. Mas você poderia dar alguns conselhos sobre a pergunta inicial?

Espalhada, se faturada na corrente. A data final do teste se for faturado no atual. Pode haver muitas outras razões para isso.
Razão: