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

 
Tünaydın. Fonksiyonla ilgili yardım lütfen, kapalı emirlerin kaybını özetler, emirleri kapatma fonksiyonu ile kullanıldığında, metatrader çöküyor, bu fonksiyonda nasıl bir hata olduğunu düşünüyorum.
çift ClosProfit()
{
çift toplam=0 ;
int siparişler=OrdersHistoryTotal();
{
for(int i=sipariş-1;i>=0;i--)
{
if( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)==yanlış)
{
Print("Geçmişte Hata!");
kırmak;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
devam etmek;
//---
if(OrderProfit()>0) kırılması;
If(OrderProfit()<0)i++;
}
eğer(i<0)
toplam=SiparişProfit()+toplam;
}
If(OrderProfit()>toplam)
toplam=SiparişProfit()+toplam;
dönüş(toplam);
}
 
Lowech :
Tünaydın. Fonksiyonla ilgili yardım lütfen, kapalı emirlerin kaybını özetler, emirleri kapatma fonksiyonu ile kullanıldığında, metatrader çöküyor, bu fonksiyonda nasıl bir hata olduğunu düşünüyorum.

Daha şimdiden görmeye hazır olun ve gerekirse kendiniz düzeltin. GetProfitFromDateInCurrency()

 
Lowech :
Tünaydın. Fonksiyonla ilgili yardım lütfen, kapalı emirlerin kaybını özetler, emirleri kapatma fonksiyonu ile kullanıldığında, metatrader çöküyor , bu fonksiyonda ne tür bir hata olduğunu düşünüyorum.

metatrader çökmesi ne anlama geliyor? Program hatalarla derleniyor!!!

Üç yerde if yerine küçük küçük harf ile yazılır Büyük büyük harf ile ise

küme parantezleri açıkça gereksizdir: int order=OrdersHistoryTotal(); ve summa=OrderProfit()+summa'dan sonraki çifti; - ama önemli değil

işte hala var...

 
Lowech :
Tünaydın. Fonksiyonla ilgili yardım lütfen, kapalı emirlerin kaybını özetler, emirleri kapatma fonksiyonu ile kullanıldığında, metatrader çöküyor, bu fonksiyonda nasıl bir hata olduğunu düşünüyorum.

Şu şekilde deneyin:

 double ClosProfit()
{ double summa= 0 ;
   int orders= OrdersHistoryTotal (); 
   for ( int i=orders- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )== false ) { Print ( "Error in history!" ); break ; }
     if ( OrderSymbol ()!= Symbol () || OrderType ()> OP_SELL ) continue ;
     if ( OrderProfit ()< 0.0 ) summa= OrderProfit ()+summa;
  }
   return (summa);
}
 
Yazarken 2 dakika gecikti... Şu kısma biraz daha yakından bakalım:
   for ( int i=orders- 1 ;i>= 0 ;i--)
  {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )== false )
    {
       Print ( "Error in history!" );
       break ;
    }
     if ( OrderSymbol ()!= Symbol () || OrderType ()> OP_SELL ) continue ;
     if ( OrderProfit ()> 0 ) break ;
     if ( OrderProfit ()< 0 )i++;
  }
   if (i< 0 )

#property strict yönergesi ile derlenmiştir - son satırı azarlar: 'i' - bildirilmemiş tanımlayıcı. Mesele şu ki, değişken bir döngü içinde bildirilir ve sadece onun içinde geçerlidir. #property strict yönergesi olmadan hatasız derlendi, ancak bu kötü. Yönerge kullanılmalıdır.

if( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)==false) yerine if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) yazmak daha kolaydır. Şimdi daha fazla ara vermelisiniz - bu döngüden çıkış. Ve diğer siparişleri işlemeniz gerekiyor. Ancak, bu tarihte gereksizdir. Piyasada ve bekleyen emirlerde bir hata oluşur, eğer işlem sırasında emir kapanmışsa ve eksikse. Genel olarak, if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) devam eder; - sonraki siparişleri işlemeye devam et

Aynı nedenle if(OrderProfit()>0) break; if(OrderProfit()>0) ile değiştirin devam edin;

İşte hatanın nedeni: if(OrderProfit()<0) i++ ; - Kaybeden bir sayı varsa, endeks artar. Ve döngü başlığı for(int i=orders-1;i>=0; i-- ) onu azaltır. Aynı siparişin işlenmesi tekrarlanır - program döngüleri. Muhtemelen şöyle olmalı:

 #property   strict
double ClosProfit()
{
   double summa= 0 ;
   for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)
  {
     if (! OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) continue ;
     if ( OrderSymbol ()!= Symbol () || OrderType ()> OP_SELL ) continue ;
    if ( OrderProfit ()< 0 ) summa+= OrderProfit ();
  }
   return (summa);
}
 
STARIJ :
Yazarken 2 dakika gecikti... Şu kısma biraz daha yakından bakalım:

#property strict yönergesi ile derlenmiştir - son satırı azarlar: 'i' - bildirilmemiş tanımlayıcı. Mesele şu ki, değişken bir döngü içinde bildirilir ve sadece onun içinde geçerlidir. #property strict yönergesi olmadan hatasız derlendi, ancak bu kötü. Yönerge kullanılmalıdır.

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) yerine if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) yazmak daha kolaydır. Şimdi daha fazla ara vermelisiniz - bu döngüden çıkış. Ve diğer siparişleri işlemeniz gerekiyor. Ancak, bu tarihte gereksizdir. Piyasada ve bekleyen emirlerde bir hata oluşur, eğer işlem sırasında emir kapanmışsa ve eksikse. Genel olarak, if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) devam eder; - sonraki siparişleri işlemeye devam et

Aynı nedenle if(OrderProfit()>0) break; if(OrderProfit()>0) ile değiştirin devam edin;

İşte hatanın nedeni: if(OrderProfit()<0) i++ ; - Kaybeden bir sayı varsa, endeks artar. Ve döngü başlığı for(int i=orders-1;i>=0; i-- ) onu azaltır. Aynı siparişin işlenmesi tekrarlanır - program döngüleri. Muhtemelen şöyle olmalı:


Teşekkürler, metatrader artık çökmez) Hakkında

if(OrderProfit()>0) kırılması; if(OrderProfit()>0) ile değiştirin devam edin;

İhtiyacım var, eğer emir bir kârla kapatılmışsa, fonksiyon bu karı hesaba katmadı, sadece zarar miktarını ve ilk emre kadar kârla kapattı. Onlar.

if(OrderProfit()>0) kırılması;


sipariş kârla kapandıysa tezgahı durdurmalı, doğru mu anladım?
 
Lowech :

Teşekkür ederim, metatrader artık çökmez) Bana gelince, sipariş bir kârla kapatılırsa, işlevin bu kârı dikkate almamasını, sadece zarar miktarını ve ilk siparişe kadar kârla kapatılmasını istiyorum. . Onlar.
sipariş kârla kapandıysa tezgahı durdurmalı, doğru mu anladım?
Mantığınız neredeyse doğru. Siparişlerin geçmişinde herhangi bir siparişin garantisi yoktur. Kendiniz için - yapabilirsiniz, satılık - kötü
 
STARIJ :
Mantığınız neredeyse doğru. Siparişlerin geçmişinde herhangi bir siparişin garantisi yoktur. Kendiniz için - yapabilirsiniz, satılık - kötü
Siparişlere göre döngü, siparişleri sırayla saymıyor mu?
 
STARIJ :

Bir kaynak varsa - DROW_NONE - herhangi bir çizimin olmaması

Yardımcı olmadı, hala köşedeki sayıları gösteriyor

 
Lowech : Siparişlerdeki döngü, siparişleri sırayla saymıyor mu?

listede sırayla. Ancak bu listede herhangi bir sipariş verme garantisi yoktur.