Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 649
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
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.
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!
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
'CopyTicks'in Test Edilmesi
fxsaber , 2016.10.19 07:59
// А так же задает привычные 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 )
Bunu kodun başına yapıştırı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!
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:
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.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!
//| 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
:
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:
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
...
void OnTick ()
{
if (!Long)
trade.Sell( 0.01 );
if (Long)
trade.Buy( 0.01 );
}