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

 
trader781 :
çabucak yaptın, sana son kârsız olanı verilecek, onunla ne yapacaksın ve kendin için hangi parametreleri düzelteceksin, sanırım çözeceksin

teşekkürler anladım..

Kâr aldıktan sonra lotun orijinal değerine dönmesini nasıl sağlayabilirim?

if ( OrderProfit ()> 0 && OrderType ()< 2 )
            {
            lot= 0.1
            }
çalışmıyor)
 
wishmast :

teşekkürler anladım..

Kâr aldıktan sonra lotun orijinal değerine dönmesini nasıl sağlayabilirim?

if ( OrderProfit ()> 0 && OrderType ()< 2 )
            {
            lot= 0.1
            }
çalışmıyor)

bir planım var

if (Sipariş Toplamı()==0)

{

orijinal lotla aç

}

başka

...

yani, sipariş yoksa, eski parti artık açılmayacak

Elbette her birini ezberleyebilirsiniz, ancak nasıl yapılacağını söylemiyorlar.
 
Vitalie Postolache :
Belirtilen eşiğe ulaşıldığında sayaç başlatılmalı ve başlangıç değerine sıfırlanmalıdır:

Teşekkür ederim.

Sorunu çözmeye yardımcı olun.
3 alış pozisyonu var, bir satış pozisyonu belirdi, satış pozisyonunu ve en eski alış pozisyonunu kapatmanız gerekiyor. İki satın alma pozisyonu kalmalı.
her şeyim kapalı

void OnTick ()
  {
//---
int b_STOP,s_STOP,b= 0 ,s= 0 ;

   for ( int i= 0 ; i< OrdersTotal (); i++)
    {
     if ( OrderSelect (i, SELECT_BY_POS )== true )
      {  
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()== OP_BUY ) b++;
         if ( OrderType ()== OP_SELL ) s++;
         if ( OrderType ()== OP_BUYSTOP ) b_STOP++;
         if ( OrderType ()== OP_SELLSTOP ) s_STOP++;      
      }  
     if ( OrderType ()== OP_BUY )
     {
     if (b>= 1 &&s== 1 ) //бай позиций больше или 1 и появилась SELL позиция
     {
       OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Bid , Digits ), 3 ,CLR_NONE);
      CLOSEORDER( OP_SELL );
     }
     }
    }
  }

 

OrderProfit()<0 işlevinin neden çalışmadığını açıklayabilir misiniz?

   for ( int q= OrdersHistoryTotal ()- 1 ; q>= 0 ; q--)
      {
       if ( OrderSelect (q, SELECT_BY_POS , MODE_HISTORY ))
         {
         if ( OrderType ()< 2 && OrderMagicNumber ()==magic)
            {
             if ( OrderProfit ()< 0 )
               {
               if ( DayOfWeek ()== 1 )
                  {
                  day1++;
                   Print ( "Понедельник SL=" ,day1);
                  }
               if ( DayOfWeek ()== 2 )
                  {
                  day2++;
                   Print ( "Вторник SL=" ,day2);
                  }
               }
            }
         }
      
      }

Haftanın gününe göre kaç durdurma kaybı görmek istiyorum

for ( int l= OrdersHistoryTotal ()- 1 ; l>= 0 ; l--)
        {
         if ( OrderSelect (l, SELECT_BY_POS , MODE_HISTORY ))
           {
           if ( OrderProfit ()< 0 && OrderType ()< 2 )
              {
              oldticket= OrderTicket ();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot= OrderLots ()* 4 ;
              }
           if ( OrderProfit ()> 0 && OrderType ()< 2 )
              {
              lot= 0.01;
              }
           }
        }

ve burada, anladığım kadarıyla, aynı nedenle çalışmıyor

 
wishmast :

OrderProfit()<0 işlevinin neden çalışmadığını açıklayabilir misiniz?

   for ( int q= OrdersHistoryTotal ()- 1 ; q>= 0 ; q--)
      {
       if ( OrderSelect (q, SELECT_BY_POS , MODE_HISTORY ))
         {
         if ( OrderType ()< 2 && OrderMagicNumber ()==magic)
            {
             if ( OrderProfit ()< 0 )
               {
               if ( DayOfWeek ()== 1 )
                  {
                  day1++;
                   Print ( "Понедельник SL=" ,day1);
                  }
               if ( DayOfWeek ()== 2 )
                  {
                  day2++;
                   Print ( "Вторник SL=" ,day2);
                  }
               }
            }
         }
      
      }

Haftanın gününe göre kaç durdurma kaybı olduğunu görmek istiyorum

for ( int l= OrdersHistoryTotal ()- 1 ; l>= 0 ; l--)
        {
         if ( OrderSelect (l, SELECT_BY_POS , MODE_HISTORY ))
           {
           if ( OrderProfit ()< 0 && OrderType ()< 2 )
              {
              oldticket= OrderTicket ();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot= OrderLots ()* 4 ;
              }
           if ( OrderProfit ()< 0 && OrderType ()< 2 )
              {
              lot= 0.01;
              }
           }
        }

ve burada, anladığım kadarıyla, aynı nedenle çalışmıyor

Çünkü DayOfWeek(), sunucunun bilinen son saatinin haftanın gününün seri numarasını döndürür.

Ve siparişin kapatıldığı haftanın gününe ihtiyacınız var: TimeDayOfWeek(OrderCloseTime());

 
Artyom Trishkin :

Çünkü DayOfWeek(), sunucunun bilinen son saatinin haftanın gününün seri numarasını döndürür.

Ve siparişin kapatıldığı haftanın gününe ihtiyacınız var: TimeDayOfWeek(OrderCloseTime());

ve sonuç aynıdır, sanki ( OrderProfit () < 0 ) yok sayılır ve döngü oluşur, değişkenler büyük değerlere sahiptir.

2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430208
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963666
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430207
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963665

ve lot ile döngü hakkında? Buraya yanlış kopyaladım, if işaretini düzelttim if ( OrderProfit ()> 0 && OrderType ()< 2 ), ancak bu özü değiştirmez, bu koşul olmadan döngü doğru çalışır. nedenmiş?

 
wishmast :

ve sonuç aynıdır, sanki ( OrderProfit () < 0 ) yok sayılır ve döngü oluşur, değişkenler büyük değerlere sahiptir.

2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430208
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963666
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Вторник SL= 1430207
2017.01 . 19 00 : 42 : 47.883 2014.02 . 20 23 : 59 : 48    EURUSD,H1: Понедельник SL= 963665

ve lot ile döngü hakkında? Buraya yanlış kopyaladım, if işaretini düzelttim if ( OrderProfit ()> 0 && OrderType ()< 2 ), ancak bu özü değiştirmez, bu koşul olmadan döngü doğru çalışır. nedenmiş?

1. gün ve 2. gün nerede ilan edildi?
 
Artyom Trishkin :
1. gün ve 2. gün nerede ilan edildi?
global olarak, en başında, OnTick() işlevinden önce ve tüm işlevlerden önce
 
Artyom Trishkin :
1. gün ve 2. gün nerede ilan edildi?

Bir şekilde doğru olmadığından şüpheleniyorum, çalışmayan bir sipariş seçiyorum ( OrderProfit () < 0 ), hangi siparişe ihtiyacım olduğunu özellikle nasıl belirteceğim. Sonuncusu bir çekimle kapatıldığında ve orada başka kimse yokken neden bir siparişi atladığını anlamıyorum. belki tarihte bir şeyi farklı bir şekilde sıralamak gerekirse, bir döngü oluşturmanız gerekir mi?

for ( int w= OrdersHistoryTotal ()- 1 ; w>= 0 ; w--)
      {
       if ( OrderSelect (w, SELECT_BY_POS , MODE_HISTORY ))

çünkü Expert Advisor'ların benzer koşullara sahip döngüleri vardır ve olması gerektiği gibi çalışırlar ancak OrdersTotal () 'a göre çalışırlar.

for ( int n= OrdersTotal ()- 1 ;n>= 0 ;n--)            
         {                                          
         if ( OrderSelect (n, SELECT_BY_POS ))            
            {                                        
             if ( OrderMagicNumber ()==magic)                  
               {
               if ( OrderType ()> OP_SELL )
 
sile :
Teşekkür ederim.

Sorunu çözmeye yardımcı olun.
3 alış pozisyonu var, bir satış pozisyonu belirdi, satış pozisyonunu ve en eski alış pozisyonunu kapatmanız gerekiyor. İki satın alma pozisyonu kalmalı.
her şeyim kapalı

void OnTick ()
  {
//---
int b_STOP,s_STOP,b= 0 ,s= 0 ;

   for ( int i= 0 ; i< OrdersTotal (); i++)
    {
     if ( OrderSelect (i, SELECT_BY_POS )== true )
      {  
         if ( OrderSymbol ()!= Symbol () || OrderMagicNumber ()!=Magic) continue ;
         if ( OrderType ()== OP_BUY ) b++;
         if ( OrderType ()== OP_SELL ) s++;
         if ( OrderType ()== OP_BUYSTOP ) b_STOP++;
         if ( OrderType ()== OP_SELLSTOP ) s_STOP++;      
      }  
     if ( OrderType ()== OP_BUY )
     {
     if (b>= 1 &&s== 1 ) //бай позиций больше или 1 и появилась SELL позиция
     {
       OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Bid , Digits ), 3 ,CLR_NONE);
      CLOSEORDER( OP_SELL );
     }
     }
    }
  }

Bir döngü içinde bu sorun çözülmez. Bu döngüde, bir dizide silinmek üzere siparişlerin biletlerini saklayın, başka bir döngüde - biletlerle silin.

Ayrıca kaşlı ayraçlarla kafanız karışıyor, OrderSelect{} bloğunun sınırları dışındaki emirlerle çalışıyorsunuz, bu yanlış.