GrabWeb, MT4 Build 600'de çalışmıyor - sayfa 3

 
WDholic :


char kullanıyor olabilir misin

betiğimde string kullanıyorum


Evet konu buydu. Şimdi v604 ile iyi bir şekilde derleniyor. Temel olarak, InternetOpenW ve InternetOpenUrlW'yi kullanmamız ve dizeyi öncekiyle aynı şekilde birleştirmemiz gerekiyor.

 
bennyHanna :


Evet konu buydu. Şimdi v604 ile iyi bir şekilde derleniyor. Temel olarak, InternetOpenW ve InternetOpenUrlW'yi kullanmamız ve dizeyi öncekiyle aynı şekilde birleştirmemiz gerekiyor.

WDHolic tarafından geliştirilen yukarıdaki kodu build 600 geldiğinden beri başarıyla kullanıyorum (çok teşekkürler :-)). Ne yazık ki, bugün kodu derleme 830 altında yeniden derlediğimde, artık çalışmadığını gördüm. Merak ediyorum, kibar biri, tekrar çalışmasını sağlamak için bir ince ayar önerebilir mi? Kullandığım kod aşağıdaki gibidir:

 string secData= "" ;
   
if (!GrabWeb(secURL, secData))
{
   showDebug( "Unable to access user file" );
   return ( 1 );  
}
.
.
.
.
#import   "Wininet.dll"
   int InternetOpenW( string , int , string , string , int );
   int InternetConnectW( int , string , int , string , string , int , int , int ); 
   int HttpOpenRequestW( int , string , string , int , string , int , string , int ); 
   int InternetOpenUrlW( int , string , string , int , int , int );
   int InternetReadFile( int , string , int , int & OneInt[]);
   int InternetCloseHandle( int ); 
   
#import
 
bool GrabWeb( string strUrl, string & strWebPage)
{
  
     int HttpOpen = InternetOpenW( " " , 0 , " " , " " , 0 ); 
     int HttpConnect = InternetConnectW(HttpOpen, "" , 80 , "" , "" , 3 , 0 , 1 ); 
     int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL , 0 , 0 , 0 );
   
   int read[ 1 ];
   string Buffer = " " ;
 
   while ( true )
   {
      InternetReadFile(HttpRequest, Buffer, StringLen (Buffer), read);
       if (read[ 0 ] > 0 ) strWebPage = strWebPage + StringSubstr (Buffer, 0 , read[ 0 ]);
       else              break ;
   }
   
   if (HttpRequest > 0 ) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0 ) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0 ) InternetCloseHandle(HttpOpen);  
 
   return ( true );
}

Şimdi sadece boşluk döndürüyor gibi görünüyor.

Herhangi bir yardım minnetle karşılanacaktır. Beklenti içinde teşekkürler,

Greg

 
Bunun yerine WebRequest'i kullanmamak için herhangi bir neden var mı?
 
ydrol :
Bunun yerine WebRequest'i kullanmamak için herhangi bir neden var mı?

Sadece bu Grabweb, birkaç yıl önce karşılaştığım ilk yöntem ve diğer seçenekleri araştırmaktansa buna bağlı kalmak daha kolay! WebRequest'e bir göz atacağım ve kodumda oluşturup oluşturamayacağımı göreceğim. Öneri için çok teşekkürler - Deneyimlerimi geri göndereceğim - umarım başarılı olur :-)

Teşekkürler,

Greg

 
ydrol :
Bunun yerine WebRequest'i kullanmamak için herhangi bir neden var mı?

WebRequest'i haber uyarımda kullanıyorum, ancak WebRequest'in herkese uymayan bir eksikliği var: yalnızca bir EA'da kullanılabilir.

WebRequest Belgelerinden:

WebRequest() işlevi eşzamansızdır, yani program yürütmesini keser ve istenen sunucudan yanıt bekler. Bir yanıtın alınmasındaki gecikmeler büyük olabileceğinden, işlev, göstergelerden gelen aramalar için kullanılamaz, çünkü göstergeler, tüm göstergeler ve çizelgeler tarafından tek bir sembol üzerinde paylaşılan ortak bir iş parçacığında çalışır. Bir sembolün tablolarından birindeki gösterge performans gecikmesi, aynı sembolün tüm tablolarının güncellenmesini durdurabilir.

 
honest_knave :

WebRequest'i haber uyarımda kullanıyorum, ancak WebRequest'in herkese uymayan bir eksikliği var: yalnızca bir EA'da kullanılabilir.

WebRequest() işlevi eşzamansızdır , yani program yürütmesini keser ve istenen sunucudan yanıt bekler. Bir yanıtın alınmasındaki gecikmeler büyük olabileceğinden, işlev, göstergelerden gelen aramalar için kullanılamaz, çünkü göstergeler, tüm göstergeler ve çizelgeler tarafından tek bir sembol üzerinde paylaşılan ortak bir iş parçacığında çalışır. Bir sembolün tablolarından birindeki gösterge performans gecikmesi, aynı sembolün tüm tablolarının güncellenmesini durdurabilir.

