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
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]
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.
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.
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 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
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 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
BenoWahrscheinlich 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)
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.
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);
},,,,,,,,,,,,,.,,,,,,,,,