[ARŞİV!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 4. - sayfa 66

 
Fox_RM :
Tünaydın!
Belirli (kullanıcı tanımlı) sayıda sipariş açma sorunuyla karşılaştım.
Bu sorunu çözmesi gereken ve çözecek gibi görünen küçük bir kod yazdım, ancak anlar var
genellikle testin sonuna doğru, isteğe bağlı sayıda sipariş açıldığında.

Aşağıda kodun kendisi var.

Sorunun daha basit çözümleri varsa, yorum yapmaktan memnuniyet duyarım.


Muhtemelen böylesi daha iyidir

 extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров" ;
extern int OrederBuy = 1 ;
extern int OrederSell = 1 ;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell= 0 ,lastticketBuy= 0 ;
//========================================================================================================//
                                 //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
       {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
         if ( OrderType ()==OP_BUY)
            {
            OrdB++
            }
         if ( OrderType ()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                   //---- Открытие ордеров SELL ----//
//========================================================================================================//

   if (OrdS<=OrederSell)
    { //----- start 
     if (trendDn==true && SthFast> 88.2 && SthSlow< 38.2 )
       {
      ticketSell= OrderSend ( Symbol (),OP_SELL, 0.1 ,Bid, 3 , 0 , 0 , 0 ,magick, 0 , Blue ); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if (OrdB<=OrederBuy)
     { //-----start
     if (trendUp==true && SthFast< 11.8 && SthSlow> 61.8 )
        {
        ticketBuy= OrderSend ( Symbol (),OP_BUY, 0.1 ,Ask, 3 , 0 , 0 , 0 ,magick, 0 , Red ); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians :
Teşekkürler, ama benim için çok karmaşık ve işlevin aynı anda 4 mesaj gösteriyor, ama bir taneye ihtiyacım var. Bir satırda en fazla 64 karakter çıkıyor mu?

Numara. Uzun mesajınızı alın ve ekranda okumak için uygun olduğu kadar çok parçaya bölün, ancak en fazla dört parçaya bölün. Ana şey, her bölümün 64 karakteri geçmemesidir. Mesaj kısa ise, fonksiyona tek parça olarak iletilebilir.

Bak, bu işlevi test etmesi için karavana bir danışman bağladım. Test cihazında görsel modda çalıştırın ve Win_Inform göstergesini görselleştirme tablosuna yerleştirin (bu, fragmandaki son mesajımda). Bu özelliğin nasıl çalıştığını hemen göreceksiniz.

Dosyalar:
 
r772ra :


Muhtemelen böylesi daha iyidir

Yaklaşık olarak bu kodla benimkini yükseltmeye başladım. Sürümünüzün 3 sorunu var:

- OP_BUY ve OP_SELL türündeki emirler açılır açılmaz OrdB ve OrdS parametreleri her tick'te otomatik olarak artacaktır , bu yüzden sadece ilgili bilette bir değişiklik (sat veya satın al) üzerine yeniden hesaplama koşulu ekledim;

- tüm siparişlerin yeniden hesaplanması OrdB ve Ord'da hatalara yol açar , sadece siparişlerdeki en son değişiklikleri saymamız gerekir;

- Versiyonunuzda if (OrdB<=OrederBuy), if (OrdS<=OrederSell) sonraki açılış emirleri için OrdB ve Ord parametrelerinde herhangi bir azalma yoktur .

Öyle bir şeye benziyor.

 
Fox_RM :

Yaklaşık olarak bu kodla benimkini yükseltmeye başladım. Sürümünüzün 3 sorunu var:

- OP_BUY ve OP_SELL türündeki emirler açılır açılmaz OrdB ve OrdS parametreleri her tick'te otomatik olarak artacaktır , bu yüzden sadece ilgili bilette bir değişiklik (sat veya satın al) üzerine yeniden hesaplama koşulu ekledim;

- tüm siparişlerin yeniden hesaplanması OrdB ve Ord'da hatalara yol açar , sadece siparişlerdeki en son değişiklikleri saymamız gerekir;

- Versiyonunuzda if (OrdB<=OrederBuy), if (OrdS<=OrederSell) sonraki açılış emirleri için OrdB ve Ord parametrelerinde herhangi bir azalma yoktur .

Öyle bir şeye benziyor.

Evet, doğru, for döngüsünden önce sipariş sayaçlarını sıfırlamanız gerekiyor

 //========================================================================================================//
                                 //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS= 0 ;
     OrdB= 0 ;
    
     for ( int i = OrdersTotal ()- 1 ; i>= 0 ; i--)
       {
       if ( OrderSelect (i,SELECT_BY_POS,MODE_TRADES))
         {
         if ( OrderType ()==OP_BUY)
            {
            OrdB++
            }
         if ( OrderType ()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
 

Tünaydın! Lütfen Kim'in işlevini anlamama yardım edin:

 
double FindNearFractal ( string sy = " 0 " , int tf = 0 , int mode = MODE_LOWER ) {
 if ( sy == "" || sy == " 0 " ) sy = Symbol () ;
  double f = 0 ;
  int d = MarketInfo ( sy , MODE_DIGITS ) , s ;
  if ( d == 0 ) if ( StringFind ( sy , " JPY " ) < 0 ) d = 4 ; else d = 2 ;
 
  for ( s = 2 ; s < 100 ; s ++ ) {
    f = iFractals ( sy , tf , mode , s ) ;
    if ( f != 0 ) return ( NormalizeDouble ( f , d )) ;
  }
  Print ( " FindNearFractal(): Фрактал не найден " ) ;
  return ( 0 ) ;
}

çizgiyi anlamıyorum

 if ( d == 0 ) if ( StringFind ( sy , " JPY " ) < 0 ) d = 4 ; else d = 2 ;

neden ilk if'den sonra işaret yok, ifade böyle yazılırsa ne olur. StringFind eylemi ne için ve neden dize araması JPY'ye dayalı? Nasıl d = 0 olabilir ve hangi durumda 2 atanır ve hangi 4? Cevap için çok minnettar olacağım, şimdiden teşekkürler)))

 
r772ra :

Evet, doğru, for döngüsünden önce sipariş sayaçlarını sıfırlamanız gerekiyor

)) Nedense, kendim düşünmedim, sarmaya başladım.
 
Fox_RM :
)) Nedense, kendim düşünmedim, sarmaya başladım.

İyi şanlar
 
Lisi4ka330 : neden ilk if'den sonra işaret yok, ifade böyle yazılırsa ne olur? ... d = 0 nasıl olur ve hangi durumda 2, hangisinde 4 atanır? Cevap için çok minnettar olacağım, şimdiden teşekkürler)))

bu yüzden daha net olacağını düşünüyorum

 if ( d == 0 )
{ 
  if ( StringFind ( sy , " JPY " ) < 0 )
  {
    d = 4 ;
  } 
  else
  {
    d = 2 ;
  }
}

d - alıntı doğruluğu (ondalık noktadan sonraki rakamlar)

JPY çiftindeyse, ana dalları olan kurs yaklaşık olarak aşağıdaki formattadır xxx.xx

çiftte JPY yoksa, ana oranlar yaklaşık olarak x.xxxx'tir (dolayısıyla "dört haneli " adı)

 
r772ra :

Evet, doğru, for döngüsünden önce sipariş sayaçlarını sıfırlamanız gerekiyor


Bir noktayı daha kaçırdım:

- Versiyonunuzda, if (OrdB<=OrederBuy), if (OrdS<=OrederSell) sonraki açılış emirleri için OrdB ve OrdS parametrelerinde herhangi bir azalma yoktur .

Yeni versiyonda örneğin 5 emir açılır, sayılır ve ardından if koşulu yeni emir açılmasına izin vermez. OrdB'nin eski sürümüne sahibim-- ve OrdS--

kullanılmış.

 
GaryKa :

bu yüzden daha net olacağını düşünüyorum

d - alıntı doğruluğu (ondalık noktadan sonraki rakamlar)

JPY çiftinde ise, ana dalları olan kurs yaklaşık olarak aşağıdaki formattadır xxx.xx

çiftte JPY yoksa, ana oranlar yaklaşık olarak x.xxxx'tir (dolayısıyla "dört basamaklı" adı)

GaryKa , cevap için teşekkürler, d'nin 0'a nasıl eşit olabileceği biraz belirsiz, çünkü fonksiyon
 d = MarketInfo ( sy , MODE_DIGITS )
ondalık basamak sayısını döndürür; bu, d'nin her zaman 0'dan büyük olacağı ve koşulun her zaman yanlış olacağı anlamına gelir