[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 402

 

Das ist meine Idee:

Ich eröffne einen Auftrag, und dann hängt es davon ab, mit welchem Saldo er abgeschlossen wurde.

Wenn der Saldo kleiner als Null ist, verbuchen wir den Verlust, und wenn er größer als Null ist, fangen wir wieder von vorne an.

Wenn unser Verlust kleiner als Null ist, haben wir ihn festgelegt und einer Variablen zugewiesen, zum Beispiel: Minus

Minus = OrderProfit (- 45 Cents);

KontoAqviti + Minus + mein Wert (mein Gewissen)

weiter bei der nächsten Bestellung

Wenn der Gewinn dieses Auftrags höher ist als AccountAqviti + Minus + mein Wert (mein Gewissen), dann schließen wir den Auftrag; wenn nicht, gehen höher als Null, dann fixieren wir es:

(AccountAqviti + OrderProfit) - (AccountAqviti + Minus + mein Wert (mein Gewissen)) = Minus

wenn Minus >= 0 ist, dann ist Minus = 0;

 
belck:

Genau darum geht es bei meiner Idee:


Man muss mit einer Idee zu Service Work gehen, und hier ist es üblich, bestimmte Situationen mit einem bestimmten Code zu behandeln.
 

Guten Tag! Ich würde gerne einen Indikator erstellen, der einen Kanal auf Indikatoren wie MASD, AO und ähnlichen anzeigt. Dieser Indikator überlagert das Fenster der Basisindikatoren (MASD, AO und ähnliche) und wird als parallele Linien über und unter 0 gezeichnet. Diese Linien sind als Durchschnitt der maximalen Spitzenwerte (über 0) und der minimalen Tiefstwerte (unter 0) für den angegebenen Zeitraum definiert.
Ich versuche, den AO-Indikator als Beispiel zu verwenden, aber er funktioniert nicht.
Algorithmus:
wir schreiben die Indikatorwerte in ein Array,
wir durchlaufen dieses Array auf der Suche nach Spitzen / Tälern,
wir schreiben sie in bestimmte Arrays,
wir finden den Durchschnittswert von Spitzen, dann Tälern,
wir weisen den erhaltenen Wert dem Indikatorpuffer zu.
In diesem Schritt wird im Code nicht der Kanal (der an 0 klebt) auf dem Indikator definiert, sondern der Durchschnittswert der maximalen Spitzen und der Durchschnittswert der minimalen Talsohlen.
Die Definition von Höchst- und Tiefstwerten kann aus dem Code entfernt und als Funktion ausgeführt werden, aber im Moment habe ich es so gelassen - es macht keinen Unterschied.
Probleme:
1. Das Terminal hängt sich auf (erheblich)
2. Die Zeilen werden nicht als Durchschnitt angezeigt, sondern als Max/Min für einen bestimmten Zeitraum.
Es hat lange gedauert, bis ich es herausgefunden habe, aber ich kann die Ursache für die Probleme nicht herausfinden. Können Sie mir bitte helfen, meinen Code zu korrigieren oder mir einen Link zum Quellcode ähnlicher Probleme geben und ich werde versuchen, ihn weiter zu korrigieren. Vielen Dank im Voraus.

int start(){
    int limit=Bars-IndicatorCounted();
    for(int i=limit;i>=0;i--){
//     if (IsNewBar()){
       int j=0;
       for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 
             AO[j]=AO(d);                            // Запишем данные инд. в цикле в массив
             Print("АО-",AO[j],"-",d,"-",i);
             j++;
       }             
       int k_up=0,k_dw=0; double SDw=0,SUp=0,P1=0,P2=0;      
       //собираем экстремумы выше 0
       for (int p=4;p<=period-1; p++){          
         if (AO[p]>AO[p+1] && AO[p]>AO[p-1] 
            && AO[p+1]>AO[p+2]
            && AO[p+2]>AO[p+3]
            && AO[p+3]>0
            && AO[p-1]>AO[p-2]
            && AO[p-2]>AO[p-3]
            && AO[p-3]>0){                           // Нашли макс
            ArrayResize(Up, k_up+1);                 // Размер массива донышек под кол-во найденных донышек
            Up[k_up]=AO(p);                          // Заносим значение пика в массив                 
            Print("значение пика-",Up[k_up],"-",p);           
            SUp=SUp+Up[k_up];
            P1=SUp/(k_up+1);            
            k_up++;                                  // Увеличиваем индекс массива донышек                                 
         }
         //собираем впадины ниже 0
         if (AO[p]<AO[p+1] && AO[p]<AO[p-1] 
            && AO[p+1]<AO[p+2]
            && AO[p+2]<AO[p+3]
            && AO[p+3]<0
            && AO[p-1]<AO[p-2]
            && AO[p-2]<AO[p-3]
            && AO[p-3]<0){                           // Нашли мин
            ArrayResize(Dw, k_dw+1);                 // Размер массива донышек под кол-во найденных донышек
            Dw[k_dw]=AO[p];                          // Заносим значение пика в массив                                            
            Print("значение донышка-",Dw[k_dw],"-",p);                                           
            SDw=SDw+Dw[k_dw];
            P2=SDw/(k_dw+1);           
            k_dw++;// Увеличиваем индекс массива донышек   
         }         
       }
       level1[i]=P1;
       level2[i]=P2;
    }
    return(0);
}
//+------------------------------------------------------------------+
double AO(int a){double AO=iAO( NULL, 0, a);
     return(AO);
}
 
Vielen Dank! Sehr hilfreich!
 
LOA:

Guten Tag!
Probleme:

1. das Terminal hängt (erheblich)

for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 


Die Vergrößerung eines Arrays in einer Schleife ist grausam, deshalb bleibt sie hängen. Vergrößern Sie die Größe einmal auf einmal. Oder verwenden Sie Zeitreihen auf einmal


P.S. siehe persönliche Nachrichten

 

Wie kann ich eine Schleife durch eine Variable vom Typ String ziehen?

Beispiel

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
Wie kann ich diese Konstruktion durch eine Schleife ersetzen?
 
Guten Tag, könnten Sie mir bitte sagen, wie ich eine Bedingung schreiben kann, die besagt, dass, wenn der Gewinn eines offenen Auftrags ein Prozent beträgt, dieser Auftrag geschlossen wird?
 
first_may:
Guten Tag, könnten Sie mir bitte sagen, wie ich eine Bedingung schreiben kann, die besagt, dass, wenn der Gewinn eines offenen Auftrags ein Prozent beträgt, dieser Auftrag geschlossen wird?

Verwenden Sie die Funktion.

https://www.mql5.com/ru/forum/131859/page3#434225

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
 
Rorschach:

Wie kann ich eine Schleife durch eine Variable vom Typ String ziehen?

Beispiel

Wie kann ich dieses Konstrukt durch eine Schleife ersetzen?

   string asSymbols[3] = {"EURUSD", "GBPUSD", "AUDUSD"};
   double A[3] = {0};
   for (int i = 0; i < ArraySize( sSymbols) && i < ArraySize( A); i++) A[i]= iClose(asSymbols[i], 0, 0);
 
Zhunko:



Dankeschön
Grund der Beschwerde: