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

 

warum diese Schleife nicht endet, wenn ... (Ich habe die zweite Bedingung für i < 2000 hinzugefügt, als mir klar wurde, dass die Schleife unendlich ist) MQL4

cv * tvp * (double)stop < ml


double tvp  = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE_PROFIT),
          vm   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),
          vs   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP),
          ml   = AccountEquity() * (risk / 100.0),
          cv   = -1.0;
   
   for(int i = 0; cv * tvp * (double)stop < ml && i < 2000; i++)
     {
      if( (vm + vs * (double)i) * tvp * (double)stop < ml ) { cv = vm + vs * (double)i; Print(i," ",cv,"/",ml); };
     };


 
Alexandr Sokolov:

warum diese Schleife nicht endet, wenn ... (Ich habe die zweite Bedingung für i < 2000 hinzugefügt, als mir klar wurde, dass die Schleife unendlich ist)



Die Schleife wird nicht beendet, bis

cv * tvp * (double)stop < ml

Um die Schleife zu beenden, wenn diese Bedingung erfüllt ist, können wir folgendes in den Schleifenkörper schreiben

for(int i = 0; i < 2000; i++)
{
  if(cv * tvp * (double)stop < ml)
    break
  ...
}

oder

for(int i = 0; cv * tvp * (double)stop >= ml; i++)
{
  if(i >= 2000)
    break;
  ...
}
 
Mihail Matkovskij:

In MQL4 nur auf diese Weise:

Ergebnis:


Nochmals vielen Dank für Ihre Hilfe. Ich wäre Ihnen sehr dankbar, wenn Sie mir auch sagen könnten, wie ich Folgendes tun kann...
Welche Funktion oder welches Sprachkonstrukt kann verwendet werden, um den Indexwert eines Array-Elements zu berechnen, das den Index vor der Sortierung hatte?

Hier habe ich Array A[] vor der Sortierung (die obere Zeile) und das gleiche Array nach der Sortierung. Ein Element mit dem Wert 5 befand sich vor der Sortierung bei Index 9
, und ein Element mit dem Wert 5 befindet sich nach der Sortierung bei Index 3.

Ich finde eine Zelle mit dem Wert 5 im sortierten Array und die Funktion speichert die Indexnummer dieser Zelle im sortierten Array in W, was gleich dem Index 3 ist

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

FRAGE: Wie kann nach ArrayBsearch() der Wert des Index einer Zelle mit dem Wert 5 in einer Variablen gespeichert werden, die ein unsortiertes Array enthält?

Das heißt, speichern Sie den Wert von 9.
Vielen Dank für Ihre Hilfe.

 
 

Hallo zusammen. Wer weiß, wie man einen negativen Wert in einem benutzerdefinierten Indikator einstellt und ihn zum Funktionieren bringt, z. B. "Verschiebung des Indikators relativ zum Preisdiagramm"?

Beispiel: Wenn Sie einen Wert von -4 in den Indikator für den gleitenden Durchschnitt eingeben, bewegt er sich relativ zum Diagramm nach links - und funktioniert.

Aber wenn Sie diesen Wert in den Code des Indikators einfügen, dann funktioniert der Indikator nicht mehr und zeigt alle TF-Werte rot an.

Dateien:
 
ANDREY:

Ich danke Ihnen nochmals für Ihre Hilfe. Ich wäre Ihnen sehr dankbar, wenn Sie mir auch sagen könnten, wie ich Folgendes tun kann...
Welche Funktion oder welches Sprachkonstrukt kann verwendet werden, um den Indexwert eines Array-Elements zu berechnen, den dieses Element vor der Sortierung hatte?

Hier habe ich das Array A[] vor der Sortierung (die obere Zeile) und das gleiche Array nach der Sortierung. Ein Element mit dem Wert 5 befand sich vor der Sortierung bei Index 9
, und ein Element mit dem Wert 5 befindet sich nach der Sortierung bei Index 3.

Ich finde eine Zelle mit dem Wert 5 im sortierten Array und die Funktion speichert die Indexnummer dieser Zelle im sortierten Array in W, was gleich dem Index 3 ist

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

FRAGE: Wie kann nach ArrayBsearch() der Wert des Index einer Zelle mit dem Wert 5 in einer Variablen gespeichert werden, die ein unsortiertes Array enthält?

Das heißt, speichern Sie den Wert von 9.
Vielen Dank für Ihre Hilfe.

aber sortieren Sie die Daten nicht willkürlich und ohne globalen Zweck.

Aus dem aktuellen Projekt: Nehmen Sie ein (kurzes) Array, die Ausgabe wird Element-Indizes in der richtigen Reihenfolge sein:

void BubleSortIndex5(double &data[5],int &index[5])
{
   for(int i=0;i<5;i++)
      index[i]=i;
   for(int i=0;i<4;i++) {
      for(int j=1;j<5;j++) {
         if (data[index[i]]>data[index[j]]) {
            int tmp=index[i];
            index[i]=index[j];
            index[j]=tmp;
         }
      }
   }
}


für größere Arrays müssen wir den Sortieralgorithmus ändern (Bubbling funktioniert nicht für größere Arrays) - ändern Sie ihn.

Die wichtigste Botschaft lautet: Lassen Sie die Originaldaten unangetastet. Arbeiten Sie entweder mit Referenzen oder, noch besser, mit Array-Indizes. Sonst gehen Informationen verloren, die später dringend benötigt werden.

 
ANDREY:

Ich danke Ihnen nochmals für Ihre Hilfe. Ich wäre Ihnen sehr dankbar, wenn Sie mir auch sagen könnten, wie ich Folgendes tun kann...
Welche Funktion oder welches Sprachkonstrukt kann verwendet werden, um den Indexwert eines Array-Elements zu berechnen, den dieses Element vor der Sortierung hatte?

Hier habe ich das Array A[] vor der Sortierung (die obere Zeile) und das gleiche Array nach der Sortierung. Ein Element mit dem Wert 5 befand sich vor der Sortierung bei Index 9
, und ein Element mit dem Wert 5 befindet sich nach der Sortierung bei Index 3.

Ich finde eine Zelle mit dem Wert 5 im sortierten Array und die Funktion speichert die Indexnummer dieser Zelle im sortierten Array in W, was gleich dem Index 3 ist

ArraySort(А,10,0,MODE_ASCEND);

W = ArrayBsearch( A,5,WHOLE_ARRAY,0,MODE_ASCEND);

FRAGE: Wie kann nach ArrayBsearch() der Wert des Index einer Zelle mit dem Wert 5 in einer Variablen gespeichert werden, die ein unsortiertes Array enthält?

Damit soll der Wert 9 gespeichert werden.
Vielen Dank für Ihre Hilfe.

Hierfür müssen Sie zwei Fragen beantworten:Was würden Sie tun, wenn:

1. Es werden mehrere Werte von 5 in verschiedenen Zellen des Feldes vorhanden sein.

2. Es wird kein Wert 5 im Array vorhanden sein.

Da die FunktionArrayBsearch (für sortierte Daten) im ersten Fall den ersten gefundenen Index liefert, bei dem der Zellenwert 5 ist, wird im zweiten Fall ein Element in der Nähe des Wertes 5 gefunden. Wie Sie mit einem unsortierten Array umgehen wollen, ist mir nicht klar.

 
sla100:

Hallo zusammen. Wer weiß, wie man einen negativen Wert in einem benutzerdefinierten Indikator einstellt und ihn zum Funktionieren bringt, z. B. "Verschiebung des Indikators relativ zum Preisdiagramm"?

Beispiel: Wenn Sie einen Wert von -4 in den Indikator für den gleitenden Durchschnitt eingeben, verschiebt er sich relativ zum Diagramm nach links - und funktioniert.

Wenn Sie jedoch einen solchen Wert in den Indikatorcode eingeben, funktioniert der Indikator nicht mehr und zeigt alle TF-Werte rot an.

SetIndexShift.

Die Verschiebung wird auch in iMA angegeben:

iMA

Gibt den Wert destechnischen IndikatorsGleitender Durchschnittzurück.

doubleiMA(
stringsymbol,// Symbolname
inttimeframe,// Zeitrahmen
intma_period,// Zeitraum
intma_shift,// Durchschnitt verschieben
intma_method,// Mittelungsmethode
intangewandter_Preis,//Preistyp
intshift// shift
);

Parameter

Symbol

[in] Symbolname des Symbols, dessen Daten zur Berechnung des Indikators verwendet werden sollen.NULL bedeutet aktuelles Symbol.

Zeitrahmen

[in] Zeitraum. Kann einer der Werte der AufzählungENUM_TIMEFRAMES sein. 0 bedeutet die Periode des aktuellen Diagramms.

ma_Zeitraum

[in] Zeitraum der Mittelwertbildung für die Berechnung des Indikators.

ma_shift

[in] Verschiebung des Indikators relativ zum Preisdiagramm.

ma_method

[in] Mittelungsmethode. Kann einer der Werte der AufzählungENUM_MA_METHOD sein.

angewandter_Preis

[in] Angewandter Preis. Kann ein beliebiger Wert aus der AufzählungENUM_APPLIED_PRICE sein.

Schicht

[in] Index des aus dem Indikatorpuffer gewonnenen Wertes (Verschiebung relativ zum aktuellen Takt um eine bestimmte Anzahl von Perioden zurück).

Zurückgegebener Wert

Wertdes technischen Indikators Gleitender Durchschnitt.

Beispiel:

AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);

https://docs.mql4.com/ru/indicators/ima

Hier ist ein vorgefertigtes Beispiel, aber in MQL5: https://www.mql5.com/ru/docs/indicators/ima,

die leicht in MQL4 übersetzt werden können.

SetIndexShift - Пользовательские индикаторы - Справочник MQL4
SetIndexShift - Пользовательские индикаторы - Справочник MQL4
  • docs.mql4.com
При положительном значении изображение линии смещается вправо, при отрицательном - влево. Значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.
 

Es gibt keine Verschiebung bei den Indikatoreinstellungen. Ich bin in den Code gegangen und habe Shift -4 in den Code eingefügt, woraufhin der Indikator nicht mehr funktioniert hat - er zeigt an, dass alle TFs rot sind. Ich sitze hier und frage mich, warum.

Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Торговые советники и собственные индикаторы - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Среди программ для автоматического трейдинга можно выделить две большие категории: торговые роботы и индикаторы. Первые предназначены для совершения торговых операций на рынках, а вторые — для анализа котировок и выявления закономерностей в их изменении. При этом индикаторы могут использоваться непосредственно в роботах, образуя полноценную...
 
Mihail Matkovskij:

Zu diesem Zweck müssen Sie zwei Fragen beantworten:Was werden Sie tun, wenn

1. Es wird mehrere Werte von 5 geben, die in verschiedenen Zellen des Feldes liegen.

2. Der Wert 5 wird nicht im Array enthalten sein.

Da die FunktionArrayBsearch (für sortierte Daten) im ersten Fall den ersten gefundenen Index liefert, bei dem der Zellenwert 5 ist, wird im zweiten Fall ein Element in der Nähe des Wertes 5 gefunden. Wie Sie mit einem unsortierten Array umgehen wollen, ist mir nicht klar.

Vielen Dank für Ihre schnelle Antwort. In meinem Fall ist jeder Wert eines Array-Elements eindeutig und existiert nur in einer einzigen Instanz. Das heißt, dass der Wert 5, wie andere Werte auch, nicht wiederholt wird.

In meinem Fall darf der Wert 5 in einem unsortierten Array nicht existieren. Das bedeutet, dass einige Zellen im unsortierten Array leer sein können.
Aber wenn der Wert 5 nicht im unsortierten Array ist, dann kann ich den Wert 5 nicht als zweiten Parameter in der Funktion ArrayBsearch() angeben. Nur Werte, die notwendigerweise im unsortierten Array vorhanden sind, gelangen in diese Funktion.
Vielen Dank für Ihre Hilfe

Grund der Beschwerde: