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

 
Vladimir Pastushak :

Bir giriş parametresinin türünü nasıl biliyorsunuz?

Pekala, derleyicinin kendisinin şablon işlevini çağırırken türlerin yerine geçtiğini yazıyorum, eğer böyle bir çağrı henüz kodda yoksa, derleyici işlevin başka bir kopyasını oluşturacak ve türleri kendisi koyacaktır - peki , mantıklı olduğu gibi - şablon


soru, böyle bir işlevde türün nasıl belirleneceği ile ilgiliyse, şunu kullanın:

 typename

UPD: Yukarıdaki örneğe parametre türünün çıktılarını ekledim:

 #define PRINT(VAL) Print ( #VAL, " = " ,VAL, ", typename = " , typename (VAL))
template < typename T1, typename T2>
int myfunc(T1 val1= 0 , T2 val2= 0 )
{
   Print ( __FUNCSIG__ );
   PRINT(val1);
   PRINT(val2);
   return (( int ) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart ()
{
   int i1 = 2 , i2 = 3 ;
   Print (myfunc(i1, i2));
   double d1 = 10.0 , d2 = 30.0 ;
   Print (myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int işlevim<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, tür adı = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = çift

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = çift

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD: bu örneğe __FUNCSI__ eklendi

 

Tünaydın.
MQL5'te bir gösterge yazarken bir tuhaflıkla karşılaştım (gösterge ayrı bir alt pencerede, 4 satır).

İlk arabellek açıklamaları şunlardır:

 //------------------------------------------------------------------
#property indicator_buffers    6
#property indicator_plots      4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrMagenta
#property indicator_style1    STYLE_SOLID
#property indicator_width1    2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBlue
#property indicator_style2    STYLE_SOLID
#property indicator_width2    2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3    DRAW_COLOR_LINE
#property indicator_color3    clrWhite , clrBlack
#property indicator_style3    STYLE_SOLID
#property indicator_width3    3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4    DRAW_COLOR_LINE
#property indicator_color4    clrYellow , clrRed
#property indicator_style4    STYLE_SOLID
#property indicator_width4    2
//------------------------------------------------------------------
 //--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double       RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double       MAr1_fast[];                                                   // буфер под быструю МА
double       MAr2_slow[];                                                   // буфер под медленную МА
double       MAr2_slowColor[];                                               // буфер под цвета медленной МА
//--------------------------------------------------------------------
double       MAr3_slow_glob[];                                               // буфер под глобальную медленную МА
double       MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

OnInit'te sonraki:

   //--------------------------------------------------------------------
   SetIndexBuffer        ( 0 ,   RSI,                 INDICATOR_DATA );
   ArraySetAsSeries      (     RSI,                 true );
   PlotIndexSetString    ( 0 ,   PLOT_LABEL ,           "RSI(" + IntegerToString (RSI_per) + ")" );
   PlotIndexSetInteger   ( 0 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 0 ,   PLOT_DRAW_BEGIN ,     RSI_per);
   PlotIndexSetDouble    ( 0 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 1 ,   MAr1_fast,           INDICATOR_DATA );
   ArraySetAsSeries      (     MAr1_fast,           true );
   PlotIndexSetString    ( 1 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_fast_period) + "), EMA" );
   PlotIndexSetInteger   ( 1 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 1 ,   PLOT_DRAW_BEGIN ,     MA_fast_period);
   PlotIndexSetDouble    ( 1 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 2 ,   MAr2_slow,           INDICATOR_DATA );
   ArraySetAsSeries      (     MAr2_slow,           true );
   PlotIndexSetString    ( 2 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_period) + "), SMA" );
   PlotIndexSetInteger   ( 2 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 2 ,   PLOT_DRAW_BEGIN ,     MA_slow_period);
   PlotIndexSetDouble    ( 2 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 3 ,   MAr2_slowColor,       INDICATOR_COLOR_INDEX );
   ArraySetAsSeries      (     MAr2_slowColor,       true );
   PlotIndexSetDouble    ( 3 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 4 ,   MAr3_slow_glob,       INDICATOR_DATA );
   ArraySetAsSeries      (     MAr3_slow_glob,       true );
   PlotIndexSetString    ( 4 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_glob_period) + "), SMA" );
   PlotIndexSetInteger   ( 4 ,   PLOT_SHOW_DATA ,       true );
   PlotIndexSetInteger   ( 4 ,   PLOT_DRAW_BEGIN ,     MA_slow_glob_period);
   PlotIndexSetDouble    ( 4 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------
   SetIndexBuffer        ( 5 ,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX );
   ArraySetAsSeries      (     MAr3_slow_globColor, true );
   PlotIndexSetDouble    ( 5 ,   PLOT_EMPTY_VALUE ,     EMPTY_VALUE );
   //--------------------------------------------------------------------

Aslında: gösterge 4 çizgi çizer: ilk ikisi sadece tek renkli, sonraki ikisi iki renklidir (bükülmelerde renk değiştirirler).

DRAW_COLOR_LINE çizim yöntemi nedeniyle iki renkli.

Şimdi soru şu: ilk satır (yukarıdaki kodda arabellek 2 ve 3) mükemmel bir şekilde çizilmiş, OnInit'te onun için yazılan tüm kodlar çalışıyor;
ikinci satır nedense gösteriş yapıyor: örneğin, satır açıkça çalışmıyor:

 PlotIndexSetString    ( 4 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_glob_period) + "), SMA" );
Yani data penceresinde belirttiğim metin yerine tampon yerine sadece indikatörün ismi çıkıyor. Çizginin kendisi çizilmesine ve olması gerektiği gibi çok renkli olmasına rağmen.
Sanırım bu numaralandırma vardiyasında bir şaka mı? Örneğin, kodun en üstünde, #property yönergeleri aracılığıyla son satırı bildirdiğimde, neden daha önce 4 tampon kullanılmış olduğundan, dizinin 5 değil 4 olması gerektiğini neden bana çok açık değil. #property yönergeleri aracılığıyla bildirim yapıldığında satırların numaralandırılması ile OnInit'te dizilerle bağlanırken arabelleklerin numaralandırılması arasında herhangi bir bağlantı var mı?

Lütfen bana yukarıdaki kodda neyin yanlış olduğunu söyleyin. Belki birinin elinde DRAW_COLOR_LINE... çizim yöntemi kullanılarak en az iki çizginin çizildiği bir gösterge örneği vardır.

Ve başka bir soru: çok renkli hat arabellekleri nasıl bağlanır? Demek istediğim, derlenmiş kod, bir renk arabelleğine bir değer koyarsam, o zaman başka bir arabellek satırını bu renkle süslemem gerektiğini nereden biliyor?

 
satorifx :

Tünaydın.
MQL5'te bir gösterge yazarken bir tuhaflıkla karşılaştım (gösterge ayrı bir alt pencerede, 4 satır).

İlk arabellek açıklamaları şunlardır:

OnInit'te sonraki:

Aslında: gösterge 4 çizgi çizer: ilk ikisi sadece tek renkli, sonraki ikisi iki renklidir (bükülmelerde renk değiştirirler).

DRAW_COLOR_LINE çizim yöntemi nedeniyle iki renkli.

Şimdi soru şu: ilk satır (yukarıdaki kodda arabellek 2 ve 3) mükemmel bir şekilde çizilmiş, OnInit'te onun için yazılan tüm kodlar çalışıyor;
ikinci satır nedense gösteriş yapıyor: örneğin, satır açıkça çalışmıyor:

Yani data penceresinde belirttiğim metin yerine tampon yerine sadece indikatörün ismi çıkıyor. Çizginin kendisi çizilmesine ve olması gerektiği gibi çok renkli olmasına rağmen.
Sanırım bu numaralandırma vardiyasında bir şaka mı? Örneğin, kodun en üstünde, #property yönergeleri aracılığıyla son satırı bildirdiğimde, neden daha önce 4 tampon kullanılmış olduğundan, dizinin 5 değil 4 olması gerektiğini neden bana çok açık değil. #property yönergeleri aracılığıyla bildirim yapıldığında satırların numaralandırılması ile OnInit'te dizilerle bağlanırken arabelleklerin numaralandırılması arasında herhangi bir bağlantı var mı?

Lütfen bana yukarıdaki kodda neyin yanlış olduğunu söyleyin. Belki birinin elinde DRAW_COLOR_LINE... çizim yöntemi kullanılarak en az iki çizginin çizildiği bir gösterge örneği vardır.

Ve başka bir soru: çok renkli hat arabellekleri nasıl bağlanır? Demek istediğim, derlenmiş kod, bir renk arabelleğine bir değer koyarsam, o zaman başka bir arabellek satırını bu renkle süslemem gerektiğini nereden biliyor?

Eşlemelerin numaralandırılması, arabelleklerin numaralandırılmasından farklıdır.

 PlotIndexSetString    ( 3 ,   PLOT_LABEL ,           "MA (" + IntegerToString (MA_slow_glob_period) + "), SMA" );

işte böyle çalışması gerekir.

 

Herkese iyi günler!

Durdurma kaybı değiştirme işlevi yaptı. Ancak çalışırken EURUSD,H1: OrderModify hatası 130 veriyor.

Üstelik fiyat, stop loss'un olması gereken yerden çok uzak.

işte fonksiyonun kendisi:

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
Güzel gün. Hareketli ortalamanın eğim açısını (ya da daha doğrusu bir takım, yani Timsah) ölçmeye dayalı bir Uzman Danışman yazmak istiyorum, böylece Uzman Danışman fiyat momentumu güçlü olduğunda, tercihen küçük bir ivme ile uyarı verir. gecikme. Lütfen MA açısını nasıl ölçeceğimi söyleyin veya bir darbenin oluştuğunu "danışmana açıklayın". Belki de bunu çözmenin bilinen bazı yolları vardır. Veya örneğin, keskin darbelerin hesaplanmasına dayanan ücretsiz bir gösterge?
 

3 çubuklu bir fraktalın çubuk sayısını bulmak için bir fonksiyon yazdı. Çevrimiçi grafikte doğru tespit ediyor gibi görünüyor. Ve test cihazında görsel testler ile yalan söylüyor. Belki de koda bakan profesyonellerden biri bazı kusurlar bulacaktır?

Çok minnettar olacağım.

 //+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr( string sy= "0" , int tf= 0 , int ne= 0 , int mode=MODE_UPPER)
{
 if (sy== "" || sy== "0" ) sy= Symbol ();
 int nlext= 0 ,k= iBars (sy,tf);
 nlext= 0 ;
 if (mode==MODE_UPPER)
   {
     for ( int i= 2 ; i<=k; i++)
     {
       if (High[i]>High[i+ 1 ] && High[i]>High[i- 1 ])
        {
         nlext++;
         
         if (nlext>ne) return (i);
        }
     }    
   }        
 if (mode==MODE_LOWER)
   {
     for (i= 2 ; i<=k; i++)
     {
       if (Low[i+ 1 ]>Low[i] && Low[i- 1 ]>Low[i])
        {
         nlext++;
         if (nlext>ne) 
           {
             //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
             return (i); 
           }
        }
     }    
   }       
     Print ( "Бар локального экстремума не найден" );
     return (- 1 );     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

Güzel gün. BİR AY SONRA TEST CİHAZINDA ÇALIŞMAYI DURDURAN GÖSTERGEYE HANGİ KODU EKLEMELİYİM? Demek istediğim, HER ŞEYİ TAMAM YAZDIM! AMA ZATEN BİR GERİ TEST YAPTIĞIMDA TEKRAR ÇALIŞIYOR. (mgl4)

 //+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   datetime data= D'2020.09.16 20:07' ;   // Time Block
     if ( TimeCurrent ()>data)  
      {
       Print ( "Демонстрационный период закончился, покупайте индикатор :)" );
       Alert ( "Демонстрационный период закончился, покупайте индикатор :)" );
       return ( INIT_FAILED );
     } 
  
  
   if (IsTesting() && TimeCurrent () >= D'2020.09.16 20:07' ) // для тестировщиков, ограничение работы по времени
{
     Comment ( "Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)" );
     return ( 0 );
}    
     
Dosyalar:
 

Merhaba!

Kapanış emirleri döngüsünde , Cuma günü açılanların kapanmaması için emrin açıldığı gün için bir koşul koymak istedim. ama nedense döngü gitmiyor..

 while ( OrdersTotal ()> 0 )
    { 
       if ( OrderSelect ( 0 ,SELECT_BY_POS,MODE_TRADES))  
        {   
             if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())< 5 )) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)), 3 ,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(), NormalizeDouble (MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)), 3 ,CLR_NONE); 
            
                 if (result!=TRUE) { error= GetLastError ();
                     Print ( "LastError = " ,error, " " , Symbol ()); }
                 else error= 0 ; 
            }
             else    Print ( "NoMagic " , OrderMagicNumber());   // for Debug
         }
         else Print ( "Error when order select " , GetLastError ());
   
     } 
 
Tabazhan_Dajhiov :

Güzel gün. BİR AY SONRA TEST CİHAZINDA ÇALIŞMAYI DURDURAN GÖSTERGEYE HANGİ KODU EKLEMELİYİM? Demek istediğim, HER ŞEYİ YAZDIM! AMA ZATEN BİR GERİ TEST YAPTIĞIMDA TEKRAR ÇALIŞIYOR. (mgl4)

Bu kodu OnInit'te değil, OnTick()'te yazmanız gerekir.

 
Yerkin Sagandykov :

Merhaba!

Kapanış emirleri döngüsünde , Cuma günü açılanların kapanmaması için emrin açıldığı gün için bir koşul koymak istedim. ama nedense döngü gitmiyor..

Şu şekilde deneyin:

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     }