Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 21
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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
(Ich brauche einen Hinweis, ich fange an zu verzögern)
Es gibt eine Konstruktion wie diese:
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 brauche einen Hinweis, weil ich langsam ins Stocken gerate)
Es gibt eine Konstruktion wie diese:
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 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.
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);
}
//+------------------------------------------------------------------+
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 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Vielen Dank, es funktioniert großartig!
PS. Ich habe gehört, dass das Ding auch in der fünften Klasse funktioniert?
Vielen Dank, es funktioniert großartig!
PS. Ich nehme an, dass das Ding in der fünften Klasse funktioniert?
{
//+--------------------------------------------------------------------+
//| -= 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;
}
}
}
}
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
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.
Entschuldige, Artem, aber ich möchte eine einfachere Lösung für dieses Problem zeigen
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.