Hatalar, hatalar, sorular - sayfa 2101

 
damirqa :

Merhaba! https://www.mql5.com/ru/articles/100 adresinden MQL5 öğrenmeye başladım. Kodu çalıştırdım, 4756 hatası aldım, belgelere baktım - daha kolay olmadı. Tamam, basit bir taneyle başlamayı düşündüm (Uyarı/Yazdır...). En önemli işlevlerden biri OrderSend'dir. OrderSend'in nasıl kullanılacağına dair forum\belgeleri aramaya başladım. Satın alma pozisyonu açmak için bir kod gördüğüm https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions bu makaleye rastladım. 4756 hatası alındı ve 10030 retcode kodu alındı. 10030 - bunun OrderSend özelliği olduğunu fark ettim, ancak bu özelliğin nasıl kullanılacağını anlamadım (başka birinin koduna baktım) ve en önemlisi ne için olduğunu. Sonra https://www.mql5.com/ru/docs/trading/ordersend dosyasını açtım, kodu kopyaladım, çalıştırdım, her şey yolundaydı, çalıştı.
Ama hala 4756 hatasının neden ortaya çıktığını ve 10030'un yanı sıra ondan nasıl kurtulacağını anlamıyorum.

Aradaki koda baktım

ve bu

Bence neredeyse aynılar, bu hataların ortaya çıktığı yerleri göremiyorum (4756 ve 10030). Parmağınızı gösterin ve açıklayın lütfen

Yapının bir alanı doldurulmadı. Ve sapma yeterli olmayacak, ancak bu öyle bir hata değil.

Anında infaz

Anında Yürütme modunda (akış fiyatlarında işlem modu) bir pozisyon açmak için bir işlem emri. 9 alan zorunludur:

  • eylem
  • semboller
  • Ses
  • fiyat
  • sl
  • tp
  • sapma
  • tip
  • type_filling

Sihir ve yorum alanlarını da ayarlayabilirsiniz.

Piyasa yürütme

Piyasa Yürütme modunda (piyasada işlem emirlerinin yürütülme modu) bir pozisyon açmak için bir işlem emri. 5 alan gereklidir:

  • eylem
  • semboller
  • Ses
  • tip
  • type_filling

Sihir ve yorum alanlarını da ayarlayabilirsiniz.


 

ne tür bir güncelleme geldi, 1736, içinde neler var, nerede okumalı?

 

Grafikte hangi gösterge arabelleğinin çizileceğini programlı olarak belirleme fırsatı vermeyi öneriyorum.

Bir tüccarın göstergelerini başlattığını varsayalım, hesaplama için kaç tampon kullanıldığını ve göstergeyi grafikte çizmek için kaç tane tampon kullanıldığını bilmiyoruz.

aracılığıyla özel göstergelere atıfta bulunarak

int ChartIndicatorGet (
    uzun             chart_id , // grafik kimliği
    int              alt_pencere              // alt pencere numarası
    const dize     gösterge_kısa isim     // göstergenin kısa adı
);


Ayrıca bir dizi çizim arabelleği talep edebiliriz

int ChartIndicatorGet (
    uzun             chart_id , // grafik kimliği
    int              alt_pencere              // alt pencere numarası
    const dize     gösterge_kısa isim     // göstergenin kısa adı

int & IndicatorVisualBuffer[] // çizim arabelleklerinin sayısı... );


Bu, çizelgede yüklü olan bilinmeyen göstergelerle çalışma yeteneğini genişletecektir.

 
Vladimir Pastushak :

Grafikte hangi gösterge arabelleğinin çizileceğini programlı olarak belirleme fırsatı vermeyi öneriyorum.

Bir tüccarın göstergelerini başlattığını varsayalım, hesaplama için kaç tampon kullanıldığını ve göstergeyi grafikte çizmek için kaç tane tampon kullanıldığını bilmiyoruz.

aracılığıyla göstergeye atıfta bulunarak

int ChartIndicatorGet (
    uzun             chart_id , // grafik kimliği
    int              alt_pencere              // alt pencere numarası
    const dize     gösterge_kısa isim     // göstergenin kısa adı
);


Ayrıca bir dizi çizim arabelleği talep edebiliriz

int ChartIndicatorGet (
    uzun             chart_id , // grafik kimliği
    int              alt_pencere              // alt pencere numarası
    const dize     gösterge_kısa isim     // göstergenin kısa adı

int & IndicatorVisualBuffer[] // çizim arabelleklerinin sayısı... );


Bu, çizelgede yüklü olan bilinmeyen göstergelerle çalışma yeteneğini genişletecektir.

Ne döndürür

 int    ChartIndicatorGet (
   long            chart_id,               // идентификатор графика
   int             sub_window             // номер подокна
   const string    indicator_shortname     // короткое имя индикатора
   );

ve eklemek ne işe yarar? Bir giriş parametresi eklemenizi ve yanıt olarak aynı gösterge tanıtıcısını almanızı önerirsiniz ...

Ve eğer zorlaştırmıyorsa, böyle bir ihtiyaç hangi amaçlarla ortaya çıktı? İroni olmayan bir soru. Sonuçta, eğer bir şey teklif edildiyse, o zaman, bence, önerilenin gerekliliği konusunda ikna edici argümanlar getirmek gerekir.

 
Alexey Viktorov :

Ne döndürür

ve eklemek ne işe yarar? Bir giriş parametresi eklemenizi ve yanıt olarak aynı gösterge tanıtıcısını almanızı önerirsiniz ...

Ve eğer zorlaştırmıyorsa, böyle bir ihtiyaç hangi amaçlarla ortaya çıktı? İroni olmayan bir soru. Sonuçta, eğer bir şey teklif edildiyse, o zaman, bence, önerilenin gerekliliği konusunda ikna edici argümanlar getirmek gerekir.


Kullanıcı herhangi bir gösterge koyar.

EA otomatik olarak onu bulur ve bir sinyal almak için arabellek verilerini alır.


Bunu şimdi uygulamak için iCustom almanız gerekir ve eğer bir şekilde bir parametre listesi yazabilirsek, o zaman arabelleklerde bir sorun var ....

Kopyalamayı kullanarak arabellek sayısını programlı olarak hesaplayabilirsiniz, ancak hangisinin programlı olarak çizdiğini anlamak imkansızdır ...

 
Vladimir Pastushak :

Kullanıcı herhangi bir gösterge koyar.

EA otomatik olarak onu bulur ve bir sinyal almak için arabellek verilerini alır.


Bunu şimdi uygulamak için, iCustom almamız gerekiyor ve bir şekilde bir parametre listesi yazabilirsek, o zaman arabelleklerde bir sorun var ....

Kopyalamayı kullanarak arabellek sayısını programlı olarak hesaplayabilirsiniz, ancak hangisinin programlı olarak çizdiğini anlamak imkansızdır ...

Neden imkansız? INDICATOR_CALCULATIONS arabelleğini iCustom() aracılığıyla almak mümkün müdür?

İlginç bir soru, ancak bu konuda tartışmak için değil. Şahsen, bunun programcının çalışmasını bir şekilde iyileştirebileceği veya kolaylaştırabileceği konusunda şüphelerim var. Uygulamaları için çok farklı göstergeler ve çok farklı koşullar mevcuttur. Ardından , grafik yapının türünü ve ardından başka bir şeyi belirleyebilmeyi ve İstek Listesinin bir kartopu gibi nasıl büyüyeceğini sormalısınız.

 
Alexey Viktorov :

Neden imkansız? INDICATOR_CALCULATIONS arabelleğini iCustom() aracılığıyla almak mümkün müdür?

İlginç bir soru, ancak bu konuda tartışmak için değil. Şahsen, bunun programcının çalışmasını bir şekilde iyileştirebileceği veya kolaylaştırabileceği konusunda şüphelerim var. Uygulamaları için çok farklı göstergeler ve çok farklı koşullar mevcuttur. Ardından , grafik yapının türünü ve ardından başka bir şeyi belirleyebilmeyi ve İstek Listesinin bir kartopu gibi nasıl büyüyeceğini sormalısınız.


Teorik olarak indikatöre varsayılan olarak ne konuyor, şimdi programcının kodundan bahsetmiyorum, dışarıdan temin edilebilir olmalı... Tamponlar, sayıları, yapım şekli, rengi ve diğer standartlar...

 

İşte karşılaştığım sorun:

Grafik kimliğini 1000 veya 10000'e bölmenin geri kalanını sihir olarak kullanmaya karar verdim, genel olarak önemli değil.

Ama bazı nedenlerden dolayı, farklı ChartID() ile, bölümün geri kalanı birdenbire aynı çıkıyor. soru: neden?

Komut dosyasını kontrol edin

 /********************Script program start function*******************/
void OnStart ()
{
   long chartID = ChartID (), d = 100000 ;
   Print ( "ChartID - " , ChartID ());
   Print ( "fmod(ChartID(), " ,  d, ") = " , fmod ( ChartID (), d));
} /*******************************************************************/

Sonuç

 2018.01 . 15 13 : 01 : 45.881 Script 00 EURUSD,M15: removed
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: uninit reason 0
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: fmod ( ChartID (), 100000 ) = 749 12
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: ChartID - 1314725038414749 07
2018.01 . 15 13 : 01 : 45.881 00 EURUSD,M15: initialized
2018.01 . 15 13 : 01 : 45.871 Script Test\ 00 EURUSD,M15: loaded successfully
2018.01 . 15 13 : 01 : 40.361 Script 00 EURUSD,H1: removed
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: uninit reason 0
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: fmod ( ChartID (), 100000 ) = 749 12
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: ChartID - 1314725038414749 08
2018.01 . 15 13 : 01 : 40.361 00 EURUSD,H1: initialized
2018.01 . 15 13 : 01 : 40.351 Script Test\ 00 EURUSD,H1: loaded successfully

Sırasıyla 74907 ve 74908 görmesi bekleniyordu, çünkü bölümün geri kalanı tam olarak bu olmalı.


Ve bu sorunun cevabını duymak isterim.

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hatalar, hatalar, sorular

Alexey Viktorov , 2018.01.09 14:21

MT5 test cihazında "Düzenleme alanı" OBJ_EDIT nesnesi, içerdiği değerin düzenlenmesine izin vermiyor. Bu tasarımdan mı yoksa bir hata mı?

Terminallerde ve test cihazında MT4 düzenlenir, ancak test cihazında MT5 istemez , nesneyi oluştururken programlı olarak girilen değer tamamen kaybolur.


 
Alexey Viktorov :

Ama bazı nedenlerden dolayı, farklı ChartID() ile, bölümün geri kalanı aniden aynı çıkıyor. soru: neden?

Çünkü fmod girişi çifttir. double çok sayıda tamsayı depolayamaz. Örneğin, durumunuz:

 Print ( DoubleToString (( double ) 1314725038414749 07 , 0 )); // 1314725038414749 12

böyle yap

 long fmod ( const long Value, const long Value2 )
{
   return (Value % Value2);
}


Örnek olarak float kullanarak, double özelliğini hızlıca anlayabilirsiniz.

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{
   for ( int i = 0 ; i < INT_MAX ; i++)
     if (( int )( float )i != i)
    {
      PRINT(i);
      PRINT(( float )i);
      PRINT(( double )i);
      
       break ;
    }
}


Sonuç

i = 16777217
( float )i = 16777216.0
( double )i = 16777217.0


ZY double, tüm int-aralığın bilgisini kaybetmez, uzun süre öyle değildir.

 
fxsaber :

Çünkü fmod girişi çifttir. double çok sayıda tamsayı depolayamaz. Örneğin, durumunuz:

böyle yap

Tabii ki, şimdi önerilen seçeneği kontrol edeceğim, ancak böyle bir doğrulama kodum da vardı.

 /********************Script program start function*******************/
void OnStart ()
{
   long chartID = ChartID (), d= 100000 ;
   Print ( "ChartID - " , ChartID ());
   Print ( "fmod(ChartID(), " ,  d, ") = " , fmod ( ChartID (), d));
   printf ( "LONG_MAX = %I64d" , LONG_MAX );
   printf ( "DBL_MAX = %.16e" , DBL_MAX );
   Print ( "DBL_MAX-LONG_MAX = " , DBL_MAX - LONG_MAX );
} /*******************************************************************/

sonuç

 2018.01 . 15 14 : 07 : 20.440 Script 00 EURUSD,M15: removed
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: uninit reason 0
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: DBL_MAX - LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+ 308
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: fmod ( ChartID (), 100000 ) = 74912
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01 . 15 14 : 07 : 20.440 00 EURUSD,M15: initialized
2018.01 . 15 14 : 07 : 20.430 Script Test\ 00 EURUSD,M15: loaded successfully

Bu, değer kesmenin gerçekleşmemesi gerektiğini gösterir.


Ancak önerilen seçeneği biraz değiştirerek bu seçeneği işaretledim.

 /********************Script program start function*******************/
void OnStart ()
{
   long chartID = ChartID (), d= 100000 ;
   Print ( "ChartID - " , ChartID ());
   Print ( "fmod(ChartID(), " ,  d, ") = " , ( long ) fmod ( ChartID (), d));
   Print ( "ChartID() % " , d, " = " , ChartID () % d);
} /*******************************************************************/

ve beklenen seçeneği aldım

 2018.01 . 15 14 : 17 : 51.301 Script 00 EURUSD,M15: removed
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: uninit reason 0
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: ChartID () % 100000 = 74907
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: fmod ( ChartID (), 100000 ) = 74912
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01 . 15 14 : 17 : 51.301 00 EURUSD,M15: initialized
2018.01 . 15 14 : 17 : 51.291 Script Test\ 00 EURUSD,M15: loaded successfully

başka bir soru belirir

MathMod fmod ile aynıysa , iki sayının bölümünden kalan gerçek değeri döndürür. Ve belgelere göre %

Kalan dakika = süre % 60 ;


o zaman neden fark?
Neden: