Wie programmiert man? - Seite 284

 

Ich habe eine Lösung für den Zeitfilter Close All sortiert

Externe Variablen

extern string timefilter="Time Filter";

extern int gmtshift=1; // gmt offset of the broker

extern bool generalfilter=false; // enable time filter

extern int starthour=7; // start hour to trade after this hour

extern int startminutes=0; // minutes of the start hour

extern int endhour=21; // stop to trade after this hour

extern int endminutes=0; // minutes of the start hour

extern bool tradesunday=true; // trade on sunday

extern bool fridayfilter=false; // enable special time filter on friday

extern int fridayhour=21; // stop to trade after this hour

extern int fridayminutes=0; // minutes of the friday hour

[/CODE]

int nstarthour,nendhour,nfridayhour;

string istarthour,istartminutes,iendhour,iendminutes,ifridayhour,ifridayminutes;

datetime tstart,tend,tfriday;[/CODE]

Place Code in Start,

[CODE] if(generalfilter){

nstarthour=starthour+(gmtshift);if(nstarthour>23)nstarthour=nstarthour-24;

if(nstarthour<10)istarthour="0"+nstarthour;

if(nstarthour>9)istarthour=nstarthour;

if(startminutes<10)istartminutes="0"+startminutes;

if(startminutes>9)istartminutes=startminutes;

tstart=StrToTime(istarthour+":"+istartminutes);

nendhour=endhour+(gmtshift);if(nendhour>23)nendhour=nendhour-24;

if(endhour<10)iendhour="0"+nendhour;

if(endhour>9)iendhour=nendhour;

if(endminutes<10)iendminutes="0"+endminutes;

if(endminutes>9)iendminutes=endminutes;

tend=StrToTime(iendhour+":"+iendminutes);

}

if(fridayfilter){

nfridayhour=fridayhour+(gmtshift);if(nfridayhour>23)nfridayhour=nfridayhour-24;

if(nfridayhour<10)ifridayhour="0"+nfridayhour;

if(nfridayhour>9)ifridayhour=nfridayhour;

if(fridayminutes<10)ifridayminutes="0"+fridayminutes;

if(fridayminutes>9)ifridayminutes=fridayminutes;

tfriday=StrToTime(ifridayhour+":"+ifridayminutes);

}

if((generalfilter && (nstarthour<nendhour && TimeCurrent()tend) || (nstarthour>nendhour && TimeCurrent()tend))

|| (tradesunday==false && DayOfWeek()==0) || (fridayfilter && DayOfWeek()==5 && TimeCurrent()>tfriday))

{

CloseAll();

Comment("Non-trading Hours All Positions Closed");

return(0);

}

and the CloseAll function.

[CODE]

void CloseAll(){

int total = OrdersTotal();

for(int i=total-1;i>=0;i--){

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type){

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Lime); break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, LightGreen );

} if(result == false){

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

Danke für die Hinweise und Tipps Kalenzo

 

StopLoss

Guten Tag

Ich habe ein Experiment zur Berechnung eines SL basierend auf dem Tickvalue, einem max dd und dem Prozentsatz pro Trade ausprobiert.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

Die Idee ist, dass abhängig von dem Paar und dem individuellen Tickwert und der Lotgröße der 2%-SL gesetzt werden kann.

Ich denke, dass es richtig ist, aber ich würde mich freuen, wenn jemand es überprüfen könnte.

 
Beno:
Guten Tag

Ich habe ein Experiment zur Berechnung eines SL auf der Grundlage des Tickwerts, eines maximalen dd und eines Prozentsatzes pro Handel ausprobiert.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

Die Idee ist, dass in Abhängigkeit von dem Paar und der Paare einzelnen tickvalue und die Losgröße der 2% sl gesetzt werden kann.

Ich denke, es ist richtig, aber ich möchte, dass jemand es überprüft, wenn möglich.

Gute Arbeit Beno,

Es ist immer besser, die Angelrute zu geben als den Fisch. Es freut mich sehr, dass ich Ihnen mit einigen Kommentaren helfen konnte.

Was den Stop-Loss betrifft, so ist die Idee gut, aber versuchen Sie, ihn auch in umgekehrter Weise zu betrachten:

erstens Stop-Loss setzen

Zweitens: Handelsgröße festlegen

Auf diese Weise passen Sie den Einstieg/Ausstieg des Systems an die Marktbedingungen an und riskieren nicht mehr als X% Ihres Kontos, aber der Ausstieg hängt von der Systemlogik und nicht vom Risikoprozentsatz ab.

 
Kalenzo:
Gute Arbeit Beno,

Es ist immer besser, die Angelrute zu verschenken als den Fisch. Ich freue mich sehr, dass ich Ihnen mit einigen Kommentaren helfen konnte.

Was den Stop-Loss betrifft, so ist die Idee gut, aber versuchen Sie, ihn auch in umgekehrter Weise zu berücksichtigen:

erstens Stop-Loss setzen

Zweitens: Handelsgröße festlegen

Auf diese Weise werden Sie das System Eingang / Ausgang zu den Marktbedingungen passen, und wird nicht mehr als X% von Ihrem Konto riskieren, aber der Ausgang wird auf Systemlogik statt Risiko Prozent abhängen.

Guten Tag Kalenzo

Ich erhalte einen Fehler beim Öffnen einer SELL-Order: ungültige Stopps mit dem EA auf dem Demo- und Live-Konto und keine Trades werden geöffnet. aber es funktioniert gut auf dem Tester und hat keine Fehlermeldungen.

EURUSD,Daily: modify #1 buy 0.01 EURUSD at 1.43348 sl: 1.43895 tp: 0.00000 ok

Der SL 0,00547 Punkte Unterschied

Ich habe den

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

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

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

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

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Das ist mir bisher noch nie aufgefallen.

Vielen Dank

Beno

 

Latch/Unlatch-Funktion

Gibt es eine Möglichkeit, eine Latch/Unlatch-Funktion in mq4 zu programmieren. Sie würden ein Bit basierend auf einer Bedingung verriegeln, und es würde diesen Wert speichern, bis er durch eine andere Bedingung entriegelt wird.

cmfxtrader

 
Beno:
Guten Tag Kalenzo

Ich erhalte einen Fehler beim Öffnen einer SELL-Order: ungültige Stopps mit dem EA ist auf der Demo und Live-Konto und keine Trades öffnen. aber es funktioniert gut auf dem Tester und hat keine Fehlermeldungen.

EURUSD,Daily: modify #1 buy 0.01 EURUSD at 1.43348 sl: 1.43895 tp: 0.00000 ok

Der SL 0,00547 Punkte Unterschied

Ich habe den

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

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

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

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

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Das ist mir bisher noch nie aufgefallen.

Vielen Dank

Beno

Wahrscheinlich liegt Ihr Stop-Loss zu nahe. Versuchen Sie, den Stop-Loss-Wert mit 10 zu multiplizieren. Das ist ein häufiges Problem, wenn Sie das System mit einem 4-stelligen Broker getestet haben und es mit einem 5-stelligen Broker handeln. Sie können das System auch auf einem 5-stelligen Broker testen, aber Sie sollten sich nie mit dem Broker verbinden (im Offline-Modus) und dann wird Metatrader die alten Einstellungen haben (von 4 Dig).

Zuerst von dieser Zeile:

NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

Drucken Sie diesen Wert => stopLoss*pips2dbl

dann werden Sie den tatsächlichen Wert des StopLoss kennen.

Wenn der Wert 20 oder 10 ist, dann bedeutet das, dass Sie ihn mit dem Punktwert multiplizieren müssen

NormalizeDouble(Ask - (stopLoss * pips2dbl) *Point, Digits);

wenn es wie 0.00009 sein wird, dann müssen Sie es nur mit 10 multiplizieren, weil es 0.0009 sein sollte (natürlich, wenn Sie 9 Pips Stop Loss setzen wollen)

 
cmfxtrader:
Gibt es eine Möglichkeit, eine Latch/Unlatch-Funktion in mq4 zu codieren. Sie würden ein Bit auf der Grundlage einer Bedingung verriegeln, und es würde diesen Wert speichern, bis er durch eine andere Bedingung entriegelt wird. cmfxtrader

Ich bin nicht sicher, ob ich Sie richtig verstanden habe. Möchten Sie einen bestimmten Teil von ea(Funktion) ein- bzw. ausschalten oder möchten Sie eine Funktion von ea A durch eine Aktion in ea B deaktivieren? So oder so, beides ist möglich.

 

Geldwert in Preis umrechnen (für Gewinnzielberechnung)

Ich möchte eine Funktion programmieren, die einen Preiswert für ein bestimmtes Gewinnziel eines Korbes von Geschäften zurückgibt, aber ich habe Schwierigkeiten damit. Das Ziel, das ich erreichen möchte, ist eine einfache horizontale Linie, die auf dem Bildschirm gezeichnet wird und das Gewinnziel anzeigt. Das Gewinnziel ist jedoch eine vom Benutzer definierbare Variable in Form eines Geldwerts und nicht eines Kurswerts. (z.B. Ziel = 100 € anstelle von Ziel = 1.2000)

Die Routine habe ich bis jetzt:

(Mein Konto ist in EUR!)

1) Sagen wir, ich eröffne mehrere Kaufpositionen für den USDJPY (an zufälligen Positionen, um eine Beispielsituation zu schaffen)

2) Ich berechne den durchschnittlichen Eröffnungskurs des Korbs (sagen wir mal 1,1500, wiederum hypothetisch) und zeige eine horizontale Linie an, um dies anzuzeigen

3) Ich habe eine Variable mit einem Gewinnziel gesetzt: sagen wir mal Ziel = 100 €.

4) Ich kann alle offenen Positionen erfolgreich schließen, wenn der Korbgewinn >= Ziel ist.

Der Schritt dazwischen fehlt. Ich brauche eine Funktion: double targetPrice(){}, die den targetPrice zurückgibt. Das Zeichnen der horizontalen Linie ist nicht das Problem: die Berechnung des targetPrice ist es!

Der targetPrice = durchschnittlicher Eröffnungskurs + money-value-target (€100)

Was ich also wissen möchte: Wie kann ich einen Geldwert in Pips umwandeln. Auf diese Weise kann ich die Pips zum Durchschnittspreis addieren und voila, ich habe meinen Zielpreis. Denken Sie daran, dass dies auch die Tatsache berücksichtigen muss, dass ich ein EUR-Konto habe und mit USDJPY handle. Ich vermute, dass es auch hier Fallstricke gibt?

 

ECN SL funktioniert nicht

Guten Tag

Ich versuche, einen EA einzurichten, der auf einem ECN funktioniert, ich verstehe, dass SL und TP platziert/geändert werden müssen, und ich denke, dass die Einrichtung korrekt ist. Der Auftrag öffnet sich jetzt, aber der SL wird nicht platziert extern double StopLoss = 100; jede Hilfe wäre großartig.

//---- buy conditions

if(buysig && ttime!=Time[0]) {

ticket = OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);

if(ticket > -1){

if (!OrderSelect(ticket, SELECT_BY_TICKET)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("order "+ticket+" successfully opened");

//now enter in the SL and TP via OrderModify to make compatible with ECN broker

SL = MarketInfo(Symbol(), MODE_ASK) - (StopLoss * pips2points);

Print("Ask = " + DoubleToStr(Ask,Digits) + " : SL = " + DoubleToStr(SL,Digits));

//round to nearest Tickvalue

SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKSIZE));

Print("SL rounded: " + SL);

if(!OrderModify(ticket, entry_price, SL, 0, Blue)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("Stoploss successfully set");

ttime=Time[0];

return(0);

}

}

}

//Tickvalue Rounding

double DoubleRound(double number, double step){

double mod = MathMod(number, step);

if(mod < step/2.0)

step = 0;

double rounded = number - mod + step;

return (rounded);

}
 

,,,,,,,,,,,,,.,,,,,,,,,

Dateien:
test_ea.txt  10 kb
aizig.ex4  10 kb
Grund der Beschwerde: