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

 
Terminal, gereksiz tüm karakterleri atar.

bu ciltle açarsanız:
 0.029

0.02 lot açılacak

ve böyle bir hacimle açarsanız:

 NormalizeDouble ( 0.029 , 2 )
0.03 lot açılacak
 
multiplicator :

Ondalık basamak sayısı nasıl sayılır?

örneğin, minimum lotun 0.01 olduğunu öğrendim.

Şimdi buradaki ondalık basamak sayısının 2 olduğunu nasıl anlayabilirim?
daha sonra sipariş hacmini iki ondalık basamağa normalleştirmek için.

işte kodlayıcı :
 void OnStart ()
  {
   double minlot= MarketInfo ( Symbol (), MODE_MINLOT );
   Alert (d(minlot));
  }




int d( double x)
{
   int n;
   for (n= 0 ;n< 8 ;n++)
   {
       if (x== NormalizeDouble (x,n))      
      {
         return (n);
      }
   }
return (n- 1 );
}
 
multiplicator :
Terminal, tüm gereksiz karakterleri atar.

bu ciltle açarsanız:

0.02 lot açılacak

ve böyle bir hacimle açarsanız:

0.03 lot açılacak

ve 0.25 lot açmanız gerekiyorsa? İşte hazır ve çalışan fonksiyonlar, okuyun, kullanın

https://www.mql5.com/ru/forum/131859/page8#comment_3359730


çarpan :

örneğin, değeri fonksiyonda yerine koyarız: 7 lot.
komisyoncunun minimum lot büyüklüğü 5 ve lot adımı 2'dir.

buradan parti normalleştirme fonksiyonumu kontrol edebilirsiniz, uzun zamandır kullanıyorum, şimdiye kadar kimse şikayet etmedi, nerede parti adımını bulmak ve ardından parti adımı adımlarının sayısına yuvarlamak istiyorsunuz

 //_______________________________________________________________________
//Нормализация объема лота для ордера up=true - в большую сторону, иначе в меньшую
//_______________________________________________________________________
double NormalizeLot( double value, bool up= false ){
   double res,sizetable[ 9 ] = { 1.0 , 0.1 , 0.01 , 0.001 , 0.0001 , 0.00001 , 0.000001 , 0.0000001 , 0.00000001 };
   double lotStep = MarketInfo ( Symbol (), MODE_LOTSTEP );
   int lotdigits;
   for (lotdigits= 8 ; lotdigits>= 0 ; lotdigits--) if (lotStep <= sizetable[lotdigits]) break ;
   if (up) res = NormalizeDouble ( MathCeil ( MathMin ( MathMax (value, MarketInfo ( Symbol (), MODE_MINLOT )), MarketInfo ( Symbol (), MODE_MAXLOT ))/lotStep)*lotStep,lotdigits); 
         else res = NormalizeDouble ( MathFloor ( MathMin ( MathMax (value, MarketInfo ( Symbol (), MODE_MINLOT )), MarketInfo ( Symbol (), MODE_MAXLOT ))/lotStep)*lotStep,lotdigits);
return (res);}
//_______________________________________________________________________
Peki, lot adımlı bir sunucu bulduysanız, örneğin 0.37, o zaman sadece bir döngüde gerekli lotu ekleyerek ve karşılaştırarak olur, ancak böyle sunucular yoktu, bitcoin'de standart olmayan lotlar var gibi görünüyor , çalışmadım, bilmiyorum, özel bir duruma ihtiyacım var
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

İyi günler, sevgili meslektaşlarım, lütfen SHI_silvertrend_signal göstergesinin ikili opsiyonlarda, sadece OP_SELL ve OP_BUY sinyallerine dayalı olarak bir ticarete girmek için danışmandaki koşulu doğru bir şekilde yazmama yardım edin. M1 ve M5 için. Sinyal önceki mumun kapanışında gelir.


- Gösterge sinyali anında, yalnızca sinyalden sonraki ilk mumda bir sipariş açın

- sinyali aldıktan sonra en fazla 5 saniye.

- Slippage içinde izin verilen fiyat değişikliği



(Göstergenin 2 tamponu vardır)

gösterge yorumundan // her iki arabellek de sıfırlarla doldurulur. Aksi takdirde, zaman çerçevesi değiştirilirken çöpler olacaktır.

Yardımlarınız ve desteğiniz için şimdiden çok teşekkürler!

 void OnTick ()

{

.....

   if ((CountSell() + CountBuy())== 0 && isTradeHours())

   {

      SignalBuy = iCustom ( NULL , 0 , "SST" , AllBars, Otstup, Per, 0 , 0 ); //получаемое значение в формате 4546546549.0 

      SignalSell = iCustom ( NULL , 0 , "SST" , AllBars, Otstup, Per, 1 , 0 );



       if (( Ask <= SignalBuy - Slippage* Point || Ask   <= SignalBuy + Slippage* Point ) && iBarShift ( NULL , 0 , TimeSeconds ( TimeCurrent ())))     //<---- помогите дописать условие

      {

         if ( OrderSend ( Symbol (), OP_BUY , Lots, Ask , Slippage, 0 , 0 , IntegerToString (Expiration), Magic, 0 , Blue) > 0 )

         {

             Print ( "Ордер на покупку открыт!" );

             return ;

         } else Print ( "Ошибка открытия ордера на покупку!" );

      }  

         

       if (( Bid >= SignalSell - Slippage* Point || Bid >= SignalSell + Slippage* Point ) && iBarShift ( NULL , 0 , TimeSeconds ( TimeCurrent ())))   //<---- помогите дописать условие

      {  

       if ( OrderSend ( Symbol (), OP_SELL , Lots, Bid , Slippage, 0 , 0 , IntegerToString (Expiration), Magic, 0 , Red) > 0 )

         {

             Print ( "Ордер на продажу открыт!" );

             return ;

         } else Print ( "Ошибка открытия ордера на продажу!" );

      }

   }

}

.......

Göstergenin kodu (Kodun yayınlanması forum kurallarına aykırı değilse İnternette bulunur mu?)

 //+------------------------------------------------------------------+
//|                                           SHI_SilverTrendSig.mq4 |
//|       Copyright © 2003, VIAC.RU, OlegVS, GOODMAN, © 2005, Shurka |
//|                                                 shforex@narod.ru |
//|                                                                  |
//|                                                                  |
//| Пишу программы на заказ                                          |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Shurka"
#property link        "http://shforex.narod.ru"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
#define   SH_BUY   1
#define   SH_SELL  - 1

//---- Входные параметры
extern int      AllBars= 0 ; //Для скольки баров считать. 0 - для всех.
extern int      Otstup= 30 ; //Отступ.
extern int      Per= 9 ; //Период.
int             SH,NB,i,UD;
double          R,SHMax,SHMin;
double          BufD[];
double          BufU[];
//+------------------------------------------------------------------+
//| Функция инициализации                                            |
//+------------------------------------------------------------------+
int init()
{
   //В NB записываем количество баров для которых считаем индикатор
   if ( Bars <AllBars+Per || AllBars== 0 ) NB= Bars -Per; else NB=AllBars;
   IndicatorBuffers ( 2 );
   IndicatorShortName ( "SST" );
   SetIndexStyle ( 0 , DRAW_ARROW , 0 , 1 );
   SetIndexStyle ( 1 , DRAW_ARROW , 0 , 1 );
   SetIndexArrow ( 0 , 159 );
   SetIndexArrow ( 1 , 159 );
   SetIndexBuffer ( 0 ,BufU);
   SetIndexBuffer ( 1 ,BufD);
   SetIndexDrawBegin ( 0 , Bars -NB); //Индикатор будет отображаться только для NB баров
   SetIndexDrawBegin ( 1 , Bars -NB);
   ArrayInitialize (BufD, 0.0 ); //Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
   ArrayInitialize (BufU, 0.0 );
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Функция деинициализации                                          |
//+------------------------------------------------------------------+
int deinit()
{
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Собсна индикатор                                                 |
//+------------------------------------------------------------------+
int start()
{
   int CB= IndicatorCounted ();
   /* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
   посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
   не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
   то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
   обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
   и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
   до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
   if (CB< 0 ) return (- 1 ); else if (NB> Bars -CB) NB= Bars -CB;
   for (SH= 1 ;SH<NB;SH++) //Прочёсываем график от 1 до NB
   {
       for (R= 0 ,i=SH;i<SH+ 10 ;i++) {R+=( 10 +SH-i)*( High [i]- Low [i]);}      R/= 55 ;

      SHMax = High [ Highest ( NULL , 0 , MODE_HIGH ,Per,SH)];
      SHMin = Low [ Lowest ( NULL , 0 , MODE_LOW ,Per,SH)];
       if ( Close [SH]<SHMin+(SHMax-SHMin)*Otstup/ 100 && UD!=SH_SELL) { BufD[SH]= High [SH]+R* 0.5 ; UD=SH_SELL; }
       if ( Close [SH]>SHMax-(SHMax-SHMin)*Otstup/ 100 && UD!=SH_BUY) { BufU[SH]= Low [SH]-R* 0.5 ; UD=SH_BUY; }
   }
   return ( 0 );
}
 

Igor Makanu :

res = NormalizeDouble ( MathFloor ( MathMin ( MathMax (value, MarketInfo ( Symbol (), MODE_MINLOT )), MarketInfo ( Symbol (), MODE_MAXLOT ))/lotStep)*lotStep,lotdigits);


nasıl bükmüşler. matmax, sonra matmin. )

 

Optimizasyon anahtarı nereye gitti?



nasıl optimize edilir???


 

Sevgili iş arkadaşlarım! Lütfen gösterge sinyalinde bir ticarete girme koşulunu nasıl doğru bir şekilde belirteceğimi söyleyin.


Aşağıdaki gibi Renko çizelgeleri için basit bir danışman yazdı :

 extern double LotSize = 0.01 ;
extern int Magic = 1 ;

int prevtime = 0 ;

int start() {
 
   
//При образовании нового кубика ренко проверка на Buy или Sell и заключение ордера
   if (prevtime != Time [ 0 ]) {

   if ( Close [ 1 ] > Open [ 1 ]) {
       OrderSend ( Symbol (), OP_BUY , LotSize, ND( Ask ), 3 , 0 , 0 ,   "RG" , Magic, 0 , Blue);
      }
   if ( Close [ 1 ] < Open [ 1 ]) {
       OrderSend ( Symbol (), OP_SELL , LotSize, ND( Bid ), 3 , 0 , 0 , "RG" , Magic, 0 , Red);
      }
      Magic++;
   prevtime = Time [ 0 ];
    }
         return ( 0 );
} 

double ND( double np) {
   return ( NormalizeDouble (np, Digits ));
}


Çevrimdışı grafikten pek memnun değilim, bu yüzden onu bu AG_RENko_Chart göstergesiyle birleştirmeye karar verdim. Gönderiye eklendi.

Ancak işlev, sağ kenardaki Renko değerini şu şekilde döndürür:

 iCustom ( _Symbol ,TF, "AG_Renko_Chart" ,Step, false , false ,Revers, 0 , 0 );

Ama bir çubuğu alttan veya üstten nasıl ayırt edeceğimi çözemiyorum ... Ve bir işlevi çok fazla anlaşma yapmaması için nasıl doğru bir şekilde kaydedeceğim ...


Genel olarak, kafa artık anlamıyor. Yardım lütfen!!!!

Dosyalar:
 
Roman Shiredchenko :

Optimizasyon anahtarı nereye gitti?



nasıl optimize edilir???


Bu bir şaka mı yoksa toplumla dalga geçmeye mi karar verdin???


 
Alexey Viktorov :

Bu bir şaka mı yoksa toplumla dalga geçmeye mi karar verdin???


Bu bir şaka değil ve şaka yapmıyorum.

Sapkınlık göndermeden önce resme dikkatlice bakın.

 
Roman Shiredchenko :

Bu bir şaka değil ve şaka yapmıyorum.

Sapkınlık göndermeden önce resme dikkatlice bakın.

Ekran çözünürlüğü sorunu.