Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 649

 
Artyom Trishkin :

Sahip olduğunuz ZigZag köşe arama kodunun bir parçasını gördüm - sanırım bu Igor Kim'den. Burada ekstremum arama kodunda ve ayrıca bulunan ekstremumun zamanını kaydederek ekleyin. Onu döngüde arıyorsunuz... Bulduğunuzda, ekstremum zaten bulunduğunda, fiyatının değerini döndürmeden önce döngü endeksi tarafından belirtilen süreyi hatırlayın. Diğer bir deyişle, ZigZag ekstremumunun bulunduğu zamanın yazılacağı fonksiyona referansla datetime değişkenini de iletin. Fonksiyon fiyat değerini döndürdüğünde, bu değişkene ayrıca istenen ZigZag ekstremumunun bulunduğu çubuğun açılma zamanının değerini girecektir.

Üzgünüm ama çalışan bir bilgisayardan çok uzaktayım ve örnek bir kod sağlayamam.

Her şey yolunda gitti!
 
Merhaba! MQL4'te biraz yazıyorum ama MQL5'te tamamen sıfır. Günlük yüksek ve düşük arasındaki farkı hesaplayacak küçük bir asistan yazma ihtiyacı vardı. 4. versiyonda bunun için iyi iHigh ve iLow fonksiyonları var ama burada onların eksik olduğunu gördüm. copyHigh ve copyLow kullanmayı denedim, ancak minimum değeri maksimumdan çıkarırken bir sürü hata veriyor. Lütfen bana bu sorunu, tercihen bir kod parçasıyla nasıl çözeceğimi söyleyin. Şimdiden teşekkürler!
 
Александр Богданов :
Merhaba! MQL4'te biraz yazıyorum ama MQL5'te tamamen sıfır. Günlük yüksek ve düşük arasındaki farkı hesaplayacak küçük bir asistan yazma ihtiyacı vardı. 4. versiyonda bunun için iyi iHigh ve iLow fonksiyonları var ama burada onların eksik olduğunu gördüm. copyHigh ve copyLow kullanmayı denedim, ancak minimum değeri maksimumdan çıkarırken bir sürü hata veriyor. Lütfen bana bu sorunu, tercihen bir kod parçasıyla nasıl çözeceğimi söyleyin. Şimdiden teşekkürler!
Kod parçanızı çok fazla hatanın olduğu yerde gösterin ve bir şeylerin yanlış yapıldığı yerlerde çok sayıda yorum alın.
 
Александр Богданов :
Merhaba! MQL4'te biraz yazıyorum ama MQL5'te tamamen sıfır. Günlük yüksek ve düşük arasındaki farkı hesaplayacak küçük bir asistan yazma ihtiyacı vardı. 4. versiyonda bunun için iyi iHigh ve iLow fonksiyonları var ama burada onların eksik olduğunu gördüm. copyHigh ve copyLow kullanmayı denedim, ancak minimum değeri maksimumdan çıkarırken bir sürü hata veriyor. Lütfen bana bu sorunu, tercihen bir kod parçasıyla nasıl çözeceğimi söyleyin. Şimdiden teşekkürler!
Bunu kodun başına yapıştırın

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

'CopyTicks'in Test Edilmesi

fxsaber , 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
   class CLASS ##NAME                                                                                           \
  {                                                                                                           \
   public :                                                                                                     \
     static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
       return ((Copy ##FUNC((Symb == NULL ) ? _Symbol : Symb, _Period , iShift, 1 , tValue) > 0 ) ? tValue[ 0 ] : - 1 ); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                      \
    {                                                                                                         \
       return (CLASS ##NAME::Get(_Symbol, _Period , iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS ##NAME NAME;                                                                                           \
                                                                                                              \
  T i ##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
     return (CLASS ##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE( Volume , TickVolume, long )
DEFINE_TIMESERIE( Time , Time , datetime )
DEFINE_TIMESERIE( Open , Open , double )
DEFINE_TIMESERIE( High , High , double )
DEFINE_TIMESERIE( Low , Low , double )
DEFINE_TIMESERIE( Close , Close , double )
Bu, MT5'te her zamanki iHigh ve iLow'unuzu kullanmanıza izin verecektir.
 
fxsaber :
fxsaber :
Bunu kodun başına yapıştırın
Bu, MT5'te her zamanki iHigh ve iLow'unuzu kullanmanıza izin verecektir.
Çok teşekkürler! Bu, görevi büyük ölçüde basitleştirecek
 
Александр Богданов :
Merhaba! MQL4'te biraz yazıyorum ama MQL5'te tamamen sıfır. Günlük yüksek ve düşük arasındaki farkı hesaplayacak küçük bir asistan yazma ihtiyacı vardı. 4. versiyonda bunun için iyi iHigh ve iLow fonksiyonları var ama burada onların eksik olduğunu gördüm. copyHigh ve copyLow kullanmayı denedim, ancak minimum değeri maksimumdan çıkarırken bir sürü hata veriyor. Lütfen bana bu sorunu, tercihen bir kod parçasıyla nasıl çözeceğimi söyleyin. Şimdiden teşekkürler!

Görev sadece ekranda göstermekse, en iyi çözüm bir göstergedir. OnCalculate() içindeki gösterge, gerekli tüm zaman serilerine sahiptir:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {

Varsayılan olarak, MQL5 göstergesinde en sağdaki çubuk Rates_total-1 dizinine sahiptir. Ve göreviniz temel çıkarma işlemine indirgenmiştir:

   double difference=high[rates_total- 1 ]-low[rates_total- 1 ];


Doğru, bu kadar basit bir yaklaşım, yalnızca gösterge D1 zaman diliminde başlatılırsa doğru şekilde görüntülenecektir. Diğer zaman dilimlerinde çalıştırırsanız, CopyHigh ve CopyLow kullanmanız gerekir - prensipte, karmaşık bir şey değildir.

Bir örnek yazacağım...

//+------------------------------------------------------------------+
//|                                               High minus Low.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input ENUM_TIMEFRAMES period= PERIOD_D1 ;   // для какого периода считать High-Low
//---
double multiplier= 0.0 ;
double High [], Low [];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   multiplier= MathPow ( 10 , Digits ());
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//--- разницу цен переводим в пункты
   double difference=( iHigh ( Symbol (),period, 0 )- iLow ( Symbol (),period, 0 ))*multiplier;
//--- вывод результата на экран
   Comment ( "High-Low=" , DoubleToString (difference, 0 ));
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара                            |
//+------------------------------------------------------------------+
double iLow ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double low= 0 ;
   ArraySetAsSeries ( Low , true );
   int copied= CopyLow (symbol,timeframe, 0 , Bars (symbol,timeframe), Low );
   if (copied> 0 && index<copied) low= Low [index];
   return (low);
  }
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара                           |
//+------------------------------------------------------------------+
double iHigh ( string symbol, ENUM_TIMEFRAMES timeframe, int index)
  {
   double high= 0 ;
   ArraySetAsSeries ( High , true );
   int copied= CopyHigh (symbol,timeframe, 0 , Bars (symbol,timeframe), High );
   if (copied> 0 && index<copied) high= High [index];
   return (high);
  }
//+------------------------------------------------------------------+


Artık gösterge, geçerli sembolün herhangi bir zaman diliminde çalıştırılabilir ve Yüksek ile Düşük arasındaki farkı hangi zaman dilimi için hesaplayacağını seçebilir.
Dosyalar:
 
Александр Богданов :
Merhaba! MQL4'te biraz yazıyorum ama MQL5'te tamamen sıfır. Günlük yüksek ve düşük arasındaki farkı hesaplayacak küçük bir asistan yazma ihtiyacı vardı. 4. versiyonda bunun için iyi iHigh ve iLow fonksiyonları var ama burada onların eksik olduğunu gördüm. copyHigh ve copyLow kullanmayı denedim, ancak minimum değeri maksimumdan çıkarırken bir sürü hata veriyor. Lütfen bana bu sorunu, tercihen bir kod parçasıyla nasıl çözeceğimi söyleyin. Şimdiden teşekkürler!
Tam olarak günlük Yüksek ve Düşük'e ihtiyacınız varsa (geçerli günün en yüksek ve en düşük seviyesi), bu oldukça basit bir şekilde SymbolInfoDouble() kullanılarak SYMBOL_BIDHIGH ve SYMBOL_BIDLOW (veya zevkinize göre başkaları) tanımlayıcıları ile yapılır.
 
Merhaba! 2016.10.21_19:58 Moskova saati. Strateji test cihazındaki danışmanı kontrol ediyorum. EA çalışır, bir işlemi açar ve kapatır. Ancak strateji test cihazı bir hata veriyor: ArrayMinimum işlevi için yanlış başlangıç konumu 0; -1; dizi 'CLose.mqh' (86,59) içinde aralık dışında; EA'daki kritik bir hata nedeniyle test geçişi durduruldu. EA'nın nasıl hata yaptığına dair bir ekran görüntüsü ve dahil edilen CLose.mqh dosyasının kodu var. Bu kodda diziden herhangi bir çıkış yolu görmüyorum. Bu yüzden neyin yanlış olduğunu anlamıyorum. Yapabiliyorsanız, lütfen tavsiyede bulunun. Her şey varken. 20:08 Moskova saati. kritik hata
//+------------------------------------------------------------------+
//|                                                        CLose.mqh |
//|                                              Nickityuk N., 2016. |
//|                             https://www.mql5.com/users/nicityuk/ |
//+------------------------------------------------------------------+
#property copyright "Nickityuk N., 2016."
#property link        "https://www.mql5.com/users/nicityuk/"
#property strict
#include <Expert\OPen.mqh>
//#include <ARrayMinimum.mqh>
double AOmax,AOmax2,AOmin,AOmin2,AOm0,AOn0,z5max0,z5min0,clm,cln,AO[];
int aom,aom2,aon,aon2;
datetime ttm,ttn,hm,hn;
//+------------------------------------------------------------------+
//| Calculate for close order                                        |
//+------------------------------------------------------------------+
void CLose()
  { if (buy== 0 && sell== 0 ) { return ;}
   else if ( OrderType ()== OP_BUY ) {CloseBuy();}
         else                      CloseSell();}
//+------------------------------------------------------------------+
void St()
  {St0= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_MAIN , 0 );
   Si0= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 0 );
   St1= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_MAIN , 1 );
   Si1= iStochastic ( NULL , 0 , 24 , 5 , 3 , MODE_SMA , 0 , MODE_SIGNAL , 1 );}
void CloseBuy()
  {St(); if (St0- 20 > 0 && Si0- 20 > 0 )
           { if (St1-Si1> 0 && St0-Si0< 0 ) {AOm0= iAO ( NULL , 0 , 0 );
               if (AOm0-AOm1>= 0 ) {AOm1= iAO ( NULL , 0 , 0 ); return ;}
               else if (St0- 80 > 0 && St0- 100 <= 0 && Si0- 80 > 0 )
                      { if (Si0- 100 <= 0 && St1-Si1> 0 && St0-Si0< 0 )
                         {TwoExtremeAO_Buy(); OneExtremeBuy(); ExpirationBuy();}
                       else return ;}            
                     else return ;}
             else return ;}        
         else return ;}
void CloseSell()
  {St(); if (St0- 80 < 0 && Si0- 80 < 0 )
           { if (St1-Si1< 0 && St0-Si0> 0 ) {AOn0= iAO ( NULL , 0 , 0 );
               if (AOn0-AOn1<= 0 ) {AOn1= iAO ( NULL , 0 , 0 ); return ;}
               else if (St0- 20 < 0 && St0>= 0 && Si0- 20 < 0 )
                      { if (Si0>= 0 && St1-Si1< 0 && St0-Si0> 0 )
                         {TwoExtremeAO_Sell(); OneExtremeSell(); ExpirationSell();}
                       else return ;}  
                     else return ;}
             else return ;}        
         else return ;}
//+------------------------------------------------------------------+                      
void CalculateClose()
  {v0= iVolume ( NULL , PERIOD_M1 , 0 ); //--- go trading only for first tiks of new bar
   v1= iVolume ( NULL , PERIOD_M1 , 1 );
   v2= iVolume ( NULL , PERIOD_M1 , 2 );
   v3= iVolume ( NULL , PERIOD_M1 , 3 );
   v4= iVolume ( NULL , PERIOD_M1 , 4 );
   if (v0+v1+v2+v3+v4- 10 / 12 > 0 ) return ;  
   for (index= 0 ;index< 24 ;index++)
     {AO[index]= iAO ( NULL , PERIOD_M5 ,index);}
   ArrayResize (AO, 24 , 4 );
   ArraySetAsSeries (AO, true );}
   //index=0; AO[index]=iAO(NULL,PERIOD_M5,index);}
//+------------------------------------------------------------------+      
void TwoExtremeAO_Buy()
  {CalculateClose();
   if ( ArrayMaximum (AO, 23 , 0 )== 0 ) return ;
   else aom= ArrayMaximum (AO, 23 , 0 ); AOmax=AO[aom];
   if ( ArrayMinimum (AO,aom, 0 )> 0 ) {aon= ArrayMinimum (AO,aom, 0 );}
   else return ;
   if ( ArrayMaximum (AO,aon, 0 )== 0 ) return ;
   else aom2= ArrayMaximum (AO,aon, 0 ); AOmax2=AO[aom2];
     if (AOmax2-AOmax> 0 ) { return ;}
     else if (AOmax2-AOmax< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                { Print ( "OrderClose error." , GetLastError ());}
                               else //index=2;
                                   //while(iFractals(NULL,0,MODE_UPPER,index)==0) {index++;}
                                   //Sleep(3000); luf=iFractals(NULL,0,MODE_UPPER,index);
                                   //SL=NormalizeDouble(luf+(Ask-Bid)+(1*_Point),_Digits);
                                   TP= NormalizeDouble ( Ask -tp* _Point , _Digits );
                                   tic= OrderSend ( Symbol (), OP_SELL ,LotsCalculated(), Bid , 50 , 0 ,TP, "" ,MAGIC, 0 ,Red);
                                   AOn1= iAO ( NULL , 0 ,index); return ;}
           else return ;}
//+------------------------------------------------------------------+          
void TwoExtremeAO_Sell()
  {CalculateClose();
   if ( ArrayMinimum (AO, 23 , 0 )== 0 ) return ;
   else aon= ArrayMinimum (AO, 23 , 0 ); Print (aon, "" ); AOmin=AO[aon];
   if ( ArrayMaximum (AO,aon, 0 )> 0 ) {aom= ArrayMaximum (AO,aon, 0 );}
   else return ;
   if ( ArrayMinimum (AO,aom, 0 )== 0 ) return ;
   else aon2= ArrayMinimum (AO,aom, 0 ); AOmin2=AO[aon2]; //Print(aon2,"");
     if (AOmin2-AOmin> 0 ) { return ;}
     else if (AOmin2-AOmin< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                { Print ( "OrderClose error." , GetLastError ());}
                               else //index=2;
                                   //while(iFractals(NULL,0,MODE_LOWER,index)==0) {index++;}
                                   //Sleep(3000); ldf=iFractals(NULL,0,MODE_LOWER,index);
                                   //SL=NormalizeDouble(ldf-(1*_Point),_Digits);
                                   TP= NormalizeDouble ( Bid +tp* _Point , _Digits );
                                   tic= OrderSend ( Symbol (), OP_BUY ,LotsCalculated(), Ask , 50 , 0 ,TP, "" ,MAGIC, 0 ,Blue);
                                   AOm1= iAO ( NULL , 0 , 0 ); return ;}
           else return ;}
//+------------------------------------------------------------------+                      
void OneExtremeBuy()
  {index= 0 ;
   while ( iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 1 ,index)== 0 ) {index++;}
   z5max0= iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 1 ,index); ttm= iTime ( NULL , 0 ,index); clm= iClose ( NULL , PERIOD_M5 , 0 ); //Sleep(3000);
   if ((clm-(z5max0- 300 * Point ))< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                       { Print ( "OrderClose error." , GetLastError ());}
                                   else return ;}
   else return ;}
void OneExtremeSell()
  {index= 0 ;
   while ( iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 2 ,index)== 0 ) {index++;}
   z5min0= iCustom ( NULL , PERIOD_M5 , "ZigZag" , 12 , 5 , 3 , 2 ,index); ttn= iTime ( NULL , 0 ,index); cln= iClose ( NULL , PERIOD_M5 , 0 ); //Sleep(3000);
   if ((cln-(z5min0+ 300 * Point ))> 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                       { Print ( "OrderClose error." , GetLastError ());}
                                   else return ;}
   else return ;}
