MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 845

 
Anatoliy Ryzhakov :
Merhaba. Geçmişteki sondan bir önceki sıranın türünün değerini nasıl döndüreceğimi söyle.

son kapatılan emrin zamanını bulmanız ve ardından kapanış süresinin maksimum olacağı ancak son hafızaya alınan zamandan daha az olacağı emirleri aramanız gerekiyor, bu yüzden şunu yaptım:

https://www.mql5.com/en/forum/247136#comment_7555643

Benim örneğimde biletler arandı, bilet yerine sipariş türünü döndürmeniz gerekecek veya sipariş biletini bilerek türünü öğrenebilirsiniz...

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

C++'dan mql4'e aktarılacak olan dışa aktarılan bir işleve bir şablon uygulamak mümkün müdür?

"cpp" uzantılı olağan türde bir dosya oluşturdum ve oraya ilkel bir işlev yazdım.

 #define MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC   int __stdcall  add( int a= 0 , int b= 0 ) //stdcall //cdecl
{ return ( 18 );}

Ardından, "def" uzantılı bir dosya oluşturdum ve dışa aktarılan işlevin adını belirledim.

LIBRARY "dllmt42"
EXPORTS
add

Sonra bu vakayı Build - Build Solution aracılığıyla başlattım.
İşlevime bir şablon uygulamak istiyorum çünkü dizilerle çalışan fonksiyonlar geliştirilecek ve burada bir şablon olmadan yapamazsınız

 #define MT4_EXPFUNC extern "C++" __declspec(dllexport)
template < typename T>MT4_EXPFUNC   int __stdcall  add(T a= 0 , T b= 0 ){ return ( 18 );}

T vurgulanmış ancak bir hata olduğunu yazıyor, tavsiyede bulunun ve mümkün mü, yeniden düzenlemeye çalıştı mı? Ayrıca, mümkünse böyle bir fonksiyon mql4 tarafından nasıl çağrılacak?




 
Roman Shiredchenko :

kod tabanına bakın - kesinlikle MT4'teydiler ...

Bu konunun hemen ön sayfasında.

 

İyi akşamlar. MT5 çalışma ve öğrenme sürecinde, zor olmayan, ancak deneyim ve bilgi eksikliği az olan bir görevi uygulamaya çalışıyorum ....... genel olarak işe yaramıyor, yardım ve yardım istiyorum.

Fikir şudur - hem açık kaynak hem de aynı yazara ait bir gösterge ve bir danışman var (Artyom Trishkin, saygı ve saygı !!!). İstek anında mevcut yönü almak için EA'dan göstergeye erişmeye çalışıyorum. Gösterge bu yönü Yukarı veya Aşağı oklarla gösterir. Alınan yön, danışman tarafından ya bir sinyal olarak ya da bir filtre olarak kullanılacaktır, ancak bu hala çok uzaktır.

Gösterge tutamağını aldım ancak göstergeden gelen okların veri değerleri tam bir karmaşa ve bir türlü çözemiyorum.

Göstergeyi değiştirmedim, EA'da OnInit'e ekledim:

   CrossAD = iCustom (asymbol.Name(), _Period , "iCrossAD" );
   if (CrossAD == INVALID_HANDLE )
   {
       Print ( "Не удалось создать описатель индикатора iCrossAD!" );
       return ( INIT_FAILED );
   }
       else Print ( "Хендл iCrossAD = " ,CrossAD);

OnTick'te şunları ekledi:

   int n= 0 ;
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find || ArraySize (Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
      }
       else 
         for (n= 0 ; n<period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE ) break ;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index);
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find || ArraySize (Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
      }
       else 
         for (n= 0 ; n<period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE ) break ;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index);

Tabii ki, karşılık gelen köpükleri, dizileri tanımladım ve başlattım, onları zaman serisi olarak tanımladım, vb....

Kullanılan Yorum ve Yazdır kontrol için. Hemen değil, ancak hiçbir hata yok gibi görünüyor, sadece anlamadığım birkaç uyarı var. Ancak asıl mesele, parametrelerin yanlış belirlenmesidir. Aşağıdaki duruma rağmen, yukarı ok için olası en büyük çift sayı ve aşağı ok için başka bir negatif sayı görüntülenir.

 if (Buf_Arrow_Buy[n]!= EMPTY_VALUE ) break ;
