MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 12
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
Mantık şu:
Küstahlık için özür dilerim) Böyle bir kodun bir örneğini bir yerde görmek mümkün mü?
her şey basit
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
datetime t;
int i, k= OrdersHistoryTotal ();
if (sy== "" || sy== "0" ) sy= Symbol ();
for (i= 0 ; i<k; i++) {
if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
if ( OrderSymbol ()==sy) {
if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
if (op< 0 || OrderType ()==op) {
if (mn< 0 || OrderMagicNumber ()==mn) {
if (t< OrderCloseTime ()) t= OrderCloseTime ();
}
}
}
}
}
}
return ( iBarShift (sy, tf, t, True ));
}
Üzgünüm, belki bundan bahsetmiyorum.
Burada bu gösterge üzerinde meditasyon yapın. Bir sürü statik değişkene sahiptir:
static int cDir= 0 ;
static int pDir= 0 ;
Tamponları değiştirmek için yapılırlar.
IndicatorCounted()=0 ise, LastTime sıfıra ayarlanmalıdır (diğerleri isteğe bağlıdır, ancak istenir).
Ardından, döngünün başında değerleri taşıyın:
{
LastTime= Time [i];
pDir=cDir;
}
else
{
cDir=pDir;
}
"c" ile başlayan değişkenler mevcut değerdir ve "p" ile başlayanlar bir önceki değerdir.
Bağlantı açılmıyor - 404 hatası
Zamanla denemeye çalıştım ama bir şeyler olmadı... "Son çubukta hesaplamaları nasıl durdurabilirim" yönünde düşündüm, sanırım bu benim hatam. Şimdi mevcut çubuğu değiştirmeden önce hesaplamadaki son adımı nasıl değiştirmeyeceğimi düşüneceğim.
her şey basit
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
datetime t;
int i, k= OrdersHistoryTotal ();
if (sy== "" || sy== "0" ) sy= Symbol ();
for (i= 0 ; i<k; i++) {
if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
if ( OrderSymbol ()==sy) {
if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
if (op< 0 || OrderType ()==op) {
if (mn< 0 || OrderMagicNumber ()==mn) {
if (t< OrderCloseTime ()) t= OrderCloseTime ();
}
}
}
}
}
}
return ( iBarShift (sy, tf, t, True ));
}
Üzgünüm, belki bundan bahsetmiyorum.
Merhaba! Lütfen algoritmaya yardım edin!
Pearson korelasyon katsayısını hesaplayan basit bir komut dosyası yazdı. İlk çubuktan başlayarak kapanış fiyatlarında seçilen diziler
{
int n= 25 ;
int w= 18 ;
double sum_x= 0 ; // Сумма цен закрытия для пары 1
double sum_y= 0 ; // Сумма цен закрытия для пары 2
double Price_Close_x[]; // Массив Price_Close для пары 1
double Price_Close_y[]; // Массив Price_Close для пары 2
double dx[]; // Отклонение от среднего значения для пары 1 dx
double dy[]; // Отклонение от среднего значения для пары 2 dy
double dx2[]; // Квадрат отклонения ср.значения dx2
double dy2[]; // Квадрат отклонения ср.значения dy2
double dxdy[]; // Произведение dx и dy
ArrayResize (Price_Close_x, n);
ArrayResize (Price_Close_y, n);
ArrayResize (dx, n);
ArrayResize (dy, n);
ArrayResize (dx2, n);
ArrayResize (dy2, n);
ArrayResize (dxdy, n);
string sym_x= "EURUSD" ;
string sym_y= "GBPUSD" ;
for ( int p= 1 ; p<n; p++)
{
Price_Close_x[p]= iClose (sym_x, PERIOD_H1 , p);
Price_Close_y[p]= iClose (sym_y, PERIOD_H1 , p);
sum_x=sum_x+Price_Close_x[p];
sum_y=sum_y+Price_Close_y[p];
}
Alert ( "Sum_x равно " , sum_x);
Alert ( "Sum_y равно " , sum_y);
double Mx=sum_x/(n- 1 ); // Среднее значение цен закрытия пары 1 Mx
double My=sum_y/(n- 1 ); // Среднее значение цен закрытия пары 2 My
Alert ( "Mx равно " , Mx);
Alert ( "My равно " , My);
for ( int i= 1 ; i<n; i++)
{
dx[i]=Price_Close_x[i]-Mx;
dy[i]=Price_Close_y[i]-My;
dx2[i]= DoubleToString (dx[i]*dx[i], w);
dy2[i]= DoubleToString (dy[i]*dy[i], w);
dxdy[i]= DoubleToString (dx[i]*dy[i], w);
Alert ( "Отклонение dx на баре " , i, " равно " , DoubleToString (dx[i], w));
Alert ( "Отклонение dy на баре " , i, " равно " , DoubleToString (dy[i], w));
Alert ( "Квадрат dx на баре " , i, " равен " , DoubleToString (dx2[i], w));
Alert ( "Квадрат dy на баре " , i, " равен " , DoubleToString (dy2[i], w));
Alert ( "dxdy на баре " , i, " равен " , DoubleToString (dxdy[i], w));
}
double Edx2= 0 ; // Сумма квадратов отклонений Edx2
double Edy2= 0 ; // Сумма квадратов отклонений Edy2
double Edxdy= 0 ; // Сумма произведений отклонений Edxdy
for ( int q= 0 ; q<n; q++)
{
Edx2= DoubleToString ((Edx2+dx2[q]), w);
Edy2= DoubleToString ((Edy2+dy2[q]), w);
Edxdy= DoubleToString ((Edxdy+dxdy[q]), w);
}
Alert ( "Сумма Edx2 равна " , DoubleToString (Edx2, w));
Alert ( "Сумма Edy2 равна " , DoubleToString (Edy2, w));
Alert ( "Сумма Edxdy равна " , DoubleToString (Edxdy, w));
double Koef; // Коэффициент Пирсона
Koef=Edxdy/( sqrt ( DoubleToString ((Edx2*Edy2), w)));
Alert ( "Коэффициент корреляции Пирсона между " , sym_x, " и " , sym_y, " равен " , DoubleToString (Koef, w));
return ;
}
Fiyat dizisi, birinciden başlayıp 24 çubukla biten alınır.
Şimdi korelasyonu 24 çubuk için de hesaplamak istiyorum, ancak İKİNCİ(!) çubuğundan fiyat dizisini alıyorum.
Algoritmayı bilmeden her fiyat dizisini manuel olarak girdim:
{
Price_Close_x[p]= iClose (sym_x, PERIOD_H1 , p);
Price_Close_y[p]= iClose (sym_y, PERIOD_H1 , p);
sum_x=sum_x+Price_Close_x[p];
sum_y=sum_y+Price_Close_y[p];
Price_Close_x1[p]= iClose (sym_x, PERIOD_H1 , p+ 1 );
Price_Close_y1[p]= iClose (sym_y, PERIOD_H1 , p+ 1 );
Price_Close_x2[p]= iClose (sym_x, PERIOD_H1 , p+ 2 );
Price_Close_y2[p]= iClose (sym_y, PERIOD_H1 , p+ 2 );
Price_Close_x3[p]= iClose (sym_x, PERIOD_H1 , p+ 3 );
Price_Close_y3[p]= iClose (sym_y, PERIOD_H1 , p+ 3 );
...
...
Price_Close_x24[p]= iClose (sym_x, PERIOD_H1 , p+ 24 );
Price_Close_y24[p]= iClose (sym_y, PERIOD_H1 , p+ 24 );
}
24 bar çok fazla ve eğer 100 bar için korelasyonu bulmak istersem, o zaman her diziye girmek işkence oluyor.
Peki ya insanlar?)
Merhaba! Lütfen algoritmaya yardım edin!
for(int p=1; p<n; p++)Pearson'ın korelasyon katsayısını hesaplayan bir komut dosyası yazdım. İlk çubuktan başlayarak kapanış fiyatları ile alınan diziler
for(int p=1; p<n; p++)
{
Price_Close_x[p]=iClose(sym_x, PERIOD_H1, p);
Price_Close_y[p]=iClose(sym_y, PERIOD_H1, p);
toplam_x=sum_x+Fiyat_Kapat_x[p];
toplam_y=sum_y+Fiyat_Kapat_y[p];
Price_Close_x1[p]=iClose(sym_x, PERIOD_H1, p+1);
Price_Close_y1[p]=iClose(sym_y, PERIOD_H1, p+1);
Price_Close_x2[p]=iClose(sym_x, PERIOD_H1, p+2);
Price_Close_y2[p]=iClose(sym_y, PERIOD_H1, p+2);
Price_Close_x3[p]=iClose(sym_x, PERIOD_H1, p+3);
Price_Close_y3[p]=iClose(sym_y, PERIOD_H1, p+3);
...
Price_Close_x24[p]=iClose(sym_x, PERIOD_H1, p+24);
Price_Close_y24[p]=iClose(sym_y, PERIOD_H1, p+24);
}
____________________________________________________________________________
İki boyutlu dizi...
FiyatKapat[][2];
int n= 24 ;
ArrayResize (PriceClose,n);
for ( int p= 0 ; p<n; p++) {
PriceClose[p][ 0 ]= iClose (sym_x, PERIOD_H1 , p);
PriceClose[p][ 1 ]= iClose (sym_y, PERIOD_H1 , p);
sum_x+=PriceClose[p][ 0 ];
sum_y+=PriceClose[p][ 1 ];
}
Nerede yanlış yapıyorum anlamıyorum...
//| SVA_03.mq4 |
//| Copyright © 2006, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//---- input parameters
extern int RSIPeriod= 14 ;
extern int Levl= 50 ;
extern int TF= 0 ;
//---- buffers
double MABuffer[];
static datetime TimeN= 0 ;
static datetime TimeX= 0 ;
int StopCalc= 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
IndicatorBuffers ( 1 );
SetIndexBuffer ( 0 ,MABuffer);
//---- indicator line
SetIndexStyle ( 0 , DRAW_LINE );
//----
//---- name for DataWindow and indicator subwindow label
// short_name="RSI("+IntegerToString(RSIPeriod)+")";
short_name= "RSI(" +RSIPeriod+ ")" ;
IndicatorShortName (short_name);
SetIndexLabel ( 0 ,short_name);
return ( 0 );
}
//+------------------------------------------------------------------+
//| Relative Strength Index |
//+------------------------------------------------------------------+
int start()
{
int i,counted_bars= IndicatorCounted ();
double rel,negative,positive,sma,x,y,Pos,Neg;
double sumn= 0.0 ,sump= 0.0 ;
//----
if ( Bars <=RSIPeriod) return ( 0 );
if (TF!= 0 )
{
string name= WindowExpertName ();
for (i= 0 ; i< Bars -counted_bars+ 1 ; i++)
{
int barIndex= iBarShift ( NULL ,TF, Time [i], false );
MABuffer[i]= iCustom ( Symbol (),TF,name,RSIPeriod,Levl, 0 , 0 ,barIndex);
}
return ( 0 );
}
i= Bars -RSIPeriod- 1 ;
if (counted_bars>=RSIPeriod) i= Bars -counted_bars- 1 ;
datetime TimeC= iTime ( NULL ,TF, 0 );
while (i>= 0 )
{
if (i!= 0 && StopCalc== 0 )
{
sumn= 0.0 ;sump= 0.0 ;
if (i== Bars -RSIPeriod- 1 )
{
int k= Bars - 2 ;
//---- initial accumulation
while (k>=i)
{
rel= Close [k]- Close [k+ 1 ];
if (rel> 0 ) sump+=rel;
else sumn-=rel;
k--;
}
positive=sump/RSIPeriod;
negative=sumn/RSIPeriod;
}
else
{
//---- smoothed moving average
rel= Close [i]- Close [i+ 1 ];
if (rel> 0 ) sump=rel;
else sumn=-rel;
positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
}
x=Pos;
y=Neg;
Pos=positive;
Neg=negative;
if (x> 0 )sma= Close [i+ 1 ]+x;
else sma= Close [i+ 1 ]-y;
MABuffer[i]=sma;
Print ( "Этап 01 i=" ,i);
}
if (i== 0 )
{
if (TimeC!=TimeX)
{
rel= Close [i+ 1 ]- Close [i+ 2 ];
if (rel> 0 ) sump=rel;
else sumn=-rel;
positive=(Pos*(RSIPeriod- 1 )+sump)/RSIPeriod;
negative=(Neg*(RSIPeriod- 1 )+sumn)/RSIPeriod;
x=Pos;
y=Neg;
Pos=positive;
Neg=negative;
Print ( "positive=" ,positive);
Print ( "negative=" ,negative);
if (x> 0 )sma= Close [i+ 1 ]+x;
else sma= Close [i+ 1 ]-y;
MABuffer[i]=sma;
Print ( "Этап 2 i=" ,i);
TimeX= iTime ( NULL ,TF, 0 );
StopCalc= 1 ;
}
}
i--;
}
//----
return ( 0 );
}
//+------------------------------------------------------------------+
sonuçlar seçenek 4'ten farklı - sorun ne?
Bağlantı açılmıyor - 404 hatası
Zamanla denemeye çalıştım ama bir şeyler olmadı... "Son çubukta hesaplamaları nasıl durdurabilirim" yönünde düşündüm, sanırım bu benim hatam. Şimdi, mevcut çubuğu değiştirmeden önce hesaplamadaki son adımı nasıl değiştirmeyeceğimi düşüneceğim.
Neden bu kadar ağırsın ve çevik değilsin? Size zaten bir karar verildi, sadece oturup düşünmeniz gerekiyor. Sonuç elbette, kelime yok - Zaman kelimesini gördüler ve hemen yaptığınız sonucu ...
Linke gerek yok, yoksa tamamen boğulursunuz, ihtiyacınız olan her şey o yazıda yazıyor, daha detaylı tekrar edeceğim:
1. Statik bir LastTime değişkeni bildirin.
2. c ve p önekleri ile bir çift statik değişken tanımlayın.
3. IndicatorCounted()=0 ile 1. ve 2. adımlarda oluşturulan tüm değişkenleri sıfırlayın.
4. Döngünün başında değerleri atın:
{
LastTime= Time [i];
pDir=cDir;
}
else
{
cDir=pDir;
}
Neden bu kadar ağırsın ve çevik değilsin? Size zaten bir karar verildi, sadece oturup düşünmeniz gerekiyor. Sonuç elbette, kelime yok - Zaman kelimesini gördüler ve hemen yaptığınız sonucu ...
Linke gerek yok, yoksa tamamen boğulursunuz, ihtiyacınız olan her şey o yazıda yazıyor, daha detaylı tekrar edeceğim:
1. Statik bir LastTime değişkeni bildirin.
2. c ve p önekleri ile bir çift statik değişken tanımlayın.
3. IndicatorCounted()=0 ile 1. ve 2. adımlarda oluşturulan tüm değişkenleri sıfırlayın.
4. Döngünün başında değerleri atın:
{
LastTime= Time [i];
pDir=cDir;
}
else
{
cDir=pDir;
}
Yardım etme isteğiniz için teşekkürler!
Gösterge yazma konusunda fazla deneyimim yok, bu yüzden bir takım zorluklar var - aradığım çözüm - bu da hemen yukarıdaki son kodumu kanıtlıyor.
Önerdiğiniz değişken, başlangıçta hesaplanan değerleri korumak için - fikir açık olsa da - hangi değişkenleri sıfıra sıfırlamam önerildiğini anlayamıyorum çünkü zorluk yaratıyor.
Zor değilse, varyantımın neden çalışmadığını açıklayın - ayrıca hesaplamayı çubuk başına bir onay işaretiyle sınırlandırıyorum ve teoride değişkenler değişmemeli ve boşta kalma döngüsü olmayacağından bu varyantın daha ucuz olması bekleniyor. önerdiğinizden farklı olarak her kene üzerine yerleştirin.
Mantık şu:
İşte böyle bir nüansım var: Bu kodu aldım ( Alekseu Fedotov sayesinde):
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара закрытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarCloseLastPos( string sy= "0" , int tf= 0 , int op=- 1 , int mn=- 1 ) {
datetime t;
int i, k= OrdersHistoryTotal ();
if (sy== "" || sy== "0" ) sy= Symbol ();
for (i= 0 ; i<k; i++) {
if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )) {
if ( OrderSymbol ()==sy) {
if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL ) {
if (op< 0 || OrderType ()==op) {
if (mn< 0 || OrderMagicNumber ()==mn) {
if (t< OrderCloseTime ()) t= OrderCloseTime ();
}
}
}
}
}
}
return ( iBarShift (sy, tf, t, True ));
}
Ve şimdi kontrol ediyorum:
Ve işte bütün engel, çünkü. başlangıçta NumberOfBarCloseLastPos "-1" olacaktır. Ve buna göre, ilk sipariş asla açılmayacak.
Böyle bir durumda ne yapılabilir? Yoksa bir şeyi yanlış mı anladım?