MQL5 Kullanan Hisse Osilatörü - sayfa 5

 
joo :

İşte bir dosyadan okumak için kod:

Neden FileReadString() ?

FileReadArray () kullanmak daha iyi değil, o zaman döngü gerekli değildir.

 
Serj_Che :

Neden FileReadString() ?

FileReadArray () kullanmak daha iyi değil, o zaman döngü gerekli değildir.

Belki daha da iyi. Ben sadece buna alışkınım. :)
 

Roş :
Bir dosyaya eşitlik değerleri yazın. Ardından bu değerlere dayalı bir gösterge oluşturun. Ancak, test sırasında dosyalar agent_name/MQL5/Files klasörüne yazıldığından, veri dosyasının manuel olarak aktarılması gerekecektir.

Her şeyin ne kadar berbat olduğunu ancak şimdi anladım.

Ancak yüzlerce testten bahsettiğimiz için manuel olarak bu soruna bir çözüm olmadığı açıktır.

Ve öyle görünüyor ki: başlangıçta mevcut veriler var, ama - ah, Mucize! -- program öyle bir şekilde tasarlanmıştır ki, onları programlı olarak çıkarılıp kullanılana kadar bir şekilde ve bir yere kaydetme imkanı yoktur!

Profesyonel bir programcı değilim ama bu durum kafama oturmuyor.

Büyük belgeler .., binadaki en geniş olasılıklar, öyle görünüyor ki, her şey ve her şey .., bellek yönetimi, OOP ve burada, temelde basit ve kritik olarak gerekli (umarım zaten açıklamışımdır) - bir çıkmaz sokak.

... Ve yine de ... Soru!

Daha sonra bir gösterge oluşturmak için kullanılabilecek bir tür silinemez program dizilerine test modunda yazmak gerçekten mümkün değil mi?

dahil Global bir değişken aracılığıyla böyle bir diziye bir işaretçi iletmek mümkün müdür?

Ve mevcut uygulama açısından değil, prensip olarak test aşaması ile ana çalışmanın zamanı arasında veri depolama ve aktarma genel sorunu nedir?

Renat yüzlerce megabayt veriden bahsetmiş ama birincisi neden hep veri aktarımı, eğer böyle bir imkan ancak programcının doğrudan iradesiyle sağlanabiliyorsa ve ikincisi görev anlamında veri miktarı çok daha az, ve birkaç bin haneye tekabül etmektedir.

Kullanıcının bakış açısından, tekrarlanan testler sırasında dosyaları manuel olarak aktarma seçeneğinin (ve karmaşıklığı nedeniyle pazarın tekrar gerektirdiğinden) kesinlikle elverişsiz ve ümitsiz olduğunu, aynı zamanda ben hazırım Hesap bakiyesi göstergelerinin dinamiklerinin, test tarihi üzerindeki fiyatların dinamikleri ile doğrudan korelasyon içinde olduğunu herkesle tartışmak, genel olarak en önemlilerinden biridir.

Dosyaları okuma modunda açma işlemlerinin ana modunda, kapsamı test cihazının dosyalar klasörüne genişletme sorusu nedir? Bunda varsayımsal bir tehdit bile ne olabilir?

Ve RAM'de ana mod ile test modu arasında gerekli verilerin zorunlu olarak saklanması olasılığının olmaması sorunu nedir?

 

Diskte rastgele bulunan klasörlerden dosya yazmak ve okumak için dll kullanın. Sadece dosya yazma ve okuma fonksiyonlarını dll'ye aktarın, hepsi bu.

 
DV2010 :

... Ve yine de ... Soru!

Daha sonra bir gösterge oluşturmak için kullanılabilecek bir tür silinemez program dizilerine test modunda yazmak gerçekten mümkün değil mi?


Bir dosyayı açarken FILE_COMMON bayrağını belirtmeyi deneyin - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

tanımlayıcı

Anlam

Tanım

FILE_COMMON

4096

Tüm istemci terminallerinin paylaşılan klasöründeki dosya konumu. Bayrak, dosyaları açarken ( FileOpen() ), dosyaları kopyalarken ( FileCopy() , FileMove() ) ve dosyaların varlığını kontrol ederken ( FileIsExist() ) kullanılır.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов - Документация по MQL5
 
Rosh :

Bir dosyayı açarken FILE_COMMON bayrağını belirtmeyi deneyin - https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Bu betiği çalıştırın ve nereye yazdığını görün

 //+------------------------------------------------------------------+
//|                                             Demo_File_Common.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input string    filename = "file_common.txt" ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string common_folder = TerminalInfoString ( TERMINAL_COMMONDATA_PATH );
//---
   int handle= FileOpen ( filename , FILE_WRITE | FILE_COMMON );
   if (handle!= INVALID_HANDLE )
     {
       uint written= FileWrite (handle, "Общая папка всех терминалов - " ,common_folder);
       if (written> 0 )
        {
         PrintFormat ( "Записано %d байт в общую папку всех терминалов - %s" ,written,common_folder);
        }
     }
   else
     {
       Print ( "Не удалось открыть на запись файл " ,filename, ".  Ошибка " , GetLastError ());
     }

  }
//+------------------------------------------------------------------+
 

joo, Rash, teşekkürler!

Paylaşılan klasör seçeneği daha entegre görünüyor.

Şaşırtıcı olan tek şey, bu kod çalıştırıldığında, gösterge içinde, yazma işleminin kendisi hala gerçekleştirilmesine rağmen, başarısız bir yazma ile ilgili bir mesajın görüntülenmesidir. Ayrıca, veri yazmanın tam olarak nasıl ve ne zaman daha iyi olduğu hakkında hala açık bir soru var (her onay için ayrı ayrı, ancak bu kaynak yoğundur veya en sonunda - bütün bir dizi, ancak dizi yazarken bir şey olmaz henüz oldukça doğru ve dahası, bu durumda OnCalculated'ın çıkarılmasına nasıl etki edeceğini anlamak zor - ikincisinde, testten sonra geçer mi?)

Ve başka bir soru, biraz konu dışı, ancak konuyla ilgili dün zaten gündeme geldi.

OnTick'e ve OnCalculated'a eklendi:

 Print ( "ObjectsTotal =" , ObjectsTotal ( ChartID ()));
ancak test tamamlandıktan sonra, açılış ve kapanış konumlarıyla ilişkili nesnelerin varlığına rağmen (Terminal: Grafikler>Nesneler>Nesne Listesi'nde oklar ve çizgiler görülebilir), döndürülen değer nedense 0'dır.
 

Bir dosyaya mümkün olduğunca nadiren yazmak daha iyidir, bu nedenle bütün bir dizi olarak yazmak daha iyidir. Değerleri dakikada bir kereden fazla ölçün, aksi takdirde grafikte görüntüleme ile ilgili sorunlar olacaktır (ve makul olmayan bir şekilde kaynak yoğundur). Yani koşunun sonunda. Ancak bu seçenek de mümkündür:

Algoritma şöyle görünür:

1) Test cihazında Expert Advisor'ı başlattı.

2) Faizin değerini ölçtük.

3) Bu değeri dosyaya yazın .

4) Ayrı bir dosyaya doğru yazıldı, yani yeni bir değer yazıldı

5) Çıkış koşulu, bayraklı dosyadaki yanlış bayrak olan sonsuz bir döngü başlattı.

6) Ayrı bir çizelgede script bayraklı dosyayı okur, eğer yeni bir değer belirirse daha sonra çizelgeye risk çizer, dosyaya false yazar.


Test cihazındaki görsel test modu bu şekilde görünecektir.

Biraz bekleyin rekabet biter, belki daha şık ve güzel çözümler sunulur.

Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
Файловые операции / FileWrite - Документация по MQL5
 
DV2010 :

joo, Rash, teşekkürler!

Paylaşılan klasör seçeneği daha entegre görünüyor.

Şaşırtıcı olan tek şey, bu kod çalıştırıldığında, gösterge içinde, yazma işleminin kendisi hala gerçekleştirilmesine rağmen, başarısız bir yazma ile ilgili bir mesajın görüntülenmesidir.

Böyle bir şey anlamıyorum. Denemek:

 //+------------------------------------------------------------------+
//|                                   Demo_File_Common_Indicator.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red

double buffer[];
input string    filename= "file_common.txt" ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,buffer, INDICATOR_DATA );

   string common_folder= TerminalInfoString ( TERMINAL_COMMONDATA_PATH );
//---
   int handle= FileOpen (filename, FILE_WRITE | FILE_COMMON );
   if (handle!= INVALID_HANDLE )
     {
       uint written= FileWrite (handle, "Общая папка всех терминалов - " ,common_folder);
       if (written> 0 )
        {
         PrintFormat ( "Записано %d байт в общую папку всех терминалов - %s" ,written,common_folder);
        }
     }
   else
     {
       Print ( "Не удалось открыть на запись файл " ,filename, ".  Ошибка " , GetLastError ());
     }
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

Rosh :

Böyle bir şey anlamıyorum. Denemek:

Roş

, Sebebinin tam olarak ne olduğunu anlayamıyorum, ancak göstergelerimin aksine, sizinkiyle başlattığınızda bir mesaj görüntüleniyor:

 2011.01 . 21 13 : 52 : 53      Core 1    2011.01 . 14 00 : 00 : 00    Expert removed because indicator 43 cannot load [ 4002 ]

Kodunuza dayanarak, şimdi tüm Özkaynak değerlerini bir dosyaya tik tik olarak yazması gereken en basit Uzman Danışmanı yaptım (kodda, yazılan sıfır bayt sayısı da dahil olmak üzere yalnızca herhangi birinin çıktısını değiştirdim, yapılan değişkenler globaldir ve dosyayı açma ve yazma işlemini OnInit ve OnTick'e taşır), ancak yazma hatası olmamasına ve dosyanın oluşturulmasına rağmen, girişler ve dosya boştur.

 #property copyright "Copyright 2010, Pavlov Sergei"
#property link       ""
#property version   "1.00"

#include <\..\Experts\_My\Classes\ClassExpert\ClassExpert.mqh>
ClassExpert Expert1;
int handle;
string common_folder;
string filename;

void OnInit (){
   Expert1.Init();
   //--
   filename= "equity.txt" ;
   common_folder= TerminalInfoString ( TERMINAL_COMMONDATA_PATH );
   int handle= FileOpen (filename, FILE_WRITE | FILE_COMMON );
}
void OnTick (){
   Expert1. OnTick ();
   //---
   if (handle!= INVALID_HANDLE ){
       uint written= FileWrite (handle, AccountInfoDouble ( ACCOUNT_EQUITY ),common_folder);
       PrintFormat ( "Expert OnTick: Записано %d байт в общую папку всех терминалов - %s" ,written,common_folder);
   }
   else {
       Print ( "Expert OnTick: Не удалось открыть на запись файл " ,filename, ".  Ошибка " , GetLastError ());
   }  
}
void OnDeinit ( const int reason){
   Expert1.Deinit();
   //---
   FileClose (filename);
}

 2011.01 . 21 14 : 00 : 46      Core 1   connect closed
2011.01 . 21 14 : 00 : 46      Core 1    log file "C:\Program Files\MetaTrader 5\Tester\Agent-127.0.0.1-3000\logs\20110121.log" written
2011.01 . 21 14 : 00 : 46      Core 1   EURUSD,H1: 5516 ticks ( 23 bars) generated within 47 ms (total bars in history 6419 , total time 3093 ms)
2011.01 . 21 14 : 00 : 46      Core 1   OnTester result 0
2011.01 . 21 14 : 00 : 46      Core 1    2011.01 . 14 23 : 59 : 59    order performed sell 0.15 at 1.33829 [ # 13 sell 0.15 EURUSD at 1.33829 ]
2011.01 . 21 14 : 00 : 46      Core 1    2011.01 . 14 23 : 59 : 59    deal performed [ # 13 sell 0.15 EURUSD at 1.33829 ]
2011.01 . 21 14 : 00 : 46      Core 1    2011.01 . 14 23 : 59 : 59    deal # 13 sell 0.15 EURUSD at 1.33829 done (based on order # 13 )
2011.01 . 21 14 : 00 : 46      Core 1    2011.01 . 14 23 : 59 : 59    position closed due end of test at 1.33829 [buy 0.15 EURUSD 1.33593 ]
2011.01 . 21 14 : 00 : 46      Core 1    2011.01 . 14 22 : 00 : 00    Expert OnTick : Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
2011.01 . 21 14 : 00 : 46      Core 1    2011.01 . 14 21 : 00 : 00    Expert OnTick : Записано 0 байт в общую папку всех терминалов - C:\Documents and Settings\All Users\Application Data\MetaQuotes\Terminal\Common
Neden: