Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 12
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Die Logik ist folgende:
Verzeihen Sie meine Unverschämtheit) Kann ich irgendwo ein Beispiel für diesen Code sehen?
Das ist ganz einfach.
//| Автор : Ким Игорь В. 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));
}
Es tut mir leid, vielleicht spreche ich von der falschen Sache.
Denken Sie über diesen Indikator nach. Es hat eine Menge statischer Variablen:
static int cDir=0;
static int pDir=0;
Sie werden anstelle von Puffern hergestellt.
Wenn IndicatorCounted()=0 ist, sollte LastTime auf Null gesetzt werden (die anderen sind nicht notwendig, aber wünschenswert).
Verschieben Sie dann am Anfang der Schleife die Werte:
{
LastTime=Time[i];
pDir=cDir;
}
else
{
cDir=pDir;
}
Variablen, die mit "c" beginnen, sind der aktuelle Wert und mit "p" der vorherige Wert.
Dieser Link kann nicht geöffnet werden - Fehler 404.
Ich habe versucht, mit der Zeit zu experimentieren, aber es hat nicht funktioniert... Ich dachte in die Richtung "wie man Berechnungen beim letzten Takt stoppt", ich glaube, das ist mein Fehler. Ich werde jetzt darüber nachdenken, wie ich den letzten Schritt in der Berechnung nicht ändern kann, bevor ich den aktuellen Takt ändere.
Das ist ganz einfach.
//| Автор : Ким Игорь В. 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));
}
Es tut mir leid, vielleicht spreche ich von der falschen Sache.
Hallo! Bitte helfen Sie mir mit dem Algorithmus!
Ich habe ein einfaches Skript geschrieben, das den Korrelationskoeffizienten von Pearson berechnet. Die Arrays basieren auf den Schlusskursen, beginnend mit dem ersten Balken.
{
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;
}
Das Preisfeld wird vom ersten bis zum 24. Balken genommen.
Nun möchte ich die Korrelation auch für 24 Balken berechnen, aber das Preisfeld aus dem ZWEITEN(!) Balken nehmen.
Da ich den Algorithmus nicht kannte, habe ich jedes Preisfeld manuell eingegeben:
{
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 Balken sind mühsam, und wenn ich die Korrelation für 100 Balken wissen will, ist es mühsam, jedes Feld einzugeben.
Was ist zu tun, Leute?)
Hallo! Könnten Sie mir bitte mit dem Algorithmus helfen!
for(int p=1; p<n; p++)Ich habe ein Skript geschrieben, das den Korrelationskoeffizienten nach Pearson berechnet. Ich habe Arrays nach Schlusskursen, beginnend mit dem ersten Bar
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+Preis_schluss_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);
}
____________________________________________________________________________
Zweidimensionales Array
PriceClose[][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];
}
Ich weiß nicht, was ich falsch mache...
//| 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);
}
//+------------------------------------------------------------------+
die Ergebnisse sind anders als bei Option 4 - was ist los?
Der Link lässt sich nicht öffnen - 404-Fehler
Ich habe versucht, mit dem Timing zu experimentieren, aber es hat nicht funktioniert... Ich dachte in die Richtung "wie man die Berechnung beim letzten Takt stoppt", ich denke, das ist mein Fehler. Ich werde nun darüber nachdenken, wie ich den letzten Schritt in der Berechnung nicht ändern kann, bevor ich den aktuellen Takt ändere.
Warum bist du so schwer und schwenkst nicht? Sie haben bereits eine Lösung erhalten, Sie müssen sich nur noch zurücklehnen und nachdenken. Für die Schlussfolgerung gibt es natürlich keine Worte - du hast das Wort "Zeit" gesehen und sofort gefolgert, dass du es warst...
Sie brauchen keinen Link, sonst gehen Sie verloren. Alles, was Sie brauchen, ist in diesem Beitrag beschrieben, lassen Sie mich es im Detail wiederholen:
1. Deklarieren Sie eine statische Variable LastTime.
2. ein Paar statischer Variablen mit den Präfixen s und p deklarieren.
3. Wenn IndicatorCounted()=0, werden alle in Schritt 1 und 2 erstellten Variablen gelöscht.
4. Setzen Sie die Werte zu Beginn des Zyklus zurück:
{
LastTime=Time[i];
pDir=cDir;
}
else
{
cDir=pDir;
}
Warum sind Sie so schwerfällig und nicht von zentraler Bedeutung? Sie haben bereits eine Entscheidung getroffen, Sie müssen sich nur noch zurücklehnen und nachdenken. Die Schlussfolgerung ist natürlich, nun, es gibt keine Worte - das Wort Zeit sah, und schloss sofort, dass Sie es getan haben ...
Sie brauchen keinen Link, Sie werden sich verirren. Alles, was Sie brauchen, steht in diesem Beitrag, lassen Sie mich es im Detail wiederholen:
1. Deklarieren Sie eine statische Variable LastTime.
2. ein Paar statischer Variablen mit den Präfixen s und p deklarieren.
3. Wenn IndicatorCounted()=0, werden alle in Schritt 1 und 2 erstellten Variablen gelöscht.
4. Zu Beginn der Schleife werden die Werte zurückgesetzt:
{
LastTime=Time[i];
pDir=cDir;
}
else
{
cDir=pDir;
}
Vielen Dank für Ihre Bereitschaft zu helfen!
Ich habe nicht viel Erfahrung im Schreiben von Indikatoren, daher gibt es einige Schwierigkeiten, für die ich eine Lösung suche, wie mein letzter Code oben beweist.
Die von Ihnen vorgeschlagene Variante bereitet mir Schwierigkeiten, da ich nicht verstehen kann, welche Variablen ich auf Null setzen soll, obwohl die Idee klar ist, dass die ursprünglich berechneten Werte beibehalten werden sollen.
Wenn Sie erklären können, warum meine Variante nicht funktioniert - ich beschränke die Berechnung auch auf einen Tick pro Balken, und nach der Idee sollten sich die Variablen nicht ändern, und es wird erwartet, dass diese Variante weniger kostspielig ist, da die Schleife nicht untätig bei jedem Tick läuft, im Gegensatz zu der von Ihnen vorgeschlagenen Variante.
Die Logik ist folgende:
Ich habe die folgende Nuance hier: Ich nahm diesen Code (Dank an Alekseu Fedotov):
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. 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));
}
Und jetzt stelle ich einen Scheck aus:
Und hier liegt der Haken, denn zunächst wird NumberOfBarCloseLastPos auf "-1" gesetzt. Folglich wird die erste Bestellung nie geöffnet.
Was können wir in einer solchen Situation tun? Oder habe ich vielleicht etwas missverstanden?