MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 478

 
lil_lil :

FileSeek var (Dosya, 0 , SEEK_END ); ve her şey dosyaya yeni bir satırdan yazılır.

Sorun şu ki, 4 dosya var ve her biri ayrı bir dosyada dört pozisyon için veri yazmanız gerekiyor, her dosyanın adında bir pozisyon bileti var ve veriler sadece bir tanesine, son dosyaya, sondaki veriye yazılıyor. konum.

Dosya adları doğru mu? Ticket=OrderTicket() yerine; DosyaAdı=_Ticket+Symbol()+".txt"; FileName=(string)OrderTicket()+Symbol()+".txt" yazardı; ve başlangıçta #property katı yönergesini eklerdim - hataları ortadan kaldırmaya yardımcı olur
 
STARIJ :
Dosya adları doğru mu? Ticket=OrderTicket() yerine; DosyaAdı=_Ticket+Symbol()+".txt"; FileName=(string)OrderTicket()+Symbol()+".txt" yazardı; ve başlangıçta #property katı yönergesini eklerdim - hataları ortadan kaldırmaya yardımcı olur

Teşekkürler, isim oluşumu sizin tavsiyenize göre yeniden yapıldı, ancak yine de sadece son pozisyonun verilerini yazıyor.

Ve yeni dosyaların adları değişmedi) Konunun adı olmadığından şüpheleniyorum, son konumun dosyası zaten bulundu.

Neden önceki pozisyonları görmezden geliyor?

 

1501896125EURUSD.txt
Zaman Yarı TEKLİF Fiyatı
2018.02.22 22:53 K 1.23259 0.88322
2018.02.22 22:54 K 1.23259 0.88322
2018.02.22 22:55 S 1.23259 0.88322
2018.02.22 22:56 S 1.23249 0.88322

1501896094EURUSD.txt
Zaman Yarı TEKLİF Fiyatı
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
bir şey değişti mi? bak... işte burada: string sy=""; int op=-1, mn=-1; pek gerekli değil ... belki atmak? Bir döngüde, iç içe if() yerine devam etmek daha iyidir;

Dosyalar:
Fileee.mq4  7 kb
 
STARIJ :

1501896125EURUSD.txt
Zaman Yarı TEKLİF Fiyatı
2018.02.22 22:53 K 1.23259 0.88322
2018.02.22 22:54 K 1.23259 0.88322
2018.02.22 22:55 S 1.23259 0.88322
2018.02.22 22:56 S 1.23249 0.88322

1501896094EURUSD.txt
Zaman Yarı TEKLİF Fiyatı
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
bir şey değişti mi? bak... işte burada: string sy=""; int op=-1, mn=-1; pek gerekli değil ... belki atmak? Bir döngüde, iç içe if() yerine devam etmek daha iyidir;

Tüm pozisyonları yazmak istemiyor.

7 pozu açın. bir dosya yazdı

Danışman grafikteyken derlenmiş, ilk ve son pozisyonların verilerini kaydetmeye başladı. Şimdi verileri yalnızca bir tanesine, ilk konuma yazar.

altısı eksik görünüyor, ancak uyarıda ( DosyaAdı ) uyarıda biletlerin hepsi orada.

Ne istiyor...

 
bir dosya yazmak için aşağıdaki koşul dahil olmak üzere programda birçok koşul vardır:
if(t_pre+60< TimeCurrent() && _o_t+1800>TimeCurrent()) // siparişin açılmasından itibaren yarım saat boyunca dakikada bir. Bu gerekli mi?
{
t_pre=ZamanAkım();
Program dalları içerir:
   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 ();
Neden merdivenle yazardın? MQL4'ün eski versiyonunda bu, yürütmeyi hızlandırdı. Şimdi önemli değil
_o_t değişkeni yalnızca 2 yerde kullanılır. Onu OrderOpenTime() ile değiştirirseniz, program 2 satır daha netleşir ve kısalır (bildirim ve atama)
tarihsaat_o_t; ve
_o_t=OrderOpenTime();
 

Sorunun ne olduğunu buldum - bir döngü için 60 saniyelik geri sayım yapılmalı

 //+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#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 ), "." ), ',' );
}
Dosyalar:
-Fi----.mq4  5 kb
 

İyi günler, sevgili forum kullanıcıları.

Aynı ayarları optimize ederken ve test ederken neden bazen farklı sonuçlar çıktığını söyleyebilir misiniz?

SQ Tick Downloader'dan indirilen alıntılar ve komut dosyası boyunca çalışır

 
Aidar Kaliaskar :

İyi günler, sevgili varlıklar.

Aynı ayarları optimize ederken ve test ederken neden bazen farklı sonuçlar çıktığını söyleyebilir misiniz?

Size daha fazlasını anlatacağım: Gerçek bir hesapta işlem yaparken, 2 farklı hesaptaki bir komisyoncu farklı sonuçlara sahip olabilir.
 
Vladislav Andruschenko :
Size daha fazlasını anlatacağım: Gerçek bir hesapta işlem yaparken, 2 farklı hesaptaki bir komisyoncu farklı sonuçlara sahip olabilir.

Muhtemelen daha çok komisyoncuya bağlıdır. Ama asıl soruya yardım edebilir misin?

 
Aidar Kaliaskar :

Muhtemelen daha çok komisyoncuya bağlıdır. Ama asıl soruya yardım edebilir misin?

Geçerli olarak ayarlanmışsa yayılır. Şu anda ayarlanmışsa, test için bitiş tarihi. Daha birçok sebep olabilir.