Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   SL über EA setzen -zeitverzögert (http://www.expert-advisor.com/forum/showthread.php?t=4935)

DariusK 13.05.16 06:25

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...

Top-SecreT 13.05.16 08:27

Warum soll das ganze auf 2 EA's aufgeteilt sein?

DariusK 13.05.16 09:02

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

traderdoc 13.05.16 11:56

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

DariusK 13.05.16 12:37

//-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?

DariusK 13.05.16 12:39

Danke im Vorasu. Den ganzen funktionierenden ea würde ich hier heute abend einstellen.
Gruß
DariusK

DariusK 13.05.16 14:13

Danke hat sich erledigt.Habe es selber geschafft.
trotzdem nochmals danke...werde den Code noch verbessern und hier einstellen...mit MagicNumer etc.

DariusK 13.05.16 14:48

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);
}

traderdoc 13.05.16 14:48

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

DariusK 13.05.16 14:49

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


gruß
darius


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:13 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum