Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 143

 
Лауреат :
Sihri ile açık bir pozisyonu kapatacak bir fonksiyon nasıl yapılır? zaman geçmişinde belirtilen mum sayısı geçtikten sonra.
 int numBars = 5 ;
void OnTick ()
{
     for ( int i = OrdersTotal (); i >= 0 ; i--)
     {
           if (! OrderSelect (i, SELECT_BY_POS , MODE_TRADES )) continue ;
           if ( OrderSymbol () != _Symbol )                 continue ;
           if ( OrderMagicNumber () != Magic)             continue ;
           if ( OrderOpenTime () > Time [numBars- 1 ] )      continue ; 
          
           /* work */
     }
}
 
sviter-pro :
Peki, deneme yapıyorum!!! özel mantık! Yardım?

Orada özel olan ne?

Son pozisyona bakın ve karşı pozisyonu açın.

 
Konstantin Nikitin :

iyi kontrol et

 
sviter-pro :

tamam kontrol et

 

Merhaba. Lütfen bu fonksiyona yardım edin. Bir hesap, birkaç danışmanla işlem yapmak anlamına gelir. Her Uzman Danışman günde birden fazla işlem açamaz. Return true diyecek bir fonksiyona ihtiyacımız var danışman için zaten bir anlaşma varsa ve yanlış eğer anlaşma olmasaydı. Anladığım kadarıyla kontrol, geçerli tarih için sihirle yapılmalıdır. Yardımcı olabilirseniz, böyle bir kontrolün gerekli olduğu her bir Uzman Danışmanımın içine bu işlevi eklemeyi planlıyorum. Teşekkür ederim.

 
Kolya32 :

Merhaba. Lütfen bu fonksiyona yardım edin. Bir hesap, birkaç danışmanla işlem yapmak anlamına gelir. Her Uzman Danışman günde birden fazla işlem açamaz. Return true diyecek bir fonksiyona ihtiyacımız var danışman için zaten bir anlaşma varsa ve yanlışsa eğer anlaşma olmasaydı. Anladığım kadarıyla kontrol, geçerli tarih için sihirle yapılmalıdır. Yardımcı olabilirseniz, böyle bir kontrolün gerekli olduğu her bir Uzman Danışmanımın içine bu işlevi eklemeyi planlıyorum. Teşekkür ederim.

Her şey bizden önce yapıldı)) Buraya bakın .

 

isTradeToDay() işlevine ihtiyacım var gibi görünüyor. Peki, deneyeceğim) Teşekkürler.

İnt mn=-1'i yorumlayarak ve ardından kodda mn'yi Magic ile değiştirerek işlevi kendim için biraz değiştirdim. Danışmanı test cihazında bu işlevle çalıştırdıktan sonra kendim için büyük bir dezavantaj buldum: danışmanı test etme süresi BİRKAÇ KAT ARTTI!!! Şimdi bir demo hesabında bu işlevle Expert Advisor'ları test ettim. Hesapta 5 danışman var, işlemlerin gecikmeli olarak açılmasından endişe ediyorum, asıl mesele şu ki biraz...

bool isTradeToDay(string sy="", int op=-1 /*,int mn=-1*/) {
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Büyü) {
if (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Ay()
&& TimeYear (OrderOpenTime())==Yıl()) return(True);
}
}
}
}
}
}
k=SiparişToplam();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (Magic<0 || OrderMagicNumber()==Büyü) {
if (TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Ay()
&& TimeYear (OrderOpenTime())==Yıl()) return(True);
}
}
}
}
}
}
dönüş(yanlış);
}

 

Tabloda ızgaranın başabaş seviyesini işaretlemek gerekir.

Puan olarak kar:

double current_Prof_Pts = current_Prof_Bux/current_summ_lot/( SymbolInfoDouble ( _Symbol , SYMBOL_TRADE_TICK_VALUE )/( SymbolInfoDouble ( _Symbol , SYMBOL_TRADE_TICK_SIZE )/ _Point )

SATIN AL ızgarası için başabaş konumu

 zero = Bid -current_Prof_Pts* _Point

(SATIŞ için sırasıyla: Ask+ current_Prof_Pts* _Point )

Sonuç: Doğruya benzer, ancak her zaman gerçek değerin etrafında yaklaşık 3 puan atlar.

Söyle bana, hata nerede?

 
Kolya32 :

isTradeToDay() işlevine ihtiyacım var gibi görünüyor. Peki, deneyeceğim) Teşekkürler.

kendim için büyük bir dezavantaj keşfettim: danışmanı test etme süresi BİRKAÇ KEZ arttı!!!

Evet elbette. Fonksiyon evrensel olarak yazılmıştır. Her tikte ona atıfta bulunursak, döngünün hesabın tüm geçmişinden geçtiğini anlarız. Ve hesap geçmişi oldukça derin olabilir (100.000'den fazla siparişin olduğu durumlarla karşılaştım). Yürütmeyi hızlandırmak için her seferinde tüm geçmiş üzerinde bir döngü çalıştırmanız gerekmez. Bunu en başta sadece bir kez yapmak ve son işlenen siparişin indeksini hatırlamak yeterlidir. Bir dahaki sefere, yalnızca kayıtlı dizinden daha büyük bir dizine sahip siparişler arasında geçiş yapmanız gerekir. Bundan sonra, son siparişin indeksini tekrar hatırlayın, vb.

 
Igor Zakharov :

Tabloda ızgaranın başabaş seviyesini işaretlemek gerekir.

Puan olarak kar:

SATIN AL ızgarası için başabaş konumu

(SATIŞ için sırasıyla: Ask+ current_Prof_Pts* _Point )

Sonuç: Doğruya benzer, ancak her zaman gerçek değerin etrafında yaklaşık 3 puan atlar.

Söyle bana, hata nerede?

Yüzen yayılma suçlamaktır.