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

 
Renat Akhtyamov:

Das Einzige, was hier zu beachten ist, ist, dass nach dem Schleifenblock i==x

In diesem Fall wird Array[i] nach for(...){} einen Array-Überlauffehler zurückgeben und das war's

Auf diese Weise schaffen Sie einen fruchtbaren Boden für mögliche Fehler, z. B. wenn Sie weiter unten im Code eine Variable j haben und sie versehentlich i nennen. Oder Sie schreiben [i] anstelle von Array-Index [1] und so weiter.
Ich habe hier nicht über einen bestimmten Code geschrieben, sondern über ein Beispiel, wie er aussehen könnte. Es kann durchaus vorkommen, dass es keine Array-Grenzen gibt und der Fehler schwer zu finden ist, so dass Sie viele wertvolle Minuten (wenn nicht sogar Stunden) damit verbringen, ihn zu finden.
 

(Ich brauche einen Hinweis, ich fange an zu verzögern)

Es gibt eine Konstruktion wie diese:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Es findetHoch/Tiefdes Bereichs in N Kerzen.

Frage: Wie kann man die gleichenHochs/Tiefs finden, aber nicht durch Schatten, sondern durch Körper?

 
Vitaly Muzichenko:

(Ich brauche einen Hinweis, weil ich langsam ins Stocken gerate)

Es gibt eine Konstruktion wie diese:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Es findetHoch/Tiefdes Bereichs in N Kerzen.

Frage: Wie kann man die gleichenHochs/Tiefs finden, aber nicht durch Schatten, sondern durch Körper?

Ich muss fmax(Open[i],Close[i]) für die Oberseite und fmin(Open[i],Close[i]) für die Unterseite der Kerze finden
 
Artyom Trishkin:
Ich muss nach fmax(Open[i],Close[i]) für den oberen und fmin(Open[i],Close[i]) für den unteren Bereich suchen

Das heißt, eine Schleife anstelle von zwei Zeilen, die nach High/Low suchen?

HighRange =iHigh(Symbol,0,iHighest(Symbol,0,MODE_HIGH,RangeBar,1));

LowRange =iLow(Symbol,0,iLowest(Symbol,0,MODE_LOW,RangeBar,1))

Dies ist für den EA benötigt, nicht der Indikator, es funktioniert richtig in der EA, aber wie man den Bereich durch Stellen zu finden - ich kann nicht von einem denken.

 
Vitaly Muzichenko:

Das heißt, eine Schleife anstelle von zwei Zeilen, die nach High/Low suchen?

HighRange =iHigh(Symbol,0,iHighest(Symbol,0,MODE_HIGH,RangeBar,1));

LowRange =iLow(Symbol,0,iLowest(Symbol,0,MODE_LOW,RangeBar,1));

Ich brauche es für Expert Advisor, nicht für Indikator, es funktioniert richtig in Expert Advisor, aber ich kann nicht herausfinden, wie man den Bereich von Stellen zu finden.

Ich habe ein Testskript geworfen. Sie kann ungenau sein, ich habe nicht daran gearbeitet. Ich hoffe, Sie werden es herausfinden.

//+------------------------------------------------------------------+
//|                                      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)>0) {
      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);
}
//+------------------------------------------------------------------+
Wenn Sie irgendwelche Fragen haben, fragen Sie einfach...
 
Artyom Trishkin:

Ich habe ein Testskript erstellt. Es kann zu Ungenauigkeiten kommen - ich habe es an Ort und Stelle geschrieben. Ich hoffe, Sie haben den Dreh raus.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Wenn Sie etwas brauchen, fragen Sie einfach...

Vielen Dank, es funktioniert großartig!

PS. Ich habe gehört, dass das Ding auch in der fünften Klasse funktioniert?

 
Vitaly Muzichenko:

Vielen Dank, es funktioniert großartig!

PS. Ich nehme an, dass das Ding in der fünften Klasse funktioniert?

Ja. Ich versuche, plattformübergreifenden Code zu erstellen. Oder mit minimalen Änderungen für den fünften.
 
Ich habe ein sehr schlechtes Händchen. Bitte helfen Sie mir, Stop-Loss für den Verkauf (slevel) hinzuzufügen.
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool   result;
double stop;
int    cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
 
Artyom Trishkin:

Ich habe ein Testskript beigefügt. Es mag ungenau sein, ich habe nicht an meiner Hand gearbeitet. Ich hoffe, Sie werden es verstehen.

Wenn Sie noch Fragen haben...

Tut mir leid, Artem, aber ich möchte die Lösung für dieses Problem auf einfachere Weise zeigen

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

Ich hoffe, dass jeder in der Lage sein wird, es in seinen Code zu schreiben und die erforderlichen Prüfungen hinzuzufügen. Die Funktionalität ist für mql4 und mql5 identisch.

 
Alexey Viktorov:

Entschuldige, Artem, aber ich möchte eine einfachere Lösung für dieses Problem zeigen

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

Ich hoffe, dass jeder in der Lage sein wird, dies in seinen Code zu schreiben und die notwendigen Prüfungen hinzuzufügen. Die Funktionalität ist für mql4 und mql5 identisch.

О! Ich danke Ihnen. Ich habe es selbst am Morgen noch nicht erraten... Es stimmt, die Arrays sollten auf Füllung geprüft werden. Beim Vierfachen habe ich das noch nicht gesehen, und beim Fünffachen werden die Daten oft nicht beim ersten Mal eingegeben, weil es keine historischen Daten gibt.

ZS: Sie sollten mehr schlafen - Ihre Gedanken werden in diese Richtung arbeiten.