Senkron olmalıdır.
 
angevoyageur :
Senkron olmalıdır.

Şu anki gereksinimim bir EA'da, bu nedenle WebRequest muhtemelen kısa vadeli cevap olacaktır.

Bununla birlikte, haberlere erişen bir dizi göstergem var, bu da, sürdürülebilir olmaya devam etmelerini istiyorsam Grabweb'de neleri değiştireceğimi denemem ve çözmem gerektiği anlamına geliyor. Bu makaledeki bilgiler cevabı verecek mi merak ediyorum: https://www.mql5.com/en/articles/73 ?

 
gregspinner :

Şu anki gereksinimim bir EA'da, bu nedenle WebRequest muhtemelen kısa vadeli cevap olacaktır.

Bununla birlikte, haberlere erişen bir dizi göstergem var, bu da, sürdürülebilir olmaya devam etmelerini istiyorsam Grabweb'de neleri değiştireceğimi denemem ve çözmem gerektiği anlamına geliyor. Bu makaledeki bilgiler cevabı verecek mi merak ediyorum: https://www.mql5.com/en/articles/73 ?

Sanırım cevabı buldum - ve yukarıda belirtilen makaledeydi. GrabWeb kodu şimdi aşağıdaki gibi görünüyor:

 #import   "Wininet.dll"
   int InternetOpenW( string , int , string , string , int );
   int InternetConnectW( int , string , int , string , string , int , int , int ); 
   int HttpOpenRequestW( int , string , string , int , string , int , string , int ); 
   int InternetOpenUrlW( int , string , string , int , int , int );
   //int InternetReadFile(int, string, int, int& OneInt[]);
   int InternetReadFile( int , uchar &sBuffer[], int , int & OneInt);
   int InternetCloseHandle( int ); 
   
#import
 
bool GrabWeb( string strUrl, string & strWebPage)
{
  
     int HttpOpen = InternetOpenW( " " , 0 , " " , " " , 0 ); 
     int HttpConnect = InternetConnectW(HttpOpen, "" , 80 , "" , "" , 3 , 0 , 1 ); 
     int HttpRequest = InternetOpenUrlW(HttpOpen,strUrl, NULL , 0 , 0 , 0 );
   
   /*int read[1];
   string Buffer = " ";
 
   while (true)
   {
      InternetReadFile(HttpRequest, Buffer, StringLen(Buffer), read);
      if (read[0] > 0) strWebPage = strWebPage + StringSubstr(Buffer, 0, read[0]);
      else             break;
   }*/
   
   uchar ch[ 500 ];
   string toStr= "" ;
   int dwBytes,h;
   while (InternetReadFile(HttpRequest,ch, 500 ,dwBytes))
   {
       if (dwBytes<= 0 ) break ;
      toStr=toStr+ CharArrayToString (ch, 0 ,dwBytes);
   }
   
   strWebPage=toStr;   
   
   if (HttpRequest > 0 ) InternetCloseHandle(HttpRequest); 
   if (HttpConnect > 0 ) InternetCloseHandle(HttpConnect); 
   if (HttpOpen > 0 ) InternetCloseHandle(HttpOpen);  
 
   return ( true );
}

Temel olarak...

1) InternetRead'in tanımını, veriler için bir uchar dizisine dolaylı bir başvuru kullanacak ve ayrıca sayım için doğrudan basit bir int değişkeni kullanacak şekilde değiştirdi.

2) InternetRead işlevinin bir uchar dizisi kullanmasını sağladı ve ardından doldurulmuş diziyi bir dizeye dönüştürdü.

uchar dizisinin boyutunun ne gibi bir etkisi olduğundan emin değilim. Ne olursa olsun tüm web sayfasını (örneğin FFCal XML) okuyor gibi görünüyor ve bu 500 bayttan büyük. Sadece sonraki n baytlık belleği mi kaplıyor, yoksa sistem depolamayı dinamik olarak tahsis edecek kadar akıllı mı? umarım, ikincisi!

Şerefe,

Greg

 
Cevabı da bu konunun ilk sayfasındaydı. Paylaşım için teşekkürler.
 
thili55 :

Bu kod, artık sunucumdaki hesapları doğrulamadığı MT4 build 600'de test edene kadar benim için kusursuz çalıştı.


Merhaba arkadaşlar, lütfen bu kod neyle ilgili, bir gösterge mi yoksa EA mı? mql4 düzenleyicide çalıştırmayı denedim ve aşağıdaki hata mesajını aldım:

'Kullanıcı - bildirilmemiş tanımlayıcı'

Aslında aşağıdaki kod satırına atıfta bulunuyor:


(Satır: 112) GrabWeb("http://www.website.com/query.php?accountnumber="+AccountNumber()+"&login="+User, answer);


"Kullanıcı"nın program tarafından kabul edileceğini nasıl beyan edebilirim veya "Kullanıcı" yerine ne koyabilirim?

Windows 8.1, 64 bit işletim sistemi ve MT4 sürüm 4.00, yapı 1010 kullanıyorum.

Şimdiden teşekkür ederim.