MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 248
![MQL5 - MetaTrader 5 müşteri terminalinde yerleşik ticaret stratejileri dili](https://c.mql5.com/i/registerlandings/logo-2.png)
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
İnternet açıldı! Maile yazabilir miyim?
Evet, temas halindeyim. Yazmak.
Danışmanı tamamlamaya yardımcı olun Ben yeni başlayan bir programcıyım, açıklama:
EA, EURUSD ve USDCHF iki döviz çifti üzerinde çalışır, yalnızca 10pp'lik bir sapma olması durumunda satın almak için iki işlem açar (aslında, bu standart bir arbitrajdır).
İşte koşul: if ((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) || (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point))
Ve toplam kar/zarar belirli bir değere ulaştığında kapanır: if ((AccountProfit()>=10)||(AccountProfit()<=-20))
SORUNUN ÖZÜ: Her zaman 2 işlem açmaz, bazen 3 işlem açar. Veya aynı para birimi için iki işlem açar. Şunlar gereklidir: her zaman farklı para birimlerinde 2 işlem açın (biri - EURUSD'de; diğeri - USDCHF'de)
İşte kodun kendisi:
dış çift dürtü = 10; // Genel değişkenler
dış çift Lot = 1;
int başlangıç()
{
double ind2=iClose("EURUSD",PERIOD_M1,0);
double ind1=iOpen("EURUSD",PERIOD_M1,0);
double ind3=iClose("USDCHF",PERIOD_M1,0);
double ind4=iOpen("USDCHF",PERIOD_M1,0);
çift oper1=ind2-ind1;
double EUR=(int)DoubleToStr(oper1*100000,0);
çift oper2=ind3-ind4;
doubleCHF=(int)DoubleToStr(oper2*100000,0);
Comment(StringFormat("Veri çıktısı\nEUR = %G\nCHF =%G",EUR,CHF));
if ((AccountProfit()>=10)||(AccountProfit()<=-20)) // Kapanış koşulu
uyarı3();
if ((ind2>ind1+impulse*Point && ind3<ind4-impulse*Point) || (ind2<ind1-impulse*Point && ind3>ind4+impulse*Point)) // Açık Koşul
if (Sipariş Toplamı() == 0)
Uyarı1();
if (OrdersTotal() == 1)
uyarı2();
dönüş(0);
}
int Uyarı1()
{
if (Sipariş Toplamı() == 0)
int send1=OrderSend("EURUSD",OP_BUY,Çok Sayıda,Sor,3,0,0);
dönüş(0);
}
int Uyarı2()
{
if(SiparişToplam() == 1)
int send2=SiparişGönder("USDCHF",OP_BUY,Çok Sayıda,Sor,3,0,0);
dönüş(0);
}
int Uyarı3()
{
while (OrdersTotal()>0)
if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) //Kapat
int cl1=SiparişKapat (OrderTicket(),OrderLots(),Bid,3);
int cl1=SiparişKapat (OrderTicket(),OrderLots(),Ask,3);
dönüş(0);
}
Alexey Belyakov : CУТЬ ПРОБЛЕММЫ: Не всегда открывает 2 сделки, а бывает открывает 3. Или открывает две сделки по одной валюте. Нужно чтобы: открывал всегда 2 сделки по разным валютам ( одна - по EURUSD; другая- по USDCHF)
Sunucuya Euro'yu açması emredildi. Sunucuya ulaşana kadar, sunucuya ulaşana kadar... Şu ana kadar 0 emir var.Bir sonraki tıklamada koşul tekrar yerine getiriliyor ve tekrar Euro açma emri veriliyor. Sunucu ilk siparişi açtı. 1 emir olduğu için ikinci (ve zaten üçüncü!) emri açmak için bir komut gönderilir.
Tüm işlevler geçersiz kılındı ve geri dönüşü kaldırıldı. Programın bu kısmı (Yapıştırmak için SRC butonuna bastım)
ile değiştirildi (kabaca, ancak IMHO orijinalinden daha iyi)
Alert3 işlevinde ekstra satır
double CHF=(int)DoubleToStr(oper2*100000,0); int CHF=oper2/_Point'i deneyin;değiştirildi (kabaca, ancak IMHO orijinalinden daha iyi) ile
Tabii ki, kesinlikle haklısın. Ayrıca, bu hata kaynak kodunda yer aldı, ancak yazardan ve sizden ve benden bir günahkardan gelen işlevlerin kullanılmasıyla maskelendi. İşlevler kaldırıldıktan sonra hata belirginleşti. Pozisyonların sadece danışmanın bulunduğu çizelgedeki sembol ile açılacağına inanıyorum. Böyle?
Tabii ki, kesinlikle haklısın. Ayrıca, bu hata kaynak kodunda yer aldı, ancak yazardan ve sizden ve benden bir günahkardan gelen işlevlerin kullanılmasıyla maskelendi. İşlevler kaldırıldıktan sonra hata belirginleşti. Pozisyonların sadece danışmanın bulunduğu çizelgedeki sembol ile açılacağına inanıyorum. Böyle?
Herkese selam. Soru naif,OrdersTotal() işleviyle ilgili. Emir sayısını döndürdüğü ve emirlerin 0'dan N'ye kadar numaralandırıldığı açıktır. Ancak çubuklar geçmişte açılan yenisinden numaralandırılmışsa, yani. "Taze" çubuk 0 olarak numaralandırılmıştır, eski olan N'dir. Ve OrdersTotal() işlevinde, anladığım kadarıyla bunun tersi gerçekleşir - eski açık düzen 0, "taze" olan - N olarak .Doğru anladım mı?
Oldukça, ama nüanslar var.
Sıralamanın terminalde sıralamaya bağlı olduğu bir zaman vardı. Kullanıcıların hiçbiri, yeniden sıralamanın terminaldeki sıralamaya bağlı hale gelmesi durumunda zamanın "aniden" geri dönüp dönmeyeceğini kesin olarak söyleyemez. Bu nedenle, siparişleri bir dizide toplamak ve açma/kapama saatine göre sıralamak daha güvenilirdir - o zaman sıralamanızın terminalde "aniden" sıralamaya değil zamana bağlı olduğunu kesinlikle bileceksiniz.
Oldukça, ama nüanslar var.
Sıralamanın terminalde sıralamaya bağlı olduğu bir zaman vardı. Kullanıcıların hiçbiri, yeniden sıralamanın terminaldeki sıralamaya bağlı hale gelmesi durumunda zamanın "aniden" geri dönüp dönmeyeceğini kesin olarak söyleyemez. Bu nedenle, siparişleri bir dizide toplamak ve açma/kapama saatine göre sıralamak daha güvenilirdir - o zaman sıralamanızın terminalde "aniden" sıralamaya değil zamana bağlı olduğunu kesinlikle bileceksiniz.
Merhaba. Cevap için teşekkürler. Başlangıçta, ters döngüyle ilgili soruma verdiğiniz bir önceki cevaba dönmek istiyorum. Dün işe gitmeden önce bir cevap yazdım ve bugün (ve sizin) gönderilerimi hiç bulamadım. Anladığım kadarıyla yanlış başlıkta sormuşum. Ters döngü ben--?
"Bu nedenle, siparişleri bir dizide toplamak ve açılış/kapanış saatine göre sıralamak daha güvenilirdir" - çok ilginç ve bana göründüğü gibi, güvenilir ve daha doğru (ve bana öyle geldi ki, sonuncuyu belirlerken sipariş, ihtiyaç duyulan her zaman elde edilmez). Zor değilse, genel anlamda nasıl yapılır (bir dizi oluşturup açılış saatine göre)?
Ve ilerisi. Şimdiye kadar, fikir ve görmek henüz onu uygulamaya çalışmadı. Karlı ve kârsız (kilitli) emirler vardır. Kâr emirleri, takip eden bir stop ile kapatılır. Daha sonra toplam kârlarını kârlı olmayanların kârıyla karşılaştırabilmeleri ve pozitif bir bakiyeyle kârsız olanları da kapatabilmeleri için siparişlerin kapatıldığını nasıl kaydedebilirim? Beni ilgilendiren, emirlerin kapalı olması.
Pozisyonların sadece danışmanın bulunduğu çizelgedeki sembol ile açılacağına inanıyorum. Böyle?
EA, EURUSD üzerinde çalışıyorsa ancak USDCHF'de bir SATIN AL emri eklemek istiyorsanız
daha sonra OrderSend'de MarketInfo("USDCHF",MODE_ASK); kullanmanız gerekir. Sor yerine (EURUSD'de olacak)