Wie bekomme ich den Indikator dazu, zu filtern, anstatt zu alarmieren? - Seite 6

 
elihayun:
Bis jetzt sehe ich kein Problem (codeorientiert)

Aber logisch betrachtet, sieht es so aus

if(isCrossed == 1 && Ask < upLevel)

Sie prüfen nicht, ob sie nahe beieinander liegen, sondern nur, ob der Preis unter der Linie liegt.

Das ist es, was ich wollte... filtern... Ich möchte die Zeile als Möglichkeit verwenden, um Trades zu verbieten. Das war die Absicht. Wenn ich die Breite der Linie selbst ändern kann, muss ich keine Möglichkeit schaffen, um zu sehen, ob sie nahe an der Linie liegt, sondern kann einfach die Linie selbst als Begrenzer verwenden. Wenn ich die Breite der Bänder ändere, ist es dasselbe, als ob es einen weiteren Faktor gäbe, der prüft, wie nah er an der Linie ist. Indem ich dies zu einer Bedingung für die Eingabe mache, filtere ich oder sollte verhindern, dass die Kaufaufträge geöffnet werden, wenn sie nicht unter der oberen Linie liegen, oder dass die Verkaufsaufträge geöffnet werden, wenn sie über der unteren Linie liegen.

Ich bin verwirrt, warum dies zu Bestellfehlern führen würde?

 

Es scheint, dass der Fehler auf eine falsche Losgröße zurückzuführen ist, die etwas mit den MM-Parametern zu tun hat...

Ich ändere meinen Fokus etwas...zurück zu meinem origianl Fokus...

Ich bin zu dem Schluss gekommen, dass der Trendband-Indikator nicht die Art von Filtereffekt erzeugt, die ich mir wünsche. Er tut es einfach nicht.

Ursprünglich hatte ich den Kanalindikator "ang_AutoCh_HL-v1" im Auge. Ich kann sehen, dass er mir den gewünschten Filtereffekt liefern würde, aber er hat keine Puffer, die ich aufrufen könnte...also.....

Kann ich darin Puffer erstellen? für die Linienwerte? von Objekt 1 und Objekt 2? damit ich sie als Unterstützung und Widerstand im EA verwenden kann?

Hier ist der Indikator...

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

return(0);}

//*******************************

int deinit() {

ObjectDelete("1"+sName);

ObjectDelete("0"+sName);

ObjectDelete("2"+sName); }

//*******************************

int start() {

int i,n;

//------------------------------------------------------------------------------

if (f==1) {

p1=iBarShift(Symbol(),Period(),ObjectGet("1"+sName,OBJPROP_TIME1));

p0=iBarShift(Symbol(),Period(),ObjectGet("0"+sName,OBJPROP_TIME1));

p2=iBarShift(Symbol(),Period(),ObjectGet("2"+sName,OBJPROP_TIME1));

if (fp==0 && p!=p1) {p=p1; fp=1;}

if (fp==0 && p!=p0) {p=p0; fp=1;}

if (fp==0 && p!=p2) {p=p2; fp=1;}

}

//====================================================

sx=0; sy=0; sxy=0; sx2=0;

for (n=0; n<=p; n++) {sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);}

aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);

//----------------------------------------------------

for (i=0; i<=p; i++) {

lr=bb+aa*i;

dh=High-lr; dl=Low-lr;

//----------------------------------------------------

if (i<p/2) {if (i==0) {dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;}

if (dh>=dh_1) {dh_1=dh; ai_1=i;}

if (dl<=dl_1) {dl_1=dl; bi_1=i;}}

//----------------------------------------------------

if (i>=p/2) {if (i==p/2) {dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;}

if (dh>=dh_2) {dh_2=dh; ai_2=i;}

if (dl<=dl_2) {dl_2=dl; bi_2=i;}}}

//-------------------------------------

lr0=bb; lrp=bb+aa*(i+p);

//===================================================

if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;

if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;

if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) {if (MathAbs(dh_1-dh_2)=MathAbs(dl_1-dl_2)) f=2;}

//=================================================

if (f==1) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

if (i==0 || i==p/2) dhm=0.0;

if (High-hai>dhm && i<p/2) {ai_1=i; f1=1;}

if (High-hai>dhm && i>=p/2) {ai_2=i; f1=1;} }

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

dli=Low-hai;

