6 numaralı hata - sayfa 8

 
otopsi, 139 hata kodunun yanlış kullanıldığını gösterdi. Aslında, "ticaret bağlamı meşgul", bu nedenle nedense özel bir kodu yoktu. bugün İngilizce forumda benzer bir sorunu tartıştık "Ticaret Dispatcher: tüm ticaret bağlamı meşgul"
Tüm Uzman Danışmanlar için yalnızca bir ticaret dizisi vardır. doğru çözüm, global değişkenler üzerinde kendi semafor sisteminizi oluşturmak olacaktır.
4 dakikada 4 Expert Advisor'ı başlattım. 10 dakikalık çalışma için 7 kez hata 139
 
otopsi, 139 hata kodunun yanlış kullanıldığını gösterdi. Aslında, "ticaret bağlamı meşgul", bu nedenle nedense özel bir kodu yoktu. bugün İngilizce forumda benzer bir sorunu tartıştık "Trade Dispatcher: all trade context is busy"
Tüm Uzman Danışmanlar için yalnızca bir ticaret dizisi vardır. doğru çözüm, global değişkenler üzerinde kendi semafor sisteminizi oluşturmak olacaktır.
4 dakikada 4 Expert Advisor'ı başlattım. 10 dakikalık çalışma için 7 kez hata 139


En azından genel hatlarıyla bize bu semafor sisteminin nasıl olması gerektiğini anlatır mısınız?
1. Özellikle başkalarını rahatsız etmemek için bir işlemin nasıl yapılması gerektiği.
2. Uyur, kontroller, zaman aşımları (çok iş parçacıklı MT'de söz verilmedi, ama neyse)

Ve sonunda. Bunu bir sitem olarak algılamayın. Ders kitabınız var mı? Bir uzman içerir. Bana oradaki semaforları göster.

İşte benim uzmanım. Yirmi ruble için külot kadar basit. Her saat pozisyonu çevirin. Tüccarların ve komisyoncuların gelirini gerçekten önemsiyorsanız (kimin umurunda bilmiyorum ama önce istikrarlı çalışan bir Uzman Danışman almak ve ardından demodan gerçeğe geçmek istiyorum), o zaman lütfen bu Uzman Danışman örneğini kullanarak benimki, nasıl doğru yapılacağını göster.

Samimi olarak,
kuark

not Bazen ortaya çıkan 2, 6, 138 ve 4109 hatalarının kaynağı sorusu açık kalmaktadır.
 

bugün İngilizce forumda benzer bir sorunu tartıştık "Ticaret Dispatcher: tüm ticaret bağlamı meşgul"


İngilizce konuyu okudum. E-evet... Bu adamların acilen Rusça öğrenmesi gerekiyor.
Benzer değil, aynı sorun. Doğru, henüz 2, 6, 138 ve 4109 hatalarını almadılar. Sadece 139 civarındaydı.

Dürüst olmak gerekirse, IsTradeAllowed'daki noktayı göremiyorum. Slava, on Uzman Danışmanın bu işlevden nasıl devam ettiğini, ardından birlikte ticaret yapmak için acele ettiklerini ve ilki hariç hepsinin başarısız olduğunu açıkladı.

Birikecekleri, bir süre yaşayacakları ve ya yürütülecekleri ya da silinecekleri bir istek kuyruğu yapmak çok daha iyi olurdu. Ama bunların hepsi hayal.

Bunun yerine, örneğin global bir nTrading değişkeni oluşturmanız ve buna şu anda işlem yapan Uzman Danışmanın numarasını yazmanız gerekecektir. Mantıklı bir soru - uzmanların geri kalanı ne yapmalı? Bekleyen siparişleriyle tekrar MT3'e geri mi dönüyorsunuz...ya da başka bir fikriniz var mı?

Bu arada, global bir değişken olmadan da mümkündür, bunun gibi bir şey

if(nBeklemede == OP_BUY)
    nBeklemede = Satın Al();
else if(nPending == OP_SELL)
    nBeklemede = Sat();



Burada Buy() ve Sell(), başarısızlık durumunda OP_BUY / OP_SELL ve başarı durumunda -1 döndürür.

Dezavantajlar açıktır - komisyoncu bir yerine on açılış (kapanış) emri alacaktır. Otomatikse, her şey yolunda. Eğer bir kişi - rahatsız olacak. Makine ve kişi farklı bir mantığa göre hareket ederse daha kötüdür. Örneğin, bir otomatın kuyruğu yoktur (Slava'nın bize açıkladığı gibi, bir akışı vardır ve sıraya girmek yerine siparişler rekabet eder), ancak bir kişi vardır. Ardından, gerçek hayatta ticarete başladıktan sonra, tüccar tükenecek ve nedenini bile anlamayacak, çünkü (ben - Alpari'deki bir sunum seminerinde) demo ile gerçek arasında hiçbir fark olmadığından emin oldu.

İkinci seçenek - her uzmana ve para birimine kendi numarası atanır, böylece uzman + para birimi kombinasyonu benzersiz olur. Sonra kodu öyle bir şekilde yazarız ki, çarpan 1 ile uzman birinci saniyede, çarpan 7 ile - yedincide işlem yapar, vb. bar açıldıktan sonra Bu, sisteme ticaret için bir saniye verecektir.

Slava'ya soru - sorunu önlemek için bir saniye yeterli mi?

Dezavantajları bariz, kafa derisi - pipers size onlardan bahsedecek :)

Sevgili geliştiriciler (ve hepsi-hepsi). Açıklama için teşekkürler. Bu ve önceki gönderilerde cevaplanmamış sorular var. Bir cevap beklemek.

kuark




 
Ve bir soru daha. Tartışılan durum durdurma emirleri için geçerli mi? Uzmanlar bunların uygulanması için rekabet ediyor mu?
 
//+------------------------------------------------------------------+
//|                                                    TestQuark.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

double dStopLoss;
int nHoursToHold;

datetime timePrev = 0;

int nSlip = 5;

double dLotSize = 0.1;

int nMagic = 0;
string SemaphoreName="TradeSemaphore";

//////////////////
int init ()
{
   if(!GlobalVariableCheck(SemaphoreName)) GlobalVariableSet(SemaphoreName,0.0);
	
	timePrev = 0;

	dStopLoss = 110 * Point;
	nHoursToHold = 1;
	
	if(Symbol() == "EURUSD")
		nMagic = 1;
	else if(Symbol() == "EURJPY")
		nMagic = 2;
	else if(Symbol() == "USDCHF")
		nMagic = 3;
	else if(Symbol() == "GBPUSD")
		nMagic = 4;
	else if(Symbol() == "GBPJPY")
		nMagic = 5;
	else if(Symbol() == "GBPCHF")
		nMagic = 6;
	else if(Symbol() == "USDJPY")
		nMagic = 7;
	else if(Symbol() == "AUDUSD")
		nMagic = 8;
	else if(Symbol() == "EURGBP")
		nMagic = 9;
	else if(Symbol() == "USDCAD")
		nMagic = 10;
	else if(Symbol() == "EURCHF")
		nMagic = 11;
	else if(Symbol() == "EURAUD")
		nMagic = 12;
		
	timePrev += nMagic;	// Open nMagic seconds after the new bar

	return(0);	
}

// ------

int deinit()
{
	return(0);
}
// ------
int start()
{
	if(Bars < 5)
		return(0);
	
	// The previous bar just closed
	bool bIsBarEnd = false;
	if(timePrev != Time[0] + nMagic) 
		bIsBarEnd = true;
	timePrev = Time[0] + nMagic;
	
	if(!bIsBarEnd)
		return(0);

	// ------
	
	int nSignal = GetSignal();

	bool bSemaphored=false;
   while(!IsStopped())
     {
      if(GlobalVariableGet(SemaphoreName)==0.0)
        {
         GlobalVariableSet(SemaphoreName,1.0);
         bSemaphored=true;
         break;
        }
      Sleep(1000);
     }

	if(nSignal == OP_BUY) 
		Buy();
	else if(nSignal == OP_SELL) 
		Sell();

	for(int nCnt = OrdersTotal() - 1; nCnt >= 0; nCnt--)
	{
		OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);

		if(OrderMagicNumber() == nMagic)
		{
			if(CurTime() - OrderOpenTime() > (nHoursToHold - 1) * 60 * 60)
			{
				if(OrderType() == OP_BUY)
					OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);
				else if(OrderType() == OP_SELL)
					OrderClose(OrderTicket(), OrderLots(), Ask, nSlip, OrangeRed);
			}
		}
	}

	if(bSemaphored) GlobalVariableSet(SemaphoreName,0.0);	

	return(0);
}
// ------

void Sell()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_SELL, dLotSize, Bid, nSlip, Bid + dStopLoss, 
		0, "Friday", nMagic, 0, OrangeRed);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", " + nError);
	}
}
// ------
void Buy()
{
	if(AccountFreeMargin() < 500)
		return;

	dLotSize = GetLotSize();

	int nResult = OrderSend(Symbol(), OP_BUY, dLotSize, Ask, nSlip, Ask - dStopLoss, 
		0, "Friday", nMagic, 0, Aqua);

	if(nResult == -1)
	{
		int nError = GetLastError();
		Alert(Symbol() + ", " + nError);
	}
}
// ------

double GetLotSize()
{
	double dLot = 0.1;
	
	return(dLot);
}

// ------

int GetSignal()
{
	int nSignal;
	if(MathMod(Hour(), 2) == 0)
		nSignal = OP_BUY;
	else
		nSignal = OP_SELL;
		
	return(nSignal);
}

//+------------------------------------------------------------------+


global bir değişkenin değerini ayarlama işlevini yaparsanız, bu değişkende belirli bir değer olması şartıyla, inşaat olmaması için

      if(GlobalVariableGet(SemaforAdı)==0.0)
        {
         GlobalVariableSet(SemaforAdı,1.0);
         bSemaforlu=doğru;
         kırmak;
        }


o zaman yüzde 100 güvenilirlik olacak
gibi bir şey

      if(GlobalVariableSetOnCondition(SemaphoreName, 1.0, 0.0)==true)
        {
         bSemaforlu=doğru;
         kırmak;
        }
 
Ve bir soru daha. Tartışılan durum durdurma emirleri için geçerli mi? Uzmanlar bunların uygulanması için rekabet ediyor mu?

hayır. duraklar sunucuda işlenir. ve bizim durumumuzda, müşterinin uzman ticaret akışı için rekabet var
 
Başka bir deyişle, örneğin global bir nTrading değişkeni oluşturmanız ve o anda işlem yapmakta olan Uzman Danışmanın numarasını yazmanız gerekecektir. Mantıklı bir soru - uzmanların geri kalanı ne yapmalı? Bekleyen siparişleriyle tekrar MT3'e geri mi dönüyorsunuz...ya da başka bir fikriniz var mı?
Şahsen, işlemler arasında zorunlu bir duraklamam var (ayarlanabilir, şimdi 30 saniye). Karlı ticaret için bu bir engel değildir, ancak bu tür durumlara karşı koruma sağlar. Global üzerinden uygulandı. değişken. Semafor ve duraklatma - 2'si bir arada =)

Kuyruğa gelince, içinde kayıtlı emirleri yürüten bir Uzman Danışman yapma fikrim vardı. Ve diğer tüm uzmanlar sadece bu dosyaya emir yazarlar.
Ama benim için çok kolay değil (yetkin uygulama anlamında) ... Ama deneyebilirsiniz. birlikte =))
 
Teşekkürler :)

Bu pasajı anlamadım:


global bir değişkenin değerini ayarlama işlevini yaparsanız, bu değişkende belirli bir değer olması şartıyla, herhangi bir inşaat olmaması için

if(GlobalVariableGet(SemaforAdı)==0.0)
{
GlobalVariableSet(SemaforAdı,1.0);
bSemaforlu=doğru;
kırmak;
}


Şimdi bu davanın mantığı hakkında. Merak ettiğim için kusura bakmayın ama...

Doğru anladıysam, semaforu ayarlayana kadar while döngüsünde oturuyoruz. Böyle? Sonra bizden başka kimsenin ticaret yapmadığını bilerek ticaret yapıyoruz. Sonra semaforu orijinal durumuna döndürürüz.

Soru: while(!IsStopped()) nasıl çalışır? Yardımdan tam olarak net değil, Canlı Ticarete İzin Ver için bir çek olduğunu düşündüm.

Soru: Bu süre ve Uyku sistemi yavaşlatmaz mı?

Soru: Uyku ve semafor, test modunda doğru şekilde işlenecek mi?

Daha mantıklı. Bir semafor ayarlamak ve kaldırmak arasında, siparişlerle çalışmak için iki (maksimum) fırsatımız var. Önce Buy() veya Sell() ve ardından aşağıda, CloseOrder(). Bu iki "faaliyet", bir uzman içinde bile, aynı zamanda iki uzman varmış gibi birbirleriyle rekabet etmeyecek mi? Yoksa işlemin lineer olması garanti mi ve Buy() dönene kadar CloseOrder() oraya ulaşmayacak mı?

Şimdiden teşekkürler.
kuark
 
И еще один вопрос. Относится ли обсуждаемая ситуация к стоп ордерам? Конкурируют ли эксперты за их исполнение?

hayır. duraklar sunucuda işlenir. ve bizim durumumuzda, müşterinin uzman ticaret akışı için rekabet var


Kendimi yanlış ifade ettim. OrderSend (OP_BUYSTOP... ayrıca semaforları ayarlayan ve kaldıran bir kodla çevrelenmeli mi? Aptalca bir soru. Elbette olmalı.
 
4. sayfadaki 1. gönderide yayınlanan uzman, euro - m15'e eklendi.
Ticaret fonksiyonlarını yeniden düzenledim (kütüphanemi bağladım) ve başka bir euro - m15'e astım. Büyü, es-hayır, değişti.

Yarın neler olduğunu anlatırım ;)