[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 667

 
artmedia70:

Freunde, ich kann nicht verstehen, warum es nicht funktioniert:

Wenn in der Schleife eine Position mit der magischen Zahl 5100 gefunden wird, muss die Schleife zu einer neuen Iteration übergehen:

... Dies geschieht jedoch nicht, und die ausgewählte Position mit einer magischen Zahl von 5100 nimmt an den weiteren Berechnungen als diejenige mit den meisten Verlusten teil...

Dies ist die Verriegelung... Und dann wird dementsprechend ein weiteres Schloss darauf gesetzt...

Hilf mir zu verstehen, wo der Hund versteckt ist...

Das ist alles, danke, nicht nötig. Ich habe den Hund selbst gefunden...
 

Bislang habe ich mit einfachen Funktionen gearbeitet, die einen einzigen Ausgabewert erzeugen.

Kann die Funktion die Werte von mehreren Variablen ausgeben? Zum Beispiel: Time_1, High_1, Low_1, Time_2, High_2, Low_2.

Ich danke Ihnen!

 
chief2000:

Kann eine Funktion die Werte von mehreren Variablen ausgeben?


Eine Funktion kann nur einen Parameter zurückgeben, aber niemand verbietet einer Funktion, mit Variablen zu arbeiten, die außerhalb der start()-Funktion deklariert sind(globale Variablen).
 
DDFedor:

Die Funktion kann nur einen Parameter zurückgeben, aber niemand verbietet der Funktion, mit Variablen zu arbeiten, die außerhalb der Funktion start() deklariert sind (globale Variablen).


Nehmen wir ein einfaches Beispiel - wenn [MA_1>=Ma_2], sollten Sie die Werte Time_1, High_1, Low_1 zurückgeben

für den Takt, bei dem die Überkreuzung stattgefunden hat. Dieses Modul in start() ist

 
chief2000:


oder?


Es muss aber beachtet werden, dass die Werte solcher Variablen bis zum nächsten Funktionsaufruf relevant sind. Daher müssen die Variablen SOFORT nach dem Funktionsaufruf verwendet werden. Dann enthalten die Variablen die berechneten Werte für DIESEN Funktionsaufruf.
 
DDFedor:

Es muss aber beachtet werden, dass die Werte solcher Variablen bis zum nächsten Funktionsaufruf relevant sind. Daher müssen die Variablen SOFORT nach dem Funktionsaufruf verwendet werden. Dann enthalten die Variablen die berechneten Werte für DIESEN Funktionsaufruf.

Ja, das ist verständlich. Ich danke Ihnen!

 
chief2000:

Bislang habe ich mit einfachen Funktionen gearbeitet, die einen einzigen Ausgabewert erzeugen.

Kann die Funktion die Werte von mehreren Variablen ausgeben? Zum Beispiel: Time_1, High_1, Low_1, Time_2, High_2, Low_2.

Und was hindert Sie daran, in der Funktionsdeklaration die Parameterübergabe per Referenz und nicht per Wert zu verwenden? Beispiel (Sprachgrundlagen/Variablen/Formale Parameter):

Es ist möglich, Parameter per Referenz zu übergeben. In diesem Fall wirkt sich die Änderung solcher Parameter auf die entsprechenden Variablen in der aufgerufenen Funktion aus, die als Referenz übergeben wird. Sie können Elemente von Arrays nicht per Referenz übergeben. Parameter können nur innerhalb der Grenzen eines einzelnen Moduls per Referenz übergeben werden, für Bibliotheksfunktionen ist eine solche Möglichkeit nicht vorgesehen. Um anzugeben, dass ein Parameter als Referenz übergeben wird, muss der Modifikator & hinter dem Datentyp stehen.

Beispiel:

void func(int& x, double& y, double& z[]) { double calculated_tp; ... for(int i=0; i<OrdersTotal(); i++) { if(i==ArraySize(z)) break; if(OrderSelect(i)==false) break; z[i]=OrderOpenPrice(); } x=i; y=calculated_tp; }

Arrays können auch per Referenz übergeben werden, wobei alle Änderungen in das ursprüngliche Array übernommen werden. Im Gegensatz zu einfachen Parametern können Arrays auch per Referenz an Bibliotheksfunktionen übergeben werden.

Beachten Sie, dass func() vom Typ void ist, aber seine Ausführung alle drei außerhalb deklarierten Parameter verändert, da alle drei mit dem Modifikator & versehen sind. Das z[]-Array ändert sich übrigens komplett.
 
Mathemat:

Und was hindert Sie daran, in der Funktionsdeklaration Parameter als Referenz und nicht als Wert zu übergeben? Beispiel (Sprachgrundlagen/Variablen/Formale Parameter):

Beachten Sie, dass die Funktion func() vom Typ void ist, ihre Ausführung aber alle drei außerhalb der Funktion deklarierten Parameter verändert, da alle drei mit dem Modifikator & versehen sind. Das z[]-Array ändert sich übrigens komplett.

Herzlichen Dank!

 
Wie man es macht! Wenn der letzte Handel unrentabel war, müssen Sie die Menge ändern, wenn nicht, dann nicht)?
 
rovlent:
Wie man das macht! Wenn der letzte Handel unrentabel war, sollten wir das Los wechseln, wenn nicht - nein?)


Zum Beispiel wie folgt

//=================================================
// Расчет размера позиции
//==================================================
double CalculateLots(){
   double Res=dLots;
   bool bProfit=true;
   int PrevTime=-1;
   double tmpLots;
   for (int i=0;i<OrdersHistoryTotal();i++){
      if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if (OrderSymbol()!=Symbol())                    continue;
      if (OrderMagicNumber()!=MAGIC)                  continue;
      if (OrderCloseTime()<PrevTime)                  continue;
      PrevTime=OrderCloseTime();
      if (OrderProfit()>0) bProfit=true; else bProfit=false;
      tmpLots=OrderLots();
   }
   double Lots_Step=MarketInfo(Symbol(), MODE_LOTSTEP);
   if (!bProfit) Res=tmpLots+Lots_Step;
   return(Res);
}

Erhöht um die vom DC eingestellte Stufe. Obwohl die Varianten unterschiedlich sein können

dLots - Standard-Positionsgröße