Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 739

 
korobok777:
Lot=NormalizeDouble(Balance*0.001,2);
 
Vinin :
yazmadığın bir şey

Evet, yazım hatası, düzeltildi. Yoksa ilke yanlış mı? Mesele şu ki, bakiye 10'a kalansız bölünebiliyorsa, partiyi ilk partinin ürünü olarak bakiyenin 1/10'u olarak alıyoruz. Bu taraftan değil? Ve sonra nasıl?


Vadim burada daha kolay yazsa da, evet)))

 
evillive :

Evet, yazım hatası, düzeltildi. Yoksa ilke yanlış mı? Mesele şu ki, bakiye 10'a kalansız bölünebiliyorsa, partiyi ilk partinin ürünü olarak bakiyenin 1/10'u olarak alıyoruz. Bu taraftan değil? Ve sonra nasıl?


Vadim burada daha kolay yazsa da, evet)))

Bakiye çok nadiren 10'a kalansız bölünür. Diğer durumlarda (çoğu durumda) varsayılan bir lot olacaktır.
 
evillive :
double StartLot= 0.01 ;
if ( MathMod (AccountBalance(), 10 )== 0 ) Lot=StartLot*AccountBalance()/ 10 ;

MarketInfo() ne olacak?

MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP ne olacak?

Ayrıca lot değerlerinin izin verilen basamak ızgarasına da girmeniz gerekir:

 #property strict

/******************************************************************************/
double getLot( double factor = 0.001 ) {
   double minLot = MarketInfo( Symbol (), MODE_MINLOT);

   if (minLot > 0 ) { // Проверка значения от функции MetaQuotes на вменяемость
     double maxLot = MarketInfo( Symbol (), MODE_MAXLOT);

     if (maxLot >= minLot) { // Проверка второго значения от функции MetaQuotes на вменяемость
       double lotStep = MarketInfo( Symbol (), MODE_LOTSTEP);

       if (lotStep > 0 ) { // Проверка третьего значения от функции MetaQuotes на вменяемость
         double rawLot = AccountBalance() * factor; // Грубо вычисленное значение лота

         // В процессе "рихтования" грубо вычисленного значения лота подразумевается, что "округление" происходит всегда к меньшему
         if (rawLot >= minLot && rawLot < maxLot + lotStep) { // Если грубо вычисленное значение "влезает" в диапазон разрешённых значений лотов
           int stepNum = int ((rawLot - minLot) / lotStep); // Количество step'ов, которое надо "отступить вправо на числовой оси" от минимального значения лота (при преобразовании double -> int как раз и происходит нужный тип округления)

           return minLot + lotStep * stepNum; // Вычисляем значение лота в "разрядной сетке" разрешённых лотов.
        }
      }
    }
  }

   return 0 ; // Какие-то обстоятельства не позволили выдать значение в "разрядной сетке" разрешённых лотов; для индикации данного события выдаётся специальное значение 0.
}

/******************************************************************************/
void OnStart () {
   Print ( "AccountBalance() = " , AccountBalance(), ", getLot() = " , getLot());
}

Uzaklaştı, gerçeğe benzer bir şey buldum:

 0        20 : 09 : 49.699     Script 3 EURUSDm,H1: loaded successfully
0        20 : 09 : 49.699      3 EURUSDm,H1: initialized
0        20 : 09 : 49.699      3 EURUSDm,H1: AccountBalance() = 152.82 , getLot() = 0.15
0        20 : 09 : 49.699      3 EURUSDm,H1: uninit reason 0
0        20 : 09 : 49.699     Script 3 EURUSDm,H1: removed

Yanlış çıkmamış gibi görünüyor.

 
simpleton :

MarketInfo() ne olacak?

MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP ne olacak?

Ayrıca lot değerlerinin izin verilen basamak ızgarasına da girmeniz gerekir:

Uzaklaştı, gerçeğe benzer bir şey buldum:

Yanlış çıkmamış gibi görünüyor.

Teşekkürler, anladım :D

Açıkçası kendim için tüm kontrollerle yazıyorum, olması gerektiği gibi, denge / 10 oranını getirmek için çok fazla bir taslak vardı, ancak fikir başarısız oldu ...

Ancak çok fazla metniniz var, daha basit olabilir:

  lotstep= MarketInfo(Symbol(),MODE_LOTSTEP);
  lotmax=MarketInfo(Symbol(), MODE_MAXLOT);
  lotmin=MarketInfo(Symbol(), MODE_MINLOT);

lot=lotstep* MathRound (AccountBalance()* 0.001 /lotstep);
if (lot < lotmin) lot = lotmin;
if (lot > lotmax) lot = lotmax;
 
simpleton :

MarketInfo() ne olacak?

MODE_MINLOT, MODE_MAXLOT, MODE_LOTSTEP ne olacak?

Ayrıca lot değerlerinin izin verilen basamak ızgarasına da girmeniz gerekir:

Uzaklaştı, gerçeğe benzer bir şey buldum:

Yanlış çıkmamış gibi görünüyor.

neden, doğal bir programcı işe koyulduğunda, hedefe ulaşmak için gerekli olan bir satır, yarım kilometrelik bir listeye dönüşüyor?

 double Lot = NormalizeDouble (AccountBalance()/ 1000 ,2);
if(Lot<Min_Lot)Lot=Min_Lot;
 
_new-rena :

neden, doğal bir programcı işe koyulduğunda, hedefe ulaşmak için gerekli olan bir satır, yarım kilometrelik bir listeye dönüşüyor?

Bazıları için parti adımı 0,01 değil, örneğin 0,03 hatta 0,1'dir. Ve sonra nasıl? Çok zaman almadığı için her durumda kontrollere ihtiyaç vardır.
 
evillive :
Bazıları için parti adımı 0,01 değil, örneğin 0,03'tür. Ve sonra nasıl? Çok zaman almadığı için her durumda kontrollere ihtiyaç vardır.
init'te (aşağıda) ayarladınız ve artık sunucuya ve bilgisayara eziyet etmiyorsunuz
double Min_Lot=MarketInfo( Symbol (), MODE_MINLOT);
 
Ben bir adımdan bahsediyorum, bir dakikadan değil. çok ama tamam hadi gidelim
 
_new-rena :

neden, doğal bir programcı işe koyulduğunda, hedefe ulaşmak için gerekli olan bir satır, yarım kilometrelik bir listeye dönüşüyor?

Çünkü her fırsatta her türlü saçmalık sizi bekliyor ve kendinizi savunmanız gerekiyor. Korunmadığı takdirde, uzun vadede çok pahalı olabilecek çok düşük kalite olacaktır. Çabaların %90'ı her türlü saçmalıktan korunmaya ve sadece %10'u -aslında sorunun kendisini çözmeye- harcanır. MT4 ve MQL4++ durumunda oran daha da asimetriktir.

Belgeleri okurken saçmalık başlar:

Возвращаемое значение

Информация о финансовом инструменте. Часть информации о текущем финансовом инструменте хранится в предопределенных переменных.

Her şey. Finansal araç hakkında bilgi vermekle yükümlüdür, başka bir şey değil. Başka sonuç yok. "Saçmalık" aracı hakkında bilgi alıyoruz:

 #property strict

/******************************************************************************/
void OnStart () {
   Print ( "MarketInfo(\"Фигня\", MODE_MINLOT) = " , MarketInfo( "Фигня" , MODE_MINLOT));
   Print ( "MarketInfo(\"Фигня\", MODE_MAXLOT) = " , MarketInfo( "Фигня" , MODE_MAXLOT));
   Print ( "MarketInfo(\"Фигня\", MODE_LOTSTEP) = " , MarketInfo( "Фигня" , MODE_LOTSTEP));
}

Bu araç için lotluk parametrelerine bakalım:

 0        21 : 12 : 18.980     Script 3 EURUSDm,H1: loaded successfully
0        21 : 12 : 18.980      3 EURUSDm,H1: initialized
0        21 : 12 : 18.980      3 EURUSDm,H1: MarketInfo( "Фигня" , MODE_MINLOT) = 0.0
0        21 : 12 : 18.980      3 EURUSDm,H1: MarketInfo( "Фигня" , MODE_MAXLOT) = 0.0
0        21 : 12 : 18.980      3 EURUSDm,H1: MarketInfo( "Фигня" , MODE_LOTSTEP) = 0.0
0        21 : 12 : 18.980      3 EURUSDm,H1: uninit reason 0
0        21 : 12 : 18.980     Script 3 EURUSDm,H1: removed

İlginç seçenekler. Belgelerin neden hatalı durumlarda bu işlevin davranışını açıklamadığını bilmiyorum. Bu işlevin davranışını gözlemleme sürecinde bulunan belgelenmemiş özellikleri kullanmanız gerekecektir.

Dolayısıyla, doğası gereği 0'dan farklı olması gereken istenen parametre verileri için MarketInfo() işlevi, bir hata durumunun belgelenmemiş bir işareti olan 0'ı döndürebilir. Kodun, parametrelerin her birini talep ederken bir hata oluşup oluşmadığını kontrol etmesi gerekir. Sadece bu nedenle kodda 3 kontrol sağlanmıştır.

Daha ileri. Açıktır ki, hesaplanan parti büyüklüğü izin verilen parti büyüklükleri aralığına uymayabilir. Kontrol edelim mi? Ya da sonuçta, bu durumu açıkça programlıyoruz ve daha sonra buna tepkiyi "kendi kendine nasıl sonuçlanacağını" değil, en üst düzey kodda programlıyoruz? Her şey programlanmadığında nasıl göründüğüne ve kendi kendine çalıştığına dair bir örnek, bir şey bir yere taşındığında, mucizevi bir şekilde bir yerde arızalandığında ve bir yerde tamamen çalışmayı bıraktığında MT4'ün bir sonraki yeni sürümü olabilir. Belki de elde etmek istediğiniz sonuç bu değildir?

Kod, düşünce dizisi ve uygulanan hesaplama modelinin görülebilmesi için genişletilir ve yorumlanır. MetaQuotes tarafından belirlenen parti büyüklük modeli MINLOT, MAXLOT ve LOTTEP parametreleri ile belirlenmiş bir "sipariş değerlerinin bit gridi" şeklinde yapıldığından, bu terimlerle belirli bir lot değerini hesaplamak daha mantıklıdır. Hesaplama modeli bu nedenle bu terimlerle uygulandı.

Herhangi bir "yarım kilometre" veya gereksiz bir şey görmüyorum. Tek şey, işlevler bir kez çağrıldığında kodun maksimum performans elde etme tarzında yapılması ve elde edilen değerlerin değişkenlerde saklanması ve her çağrının yalnızca bir sonraki kontrolden sonra, ortaya çıktığında yürütülmesidir. döndürülen değerin bir hata göstergesi olmadığını ve yine de hesaplamalara devam etmenin mantıklı olduğunu. Bir hatanın meydana geldiği ortaya çıkar çıkmaz, bilgi işlem kaynakları artık gereksiz aramalarda boşa harcanmaz.

Kodun daha kompakt olması için, 3 değerin tümü hemen elde edilebilir ve 3 koşulun tümü bir if'e'de aynı anda kontrol edilebilir. Ancak, ilk aramada bir hata olması durumunda, diğer 2 arama, bilgi işlem kaynaklarının israfı olacaktır.

lotStep ile bölmenin kullanıldığı bir ifadeyi programlarken, lotStep değerinin 0'dan farklı olduğunun, yani 0'a bölünmesinin kontrol edildiği bir if altında kullanılmasına özellikle dikkat edildiğini not ediyorum. orada olmaz belki. Prensipte kod, tüm değişkenleri "double" ve "int" ve "const double" ve "const int" olarak bildirerek daha da geliştirilebilir ve daha sonra kodda olası bir değişiklik olması durumunda kendisini kendisinden korur. Özellikle, lotStep değişkeninin değeri ile 0 arasındaki farkın henüz kontrol edildiği if altında, bu yere yeni eklenen bazı kodlarda yanlışlıkla 0 değeri bu değişkene yanlışlıkla atanmışsa, ardından daha fazla bölünür. İfadede 0 oluşacaktır.Değişken "const double" olarak bildirilecekse, derleyici, umarım, derhal lotStep değişkenini değiştirerek yasadışı bir eylemi rapor edecek ve böylece bu şekilde bir hata yapmasını önleyecektir.

Yani "yarım kilometre", birinin kaprisinden değil, zorlu nesnel koşullardan kaynaklanmaktadır.

İpin adı nedir? Eh, eğer yardım edersen, o zaman - olması gerektiği gibi, böylece gerçekten bir şeyler öğrenebilirsin.