Hatalar, hatalar, sorular - sayfa 567

 
Genel olarak CTrade üzerinden çalıştı.. Bir dosya yardımı ile her şeyi yeniden yapmak kalır .. Helikopterden yine denizaltı.. Ama diyemem, boom boom yok.. :)
 

Hmm.. Prensipte her şey aynı..

 

Yeni yapı, basit yapıları bir döngüde kopyalamayı durdurdu. İşte test komut dosyası:

 //+------------------------------------------------------------------+
//|                                             Test_Copy_Struct.mq5 |
//+------------------------------------------------------------------+
struct   trade_settings
  {
   int       reopened;
   int       reverse; 
   int       TrailingStop;
   int       WithoutlossLevel;
   int       WithoutlossProfit;
   double    LossToReverse;
   int       MAPeriod;
   int       MA_use;
   double    Lots;
   int       takeprofit; 
  };
trade_settings arr_tr_set_ini[ 3 ]={  
 { 60 , 90 , 1000 , 100 , 900 , 2000.0 , 105 , 1 , 0.13 , 2700 },   // EURUSD
 { 130 , 1298 , 400 , 300 , 600 , 1000.0 , 130 , 1 , 0.1 , 2800 },   // GBPUSD
 { 110 , 140 , 200 , 600 , 800 , 1000.0 , 85 , 0 , 0.15 , 1700 }};   // AUDUSD 
trade_settings symb_default={ 110 , 130 , 200 , 1300 , 1500 , 3000.0 , 100 , 1 , 0.1 , 1000 };

class CTest_Copy_Struct
  {  
protected :
   trade_settings    m_tr_set;
public :
   void               Copy_tr_set( const trade_settings& tr_set){m_tr_set=tr_set;}
   void               Print_tr_set(){ printf ( "Setting reopened=%u overpos=%u TrailingStop=%u WithoutlossLevel=%u WithoutlossProfit=%u" 
                        ,m_tr_set.reopened,m_tr_set.reverse,m_tr_set.TrailingStop,m_tr_set.WithoutlossLevel,m_tr_set.WithoutlossProfit);
                         printf ( "LossToReverse=%.2f MAPeriod=%u MA_use=%u Lots=%.2f takeprofit=%u"
                        ,m_tr_set.LossToReverse,m_tr_set.MAPeriod,m_tr_set.MA_use,m_tr_set.Lots,m_tr_set.takeprofit);}
   void               Zero(){ ZeroMemory (m_tr_set);} 
  };

void OnStart ()
  {
   CTest_Copy_Struct Test; 
   Test.Zero();
   Test.Print_tr_set();
   Print ( "------------------------------" );
   Test.Copy_tr_set(arr_tr_set_ini[ 0 ]);
   Test.Print_tr_set();
   Print ( "------------------------------" );
   Test.Copy_tr_set(arr_tr_set_ini[ 2 ]);
   Test.Print_tr_set();
   Print ( "------------------------------" );
   Test.Copy_tr_set(symb_default);
   Test.Print_tr_set();
   int total= ArraySize (arr_tr_set_ini);
   for ( int i= 0 ;i< 3 ;i++)
     {
       Print ( "i=" ,i);
      Test.Copy_tr_set(arr_tr_set_ini[i]);
      Test.Print_tr_set();
     } 
  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Valmars :

Sonuç:

2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) 'E:\Program Files\Championship_2011\MQL5\Scripts\Test_Copy_Struct.ex5' içinde 0x00000000209FFFAC olarak erişim ihlali okundu
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) i=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=3000.00 MAPPeriod=100 MA_use=1 Lot=0.10 alprofit=1000
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Ayar yeniden açıldı=110 overpo=130 TrailingStop=200 KayıpsızLevel=1300KayıpsızKar=1500
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=1000.00 MAPPeriod=85 MA_use=0 Lot=0.15 kar al=1700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Ayar yeniden açıldı=110 overpos=140 TrailingStop=200 KayıpsızLevel=600KayıpsızKar=800
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=2000.00 MAPPeriod=105 MA_use=1 Lot=0.13 kar al=2700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Ayar yeniden açıldı=60 overpos=90 TrailingStop=1000 KayıpsızLevel=100KayıpsızKar=900
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=0,00 MAPeriod=0 MA_use=0 Lot=0,00 kar al=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Ayar yeniden açıldı=0 overpos=0 TrailingStop=0 LossLevel=0 WithoutlossProfit=0

 

https://www.mql5.com/ru/docs/basis/function/events'in sonunda şöyle yazıyor: " Daha iyi anlamak için kodu aşağıda eklenmiş olan göstergeyi çalıştırmak faydalı olacaktır. "

Kod başladı. Haftasonunda. Daha iyi bir anlayış olmadı - bence normaldi, ancak en kötü izlenimler eklendi. Hafta sonları tik yoktur, bu nedenle prev_calculated = 0 şu anda zaman diliminden zaman dilimine geçiş yaparken her zaman:

Ancak, güzel bir anda ortaya çıkıyor (yeniden bağlantı yoktu, dürüst olmak gerekirse asil!) İşte değer:

ve grafikteki komik satırlar:

ya da iki kat daha az komik, bunun gibi:

Hatta hikayenin başında ZigZag şeklinde satırlar bile vardı (ne yazık ki ekran görüntüsü almayı unuttum ama çoğaltmak mümkün olmadı).

Çizgiler ayrıca diğer TF'lerde de görünüyor, ancak daha seyrek. Bunu kendiniz kolayca doğrulayabilirsiniz.

Yazarların söylemek istediği tam olarak bu mu?

Neden prev_calculated'ın sonucu kenelerin yokluğunda en azından aynı değil, hatta tamamen garip? TF'den TF'ye atlarken bir şeyler başarısız mı oluyor?

Bu (veya başka) çizgiler kenelerin dışında görünmeli mi?

Nadir durumlarda, zaman diliminden zaman dilimine nispeten sık bir atlama, geçmişteki çubuk değerlerinin hesaplanmasını vb. başlatan sahte bir onay işareti gibi bir şey üretebilir mi?

Terminal değişkenliğinin sabitlenmesini beklemeli miyiz? Yoksa malzeme mi öğrenmeliyim?

İstenmemesi gereken bir şey mi yapmaya çalışıyorum? Bu durumda, bakış açınızı haklı çıkarın.

Bir çok soru birikmiş ... ancak, bu sadece başlangıç ...

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

Devamı...

Aynı bağlantı şu ifadeyi içerir: " Not : OnCalculate işlevi sıfır değeri döndürürse, gösterge değerleri istemci terminalinin DataWindow'unda görüntülenmez. "

Bakın sorun ne... Ellerimin büyüdüğü her yeri seve seve kabul eder, gerekirse hemen düzeltirim. Ancak. Basit göstergelerde ve orta karmaşıklıkta, yine de bir şekilde bazı durumlardan hatalarla çıkabilirsiniz. Ancak kodun karmaşıklığı arttıkça, herhangi bir Copy...() kopyalama işlevi (hem başka bir göstergenin tutamağını bir argüman olarak kabul eden hem de onsuz) durumu önemli ölçüde karmaşıklaştırmaya başlar, kişisel olarak bana göründüğü gibi, kim var? bir haftadan daha az süredir MQL programlama yapıyor. Kodda başka nelerin değiştirilebileceğini artık bilmediğiniz bir eşik anı gelir, çünkü değiştirebileceğiniz her şey ve o zaman göründüğü gibi geri kalanına hiç dokunulması gerekmez, çünkü değiştirecek hiçbir şeyi yoktur. sorunla yapın. Veya tamamen silahsızlandıran bir düşünce içeri girer: algoritmayı tamamen değiştirmek, çünkü yaşamın özellikleri ve terminalin kaprisleri önceden dikkate alınmamıştır. Ne de olsa, belgelerden MQL'yi inceleme sürecinde, geliştiricilerin büyük olasılıkla yanlışlıkla gizlediği nüanslarla uğraşmak gerekir. Ne de olsa, bir MQL programcısı, belgeleri tam olarak inceledikten sonra fazla bir şey öğrenmez... Ve en rahatsız edici olan şey, terminalin pek çok değişkeni MQL aracılığıyla hiçbir şekilde düzeltilemez, ya da Şüpheli koltuk değneklerinin şifresi ve bir gün çarpmak canımı acıtıyor...

Tamam... Bugün çıldırdım. Hala bir gün izin.

Ve işte sabahın erken saatlerinde söylemek istediklerim...

https://www.mql5.com/ru/forum/1111/page570#comment_117425 - terminalin ilk lansmanı sırasında göstergenin çizilmemesinin ana sorunu bir şekilde çözüldü (umarım kimse bunun gerçeğiyle tartışmayacaktır). en azından fraktal göstergenin hiçbir şeyi yok, kenelerin yokluğunda bile tüm geçmişi düzgün bir şekilde çizmeyi engellemeli mi?).

Öyleydi:

             CopyHigh ( _Symbol , PERIOD_M1 ,TimeUpBuffer[shift+ 1 ]- 1 ,
                                    TimeUpBuffer[shift],
                                    exact_extremum);

ile değiştirildi:

             if ( CopyHigh ( _Symbol , PERIOD_M1 ,TimeUpBuffer[shift+ 1 ]- 1 ,
                                       TimeUpBuffer[shift],
                                       exact_extremum)< 0 ) return ( 0 );

Dikkatsizliğimi ve sonuç olarak zararlı biçimciliği kabul ediyorum.

Ancak. Bu, en basit durumda yardımcı oldu (orijinal göstergeyi özel olarak basitleştirdi). Daha karmaşık bir göstergede, bu tür hileler artık yardımcı olmadı - bir noktada, özellikle orada çok sayıda kopyalama işlevi olduğundan, değişiklikler herhangi bir farklılık göstermeyi bıraktı. Ve nereye ve nasıl devam edeceğime dair anlaşılır bir talimat almayı çok isterim. Ne de olsa, güvertenin kütüğünden geçenlere çok fazla zaman harcanıyor. Şimdiye kadar, bunun benim cant mı yoksa terminal mi olduğunu bile anlamadım. Ve birincil oluşturma sorununun yalnızca if ve dönüşün olmamasından kaynaklandığından emin değilim ... bazı yerlerde şüpheli görünüyor, örneğin, başka ...

Geliştiriciler - Gerekirse kodu PM olarak atacağım; Aynı zamanda, amaçlanan amacı için benzer bir tane ekleyebilirim, ancak farklı şekilde uygulandı ve sorunsuz bir şekilde hemen çalıştı (gerçi ustalaşılan görevlere ve hedeflere tam olarak uymasa da).

 
Yazdır işlevini terminalin Uzmanlar sekmesinde, ayrıca RAM'de ve diskteki bir dosyada kaydetme işlemi ayrı bir işlem midir? Ayrıymış gibi geliyor, terminal sıkıca donmuyor, ancak yoğun kayıt sırasında neden sanki tuğla yüklüymüş gibi yavaşlıyor? Bir şekilde indirmek mümkün mü? Çok ortalama bir ArraySize dizisinin öğelerini görüntülemeye karar verirseniz, frenler çok belirgindir, daha büyük boyutlu dizilerin öğelerinin değerlerini görüntülemeyi hemen unutabilirsiniz.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

Terminalin önbellek konusunda garip olduğuna dair güçlü şüpheler var (neredeyse konunun dışındayım, yani ...). Daha da kötüsü, MetaEditor bile o sırada terminalde neler olup bittiğinin işlenmesini bir şekilde etkiler.

Bir MQL programının (hata ayıklama verilerini Expert'in sekme günlüğüne yazdıran) kodunu değiştirdiğimde, onu yeniden derlediğimde, terminal penceresine gittiğimde ve önceki sonuçların nasıl tekrarlandığını gördüğünde tekrar tekrar bir sorunla karşılaştım, ancak kesinlikle şunu söyleyebilirim ki bu önceki bitmemiş bir programın başlatılmasının gecikmeli tamamlanması gibi bir şey değildir. MetaEditor'daki F7 aracılığıyla, güncellenmiş kodu başlatma için derleyip gönderdiğim ortaya çıktı ve bu arada, terminale eskisini yeniden kaydırması için bir komut verildi (önbellekten falan mı? .. işletim sistemi "arma" bellek sayfalarına benziyor). "Dişte sıkışmış" .ex5 kodunun önceki sürümünün yalnızca terminal.exe işlemini tamamen boşaltarak değil, bazı nadir durumlarda MetaEditor'u kapatarak da iptal edilebilmesi/boşaltılabilmesi ilginçtir. Siz böyle istiyorsunuz ve anlayın, şahsen gözlemlediğim şeyi tekrar anlattım.

Son zamanlarda inşaatın olduğu bir durum vardı:

 Print ( 1 );
for ( int e= 0 ; e<ArraySize(Arr); e++)
{
   Print (Arr[e]);
}
yalnızca ilk Baskıdaki değeri görüntüledi, ancak dizi öğelerinin değerlerinin daha sonra görüntülenmesini beklemek faydasızdı. İlk Print'i kaldırdıktan ve yeniden derledikten sonra, dizi öğelerinin döngüsel çıktısı anında başladı. Prints'in MQL5-Community'ye karşı gizli komplosu mu yoksa tek şanssız olan ben miyim?

Ek olarak, bu garip terminal davranışı vakalarının, grafik pencereleri, grafik nesneler ve MQL programları ile aşırı yüklenmiş bir MT5 örneğinde değil, yalnızca tek bir temiz (çalışan gösterge taslağı sayılmaz) grafik penceresinde gözlemlendiğini not ediyorum.

 
x100gün içi Sorunları unutun - C veya başka bir dilde yazın. Sonunda, terminalden tek ihtiyacımız olan teklifler, hesap ve eşlik eden siparişler hakkında bilgi almak ve geri kalanı özel bir programlama ortamında yazılabilir ve kütüphane aracılığıyla bağlanabilir. Ve sonra bir anda bir şeyler değişecek ve proje büyükse neden işe yaramadığının sonunu bulamayacaksınız. Soru şu - bu tür maceralar için ne :) neyi ve nedenini bulana kadar...
 
ivandurak :

1. ArrayInitialize kodu çalışmaz, döngünün yorumunu kaldırırsanız, her şey yolunda demektir.

2. Yine de sınıftaki değişkenleri ve global düzeydeki göstergeyi aynı isimlerle bildirirken bir uyarı çıkıyor.

1. PlotIndexSetDouble (z,EMPTY_VALUE) init içindeki gösterge arabellekleri için kullanılır .

2. Açılır. Bu konuda bir şeyler yapılması gerekiyor, sınıf üyelerini "m_" öneki ile işaretlemeniz önerilir.

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