Genel olarak, burada her şey basit, benzersiz, farklı sihirbazlar arasındaki eşleşmeyen tüm emirleri özetliyor..
Örneğin, 3 sipariş var
İlk yineleme büyüsü=1 benzersiz =0, yinelemenin sonunda benzersiz olacak=2
İkinci yineleme büyüsü=2benzersiz =2, yinelemenin sonunda benzersiz olacak = 3
3>=tüm emirlerin sayısı olduğundan, while döngüsü bozulur.. Ve sihir =3 hiç kontrol edilmedi... Toplam sihir tekrar =2 ve hepsi ile böyle devam eder..
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0 İkinci yineleme büyüsü = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve rethorn ile 2. sıra büyü = 2'ye atanır. Üçüncüsü de aynı olmalıydı...
Tüm süreci yazdırmak istedim ama bir şeyler ters gitti:
int GetMagic()
{
int magic = 0 ;
int unique = 0 ;
if ( OrdersTotal ()){
do {
magic++;
for ( int i = OrdersTotal () - 1 ; i >= 0 ; i --){
if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)){
if (magic != OrderMagicNumber())
unique ++;
}
}
Print (" MAGIC ", magic, " | UNIQUE ", unique)
} while (unique < OrdersTotal ());
} elsereturn (magic + 1 );
return (magic);
}
-----------------------------------
'endless cycle.mq4' endless cycle.mq4 11
'}' - semicolon expected endless cycle.mq4 497
' else ' - ' while ' expected endless cycle.mq4 505
' else ' - illegal ' else ' without matching ' if ' endless cycle.mq4 505
' OnTick ' - function declarations are allowed on global, namespace or class scope only endless cycle.mq4 606
' OnTick ' - function already defined and has body endless cycle.mq4 606
see previous declaration of function ' OnTick ' endless cycle.mq4 606
'}' - unexpected end of program endless cycle.mq4 6316 errors, 0 warnings 71
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0 İkinci yineleme büyüsü = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve rethorn ile 2. sıra büyü = 2'ye atanır. Üçüncüsü de aynı olmalıydı...
Tüm süreci yazdırmak istedim ama bir şeyler ters gitti:
int GetMagic()
{
int magic = 0 ;
int unique = 0 ;
if ( OrdersTotal ()){
do {
magic++;
for ( int i = OrdersTotal () - 1 ; i >= 0 ; i --){
if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)){
if (magic != OrderMagicNumber())
unique ++;
}
}
Print ( " MAGIC " , magic, " | UNIQUE " , unique) ; // <---
} while (unique < OrdersTotal ());
} elsereturn (magic + 1 );
return (magic);
}
Daha fazlasını hedefleyin - TÜM programlama dilleri .
Çok basit - programlama dillerinde geri sayım sıfırdan başlar. Dizinin ilk hücresinin indeksi 0 olacaktır. Bu nedenle, onu DAHİL olarak sıfıra geri döndürmeniz gerekir. Onlar. >=0
OrdersTotal() örneğin 10'u verir. Ve döngüye 10'dan başlarsınız. Ve dizinin son indeksi 9'a sahiptir (sıfırdan başladığımızı hatırlıyor musunuz?). Ve var olmayan bir dizi hücresine eriştiğinizde ne olur? Bu doğru - program kritik bir hata nedeniyle çöktü, çünkü dizi için ayrılmamış bellek alanına tırmandınız - sınırlarının ötesinde .
Bu tam olarak sağlam koltuk değneği . Okuyun, çalışın ve her şey size gelecektir.
Teşekkürler. Onu kastetmedim. Açık bir lisansta olsaydı, mql için her şey affedilebilirdi. Ve böylece, nitpicking yapıyorum. Bana öyle geliyordu ki, örneğin, NormalizeDouble işlevinde bir bayrak koymak, bit kesme veya aritmetik yuvarlama kullanmak mümkündü. Veya örneğin, pozisyonlarla çalışma işlevlerini genişletmek, örneğin açık pozisyonların sayısını yalnızca uzlaşma veya satın almalar için iade etmek mümkün olacaktır. Ayrıca, daha ayrıntılı bir yardım yazabilirsiniz. Ama bu sadece bir amatörün görüşü. Ayrıca, son ifadem sert göründüyse özür dilerim.
Mql onlara yakındır ve özgürce öğrenebilirsiniz. Neyse ki, derin bilgi gerekli değildir. Ama en azından dilin sözdizimi ve algoritmaların temel temelleri.
Aksi takdirde, platform ve algoritmalar üzerine istişareler yerine, ilkokul düzeyinde diyaloglar yerine konuyla ilgili bazı saçmalıklar ortaya çıkıyor - nereye koymak; döngü nedir ve neden 0 ile indekslenir
örneğin, bir site intuit.ru var - C ve algoritmalar üzerine kurslar var, zamanınızı en fazla birkaç hafta geçirin. Aynı zamanda, bir parça kağıt alabilirsiniz :-)
Maxim Kuznetsov dilin sözdizimi ve algoritmaların temel temelleri.
Aksi takdirde, platform ve algoritmalar üzerine istişareler yerine, ilkokul düzeyinde diyaloglar yerine konuyla ilgili bazı saçmalıklar ortaya çıkıyor - nereye koymak; döngü nedir ve neden 0 ile indekslenir
örneğin, bir intuit.ru sitesi var - C ve algoritmalar üzerine kurslar var, zamanınızı en fazla birkaç hafta geçirin. Aynı zamanda, bir parça kağıt alabilirsiniz :-)
OrdersTotal() örneğin 10'u verir. Ve döngüye 10'dan başlarsınız. Ve dizinin son indeksi 9'a sahiptir (sıfırdan başladığımızı hatırlıyor musunuz?). Ve var olmayan bir dizi hücresine eriştiğinizde ne olur? Bu doğru - program kritik bir hata nedeniyle çöktü, çünkü dizi için ayrılmamış bellek alanına tırmandınız - sınırlarının ötesinde .
Biraz düzelteceğim.. Kritik bir hata olmayacak, sadece bir boolean OrderSelect false döndürecek .. ve hepsi bu.. Ama elbette kaçınmak daha iyi.. Çünkü kodun yeteneklerini yanlış kullanırsanız, zor olası söveleri tahmin etmek için ..
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0 İkinci yineleme sihirli = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve imbik tarafından 2. sıraya magic = 2 atanır. Üçüncüsü de aynı olmalıydı...
Sadece benzersizin doldurulmasının çok hızlı olduğunu ve sınıra ulaştığını ve sihrin zar zor büyüdüğünü görüyorum.
Bu bağlamda bir çözüm bulmak için yazdırın, ancak sorunu yeniden formüle etmenizi tavsiye ederim.. Örneğin, bir döngüdeki emirlerin maksimum büyüsünü bulun ve +1 ile geri gönderin, bu doğru basit çözüm olacaktır.
Bunu yapabilirsiniz, kod gerektiği gibi çağrılır, böylece ağırlığı sorun yaratmaz
Test için Al/Sat kullandım
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
Print (GetMagic());
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать//для нашего ордера уникальный маджикint arr[];
int n=- 1 ;
int OT= OrdersTotal ();
for ( int i= 0 ; i<OT; i++) {
if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) {
if (OrderType() == OP_SELL || OrderType() == OP_BUY) {
if (ArraySearchInt(arr, OrderMagicNumber())==- 1 ) {
n++;
ArrayResize (arr,n+ 1 );
arr[n]=OrderMagicNumber();
}
}
}
}
ArraySort (arr);
OT= ArraySize (arr);
for ( int i= 0 ; i<OT; i++)
if (arr[i]!=i) return i;
return OT;
}
//-- удаляет копии с массиваint ArraySearchInt( int & m[], int e)
{
for ( int i= 0 ; i< ArraySize (m); i++) {
if (m[i]==e) return (i);
}
return (- 1 );
}
Biraz düzelteceğim.. Kritik bir hata olmayacak, sadece bir boolean OrderSelect false döndürecek .. ve hepsi bu.. Ama elbette kaçınmak daha iyi.. Çünkü kodun yeteneklerini yanlış kullanırsanız, zor olası söveleri tahmin etmek için ..
Sadece benzersizin doldurulmasının çok hızlı olduğunu ve sınıra ulaştığını ve sihrin zar zor büyüdüğünü görüyorum.
Bu bağlamda bir çözüm bulmak için yazdırın, ancak sorunu basitçe yeniden formüle etmenizi tavsiye ederim.. Örneğin, bir döngüdeki siparişlerin maksimum büyüsünü bulun ve +1 ile geri gönderin , bu doğru basit çözüm olacaktır.
Bu seçenek başarısız olursa bu son çaredir. Bu arada, baskının ortaya çıktığı şey burada.
"-1" i sevmiyorsan, yapabilirsin
Hayır, bunu yapamazsınız - dizinize bu şekilde erişirseniz program çökecektir.
En iyi durumda, dahili dizilere erişirseniz, ihtiyacınız olan verileri kaçırırsınız veya onlara döngü içinde ulaşamazsınız.
Genel olarak, burada her şey basit, benzersiz, farklı sihirbazlar arasındaki eşleşmeyen tüm emirleri özetliyor..
Örneğin, 3 sipariş var
İlk yineleme büyüsü=1 benzersiz =0, yinelemenin sonunda benzersiz olacak=2
İkinci yineleme büyüsü=2 benzersiz =2, yinelemenin sonunda benzersiz olacak = 3
3>=tüm emirlerin sayısı olduğundan, while döngüsü bozulur.. Ve sihir =3 hiç kontrol edilmedi... Toplam sihir tekrar =2 ve hepsi ile böyle devam eder..
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0
İkinci yineleme büyüsü = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve rethorn ile 2. sıra büyü = 2'ye atanır.
Üçüncüsü de aynı olmalıydı...
Tüm süreci yazdırmak istedim ama bir şeyler ters gitti:
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0
İkinci yineleme büyüsü = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve rethorn ile 2. sıra büyü = 2'ye atanır.
Üçüncüsü de aynı olmalıydı...
Tüm süreci yazdırmak istedim ama bir şeyler ters gitti:
int GetMagic() { int magic = 0 ; int unique = 0 ; if ( OrdersTotal ()){ do { magic++; for ( int i = OrdersTotal () - 1 ; i >= 0 ; i --){ if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)){ if (magic != OrderMagicNumber()) unique ++; } } Print ( " MAGIC " , magic, " | UNIQUE " , unique) ; // <--- } while (unique < OrdersTotal ()); } else return (magic + 1 ); return (magic); }Daha fazlasını hedefleyin - TÜM programlama dilleri .
Çok basit - programlama dillerinde geri sayım sıfırdan başlar. Dizinin ilk hücresinin indeksi 0 olacaktır. Bu nedenle, onu DAHİL olarak sıfıra geri döndürmeniz gerekir. Onlar. >=0
OrdersTotal() örneğin 10'u verir. Ve döngüye 10'dan başlarsınız. Ve dizinin son indeksi 9'a sahiptir (sıfırdan başladığımızı hatırlıyor musunuz?). Ve var olmayan bir dizi hücresine eriştiğinizde ne olur? Bu doğru - program kritik bir hata nedeniyle çöktü, çünkü dizi için ayrılmamış bellek alanına tırmandınız - sınırlarının ötesinde .
Bu tam olarak sağlam koltuk değneği . Okuyun, çalışın ve her şey size gelecektir.
Tonlarca ücretsiz ve iyi C/C++ kursu var.
Mql onlara yakındır ve özgürce öğrenebilirsiniz. Neyse ki, derin bilgi gerekli değildir. Ama en azından dilin sözdizimi ve algoritmaların temel temelleri.
Aksi takdirde, platform ve algoritmalar üzerine istişareler yerine, ilkokul düzeyinde diyaloglar yerine konuyla ilgili bazı saçmalıklar ortaya çıkıyor - nereye koymak; döngü nedir ve neden 0 ile indekslenir
örneğin, bir site intuit.ru var - C ve algoritmalar üzerine kurslar var, zamanınızı en fazla birkaç hafta geçirin. Aynı zamanda, bir parça kağıt alabilirsiniz :-)
Aksi takdirde, platform ve algoritmalar üzerine istişareler yerine, ilkokul düzeyinde diyaloglar yerine konuyla ilgili bazı saçmalıklar ortaya çıkıyor - nereye koymak; döngü nedir ve neden 0 ile indekslenir
örneğin, bir intuit.ru sitesi var - C ve algoritmalar üzerine kurslar var, zamanınızı en fazla birkaç hafta geçirin. Aynı zamanda, bir parça kağıt alabilirsiniz :-)
Bunun gibi?
OrdersTotal() örneğin 10'u verir. Ve döngüye 10'dan başlarsınız. Ve dizinin son indeksi 9'a sahiptir (sıfırdan başladığımızı hatırlıyor musunuz?). Ve var olmayan bir dizi hücresine eriştiğinizde ne olur? Bu doğru - program kritik bir hata nedeniyle çöktü, çünkü dizi için ayrılmamış bellek alanına tırmandınız - sınırlarının ötesinde .
Biraz düzelteceğim.. Kritik bir hata olmayacak, sadece bir boolean OrderSelect false döndürecek .. ve hepsi bu.. Ama elbette kaçınmak daha iyi.. Çünkü kodun yeteneklerini yanlış kullanırsanız, zor olası söveleri tahmin etmek için ..
İlk sıraya varsayılan olarak sihirli = 1 verilir ve ardından döngü devreye alınır:
Yineleme büyüsünün başlangıcı = 1 benzersiz = 0, sonunda (sihir = 1 ile zaten bir sipariş olduğunda) büyü hala 1 ve benzersiz = 0
İkinci yineleme sihirli = 2 benzersiz = 0, sonunda, büyü = 2 ve benzersiz = 1 (eşleşme yok) ve imbik tarafından 2. sıraya magic = 2 atanır.
Üçüncüsü de aynı olmalıydı...
Sadece benzersizin doldurulmasının çok hızlı olduğunu ve sınıra ulaştığını ve sihrin zar zor büyüdüğünü görüyorum.
Bu bağlamda bir çözüm bulmak için yazdırın, ancak sorunu yeniden formüle etmenizi tavsiye ederim.. Örneğin, bir döngüdeki emirlerin maksimum büyüsünü bulun ve +1 ile geri gönderin, bu doğru basit çözüm olacaktır.
Bunu yapabilirsiniz, kod gerektiği gibi çağrılır, böylece ağırlığı sorun yaratmaz
Test için Al/Sat kullandım
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma
Vitaly Muzichenko , 2021.10.19 23:08
Biraz düzelteceğim.. Kritik bir hata olmayacak, sadece bir boolean OrderSelect false döndürecek .. ve hepsi bu.. Ama elbette kaçınmak daha iyi.. Çünkü kodun yeteneklerini yanlış kullanırsanız, zor olası söveleri tahmin etmek için ..
Sadece benzersizin doldurulmasının çok hızlı olduğunu ve sınıra ulaştığını ve sihrin zar zor büyüdüğünü görüyorum.
Bu bağlamda bir çözüm bulmak için yazdırın, ancak sorunu basitçe yeniden formüle etmenizi tavsiye ederim.. Örneğin, bir döngüdeki siparişlerin maksimum büyüsünü bulun ve +1 ile geri gönderin , bu doğru basit çözüm olacaktır.
Bunu yapabilirsiniz, kod gerektiği gibi çağrılır, böylece ağırlığı sorun yaratmaz
Test için Al/Sat kullandım