if (i==0) dlm=0.0; if (dli<dlm) dlm=dli;}

ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);

hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);

//----------------------------

price_p1=hap;

price_p0=hap+dlm/2;

price_p2=hap+dlm;

price_01=ha0;

price_00=ha0+dlm/2;

price_02=ha0+dlm;

}

//=================================================

if (f==2) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

if (i==0 || i==p/2) dlm=0.0;

if (Low-lai<dlm && i<p/2) {bi_1=i; f1=1;}

if (Low-lai=p/2) {bi_2=i; f1=1;}}

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

dhi=High-lai;

if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi;}

la0=Low*(0-bi_2)/(bi_1-bi_2)+Low*(0-bi_1)/(bi_2-bi_1);

lap=Low*(p-bi_2)/(bi_1-bi_2)+Low*(p-bi_1)/(bi_2-bi_1);

//----------------------------------------------------------------

price_p1=lap;

price_p0=lap+dhm/2;

price_p2=lap+dhm;

price_01=la0;

price_00=la0+dhm/2;

price_02=la0+dhm;

}

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//-----------------------------------------------------------------

ObjectSet("1"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_STYLE,STYLE_DOT);

ObjectSet("2"+sName,OBJPROP_COLOR,col);

//---------------------------------------------

ObjectSet("1"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("1"+sName,OBJPROP_PRICE1,price_p1);

ObjectSet("1"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("1"+sName,OBJPROP_PRICE2,price_01);

ObjectSet("0"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("0"+sName,OBJPROP_PRICE1,price_p0);

ObjectSet("0"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("0"+sName,OBJPROP_PRICE2,price_00);

ObjectSet("2"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("2"+sName,OBJPROP_PRICE1,price_p2);

ObjectSet("2"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("2"+sName,OBJPROP_PRICE2,price_02);

//==================================================================

f=1; p1=p; p0=p; p2=p; fp=0;

//*************************************************************************************

return(0);}

//=====================================================================================[/PHP]

here is what I'm trying to add a buffer so I can extract the values I need...

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double ExtBufferResistance[];

double ExtBufferMiddle[];

double ExtBufferSupport[];

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

SetIndexBuffer (4, ExtBufferResistance); //--resistance line

SetIndexBuffer (5, ExtBufferMiddle); //--middle line

SetIndexBuffer (6, ExtBufferSupport); //--support line

return(0);}

//*******************************

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//------------------make indicator buffer for EA-------------------------------------

somehow get object 1 to put it's value into buffer 4

somehow get object 0 to put it's value into buffer 5

somehow get object 2 to put it's value into buffer 6

//------------------------draw chart-------------------------------------------------

[/php]

and then upgrade this EA....

[PHP]#property copyright "Copyright 2005, Chris Battles."

#property link "cbattles@neo.rr.com"

extern double TrailingStop = 5;

extern double TrailingStopTrigger = 19;

extern double StopLoss = 186;

extern double TakeProfit = 250;

extern double Lots = 0.4;

//---- ang_AutoCh_HL-v1 and Filter Parameters

extern int Hours=24;

extern color col=SkyBlue;

extern double TF = 30; //--which bar period for the custom indicator to use

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start(){

int cnt, ticket;

if(Bars<100){

Print("bars less than 100");

return(0);

}

double ema1a=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);

double ema2a=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,0);

double ema3a=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0);

double ema1b=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);

double ema2b=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);

double ema3b=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1);

//----------channel filter

double resistance = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 4, 0);

double support = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 6, 0);

//--- end channel filter

and then make the order logic have second condition for entry...

[PHP]if (ema3bema1a && Ask < resistance){

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);

if(ticket>0){

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

if (ema3b>ema1b && ema3a support){

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);

if(ticket>0) {

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

Mein Knackpunkt ist eigentlich, die Werte aus dem Indikator herauszuholen, damit der EA sie verwenden kann... Ich denke, ich kann den Rest gut bewältigen, wenn Sie mir nur zeigen könnten, wie ich die Werte aus dem Indikator in den EA bekomme.

 

Ich weiß wirklich nicht, was ich mit Puffern machen soll. Ich gehe werfen setbuffer Zeilen in und ich weiß nicht einmal, ob es notwendig ist oder was

 
raff1410:
Hallo...

Indycator mit Puffern,

Sie können res && sup wie folgt aufrufen:

double resistance = iCustom(NULL,TF, "Channel",24,col,0,0);

double support = iCustom(NULL,TF, "Kanal",24,col,2,0);

Raff

oh man see!! that's what I'm talking bout....I can hardly wait to try this to see if it will work.

Jetzt muss ich dieses Zeug in den oberen Teil der Ea setzen? um dem Indikator zu sagen, welche Einstellungen er verwendet?

//---- Kanal- und Filterparameter

extern int Stunden=24;

extern color col=SkyBlue;

extern double TF = 30; //--welche Balkenperiode für den benutzerdefinierten Indikator verwendet werden soll

und dann...

double resistance = iCustom(NULL,TF, "Channel",Hours,col,0,0);

double support = iCustom(NULL,TF, "Channel",Hours,col,2,0);

 

Ok, ich bekomme wieder diese Fehlermeldung 130, was ist das schon wieder?

oh ja stop loss zu nah..ok...

 

Hallo...

Indycator mit Puffern,

kanal.mq4

Sie können res && sup wie folgt aufrufen:

double resistance = iCustom(NULL,TF, "Channel",24,col,0,0);

double support = iCustom(NULL,TF, "Kanal",24,col,2,0);

Raff

Dateien:
channel.mq4  6 kb
 

Neues Problem...

Ich habe mehrere Versionen von Stops, die auf diese ... Die Drawdowns kommen von einem Fehler der Trailing-Stop-Trigger zu engagieren. Wenn es nicht einrasten, dann ist der Fallback "Equity Stop", was die Position schließt und DAS ist, was schmerzt...

Anhand der vielen kleinen Drawdowns kann ich sehen, dass der Trailing-Stop, wenn er ausgelöst wird, dem Konto nicht annähernd so viel Schaden zufügt. Es kann viele dieser Verluste verkraften und ausgleichen, aber es kann die größeren Verluste nicht ausgleichen, die durch das Schließen des Equity-Stops entstehen.

so....

Gibt es eine Möglichkeit, die Position zu schließen, wenn sich der auf die Eröffnung folgende Bar nicht genug bewegt, um den Trailing-Stop zu aktivieren?

Ich habe damit begonnen, indem ich die aktuelle Periode sowie die drei vorhergehenden Perioden aus den gleitenden Durchschnittslinien abrufe. Mein Gedanke war, dass das Signal und die Bestätigung des einen Balkens aus den drei Perioden vor der aktuellen Periode stammen könnten und die aktuelle Periode verwendet werden könnte, um zu sehen, ob sie sich nun genug bewegt hat, um den Trailing-Stop auszulösen. Ich dachte, dass diese Bedingung als || oder Bedingung zum Equity Stop hinzugefügt werden könnte, der alle offenen Aufträge schließt.

Was mich verblüfft hat, ist die Frage, wie man feststellen kann, ob sich der Kurs genug bewegt hat, um den Trailing-Stop auszulösen, da er sich bei einer Long-Position nach oben bewegen muss, bei einer Short-Position jedoch nach unten. Die Erkennung des Trailing-Stop-Triggers muss also darauf achten, ob es sich um eine Long- oder Short-Position handelt, um zu wissen, in welche Richtung sie sich bewegen muss, um den Trigger auszulösen. Ich bin mir nicht sicher, wie man das erkennen kann.

Ich kann mir vorstellen, dass dieser Bericht mit den großen Draw-Downs nicht größer aussieht als die kleinen, und wenn das so wäre, wäre er profitabel.

Dateien:
whatever2.htm  292 kb
whatever2.gif  6 kb
 

eine weitere Optimierung erforderlich...

Dies IST das Schließen von Verlustpositionen, bevor sie groß werden... es ist auch das Schließen von Gewinnpositionen, bevor sie auch groß werden

die Sache, die es braucht, um zu tun, schließen Sie die Position nur, wenn es nicht genug in den ersten zehn Minuten bewegt, um den Trailing-Stop auslösen ... es muss nur 1 Pip zu tun, dass ich denke ... so bin ich nicht für viel in den ersten zehn Minuten fragen. Eigentlich will ich nur sicherstellen, dass er nicht den Schwanz einzieht und die Position sofort nach ihrer Eröffnung wieder aufnimmt. Das sind diejenigen, die verlieren....

also...., ob man es so einrichten kann, dass es erkennt, ob der Trailing-Stop ausgelöst wurde, und wenn ja, ihn laufen lässt!! den Trailing-Stop schließen lässt, anstatt ihn in Abhängigkeit von der Zeit zu schließen. Der Zeit-Schließungsparameter soll nicht die primäre Schließungsstrategie sein, sondern nur die Schließung verwalten, bis der Trailing-Stop übernimmt.

Dateien:
whatever3.htm  304 kb
whatever3.gif  6 kb
 

Das tut nicht das, was ich beabsichtigt habe... Ich kann mir keinen Reim auf diese Ergebnisse machen.

https://c.mql5.com/forextsd/forum/9/whatever3.htm

Wenn ich es mir ansehe, ist fast alles nur 10 Minuten oder weniger offen (ich habe eingestellt, dass es in zehn Minuten geschlossen wird, wenn die Kriterien nicht erfüllt sind), mit nur wenigen Ausnahmen wie Auftrag #52, der 19 Minuten offen ist, und #48, der 15 Minuten offen ist.

Dieser Teil funktioniert nicht... OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice()

Dies funktioniert auch nicht... if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

Wir müssen prüfen, ob der Trailing-Stop ausgelöst wurde. Ich möchte nicht, dass dieser auf der Grundlage des Preises geschlossen wird. Ich möchte, dass es auf der Grundlage des nicht ausgelösten Trailing-Stops geschlossen wird. Mir ist klar, dass ich ursprünglich gesagt habe, dass wir prüfen müssen, ob der Kurs genug gestiegen ist, um den Trailing-Stop auszulösen, aber ich verstehe den Code für den Auslöser des Trailing-Stops nicht ganz, und ich weiß nicht, ob er auch nach dem angegebenen Intervall wiederholt wird und nach 15 oder 19 Minuten geschlossen wird, wenn das Kriterium des Bid+Profit den OrderOpenPrice ergibt. Dies macht sich selbst zum vorherrschenden Schließungskriterium anstelle des Stop-Gap-Kriteriums, bis der Trailing-Stop ausgelöst wird...so scheint es jedenfalls...

//+------------------------------------------------------------------+

void CloseOrder()

{

double Profit=ThresholdMove*Point;

int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)

{

if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);

}

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

}

}

}

}

