|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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... |
|
|||
Warum soll das ganze auf 2 EA's aufgeteilt sein?
|
|
|||
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 |
|
|||
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. |
|
|||
//-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? |
|
|||
Danke im Vorasu. Den ganzen funktionierenden ea würde ich hier heute abend einstellen.
Gruß DariusK |
|
|||
Danke hat sich erledigt.Habe es selber geschafft.
trotzdem nochmals danke...werde den Code noch verbessern und hier einstellen...mit MagicNumer etc. |
|
|||
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); } |
|
|||
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. |
Lesezeichen |
Stichworte |
mql4, programmierung, programmierung metatrader, sl, stoploss, trailingstop |
|
|