Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 856

 
Алексей Барбашин :

Hmm... Muhtemelen API'ye dikkatlice bakmadım, ama böyle bir işlev fark etmedim.... Ve büyük olasılıkla uygun olacaktır.

Biraz daha anlatabilir misiniz... belki soru çok saçma... Bir sayı, örneğin double nasıl bir karakter dizisine dönüştürülebilir? Diğer bir deyişle, bazı API'ler, sayıların işaretçi olarak iletilmesini gerektirir. İşaretçiler tek boyutlu diziler olarak iletilir... Dizeler için açıktır , StringToShortArray ve StringToCharArray işlevleri onlar için sağlanır, ancak sayılarla, onları hala bayt dizilerine (char) nasıl dönüştüreceğimi çözemedim.

Belki bir örnek?
 
. ... Rick D. ... . :
Belki bir örnek?

Muhtemelen uzağa gitmeyeceğiz. Kayıt defteriyle çalışmayı düşünün. Hem dize değerlerini hem de sayısal değerleri (dize olarak değil) kayıt defterine koyabilirsiniz. Kayıt defterine bir sayı iletmek ve ona bir işaretçi geri almak diziler kullanılarak yapılır (düzeltmenize göre). Böyle bir örnek işe yarar mı?

 
pivomoe :

Ben tiklerin tarihini okuyorum. Kenelerin ortaya çıktığı anda piyasada neler olup bittiğini anlamak her zaman mümkün değildir.

SBER

i=987 2016.06.27 10:00:30.274 Talep=133.91 Teklif=133.9 Son=133.9 Hacim=50 TICK_FLAG_ASK

i=988 2016.06.27 10:00:30.280 Satış =133.93 Teklif=133.9 Son=133.9 Cilt=50 TICK_FLAG_ASK

i=989 2016.06.27 10:00:30.280 Sor=133.93 Teklif=133.9 Son=133.91 Cilt=100 TICK_FLAG_SON TICK_FLAG_VOLUME TICK_FLAG_SATIN AL TICK_FLAG_SELL

i=990 2016.06.27 10:00:30.280 Ask=133.93 Teklif=133.9 Son=133.92 Cilt=300 TICK_FLAG_SON TICK_FLAG_VOLUME TICK_FLAG_SATIN AL TICK_FLAG_SELL

i=991 2016.06.27 10:00:30.280 Sor=133.93 Teklif=133.9 Son=133.92 Cilt=100 TICK_FLAG_SON TICK_FLAG_VOLUME TICK_FLAG_SATIN AL TICK_FLAG_SELL

i=992 2016.06.27 10:00:30.281 Satış=133.94 Teklif=133.9 Son=133.92 Cilt=100 TICK_FLAG_ASK

1. Aynı anda TICK_FLAG_BUY ve TICK_FLAG_SELL bayraklarına sahip bu gizemli keneler nelerdir? Hatta 1 lot hacimli bu tür keneler bulmayı başardım.

2. Tik 988'de. Sor=133.93 Teklif=133.9 Son 133.91, 989'da nereden geldi?

3. Piyasada genel olarak ne oldu?

Bu tür soruları forumun "Borsa ticareti" bölümüne ayrı bir başlık olarak yazmak daha iyidir.

Kısacası, bir tick'in aynı anda hem al hem de sat bayrağına sahip olduğunu görürseniz, bu, brokerın sunucusunun güncellenmediği ve bilinmeyen bir yöndeki işlemleri yayınladığı anlamına gelir.

Hangi sunucuda kene izliyorsunuz?
 
Vladimir Karputov :

Lütfen sorunuzu yeniden yazın veya noktalama işaretleri koyun veya daha da iyisi resimde ne, nerede ve kim olduğunu ekleyin. Aksi takdirde tanıdık harfler gördüğüm ortaya çıkıyor ama anlamını ve düşüncenizi anlayamıyorum.

işte resim


 
Seric29 :

işte resim


Öyleyse neden resmim eklendi (veya markalı bir önbellek miydi?)?

 
Seric29 :

işte resim


Belirtin: Fareyi doğrudan terminalde hareket ettirmek ve sağ fare tıklamasıyla KONUM fiyatını kopyalamak ister misiniz?

 
Алексей Барбашин :

Muhtemelen uzağa gitmeyeceğiz. Kayıt defteriyle çalışmayı düşünün. Hem dize değerlerini hem de sayısal değerleri (dize olarak değil) kayıt defterine koyabilirsiniz. Kayıt defterine bir sayı iletmek ve ona bir işaretçi geri almak diziler kullanılarak yapılır (düzeltmenize göre). Bu örnek işe yarar mı?

Tutmak. Sanırım anlayacaksın.
Dosyalar:
TestReg.mq5  33 kb
 
. ... Rick D. ... . :
Tutmak. Sanırım anlayacaksın.

Orijinal! Sendikayı düşünmedim bile. )))

Önceki örneği kullanarak, bellek ve terminal çökmesinin tam olarak ne olduğunu anlamaya çalıştım.

Yeni başlayanlar için, açık bir kayıt defteri anahtarına işaretçiler almak için dizileri terk ettim. Yani, API'ye az önce uint & phkResult ilettim. Her şey yolunda gitti, hata yok. mql belgeleri, basit türlerin başvuru yoluyla iletilebileceğini, API ile çalışırken bunun bir değişkenin, yani bir işaretçinin adresi olduğunu belirtir. Bu bölümde her şey yolunda gitti. NULL parametreler de yerlerine döndürülüyor ve dizi kullanmadan geçiyorum.

Ardından, değerin kendisini kayıt defterine geçirmeye çalıştım. İşlevin açıklaması, sonunda sıfır ile biten bir dize geçirmeniz gerektiğini belirtir. Ve string tipi tam da bu, yani ilk versiyonda bir değişkeni geçtim. Bunu önceki sürümde de aynı şekilde değiştirmediniz. Ama dizileri denemeye karar verdim ve kısa bir dizi girdim, onu istenen değerle doldurdum. Bir işleve aktarıldığında parametrelerden biri

uint RegSetValueExW(uint hKey, string lpValueName, uint Ayrılmış, uint dwType, ushort &lpData[], uint cbData);

iletilen verilerin boyutudur. Örneğinizde şöyleydi:

uint cbData = (StringLen(değer)+1)*2;

Burada her şey açık. Dizenin uzunluğunu alırız, bir "sonlandırıcı" sıfır ekleriz ve ushort'un boyutunu 2 bayt ile çarparız;

Bu şekilde denedim:

ushortData[];

StringToShortArray(değer, Veri);

uint cbData = sizeof(Veri);

Verilerin boyutu önceki örneğe eşit olmadığında ne şaşırdım!

Dizinin boyutunu kontrol ettim, StringLen(value)+1 değeriyle tam olarak eşleşiyor, ancak verilerin boyutu eşleşmedi... Hala nedenini anlamıyorum..

Neyse.

Orijinal sorun, kayıt defterinden değeri almakla sonuçlandı, çünkü referans olarak bir işaretçi olarak bir dize değişkeni geçiyordum. İşte kaza burada oldu.

" DLL'ye dizenin kendisi değil, ancak bu yapı veya ona bir referans iletiliyorsa, doğru sonucu bekleyemezsiniz - sonuçta, sistem DLL'si muhtemelen sonunda boş karakterli dürüst bir dize kabul eder ve bunu değil yapı " - bu on yıl öncesinden bir alıntı, alaka düzeyini kaybetmedi.

Bu nedenle, örneğin bir kayıt defteri anahtarının adı veya bir parametrenin dize değeri gibi herhangi bir dize sabit değeri geçerken her şey doğru çalışır. Ve benim yaptığım gibi bir string değişkeni referans olarak iletirken, alıntıda belirtilen soruna yol açar. )))

Alınan boyuta gelince, API belgeleri, "hala veri var" hatası alınması durumunda, döngüdeki alıcı arabelleğinin boyutunu artırdığımız ve verileri yeniden aldığımız bir örnek verir.

Bunun gibi bir şey.

Yardımın için tekrar teşekkürler! )))


 
Алексей Барбашин :

Orijinal! Sendikayı düşünmedim bile. )))

Birliğin kullanımı uygundur. Düşünmeye gerek yok - yüksek bayt nerede ve düşük bayt nerede. Union, REG_BINARY için bile kullanılabilir. Veri yapınızı tanımlayın. Ve yapının boyutuna göre bir dizi bayt ile birlikte Union'a ekleyin. Ama buna gerçekten ihtiyacın olduğunu düşünmüyorum. Herhangi bir veri bir dizgeye dönüştürülebilir ve bir dizge olarak saklanabilir.

Önceki örneği kullanarak, bellek ve terminal çökmesinin tam olarak ne olduğunu anlamaya çalıştım.

Belki de yığın uçtuğu için işlev açıklamasında int yerine long belirttiniz.

mql belgeleri, basit türlerin başvuru yoluyla iletilebileceğini, API ile çalışırken bunun bir değişkenin, yani bir işaretçinin adresi olduğunu belirtir.

Belgelerin bu bölümüne bir bağlantı gönderebilir misiniz?

uint cbData = sizeof(Veri);

Ushort dizisini geçiyorsanız uint cbData = ArraySize(Data) * 2'ye ihtiyacınız var.

ve uint cbData = ArraySize(Data) bir uchar dizisini geçiyorsanız.

Son örnekte, Windows LPBYTE lpData ile tam uyumluluk için uchar dizisini API parametresi olarak işleve iletiyorum.

Bu doğru. Ancak tüm verileri bir bayt dizisine dönüştürmek için biraz uğraştı.

Alınan boyuta gelince, API belgeleri, "hala veri var" hatası alınması durumunda, bir döngüdeki alıcı arabelleğinin boyutunu artırdığımız ve verileri yeniden aldığımız bir örnek verir.

Son koda bakın. Orada, uygulamada, önce verinin boyutunu elde etmek için bir istek var, ardından dizinin boyutu ayarlandı , ardından tüm veriler bütünüyle alındı.

 
. ... Rick D. ... . :

Birliğin kullanımı uygundur. Düşünmeye gerek yok - yüksek bayt nerede ve düşük bayt nerede. Union, REG_BINARY için bile kullanılabilir. Veri yapınızı tanımlayın. Ve yapının boyutuna göre bir dizi bayt ile birlikte Union'a ekleyin. Ama gerçekten ihtiyacın olduğunu düşünmüyorum. Herhangi bir veri bir dizgeye dönüştürülebilir ve bir dizge olarak saklanabilir.

Belki de yığın uçtuğu için işlev açıklamasında int yerine long belirttiniz.

Belgelerin bu bölümüne bir bağlantı gönderebilir misiniz?

Ushort dizisini geçiyorsanız uint cbData = ArraySize(Data) * 2'ye ihtiyacınız var.

ve bir uchar dizisini geçiyorsanız uint cbData = ArraySize(Data).

Son örnekte, Windows LPBYTE lpData ile tam uyumluluk için uchar dizisini API parametresi olarak işleve iletiyorum.

Bu doğru. Ancak tüm verileri bir bayt dizisine dönüştürme zorluğunu ekledi.

Son koda bakın. Orada, uygulamada, önce verinin boyutunu elde etmek için bir istek var, ardından dizinin boyutu ayarlandı , ardından tüm veriler bütünüyle alındı.

Tekrar merhaba!

Sizinle bu konudaki tartışmamızın sadece yeni başlayanlar için değil aynı zamanda deneyimli programcılar için de yararlı olacağını umuyorum.

Uzun ile ilgili. Evet, bu benim hatam, ancak başlangıçta testler int ile yapıldı. 64-bit terminal kullandığım için Long kullandım. Ama her şey int ile iyi çalışır.

İşaretçiler hakkında. Aşağıdaki makalelerde her şeyin iyi bir şekilde açıklandığına inanıyorum: https://www.mql5.com/ru/docs/basis/types/this , https://www.mql5.com/ru/docs/runtime/imports

Ayrıca sizeof ile ilgili hatamı kabul ediyorum. Değişim için dinamik bir dizi kullanıyoruz, yani dinamik diziler için, sizeof verinin boyutunu değil dizinin boyutunu döndürür: https://www.mql5.com/ru/docs/basis/operations/ diğer

Tam miktarda veri alma hakkında. Evet, senin gerçeğin. Nitekim ilk çağrıda fonksiyon parametreye yerleştirilen verinin boyutunu döndürür, bu yüzden yazdığım döngü olmadan yapabilirsiniz. Görünüşe göre burada, okunan verinin boyutunun değişkene döndürüldüğünü söylediği için işlevin açıklamasını yanlış anladım.

Dizgeye geri dönelim... Prensipte, veri alırken bir değişkeni referans yoluyla iletmek mümkündü, ancak önce onu maksimum uzunluğa kadar bir değerle başlatmak mümkündü. Bana gelince, bu bir koltuk değneği, çünkü o zaman değeri bu satırdan kesmeniz gerekiyor. Bir dizi arabelleğinde veri almak daha iyi bir seçenektir, yani bizim çözümümüz bence en iyisidir))).

İşaretçi olarak bir dize geçirme hakkında burada: https://www.mql5.com/ru/forum/103532/page2#comment_2983919

Andrey, dll ile çalışmayı çok iyi anlatıyor: https://www.mql5.com/ru/articles/96


Sanırım yardımınızla, yalnızca kayıt defteriyle çalışma konusunu değil, aynı zamanda kitaplık API'leriyle çalışmanın nüanslarını da tam olarak ortaya çıkarmayı başardım.

Kayıt defteri ile çalışma sınıfı, hem aynı çizelgedeki araçlar arasında hem de genel olarak çizelgeler ve terminaller arasında veri alışverişi için çok uygundur.

Bir şekilde forumda, sözde bu amaçlar için kayıt defterini kullanmanın bir ampulle çivi çakmakla eşdeğer olduğunu ifade ettiler ve sanal dosyaların (haritalama) kullanılmasını önerdiler. Ancak buna katılmıyorum, çünkü kayıt defteri diske yazılmadan önce sadece sanal bir dosyadır. REG_OPTION_VOLATILE niteliğini kullanırken, değer her zaman sanal olacaktır. Evet ve oturumlar arası verileri kayıt defterinde saklamak çok uygundur. BENİM NACİZANE FİKRİME GÖRE.

Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
Документация по MQL5: Основы языка / Типы данных / Ссылки. Модификатор & и ключевое слово this
  • www.mql5.com
В MQL5 параметры простых типов можно передавать как по значению, так и по ссылке, в то время как параметры сложных типов всегда передаются по ссылке. Для указания компилятору на необходимость передачи параметра по ссылке, перед именем параметра ставится знак амперсанда Передача параметра по ссылке означает передачу адреса переменной, поэтому...
Neden: