Hatalar, hatalar, sorular - sayfa 2146

 
fxsaber :

OnCalculate - bu grafikte çalışmaz. Bir tutamaç yarattınız ve o orada yaşıyor.

Bunda değilse - neden normal olarak sağ alt pencerede çiziyor (tampon çizimi)?

 
A100 :

göstergede

::ChartWindowFind() -1 değerini döndürür (başka bir deyişle, çalışmaz)


Gösterge başlatılmamışken, çalıştığı alt pencerenin numarasını bilmiyor. Pencereye yalnızca başarılı bir başlatmadan sonra eklendiğinden

Başka bir deyişle, göstergenin OnInit'inde ChartWindowFind() öğesini çağırmak işe yaramaz.

 
Slava :
Başka bir deyişle, göstergenin OnInit'inde ChartWindowFind() öğesini çağırmak işe yaramaz.

Göstergenin OnInit'inde ChartWindowFind() öğesinin çağrılması (gösterge aynıdır )

 void OnStart ()
{
         string name = "Test_i" ;
        int sub_window = 1 ;
         ChartIndicatorAdd ( 0 , sub_window, iCustom ( NULL , PERIOD_CURRENT , name ));
}

Sonuç: 1:doğru:0
2: 1 : 0

Her şey yolundaydı, göstergenin OnInit kodunu size hatırlatmama izin verin

 void OnInit ()
{
//...
         ResetLastError ();
         int sub_window = ChartWindowFind ();
         Print ( "2:" , sub_window , ":" , GetLastError ());
}
 
A100 :

Bunda değilse - neden normal olarak sağ alt pencerede çiziyor (tampon çizimi)?

Yani göstergenin hesaplanması ve çizim kısmı farklı şeylerdir. ChartWindowFind, göstergeyi çizmekten sorumlu mekanizmaya yapılan bir çağrıdır. Onlar. kendisi bile bir gösterge değildir.

 
Slava :

Gösterge başlatılmamışken, çalıştığı alt pencerenin numarasını bilmiyor. Pencereye yalnızca başarılı bir başlatmadan sonra eklendiğinden

OnInit'ten sonra ChartWindowFind() 'ı çağırmak (OnCalculate'den)

 //Test.mq5//Скрипт
void OnStart ()
{
         string name = "Test_i" ;
         ObjectCreate ( 0 , name, OBJ_CHART , 0 , 0 , 0 );
         long chart_id  = ObjectGetInteger ( 0 , name, OBJPROP_CHART_ID );
         int sub_window = 1 ;
         ChartIndicatorAdd ( chart_id, sub_window, iCustom ( NULL , PERIOD_CURRENT , name ));
}
 //Test_i.mq5//Индикатор
void OnInit () { Print ( __FUNCTION__ , ":end" ); }
int OnCalculate ( const int , const int , const int , const double & [] )
{
         Print ( __FUNCTION__ );
         ResetLastError ();
         int sub_window = ChartWindowFind ();
         Print ( "3:" , sub_window , ":" , GetLastError ());
         return 0 ;
}

Sonuç: OnInit:end
Hesapla
3: -1 :4113

Başka bir deyişle, gösterge çalıştığı alt pencerenin numarasını zaten biliyor, ancak rapor etmiyor.
 
A100 :

Başka bir deyişle, gösterge çalıştığı pencerenin numarasını zaten biliyor, ancak rapor etmiyor.

ChartID() biliyor mu?

 
fxsaber :

ChartID()'yi biliyor mu?

Gerekli değildir - parametresiz ChartWindowFind() işlevi
 
A100 :
Gerekli değildir - parametresiz ChartWindowFind() işlevi

ChartID () (parametreler olmadan) bilmediğinden neredeyse emin.

 
fxsaber :

ChartID () (parametreler olmadan) bilmediğinden neredeyse emin.

Bu açık bir kusurdur, özellikle çalışmazlık kendini sadece

         ObjectCreate ( 0 , name, OBJ_CHART , 0 , 0 , 0 );
         long chart_id = ObjectGetInteger ( 0 , name, OBJPROP_CHART_ID );

ama aynı zamanda eğer

         long chart_id = ChartOpen ( NULL , PERIOD_CURRENT );

Onlar. manuel olarak bir grafik penceresi eklediysem ve ona bir gösterge eklediysem, her şey yolunda

Ve eğer otomatik yol - işe yaramazsa

Bu, algoritmik ticaret kavramıyla çelişir.

 
A100 :

Bu açık bir kusurdur, özellikle çalışmazlık kendini sadece

ama aynı zamanda eğer

Onlar. manuel olarak bir grafik penceresi eklediysem ve ona bir gösterge eklediysem, o zaman her şey yolunda

Ve eğer otomatik yol - işe yaramazsa

Bu, algoritmik ticaret kavramıyla çelişir.

Göstergelerin mimarisinin netleşmesi çok iyi. Belgelerde bununla ilgili çok az şey olması garip.

Göstergenin hesaplama kısmı ve çizim kısmı farklı varlıklardır. Sap hesaplanan kısımdır. Ve hesaplanan kişi çizim hakkında hiçbir şey bilmiyor ve bilmemeli.

Bir tutamaç oluşturduğunuzu, ancak onu bir değil iki çizelgeye yerleştirdiğinizi düşünelim. Açıkçası, yalnızca bir gösterge var, ancak farklı ChartID'ler ve Alt Windows ile iki çizelgeye çiziliyor. Ve tutamaç göstergesi bunu umursamıyor çünkü birinin onu nereye çizeceğini ve çizilip çizilmediğini bilmiyor. İndikatör çizimden sorumlu değildir.

Göstergeyi grafiğe manuel olarak veya bir şablon aracılığıyla yerleştirdiğinizde, tamamen farklı bir işlem gerçekleşir. Çizim parçası ile birlikte bir tutamaç oluşturulur. Tam olarak aynı giriş parametreleriyle gösterge, aynı sembol ve nokta ile başka bir grafikte manuel olarak başlatılırsa, çizim kısmı olan başka bir tutamaç oluşturulur.

MQL sayesinde tamamen farklıdır. Bir gösterge oluşturulur ve ikincisi aynıysa, hiçbir şey yeniden oluşturulmaz. Yerleşim kısmı dokunulmadan kalır.

Göstergeyi MQL üzerinden manuel olarak çalıştırmanın tek yolu, örneğin yeni bir grafik veya OBJ_CHART , LoadTemplate'dir.