и
if (Buf_Arrow_Sell[n]!= EMPTY_VALUE ) break ;
 
İşte dosyalar
Dosyalar:
 
Sergey Voytsekhovsky :
İşte dosyalar

Basit bir test Expert Advisor ile bir göstergeden veri alma testi ile başlarsınız ve test için gereksiz birçok işlevi olan bir makaleden almazsınız.

MQL sihirbazında normal bir EA oluşturun ve bunu iCustom() kullanarak alıştırma yapmak için kullanın.

 
Sergey Voytsekhovsky :

İyi akşamlar. MT5 çalışma ve öğrenme sürecinde, zor olmayan, ancak deneyim ve bilgi eksikliği az olan bir görevi uygulamaya çalışıyorum ....... genel olarak işe yaramıyor, yardım ve yardım istiyorum.

Fikir şudur - hem açık kaynak hem de aynı yazara ait bir gösterge ve bir danışman var (Artyom Trishkin, saygı ve saygı !!!). İstek anında mevcut yönü almak için EA'dan göstergeye erişmeye çalışıyorum. Gösterge bu yönü Yukarı veya Aşağı oklarla gösterir. Alınan yön, danışman tarafından ya bir sinyal olarak ya da bir filtre olarak kullanılacaktır, ancak bu hala çok uzaktır.

Gösterge tutamağını aldım ancak göstergeden gelen okların veri değerleri tam bir karmaşa ve bir türlü çözemiyorum.

Göstergeyi değiştirmedim, EA'da OnInit'e ekledim:

OnTick'te eklendi:

Tabii ki, karşılık gelen köpükleri, dizileri tanımladım ve başlattım, onları zaman serisi olarak tanımladım, vb....

Kontrol için kullanılan Yorum ve Yazdır. Hemen değil, ancak hiçbir hata yok gibi görünüyor, sadece anlamadığım birkaç uyarı var. Ancak asıl mesele, parametrelerin yanlış belirlenmesidir. Aşağıdaki duruma rağmen, yukarı ok için olası en büyük çift sayı ve aşağı ok için başka bir negatif sayı görüntülenir.

Artyom doğru söyledi, ancak bir karşılaştırmanın yararsızlığını not edeceğim

 if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find || ArraySize (Buf_Arrow_Buy) != period_find )

CopyBuffer diziye kopyalanan öğelerin sayısını döndürürse, dizinin boyutu tam olarak bu olacaktır. Buna göre, koşulun vurgulanan kısmı, ilkini kopyalar.

Ve sesli düşünüyorum: Gösterge ve danışman koduna bakmadım, bu yüzden yanılıyor olabilirim. Sinyalin period_find aralığında olması gerektiğinden emin misiniz?

 
Alexey Viktorov :

Artyom doğru söyledi, ama sadece bir karşılaştırmanın yararsızlığını not ediyorum

CopyBuffer diziye kopyalanan öğelerin sayısını döndürürse, dizinin boyutu tam olarak bu olacaktır. Buna göre, koşulun vurgulanan kısmı, ilkini kopyalar.

Ve sesli düşünüyorum: Gösterge ve danışman koduna bakmadım, bu yüzden yanılıyor olabilirim. Sinyalin period_find aralığında olması gerektiğinden emin misiniz?

Evet - bu bir tür filtredir - sinyallerin frekansı buna bağlıdır.

 
Artyom Trishkin :

Basit bir test Expert Advisor ile bir göstergeden veri alma testi ile başlarsınız ve test için gereksiz birçok işlevi olan bir makaleden almazsınız.

MQL sihirbazında normal bir EA oluşturun ve bunu iCustom() kullanarak alıştırma yapmak için kullanın.

Teşekkürler, iyi tavsiye, öyle yapacağım, en azından daha uygun olacak.

Bugün başlayacağım.
 

Bana partinin normalleşmesinde neyin yanlış olduğunu söyle?

 double lot_= 0.01 ;
double minlot= 0.10 ;
 double LotNormalize( double lot_)
  {
   if (minlot== 0.001 )
     {
       return ( NormalizeDouble (lot_, 3 ));
     }
   if (minlot== 0.01 )
     {
       return ( NormalizeDouble (lot_, 2 ));
     }
   if (minlot== 0.10 )
     {
       return ( NormalizeDouble (lot_, 1 ));
     }

   return ( NormalizeDouble (lot_, 0 ));
  }