Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 12

 
Artyom Trishkin:

Die Logik ist folgende:

  1. den letzten abgeschlossenen Auftrag anhand seiner Art und des Zeitpunkts seines Abschlusses finden
  2. finden wir die Bar, in der sie zum Zeitpunkt des Abschlusses dieser Bestellung geschlossen war
  3. Wenn der erhaltene Wert des Balkens größer als Null ist, können wir eine neue Position eröffnen, andernfalls nicht.
Ich entschuldige mich für die Unverschämtheit. Kann ich irgendwo ein Beispiel für einen solchen Code sehen?
 
Viachaslau Baiko:
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.

 
Dmitry Fedoseev:

Denken Sie über diesen Indikator nach. Es hat eine Menge statischer Variablen:

   static datetime LastTime=0;
   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:

if(Time[i]>LastTime)
        {
         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.

 
Alekseu Fedotov:

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.

Danke, ich werde es ausprobieren!
 

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 start()
   {
   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:

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];

         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?)

 
Timur1988:

Hallo! Könnten Sie mir bitte mit dem Algorithmus helfen!
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];
}
_______________________________________

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];

double 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?

 
-Aleks-:

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:

if(Time[i]>LastTime)
        {
         LastTime=Time[i];
         pDir=cDir;

        }
      else
        {
         cDir=pDir;
        }
 
Dmitry Fedoseev:

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:

if(Time[i]>LastTime)
        {
         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.

 
Artyom Trishkin:

Die Logik ist folgende:

  1. den letzten abgeschlossenen Auftrag anhand seiner Art und seiner Abschlusszeit finden
  2. finden wir die Grenze, an der sie zum Zeitpunkt des Abschlusses dieses Beschlusses geschlossen war
  3. Wenn der erhaltene Wert des Balkens größer als Null ist, können wir eine neue Position eröffnen, andernfalls nicht.

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:

if(УСЛОВИЕ && NumberOfBarCloseLastPos()>0)

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?