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

 
Renat Akhtyamov :

Burada dikkate alınması gereken tek şey, i==x döngü bloğundan sonra

iken Array[i] for(...){}'dan sonra bir dizi sınır dışı hatası döndürür ve bu kadar

Bu, olası hatalar için verimli bir zemin sağlar, örneğin, kodun sonraki bölümlerinde j değişkeniniz varsa ve yanlışlıkla i olarak adlandırırsanız. Veya dizinin [1] dizini yerine [i], vb. yazın.
Burada belirli bir kodla durum hakkında değil, nasıl olabileceğine dair bir örnek yazdım. Ve herhangi bir dizi sınırlarının ötesinde bir çıkış olmayacak ve hatanın yakalanması zor olabilir ve sonra onu yerelleştirmek için çok değerli dakikalar (saatler değilse bile) harcanabilir.
 

Söyle bana, yoksa gecikmeye başladım)

Böyle bir tasarım var:

int RangeBar = 10 ;
 HighRange = iHigh (symbol, 0 , iHighest (symbol, 0 , MODE_HIGH ,RangeBar, 1 ));
 LowRange = iLow (symbol, 0 , iLowest (symbol, 0 , MODE_LOW ,RangeBar, 1 ));

N mum aralığının Yüksek/ Düşük değerini bulur.

Soru: Aynı Yüksek / Düşük nasıl bulunur, ancak gölgelerle değil, bedenlerle nasıl bulunur, bir resim ekliyorum:

 
Vitaly Muzichenko :

Söyle bana, yoksa gecikmeye başladım)

Böyle bir tasarım var:

int RangeBar = 10 ;
 HighRange = iHigh (symbol, 0 , iHighest (symbol, 0 , MODE_HIGH ,RangeBar, 1 ));
 LowRange = iLow (symbol, 0 , iLowest (symbol, 0 , MODE_LOW ,RangeBar, 1 ));

N mum aralığının Yüksek/ Düşük değerini bulur.

Soru: Aynı Yüksek / Düşük nasıl bulunur, ancak gölgelerle değil, bedenlerle nasıl bulunur, bir resim ekliyorum:

Mumun tepesini fmax(Aç[i],Kapat[i]) ve mumun altını fmin(Aç[i],Kapat[i]) aramanız gerekir.
 
Artyom Trishkin :
Mumun tepesini fmax(Aç[i],Kapat[i]) ve mumun altını fmin(Aç[i],Kapat[i]) aramanız gerekir.

Yani, Yüksek / Düşük arayan iki satır yerine bir döngüde yineleme mi yapıyorsunuz?

HighRange = iHigh (sembol, 0 , iHighest (sembol, 0 , MODE_HIGH ,RangeBar, 1 ));

LowRange = iLow (sembol, 0 , iLow (sembol, 0 , MODE_LOW ,RangeBar , 1 ));

Bu bir danışman için gerekli, bir gösterge değil, bir danışmanda doğru çalışıyor, ancak bedenlere göre bir aralığı nasıl bulacağımı çözemiyorum.

 
Vitaly Muzichenko :

Yani, Yüksek/Düşük arayan iki satır yerine bir döngüde yineleme yapmak mı?

HighRange = iHigh (sembol, 0 , iHighest (sembol, 0 , MODE_HIGH ,RangeBar, 1 ));

LowRange = iLow (sembol, 0 , iLow (sembol, 0 , MODE_LOW ,RangeBar , 1 ));

Bu bir danışman için gerekli, bir gösterge değil, bir danışmanda doğru çalışıyor, ancak bedenlere göre bir aralığı nasıl bulacağımı çözemiyorum.

Bir test senaryosu gönderdim. Yanlışlıklar olabilir - "diz üstünde" yazdı. Umarım anlarsın.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int       Begin= 1 ;       // Бар начала диапазона поиска
input int       RangeBars= 20 ;   // Диапазон поиска
//---
int bars= Bars ( Symbol (), PERIOD_CURRENT );
int begin=(Begin< 0 ? 0 :Begin>bars- 3 ?bars- 3 :Begin);
int rangeBars=(RangeBars< 2 ? 2 :
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   MqlRates array[];
   double    high= 0 , low= 0 ;
   int       highest=- 1 , lowest=- 1 ;
   if ( CopyRates ( Symbol (), PERIOD_CURRENT ,begin,rangeBars,array)> 0 ) {
       ArraySetAsSeries (array, true );
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print ( "High=" , DoubleToString (high, Digits ()), ", Highest=" ,highest, ", Low=" , DoubleToString (low, Digits ()), ", Lowest=" ,lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue( int bar_begin, MqlRates &array[], int &bar_highest){
   int       sz= ArraySize (array);
   if (sz== 0 ) return (- 1 );
   double    high= DBL_MIN ;
   bar_highest=- 1 ;
   for ( int i= 0 ; i<sz; i++) {
       double value= fmax (array[i].open,array[i].close);
       if (value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return (high);
}
//+------------------------------------------------------------------+
double GetLowestValue( int bar_begin, MqlRates &array[], int &bar_lowest){
   int       sz= ArraySize (array);
   if (sz== 0 ) return (- 1 );
   double    low= DBL_MAX ;
   bar_lowest=- 1 ;
   for ( int i= 0 ; i<sz; i++) {
       double value= fmin (array[i].open,array[i].close);
       if (value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return (low);
}
//+------------------------------------------------------------------+
Bir şey olursa sor...
 
Artyom Trishkin :

Bir test senaryosu gönderdim. Yanlışlıklar olabilir - "diz üstünde" yazdı. Umarım anlarsın.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Bir şey olursa sor...

Teşekkürler, harika çalışıyor!

not. Bu şeyin beşincide işe yarayacağını anlıyorum?

 
Vitaly Muzichenko :

Teşekkürler, harika çalışıyor!

not. Bu şeyin beşincide işe yarayacağını anlıyorum?

Evet. Platformlar arası kod yapmaya çalışıyorum. Veya ilk beşin altındaki minimum değişikliklerle.
 
Güzel gün. Kollarım eğri. lütfen satmak için zararı durdurma kontrolü eklememe yardım edin (slevel). ve sonra fiyatı yakalamaya çalışır.
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool    result;
double stop;
int     cmd,error;
for ( int i= 0 ;i< OrdersTotal ();i++)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ) && OrderProfit ()>pOPCS)
{
cmd= OrderType ();
double blevel= OrderStopLoss ()< Bid - Point *TS;
double slevel= OrderStopLoss ()> Ask + Point *TS;
//---
if (cmd== OP_BUY || cmd== OP_SELL )
{
while ( true )
{
if (cmd== OP_BUY && blevel) stop= Bid - Point *TS;
else                       stop= Ask + Point *TS;
result= OrderModify ( OrderTicket (), OrderOpenPrice (),stop, 0 , 0 ,Orange);
if (result!= TRUE ) { error= GetLastError (); Print ( "LastError = " ,error); }
else error= 0 ;
if (error== 135 ) RefreshRates ();
else break ;
}
}
}
}
 
Artyom Trishkin :

Bir test senaryosu gönderdim. Yanlışlıklar olabilir - "diz üstünde" yazdı. Umarım anlarsın.

Bir şey olursa sor...

Üzgünüm Artyom, ama bu sorunun çözümünü biraz daha basit göstermek istiyorum

   double openCandle[], closeCandle[];
   CopyOpen ( _Symbol , PERIOD_CURRENT , 1 , 15 , openCandle);
   CopyClose ( _Symbol , PERIOD_CURRENT , 1 , 15 , closeCandle);
   double maxCandle = fmax (openCandle[ ArrayMaximum (openCandle)], closeCandle[ ArrayMaximum (closeCandle)]);
   double minCandle = fmin (openCandle[ ArrayMinimum (openCandle)], closeCandle[ ArrayMinimum (closeCandle)]);

Bunu kodunuzda düzenlemeyi umuyorum ve herkes gerekli kontrolleri ekleyebilir. Performans hem mql4'te hem de mql5'te aynıdır.

 
Alexey Viktorov :

Üzgünüm Artyom, ama bu sorunun çözümünü biraz daha basit göstermek istiyorum

   double openCandle[], closeCandle[];
   CopyOpen ( _Symbol , PERIOD_CURRENT , 1 , 15 , openCandle);
   CopyClose ( _Symbol , PERIOD_CURRENT , 1 , 15 , closeCandle);
   double maxCandle = fmax (openCandle[ ArrayMaximum (openCandle)], closeCandle[ ArrayMaximum (closeCandle)]);
   double minCandle = fmin (openCandle[ ArrayMinimum (openCandle)], closeCandle[ ArrayMinimum (closeCandle)]);

Bunu kodunuzda düzenlemeyi umuyorum ve herkes gerekli kontrolleri ekleyebilir. Performans, hem mql4 hem de mql5'te aynıdır.

Ö! Teşekkür ederim. Sabah kendisi tahmin edemedi... Ancak yine de dizilerin doldurulup doldurulmadığını kontrol etmek gerekiyor. İlk dörtte görmedim ve ilk beşte, tarihsel veri eksikliği nedeniyle veriler genellikle ilk kez doldurulmaz.

not. Daha fazla uyumanız gerekiyor - bu yöndeki düşünceler işe yarayacak.