MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 21
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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
Söyle bana, yoksa gecikmeye başladım)
Böyle bir tasarım var:
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:
Söyle bana, yoksa gecikmeye başladım)
Böyle bir tasarım var:
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.
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.
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 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 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Teşekkürler, harika çalışıyor!
not. Bu şeyin beşincide işe yarayacağını anlıyorum?
Teşekkürler, harika çalışıyor!
not. Bu şeyin beşincide işe yarayacağını anlıyorum?
{
//+--------------------------------------------------------------------+
//| -= 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 ;
}
}
}
}
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
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.
Üzgünüm Artyom, ama bu sorunun çözümünü biraz daha basit göstermek istiyorum
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.