//+------------------------------------------------------------------+[/PHP]

Somewhere in this closing strategy there must be a way to detect if it's been triggered or not...

[PHP]//+------------------------------------------------------------------+

//| Variable End |

//+------------------------------------------------------------------+

//Check position

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Buy) |

//+------------------------------------------------------------------+

if (CloseBuy1_1 == CloseBuy1_2) Order = SIGNAL_CLOSEBUY;

//+------------------------------------------------------------------+

//| Signal End(Exit Buy) |

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Sell) |

//+------------------------------------------------------------------+

if (CloseSell1_1 == CloseSell1_2) Order = SIGNAL_CLOSESELL;

//+------------------------------------------------------------------+

//| Signal End(Exit Sell) |

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

Unterm Strich ist der Timeclosing-Parameter viel zu aggressiv, es sei denn, er kann so geändert werden, dass er wie vorgesehen funktioniert.

 

Leider habe ich keine Zeit, den gesamten Code zu untersuchen, aber lassen Sie uns nur diesen Ausschnitt betrachten.

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

Nehmen wir an, dass der OrderOpenPrice = 1,2100

und der Gewinn beträgt 0,0010

Sie möchten also den Short-Handel schließen, wenn der Geldkurs kleiner oder gleich 1,2100-0,0010 = 1,2090 ist.

Nehmen wir an, es gab eine Kurslücke nach unten und die Kurse übersprangen 1,2090 und der Geldkurs liegt jetzt bei 1,2088. Nach Ihrer Formel,

Bid + Profit = 1,2088 + 0,0010 = 1,2098. Er ist NICHT größer als OrderOpenPrice, obwohl Ihr System die Gewinnschwelle überschritten hat. Daher wird der Auftrag nicht geschlossen. Die Logik der Schließungsbedingung muss meiner Meinung nach überdacht und neu geschrieben werden. Außerdem sollten Sie bei Short-Trades mit Ask-Preisen arbeiten, da Sie den Trade nur zum Ask-Preis schließen können.

Ein weiterer Ratschlag,

Die Zählschleife von for (int cnt = 0 ; cnt = 0; cnt--) oder etwas Ähnliches.

Viel Glück!

Grund der Beschwerde: