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

 
giannis1386:

Ich bin völlig verwirrt.

double blevel=OrderStopLoss()<Bid-Point*TS; funktioniert bei mir. SL geht nach dem Preis nur im Gewinn.

double slevel=OrderStopLoss()>Ask+Point*TS; Ich weiß nicht, wie ich dies zu else hinzufügen kann

Es ist kein Bool.

Nicht bool, sondern implizite Konvertierung genannt

Was machen Sie eigentlich? Schleppnetz?

 
Artyom Trishkin:

Kein bool, aber eine implizite Konvertierung

Was machen Sie eigentlich? Schleppnetz?

Das ursprüngliche Skript sollte nur geschlossen werden, wenn der Auftrag den Gewinn erreicht.
 
giannis1386:
Ja, ich habe versucht, ein Schleppnetz zu erstellen. Das ursprüngliche Skript sollte nur geschlossen werden, wenn der Gewinn der Bestellung erreicht war.
Kein Skript, ein EA. Sie verwechseln die Arten von Programmen. Das Skript wird einmal ausgeführt, nachdem es in das Diagramm geladen wurde, und dann gelöscht. Wenn sie nicht geschleift ist. Es ist unwahrscheinlich, dass jemand ein Skript in einer Schleife erstellt, um Positionen zu schließen.
 
giannis1386:
Ja, ich habe versucht, ein Schleppnetz zu erstellen.

Logik:

Wenn der Gewinn der aktuellen, in der Schleife ausgewählten Order größer ist als der eingestellte Wert, wenn ihr Stoploss kleiner (für Kauf)/größer (für Verkauf) ist als das berechnete Stoploss-Niveau, dann wird der Stop auf den neuen Wert verschoben.

Dies ist kurz und bündig.

 
Artyom Trishkin:
Hatte ich das nicht vorgeschlagen?

Ja, nun... Ich habe mir Ihren Code so unaufmerksam angeschaut, dass ich besser sagen sollte, ich habe ihn mir gar nicht angeschaut. Aber das ist schon halb so schlimm, dann habe ich so einen Blödsinn gesagt, für den ich mich fast schäme. Aus irgendeinem Grund hatte ich plötzlich diese verrückte Idee, dass ArrayMaximum() auf ein Array von Strukturen oder sogar ein separates Feld dieses Arrays angewendet werden könnte.

Ich bereue, ich rate niemandem, so zu denken, es funktioniert nicht...:)

 
Alexey Viktorov:

Ja, nun... Ich habe mir Ihren Code so unaufmerksam angeschaut, dass ich besser sagen sollte, ich habe ihn mir gar nicht angeschaut. Aber das ist schon halb so schlimm, dann habe ich so einen Blödsinn gesagt, für den ich mich fast schäme. Aus irgendeinem Grund hatte ich plötzlich diese verrückte Idee, dass ArrayMaximum() auf ein Array von Strukturen oder sogar ein separates Feld dieses Arrays angewendet werden könnte.

Ich bereue, ich rate niemandem, so zu denken, es funktioniert nicht...:)

Na ja... Und was ist mit mir? Ich habe mir Ihren Code auf dieselbe Weise angesehen und mich bei Ihnen bedankt - weil er wirklich kürzer ist...

Kurzum - beide sind einen Witz wert...

 
Artyom Trishkin:
Kein Skript, sondern ein Expert Advisor. Sie verwechseln die Arten von Programmen. Das Skript wird einmal ausgeführt, nachdem es in das Diagramm geladen wurde, und dann gelöscht. Wenn sie nicht geschleift ist. Kaum jemand wird ein Skript mit Schleifen erstellen, um Positionen zu schließen.

so der Autor:

Hier ist ein leicht modifiziertes Standard MT4 close.mq4 Skript

Legen Sie die Datei in den Ordner MetaTrader\experts\Scripts,

 
Artyom Trishkin:

Na ja... Und ich? Als ich einen Blick auf Ihren Code warf, verbeugte ich mich in Dankbarkeit - er ist wirklich kürzer...

Kurzum - beide sind einen Witz wert...

Nein, das sehe ich nicht so. Dieser Code

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

getestet und funktioniert. Es gibt einfache benutzerdefinierte Double-Arrays, und CopyRates() füllt ein Array von Strukturen und daher kann man nicht Maximum und Minimum wählen, indem man Funktionen der Arbeit mit Arrays verwendet.

 
giannis1386:

so der Autor:

Hier ist ein leicht modifiziertes Standard MT4 close.mq4 Skript

Legen Sie die Datei im Ordner MetaTrader\experts\Scripts ab,

Sein Skript funktioniert also nur einmal - ich habe es in den Chart eingefügt, das Skript hat funktioniert(Positionen geschlossen) und wurde dann wieder entladen.

Sie brauchen kein Skript, Sie brauchen einen EA.

 
Alexey Viktorov:

Nein, da bin ich anderer Meinung. Dieser Code

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

ist getestet und funktioniert. Hier handelt es sich um einfache benutzerdefinierte Double-Arrays, und CopyRates() füllt ein Array von Strukturen, so dass Sie Max und Min nicht mit Array-Funktionen auswählen können.

Nun, ich sage Ihnen, ich habe Ihren Code auch sehr aufmerksam beobachtet. Also - der Witz ist über mich.

SZY... Aber mein Code gibt vier Werte zurück: High/Low/Highest/Lowest, Ihrer gibt nur High und Low zurück, und mein Code prüft den Erfolg des Datenkopierens (wenn auch nicht alle), Ihrer nicht...

Auf diese Weise prüft mein Code, ob die erforderlichen Daten vollständig kopiert wurden:

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)==rangeBars) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Grund der Beschwerde: