Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 1063

 
mould:
aber wie kann man diesen Modus aktivieren?

Markieren Sie das Kästchen unten links im Fenster des Testers:

 

Hallo Guru.

Können Sie mir sagen, ob ich auf dem richtigen Weg bin?

Zielsetzung: Einführung einer variablen Losgröße in Abhängigkeit von der Entfernung zum Hauptbahnhof.

In den Eingabeparametern:

extern double Lot1 = 0.01; // erste Variante von Lot
extern double Lot2 = 0.03; // zweite Variante des Loses
extern int Distan = 20; // Abstand zur SlowMA

Ma wurde im Expert Advisor Body definiert:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Darüber hinaus benötigen wir eine Bedingung: Wenn der aktuelle Preis (Bid oder Ask, je nach Richtung) bis zur Distant-Größe reicht, verwenden wir die erste Lot-Größe, wenn er darüber liegt, verwenden wir die zweite.

Das erste, was mir in den Sinn kam:

if (Ask-SlowMA<Distan) Lot == Lot1;
if (SlowMA-Bid<Distan) Lot == Lot1;
if (Ask-SlowMA>Distan) Lot == Lot2;
if (SlowMA-Bid>Distan) Lot == Lot2;

Aber es funktioniert nicht. Der Fehler liegt entweder in den Losverbindungen oder in der allgemeinen Logik.

Vielen Dank im Voraus.

 
delf699:

Hallo Guru.

Können Sie mir sagen, ob ich auf dem richtigen Weg bin?

Zielsetzung: Einführung einer variablen Losgröße in Abhängigkeit von der Entfernung zum Hauptbahnhof.

In den Eingabeparametern:

extern double Lot1 = 0.01; // erste Losgröße
extern double Lot2 = 0.03; // zweite Lot-Variante.
extern int Distan = 20; // Entfernung von der SlowMA

Im Hauptteil des Expert Advisors definiert Ma:

double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);

Dann brauchen wir eine Bedingung: Wenn der aktuelle Preis (Bid oder Ask, je nach Richtung) bis zur Distant-Größe reicht, verwenden wir die erste Lot-Größe, wenn er größer ist, verwenden wir die zweite.

Das erste, was mir in den Sinn kam:

if (Ask-SlowMA<Distan) Lot == Lot1;
if (SlowMA-Bid<Distan) Lot == Lot1;;
wenn (Ask-SlowMA>Distan) Lot == Lot2;
if (SlowMA-Bid>Distan) Lot == Lot2;

Aber es funktioniert nicht. Es handelt sich entweder um einen Fehler in Verbindung mit Lot oder um einen Fehler in der allgemeinen Logik.

Ich danke Ihnen im Voraus.

Welche Bedeutung haben Ask, Bid und SlowMA, wenn Ask-SlowMA größer als Distan sein kann?
 

Bid und Ask sind die letzten bekannten Geld- und Briefkurse, d.h. der aktuelle Kurs.

SlowMA ist meine umgetaufte Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

Die Abweichung des aktuellen Kurses (Bid oder Ask) vom Ma (SlowMA) kann größer oder kleiner als Distans sein. Dementsprechend sollten Sie entweder die erste oder die zweite Losgröße festlegen.

Ich habe Varianten gefunden, bei denen das Lot auf der Grundlage der Einlage oder der Anzahl der offenen Aufträge geändert wird, aber ich kann keine Reaktion auf einen solchen linearen Begriff erhalten.

Irgendetwas sagt mir, dass wir eine Funktion brauchen, die einen absoluten Wert zurückgibt. Das heißt, wenn wir sie auf eine negative Zahl anwenden, wird das Ergebnis positiv sein.

 
delf699:

Bid und Ask sind die letzten bekannten Geld- und Briefkurse, d.h. der aktuelle Kurs.

SlowMA ist meine umgetaufte Ma

(double SlowMA = iMA(NULL,60,periodSlowMA,0,MODE_EMA,PRICE_MEDIAN,0);)

Die Abweichung des aktuellen Kurses (Bid oder Ask) vom Ma (SlowMA) kann größer oder kleiner als Distans sein. Dementsprechend sollten Sie entweder die erste oder die zweite Losgröße festlegen.

Ich habe Varianten gefunden, bei denen das Lot auf der Grundlage der Einlage oder der Anzahl der offenen Aufträge geändert wird, aber ich kann keine Reaktion auf einen solchen linearen Begriff erhalten.

Irgendetwas sagt mir, dass wir eine Funktion brauchen, die einen absoluten Wert zurückgibt. Das heißt, wenn wir sie auf eine negative Zahl anwenden, wird das Ergebnis positiv sein.


Den absoluten Wert der Differenz zwischen Bid und MA brauchen wir vielleicht etwas später; da Sie den Hinweis nicht verstanden haben, lassen Sie uns jetzt gemeinsam rechnen

Angebot = 1,12730;

MA = 1,12530;

Distans = 20;

Frage:

Wann und ob 1,1273 bis 1,1253 wird mehr als 20 sein?

Aus irgendeinem Grund zeigt mein Taschenrechner nur 0,002 an. Aber das ist weit weg von 20...

 

Vielen Dank, ich verstehe. Oder Sie können es so machen:

dist=Distan*Punkt;

if (Ask-SlowMA<dist) Lot == Lot1;
if (SlowMA-Bid<dist) Lot == Lot1;
if (Ask-SlowMA>dist) Lot == Lot2;
if (SlowMA-Bid>dist) Lot == Lot2;

Wie mache ich das also richtig?

 
delf699:

Vielen Dank, ich verstehe. Oder Sie können es so machen:

dist=Distan*Punkt;

if (Ask-SlowMA<dist) Lot == Lot1;
if (SlowMA-Bid<dist) Lot == Lot1;
if (Ask-SlowMA>dist) Lot == Lot2;
if (SlowMA-Bid>dist) Lot == Lot2;

Wie mache ich das also richtig?

Und jetzt können wir MathAbs() verwenden, um nicht mehr zu viel darüber nachdenken zu müssen, was von was abgezogen werden soll. Und es gibt einen weiteren interessanten bedingten Operator

Lot = MathAbs(Ask-SlowMA) < dist ? Lot1 : Lot2;


Das bedeutet: Der Lot-Variable wird der Wert von Lot1 zugewiesen, wenn Ask- SlowMA kleiner als dist ist, ansonsten wird der Wert von Lot2 zugewiesen.

Noch eine Empfehlung: Vergessen Sie die Variable Punkt. Verwenden Sie _Point oder die Funktion Point()

 
Danke, eine schöne Lösung.
 
Ich habe bereits meine Augen gebrochen, ich kann nicht finden, wo Klammern fehlen, ich bekomme Fehler wie '(' - unausgewogene linke Klammer test.mq4 31 8 (ab der Zeile, in der TrendDetection() aufgerufen wird)

Ich brauche Hilfe, ich bin noch am Lernen...


#define BULL 1;
#define BEAR 2;

//--------------------------------------------------------------------
extern int SL = 200;
extern int TP = 200;
extern double Lots = 0,01;
extern double SarStep = 0,02;
extern double SarMaximum = 0.2;
extern int Schlupf = 5;
extern int Magic = 1;
extern int MaxOrder = 1;
string OrderComments = "Schnäppchen 1.0;
int Cnt=0;
datetime PreviousBar;

int start()
{
Cnt=BestellungenGesamt();
{
wenn (Cnt<MaxOrder)
{
if(NeuerBalken() == true)
{
if(TrendDetection() == BULL){
OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),Slippage,NormalizeDouble(Ask,Digits)-(SL*Point),NormalizeDouble(Ask,Digits)+(TP*Point),OrderComments,Magic,0,CLR_NONE);}
if(TrendDetection() == BEAR){
OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),Slippage,NormalizeDouble(Bid,Digits)+(SL*Point),NormalizeDouble(Bid,Digits)-(TP*Point),OrderComments,Magic,0,CLR_NONE);}
}
}
sonst
{return(0);}
}
zurück(0);
}

int TrendDetection()
{
double Sar = iSAR(NULL,0,SarStep,SarMaximum,1);
if(Close[1] > Sar) {return(BULL);}
if(Close[1] < Sar) {return(BEAR);}
return(0);}
bool NewBar()
{
if(VorherigerBalken<Zeit[0])
{
PreviousBar = Time[0];
return(true);
}
sonst
{
return(false);
}
return(false);
}
 
AlexeyVik:

Und jetzt können Sie MathAbs() anwenden, so dass Sie nicht mehr wissen müssen, was Sie wovon subtrahieren müssen. Und ein weiterer interessanter bedingter Operator


Das bedeutet: Der Lot-Variable wird der Wert von Lot1 zugewiesen, wenn Ask- SlowMA kleiner als dist ist, ansonsten wird der Wert von Lot2 zugewiesen.

Noch eine Empfehlung: Vergessen Sie die Variable Punkt. Verwenden Sie _Point oder die Funktion Point()

Was ist mit Point, scheint alles zu funktionieren?