//+------------------------------------------------------------------+                                                                      
void ExpirationBuy()
  {hm= TimeHour (ttm); if ((hm+ 3 )- TimeCurrent ()< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                                   { Print ( "OrderClose error." , GetLastError ());}
                                                 else return ;}
                     else return ;}
void ExpirationSell()
  {hn= TimeHour (ttn); if ((hn+ 3 )- TimeCurrent ()< 0 ) { if ( OrderClose ( OrderTicket (), OrderLots (), Bid , 300 ,White)== false )
                                                   { Print ( "OrderClose error." , GetLastError ());}
                                                 else return ;}
                     else return ;}
//+------------------------------------------------------------------+          
 
Николай Никитюк :
Merhaba! 2016.10.21_19:58 Moskova saati. Strateji test cihazındaki danışmanı kontrol ediyorum. EA çalışır, bir işlemi açar ve kapatır. Ancak strateji test cihazı bir hata veriyor: ArrayMinimum işlevi için yanlış başlangıç konumu 0; -1; dizi 'CLose.mqh' (86,59) içinde aralık dışında; EA'daki kritik bir hata nedeniyle test geçişi durduruldu. EA'nın nasıl hata yaptığına dair bir ekran görüntüsü ve dahil edilen CLose.mqh dosyasının kodu var. Bu kodda diziden herhangi bir çıkış yolu görmüyorum. Bu yüzden neyin yanlış olduğunu anlamıyorum. Yapabiliyorsanız, lütfen tavsiyede bulunun. Her şey varken. 20:08 Moskova saati.

Ya da belki yeniden yapmak için int'de (kullanarak aon=NormalizeDouble(aon,0)), aksi takdirde bir tür double gibi ve tamamen net değil - sonunda ne oldu? // sürüm gibi

:

if ( ArrayMinimum (AO,aom, 0 )> 0 ) {aon= ArrayMinimum (AO,aom, 0 );}
 
Karputov Vladimir :

Uzman Danışmanınıza bir girdi parametresi girin ve başlangıçta kendisine atanan değere bağlı olarak, yalnızca satın alacak veya yalnızca satacaksınız:

input bool Long= true ;             // allow only "Long"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
...
void OnTick ()
  {
   if (!Long)
      trade.Sell( 0.01 );
   if (Long)
      trade.Buy( 0.01 );
  }
Manuel ticaret için neler sunabilirsiniz?