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

 
STARIJ :

İ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)

   if ((ind2>ind1+impulse* Point && ind3<ind4-impulse* Point ) ||
     (ind2<ind1-impulse* Point && ind3>ind4+impulse* Point ))   // Условие открытия
     if ( OrdersTotal () == 0 ) Alert1();
     if ( OrdersTotal () == 1 ) Alert2();
}

void Alert1()
{
   if ( OrdersTotal () == 0 )  // Перед вызовом этой функции уже проверялось количество ордеров
  int send1= OrderSend ( "EURUSD" , OP_BUY ,Lots, Ask , 3 , 0 , 0 );
}

void Alert2()
{
   if ( OrdersTotal () == 1 )  // Перед вызовом этой функции уже проверялось количество ордеров
  int send2= OrderSend ( "USDCHF" , OP_BUY ,Lots, Ask , 3 , 0 , 0 );
}

ile değiştirildi (kabaca, ancak IMHO orijinalinden daha iyi)

   if ((ind2>ind1+impulse* Point && ind3<ind4-impulse* Point ) ||
     (ind2<ind1-impulse* Point && ind3>ind4+impulse* Point ))   // Условие открытия
     if ( OrdersTotal () == 0 )
  {
     int send1= OrderSend ( "EURUSD" , OP_BUY ,Lots, Ask , 3 , 0 , 0 ); 
     int send2= OrderSend ( "USDCHF" , OP_BUY ,Lots, Ask , 3 , 0 , 0 );
     Sleep ( 60 ); // Дождаться следующего бара , а то еще пооткрывает
  }
}

Alert3 işlevinde ekstra satır

   int cl1= OrderClose ( OrderTicket (), OrderLots (), Ask , 3 );
double CHF=(int)DoubleToStr(oper2*100000,0); int CHF=oper2/_Point'i deneyin;
 
STARIJ :

değiştirildi (kabaca, ancak IMHO orijinalinden daha iyi) ile

Kaba değil, ancak hatalarla çalışacak. Sadece her iki sipariş de bir sembolün Ask'ını takip ettiğinden.
 
Alexey Kozitsyn : Kaba değil ama hatalarla çalışacak. Sadece her iki sipariş de bir sembolün Ask'ını takip ettiğinden.

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?

 
STARIJ :

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?

Evet. Tabii ki, açılış koşulları karşılanmadıkça. İkinci karakter için sor ayrı olarak edinilmelidir.
 
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ı?
 
Youri Lazurenko :
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.

 
Artyom Trishkin :

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ı.

 
STARIJ :

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)