Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43248
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 255
Gesamt: 255
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 13.05.16
Neues Mitglied
 
Registriert seit: May 2012
Beiträge: 11
DariusK befindet sich auf einem aufstrebenden Ast
Standard SL über EA setzen -zeitverzögert

Hallo MT4 profis

ich habe vor 12 Jahren c++ gelernt, damals war ich motiviert und habe programme für MT4 geschrieben. Paar Jahre habe ich leider nichts mehr geschrieben. Nun möchte ich wieder in die Programmierung rein, da es ja für mich riesen spass macht.Außerdem ist man ja etwas stolz ein programm zu schreiben, was tatzächlich funktioniert. Zu meinem Problem.
Ich habe ein EA, dass es ein SL setzt. Soweit so gut. Möchte aber über zweiten Programm nochmals mit einer kleiner Verzögerung z.B. 5 sec. um 5 Pips nachsetzten. Dazu habe ich ein EA gefunden und schon etwas verändert, er war frei zugänglich :;-). Leider funktioniert es nicht immer. Deshalb die Verzögerung im Programm. ..was muß ich hier ändern.

extern bool MTakeProfit=true;
extern bool MStopLoss=true;
extern double TakeProfit=30;
extern double StopLoss=30;
extern int magicNumber = 0;

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

int StopMultd=10;
double TP=NormalizeDouble(TakeProfit*StopMultd,Digits);
double SL=NormalizeDouble(StopLoss*StopMultd,Digits);

//-------------------------------------------------------------------+
//Check open orders
//-------------------------------------------------------------------+
if(OrdersTotal()>0){
for(int i=1; i<=OrdersTotal(); i++) // Cycle searching in orders
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
{
if((MTakeProfit==true)&&(TakeProfit>0)&&(OrderMagi cNumber()== magicNumber)){ // m tp

// Calculate take profit
double tpb=NormalizeDouble(OrderOpenPrice()+TP*Point,Digi ts);
double tps=NormalizeDouble(OrderOpenPrice()-TP*Point,Digits);

Comment("Modifying take profit");
if((OrderType()==OP_BUY)&&(OrderTakeProfit()==0)&& (OrderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,OrderStopLoss(),tpb,0, CLR_NONE); }
if((OrderType()==OP_SELL)&&(OrderTakeProfit()==0)& &(OrderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,OrderStopLoss(),tps,0, CLR_NONE); }

} // m tp

if((MStopLoss==true)&&(StopLoss>0)&&(OrderMagicNum ber()== magicNumber)){ // m sl

// Calculate stop loss
double slb=NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);
double sls=NormalizeDouble(OrderOpenPrice()+SL*Point,Digi ts);

Comment("Modifying stop loss");
if((OrderType()==OP_BUY)&&(OrderStopLoss()==0)&&(O rderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,slb,OrderTakeProfit(), 0,CLR_NONE); }
if((OrderType()==OP_SELL)&&(OrderStopLoss()==0)&&( OrderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,sls,OrderTakeProfit(), 0,CLR_NONE); }

}// m sl
Comment("");
}
}
}
//----
int Error=GetLastError();
if(Error==130){Alert("Wrong stops. Retrying."); RefreshRates();}
if(Error==133){Alert("Trading prohibited.");}
if(Error==2){Alert("Common error.");}
if(Error==146){Alert("Trading subsystem is busy. Retrying."); Sleep(500); RefreshRates();}

//----------
return(0);
}
//+-----------------------------------END-------------------------------+

int init()
{
//----
Alert(":-)");
//----
return(0);
}


Danke für EUre Hilfe...
  #2 (permalink)  
Alt 13.05.16
Mitglied
 
Registriert seit: Apr 2016
Beiträge: 45
Top-SecreT befindet sich auf einem aufstrebenden Ast
Standard

Warum soll das ganze auf 2 EA's aufgeteilt sein?
  #3 (permalink)  
Alt 13.05.16
Neues Mitglied
 
Registriert seit: May 2012
Beiträge: 11
DariusK befindet sich auf einem aufstrebenden Ast
Standard

der 2 EA soll den ersten EA überwachen. Falls man ein EA kauf und hier kein SL gesetzt werden kann, möchte ich es mit meinem EA tun.


ich habe was gefunden bin aber in der Arbeit, so kann ich es erst später nochmals schauen.

über Sleep(500); funktion müsste es gehen..aber wo soll ich es einbringen

// Calculate stop loss
double slb=NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);
double sls=NormalizeDouble(OrderOpenPrice()+SL*Point,Digi ts);

Comment("Modifying stop loss");
if((OrderType()==OP_BUY)&&(OrderStopLoss()==0)&&(O rderSymbol()==Symbol()))


????????????????????????hier ??????????


{ OrderModify(OrderTicket(),0,slb,OrderTakeProfit(), 0,CLR_NONE); }
if((OrderType()==OP_SELL)&&(OrderStopLoss()==0)&&( OrderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,sls,OrderTakeProfit(), 0,CLR_NONE); }

}// m sl
  #4 (permalink)  
Alt 13.05.16
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Sleep(500) wäre 0,5 Sekunden!
Bei dieser Art Ordermanager muß unbedingt bedacht werden, dass der zweite EA nicht auf demselben Chart laufen darf wie der "Gekaufte". D.h. der zweite EA muß von einem anderen Chart aus auf die betreffenden Orders zugreifen.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #5 (permalink)  
Alt 13.05.16
Neues Mitglied
 
Registriert seit: May 2012
Beiträge: 11
DariusK befindet sich auf einem aufstrebenden Ast
Standard

//-ol())){ OrderModify(OrderTicket(),0,sls,OrderTakeProfit(), 0,CLR_NONE); }}// m slQUOTE=traderdoc;34511]Sleep(500) wäre 0,5 Sekunden!
Bei dieser Art Ordermanager muß unbedingt bedacht werden, dass der zweite EA nicht auf demselben Chart laufen darf wie der "Gekaufte". D.h. der zweite EA muß von einem anderen Chart aus auf die betreffenden Orders zugreifen.

traderdoc[/QUOTE]

Danke traderdoc. Stimmt muss Sleep (5000) für 5 sec schreiben.dass mit dem zweiten ea, dessen bin ich mir bewusst. Danke trotzdem.

Ich hoffe ich habe die stelle in prg gefunden:

In Check open order...
Gleich nach der Zeile:
...
if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
Sleep (5000);
{...
Wenn order vorhanden, dann 5sec warten...bis tp uns sl gesetzt wird
Ist es Richtig?
  #6 (permalink)  
Alt 13.05.16
Neues Mitglied
 
Registriert seit: May 2012
Beiträge: 11
DariusK befindet sich auf einem aufstrebenden Ast
Standard

Danke im Vorasu. Den ganzen funktionierenden ea würde ich hier heute abend einstellen.
Gruß
DariusK
  #7 (permalink)  
Alt 13.05.16
Neues Mitglied
 
Registriert seit: May 2012
Beiträge: 11
DariusK befindet sich auf einem aufstrebenden Ast
Standard

Danke hat sich erledigt.Habe es selber geschafft.
trotzdem nochmals danke...werde den Code noch verbessern und hier einstellen...mit MagicNumer etc.
  #8 (permalink)  
Alt 13.05.16
Neues Mitglied
 
Registriert seit: May 2012
Beiträge: 11
DariusK befindet sich auf einem aufstrebenden Ast
Standard

extern bool MTakeProfit=true;
extern bool MStopLoss=true;
extern double TakeProfit=30;
extern double StopLoss=30;
extern double Sleep=1;
extern int magicNumber = 0;

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

int StopMultd=10;
double TP=NormalizeDouble(TakeProfit*StopMultd,Digits);
double SL=NormalizeDouble(StopLoss*StopMultd,Digits);

//-------------------------------------------------------------------+
//Check open orders
//-------------------------------------------------------------------+
if(OrdersTotal()>0){
for(int i=1; i<=OrdersTotal(); i++) // Cycle searching in orders
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // If the next is available
{
if((MTakeProfit==true)&&(TakeProfit>0)&&(OrderMagi cNumber()== magicNumber)){ // m tp
Sleep(Sleep*1000);
// Calculate take profit
double tpb=NormalizeDouble(OrderOpenPrice()+TP*Point,Digi ts);
double tps=NormalizeDouble(OrderOpenPrice()-TP*Point,Digits);

Comment("Modifying take profit");
if((OrderType()==OP_BUY)&&(OrderTakeProfit()==0)&& (OrderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,OrderStopLoss(),tpb,0, CLR_NONE); }
if((OrderType()==OP_SELL)&&(OrderTakeProfit()==0)& &(OrderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,OrderStopLoss(),tps,0, CLR_NONE); }

} // m tp

if((MStopLoss==true)&&(StopLoss>0)&&(OrderMagicNum ber()== magicNumber)){ // m sl
Sleep(Sleep*1000);
// Calculate stop loss
double slb=NormalizeDouble(OrderOpenPrice()-SL*Point,Digits);
double sls=NormalizeDouble(OrderOpenPrice()+SL*Point,Digi ts);

Comment("Modifying stop loss");
if((OrderType()==OP_BUY)&&(OrderStopLoss()==0)&&(O rderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,slb,OrderTakeProfit(), 0,CLR_NONE); }
if((OrderType()==OP_SELL)&&(OrderStopLoss()==0)&&( OrderSymbol()==Symbol())){ OrderModify(OrderTicket(),0,sls,OrderTakeProfit(), 0,CLR_NONE); }

}// m sl
Comment("");
}
}
}
//----
int Error=GetLastError();
if(Error==130){Alert("Wrong stops. Retrying."); RefreshRates();}
if(Error==133){Alert("Trading prohibited.");}
if(Error==2){Alert("Common error.");}
if(Error==146){Alert("Trading subsystem is busy. Retrying."); Sleep(500); RefreshRates();}

//----------
return(0);
}
//+-----------------------------------END-------------------------------+

int init()
{
//----
Alert(":-)");
//----
return(0);
}
  #9 (permalink)  
Alt 13.05.16
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Also, ich würde das Sleep(5000) da nicht platzieren. Denn an dieser Stelle würde das bedeuten, dass nach jeder selektierten Order 5 Sekunden gewartet wird. Und da die Selektion nicht weiter eingeengt wird, verläßt der EA diese Schleife erst nach x Orders * 5sec. Das kann dann eine Weile dauern.

Ok, ich sehe gerade, dass Du die Stelle verändert hast. Der wartet wahrscheinlich trotzdem noch rel. lange.

Was ist Sleep(Sleep*1000);?
Geht so etwas durch den Compiler, da Sleep ein reserviertes Wort ist, dürfte es eigentlich nicht als Variable verwendet werden.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #10 (permalink)  
Alt 13.05.16
Neues Mitglied
 
Registriert seit: May 2012
Beiträge: 11
DariusK befindet sich auf einem aufstrebenden Ast
Standard

so fertig :-)..ich hoffe es kann euch helfen...mit Magicnumer muß ich es testen, rest geht wurderbar :-)


gruß
darius
Thema geschlossen

Lesezeichen

Stichworte
mql4, programmierung, programmierung metatrader, sl, stoploss, trailingstop

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------