MQL5 Kullanan Hisse Osilatörü - sayfa 4

 
joo :

EA'da küresel düzeyde iki dizi bildirin Özkaynak [] ve Zaman[]

Expert Advisor'ı test ederken denklik değerini ve zamanı uygun diziye girin.

Komut dosyası, testin tamamlanmasının ardından dosyayı okur ve nesnelerle istenen grafik üzerinde eşitlik oluşturur.

Amaçlarınız için en uygun yöntem bu, neden bir göstergeye ihtiyacınız olduğunu anlamıyorum.

Eh, zaten yaptığım şeydeki zorluğun tam olarak ne olduğunu açıkça ve net bir şekilde anlayabilseydim, o zaman taksi yapmak daha kolay olurdu ...

(Değişen değerler zaten OnCalculated'da, başka neye ihtiyacınız var? )

Global değişkenler hakkında zaten düşündüm, ancak tanım gereği:

 datetime    GlobalVariableSet (
   string   name,       // имя
   double   value       // устанавлимое значение
   );

Ve bir dizi veya en azından Value'ya bir bağlantı nasıl yazılır, böylece daha sonra oradan çıkarmak mümkün olur ... Soru.

Nesnelere gelince, iki şeyi birleştirmek istiyorum:

1. İşlem satırları sonuca bağlı olarak belirtilir (kırmızı - tümü kârsız, mavi - tümü kârlıdır)

2. Göstergenin alt kısmında, ilk mevduattan bir karlılık grafiği oluşturun.

Aksi takdirde, nesneleri küçük ölçekte kullanırken, anlaşma çemberleri bile (ki bu arada, kurtulmak isterdim ama yine nasıl bilmiyorum) fiyat dinamiklerini görmeyi zorlaştırıyor.

Benim durumumda, Uzman Danışmanları uzun zaman dilimlerinde test etmekten bahsediyorum, burada tam olarak böyle bir eğri kombinasyonu, şimdi anladığım gibi, geleneksel işlemlere ihtiyaç duymadan, kayıp ve kârlı işlemlerin tarih boyunca dağılımının en eksiksiz resmini verecektir. Her işlem için açılış yönünün hareket yönü ile karşılaştırılması.

 

sergey1294 :
Даже не знаю как вам объяснить. AccountInfoDouble ( ACCOUNT _ EQUITY ) хранит последнее значение эквити. После тестирования как сказал Ренат индикатор инициилизируется заново и пересчитывается. По этому данные эквити накопленные в буфере индикатора за время прогона стираются.

Ama bu - silmeyle ilgili - zaten "sıcak"!

Ancak, dosyaları yazmak ve okumak için daha hantal ve kaynak yoğun bir prosedür olmadan daha sonra geri yüklemek için OnCalculated'daki bu değerleri başka bir yabancı ve "silinemez" Gösterge dizisine yazmayı engelleyen nedir?

Yoksa zaten sistem düzeyinde bir soru mu (artık atlanamayan dizilerin zorunlu otomatik serbest bırakılması için)?

Bu tür kaynakların (bellekte değişken oluşturma ve silme) manuel olarak yönetilebileceğini okumama rağmen ...

 
DV2010 :

Eh, zaten yaptığım şeydeki zorluğun tam olarak ne olduğunu açıkça ve net bir şekilde anlayabilseydim, o zaman taksi yapmak daha kolay olurdu ...

(Değişen değerler zaten OnCalculated'da, başka neye ihtiyacınız var? )

Global değişkenler hakkında zaten düşündüm, ancak tanım gereği:

Ve bir dizi veya en azından Value'ya bir bağlantı nasıl yazılır, böylece daha sonra oradan çıkarmak mümkün olur ... Soru.

Nesnelere gelince, iki şeyi birleştirmek istiyorum:

1. İşlem satırları sonuca bağlı olarak belirtilir (kırmızı - tümü kârsız, mavi - tümü kârlıdır)

2. Göstergenin alt kısmında, ilk mevduattan bir karlılık grafiği oluşturun.

Aksi takdirde, nesneleri küçük ölçekte kullanırken, anlaşma döngüleri bile (ki bu arada, kurtulmak isterdim ama yine nasıl bilmiyorum) fiyat dinamiklerini görmeyi zorlaştırıyor.

Benim durumumda, Uzman Danışmanları uzun zaman dilimlerinde test etmekten bahsediyorum, burada tam olarak böyle bir eğri kombinasyonu, şimdi anladığım gibi, geleneksel işlemlere ihtiyaç duymadan, kayıp ve kârlı işlemlerin tarih boyunca dağılımının en eksiksiz resmini verecektir. Her işlem için açılış yönünün hareket yönü ile karşılaştırılması.

Terminali değil, programın global değişkenlerini kastettim.

Maksimum doğruluk (frekans) elde etmek için nesneleri bir dakikalık grafikte bile oluşturabilirsiniz. Daha sonra grafikten nesneleri okurken indikatör ile çizgiler çizebilirsiniz (indikatör ile çizmek için inanılmaz bir istek varsa), hatta indikatör ayarlarına bir düzeltme faktörü girerek herhangi bir yerden eşitliği görebilmeniz için indikatör ayarlarına bir düzeltme faktörü bile girebilirsiniz. ilk depozito .

Yine, tüm çizgiler ve diyagramlar bir komut dosyasıyla oluşturulabilir.

 
joo :

Terminali değil, programın global değişkenlerini kastettim.

Maksimum doğruluk (frekans) elde etmek için nesneleri bir dakikalık grafikte bile oluşturabilirsiniz. Ardından, grafikteki nesneleri okuyarak, gösterge ile çizgiler oluşturabilirsiniz, hatta herhangi bir ilk depodan öz sermayeyi görebilmeniz için gösterge ayarlarına bir düzeltme faktörü girebilirsiniz.

Programın global değişkenlerine gelince - anladığım kadarıyla Gösterge kodunda ve Expert Advisor kodunda global değişkenler olabilir.

Bu değişkenlerden biri, testten sonra, bir nedenle (görünüşe göre bir sistem planından) silindikleri bir dizi Gösterge değerleridir.

Ama sonra, OnCalculated Göstergesinde, ister global değişkenlerden, nesnelerden veya bir dosyadan geçmiş olsun, Equty geçmişini görüntülemek için değerlerin alınması gerektiğini doğru anlıyorum.

 
DV2010 :

Ancak o zaman doğru anlıyorum ki, Equty'nin geçmişini görüntülemek için değerlerin, ister global değişkenlerden, nesnelerden veya bir dosyadan gelen geçmiş olsun, OnCalculated Indicator'da?

Aynen öyle.
 
joo :
Aynen öyle.

Bu durumda programın global değişkenlerini kullanmak mümkün müdür?

Sonuçta, uzmanın global değişkenleri göstergede görünmeyecek ve daha sonra, gösterge değerleri dizisinin aksine, uzmanda OnCalculated işleminden sonra "silinmez" olması gereken göstergenin global değişkenlerini kullanmaya devam edecektir. mod?

Ve mümkünse, mevcut grafiğin nesneleri hakkında bir soru. Şimdi ona ait nesnelerin listesini nasıl çıkaracağımı bulmaya çalıştım ama yine de bulmak zor. Bana programlı olarak nasıl yapacağımı söyler misin?

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
DV2010 :

Ve mümkünse, mevcut grafiğin nesneleri hakkında bir soru. Şimdi ona ait nesnelerin listesini nasıl çıkaracağımı bulmaya çalıştım ama yine de bulmak zor. Bana programlı olarak nasıl yapacağımı söyler misin?

Grafikteki nesnelerin sayısını almak için ObjectsTotal işlevini kullanın

 int    ObjectsTotal (
   long   chart_id,     // идентификатор графика
   int    nwin=- 1 ,       // индекс окна
   int    type=- 1        // тип объекта     
   );
ChartID kullanarak grafik kimliğini alın
 

Kabaca şöyle bir şey:

 //+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2010, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int TradeHistoy= 10000 ;

//Глобальные пременные
double    Equity[];
datetime EquityTime[];
int       cnt;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ArrayResize (Equity,TradeHistoy); ArrayInitialize (Equity, 0.0 );
   ArrayResize (EquityTime,TradeHistoy); ArrayInitialize (Equity, 1 );
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

//Записать накопленные данные в файл
   D_ArrayToCsv( "DATA" ,Equity,TradeHistoy, ";" );
   D_ArrayToCsv( "TIME" ,Equity,TradeHistoy, ";" );

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {

//В нужном месте эксперта проверить значение эквити
//записать эквити и время замера 
   if (cnt<TradeHistoy)
     {
      Equity[cnt]= AccountInfoDouble ( ACCOUNT_EQUITY );
      EquityTime[cnt]= TimeTradeServer ();
     }

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

void D_ArrayToCsv( string filename, double &mass[], int line, string Separator)
  {
// запись массива в файл
   string str;
   int handle= FileOpen (filename, FILE_CSV | FILE_WRITE ,Separator);
//Цикл записи строчек в файл
   for ( int l= 0 ;l<line;l++)
     {
      str= DoubleToString (mass[l], 8 );
       FileWrite (handle,str);
     }
   FileClose (handle);
  }
//+------------------------------------------------------------------+
Ardından oluşturulan dosyalar ile istediğinizi yapabilirsiniz.
 

Teşekkürler, Rosh, nesnelerle ilgili ipucu için, sanırım şimdi görevimin bu kısmını halledebilirim.

... Ama az önce ustalaşmaya çalıştığım dosya işlemlerinde her şey biraz daha kafa karıştırıcı (aslında bundan korkmuştum!)

:)

Birkaç sürpriz var:

1. Bir döngüde yazma dosyası nedense birkaç yerine tek bir değer yazıyor.

2. FileWriteArray işleminde , işaretçiyi elde etme ve geçirilen dizinin boş olmadığını kontrol etme başarısına rağmen

yazılan eleman sayısı -1'dir.

3. Belgeler, test aşamasında, MQL5\tester\files klasöründe ve ana çalışma aşamasında - MQL5/dosyalarında, açma işlemlerinin gerçekleştiğini söylüyor, bu da Göstergenin cihazda kaydedilen verileri nasıl alabileceği sorusunu hemen gündeme getirdi. test aşaması, ana çalışma sırasında (ayrıca, vesbma klasörünün yolu basit değildir ve büyük olasılıkla zamanla değişebilir - \tester\Agent-127.0.0.1-3000\MQL5\Files )

 
DV2010 :


3. Belgeler, test aşamasında, MQL5\tester\files klasöründe ve ana çalışma aşamasında - MQL5/dosyalarında, açma işlemlerinin gerçekleştiğini söylüyor, bu da Göstergenin cihazda kaydedilen verileri nasıl alabileceği sorusunu hemen gündeme getirdi. test aşaması, ana çalışma sırasında (ayrıca, vesbma klasörünün yolu basit değildir ve büyük olasılıkla zamanla değişebilir - \tester\Agent-127.0.0.1-3000\MQL5\Files )

Kolları ile taşıyın.

İşte bir dosyadan okumak için kod:

 void CsvTo1D_Array( string nameFile, double &array[], int line, string Separator)
{
         int end= 0 ;
         int handle= FileOpen (nameFile, FILE_CSV | FILE_READ ,Separator);

         if (handle!= 1 )
        {
                 Alert ( "Файл " ,nameFile, " не найден!" );
        }
         else
        {
                 for ( int l= 0 ;l<line;l++)
                {
                        array[l]= StringToDouble ( FileReadString (handle));
                }
                 FileClose (handle);
        }
}
//+------------------------------------------------------------------+
Neden: