Hatalar, hatalar, sorular - sayfa 7

 
FEDOR_MQL :

Ve geliştirmenin bu aşamasında: parametreler,fonksiyon çağrısı ve fonksiyonun kendisi derleme hatalarını göstermelidir veya göstermemelidir. Öyleyse neden? Bana hataları gösteriyor

Evet, gerçekten de, bazı nedenlerden dolayı, olmamasına rağmen hatalar var. Geliştiricilerden buna dikkat etmelerini rica ediyorum bu şekilde yeniden yaptım hata yok fakat switch switch kullanırken yine hata veriyor.

 //+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"
//--- input parameters

input double    Lots= 0.1 ;
input bool      MM = true;
input double    Risk = 10.0 ;

double lots;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   if (MM) lots = LotSon();       //вызов функции LotSon 
   else lots = Lots;
  }
//+------------------------------------------------------------------+
double LotSon()
{
   double LotMin     = SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
   double LotMax     = SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MAX );
   double LotStep    = SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_STEP );
   double Lot        = AccountInfoDouble ( ACCOUNT_FREEMARGIN )/ 100000.0 * Risk;
  Lot               = MathMin (LotMax, MathMax (LotMin,Lot));
  
   if (Lot < LotMin) Lot = LotMin;
   if (Lot > LotMax) Lot = LotMax;
   // Вариант первый
   /*
  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }
  */
   // Вариант второй
   if (LotStep == 0.01 )Lot= NormalizeDouble (Lot, 2 );
   if (LotStep == 0.1 ) Lot= NormalizeDouble (Lot, 1 );
   if (LotStep == 1.0 ) Lot= NormalizeDouble (Lot, 0 );
   // Вариант третий
   // if (LotStep == 0.01)     Lot=NormalizeDouble(Lot,2);
   // else if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
   // else if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
 return (Lot); 
}
 
sergey1294 :

Evet, gerçekten de, bazı nedenlerden dolayı, olmamasına rağmen hatalar var. Geliştiricilerden buna dikkat etmelerini rica ediyorum bu şekilde yeniden yaptım hata yok fakat switch switch kullanırken yine hata veriyor.

   switch (LotStep)
  {
   case 0.01 : Lot= NormalizeDouble (Lot, 2 ); break ;
   case 0.1 : Lot= NormalizeDouble (Lot, 1 ); break ;
   case 1.0 : Lot= NormalizeDouble (Lot, 0 ); break ;
  }

Burada int biçiminde lot göndermeniz gerekiyor, yani. 0,01 = 1000 ve 0,10 = 10000...

 
Interesting :

Burada int biçiminde lot göndermeniz gerekiyor, yani. 0,01 = 1000 ve 0,10 = 10000...

Size göre, işlevin
 SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_STEP );
0,01 yerine 1000 değerini döndürür
 
sergey1294 :
Size göre, işlevin
0,01 yerine 1000 değerini döndürür

Hayır, kod şöyle görünürse hatanın ortadan kalkacağı gerçeğinden bahsediyordum:

   switch (StepSize)
  {
   case 1000 :   Lot= NormalizeDouble (Lot, 2 ); break ;
   case 10000 :  Lot= NormalizeDouble (Lot, 1 ); break ;
   case 100000 : Lot= NormalizeDouble (Lot, 0 ); break ;
  }
 
şimdi fark ettim ki
 switch
çiftleri kullanamazsınız, bu durumda bu seçenek kullanılamaz.
 
sergey1294 :
şimdi fark ettim ki
çiftleri kullanamazsınız, bu durumda bu seçenek kullanılamaz.
İlk önce lotları int'ye dönüştürürseniz mümkündür. Yukarıda söylediklerim...
 
soru, böyle bir yapının kullanılmasının neden imkansız olduğudur.
   if (LotStep == 0.01 ) return ( NormalizeDouble (Lot, 2 ));
   if (LotStep == 0.1 ) return ( NormalizeDouble (Lot, 1 ));
   if (LotStep == 1.0 ) return ( NormalizeDouble (Lot, 0 ));
 
Interesting :
İlk önce lotları int'ye dönüştürürseniz mümkündür. Yukarıda söylediklerim...

Sakıncası yoksa kodu görebilir misin? Sonra farklı şeyler deniyorum, hiçbir şey işe yaramıyor.

Veya depodan yüzde olarak danışman riskine daha basit bir ekleme için başka bir seçenek var mı? Teşekkür ederim!

 
FEDOR_MQL :

Sakıncası yoksa kodu görebilir misin? Sonra farklı şeyler deniyorum, hiçbir şey işe yaramıyor.

Veya depodan yüzde olarak danışman riskine daha basit bir ekleme için başka bir seçenek var mı? Teşekkür ederim!

Sonunda ne elde etmeniz gerektiğine bağlı olarak, burada örneğin, riskler pahasına bir dizi ilginç işlev verdim


Ve bu kodun çalışması için, lotu 100000 ile çarpmanız ve bunu bir parametre (bir int değişkeni) olarak anahtara(StepSize) iletmeniz yeterlidir.


not

Ve genel olarak, dürüst olmak gerekirse, tüm bu seçeneklerin amacını tam olarak anlamadım? Bu işlev bağlamında, sonunculardan birinin oldukça yeterli olduğu gerçeğinden bahsediyorum ....

 
Interesting :

Sonunda ne elde etmeniz gerektiğine bağlı olarak, burada örneğin, riskler pahasına bir dizi ilginç işlev verdim


Ve bu kodun çalışması için, lotu 100000 ile çarpmanız ve bunu bir parametre (bir int değişkeni) olarak anahtara(StepSize) iletmeniz yeterlidir.

Sanırım makaleniz ihtiyacım olan şey. teşekkürler