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
Leider habe ich keine Zeit, den gesamten Code zu untersuchen, aber lassen Sie uns nur diesen Ausschnitt betrachten.
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())
Nehmen wir an, dass der OrderOpenPrice = 1,2100
und der Gewinn beträgt 0,0010
Sie möchten also den Short-Handel schließen, wenn der Geldkurs kleiner oder gleich 1,2100-0,0010 = 1,2090 ist.
Nehmen wir an, es gab eine Kurslücke nach unten und die Kurse übersprangen 1,2090 und der Geldkurs liegt jetzt bei 1,2088. Nach Ihrer Formel,
Bid + Profit = 1,2088 + 0,0010 = 1,2098. Er ist NICHT größer als OrderOpenPrice, obwohl Ihr System die Gewinnschwelle überschritten hat. Daher wird der Auftrag nicht geschlossen. Die Logik der Schließungsbedingung muss meiner Meinung nach überdacht und neu geschrieben werden. Außerdem sollten Sie bei Short-Trades mit Ask-Preisen arbeiten, da Sie den Trade nur zum Ask-Preis schließen können.
Ein weiterer Ratschlag,
Die Zählschleife von for (int cnt = 0 ; cnt = 0; cnt--) oder etwas Ähnliches.
Viel Glück!Ich bin dankbar, dass ich das gelernt habe, danke Maji! Das ist nicht die Schließungslogik, die ich sowieso wollte... die Logik, die ich wollte, war, dass es geschlossen wird, wenn es den Trailing-Stop-Loss nicht ausgelöst hat. Da ich nicht genau weiß, wie man erkennt, ob dieser ausgelöst wurde oder nicht, kann ich diese Time-to-Close-Schließstrategie nicht verwenden, bis ich gelernt habe, wie man sie so programmiert, dass sie das tut, was ich wollte.
Neue Schließung Kriterien... helfen Sie mir den Code richtig platzieren bitte...
Ich brauche etwas Hilfe, um ein weiteres Schließungskriterium einzufügen, das darin besteht, dass das LongEMA unter den Minortrendsetter fällt (wenn Long) und umgekehrt, wenn Short. Ich bin mir nicht sicher, wie genau ich die offenen Long- und Short-Positionen isolieren soll, um sie mit diesem neuen Kriterium zu schließen.
//+--------- settings may vary use at your own risk-----------------+
//+--------------user inputs--------------------+
extern double Trendsetter = 250;
extern double Minortrendsetter = 150;
extern double LongEMA = 20;
extern double ShortEMA = 5;
extern double TrailingStop = 15;
extern double TrailingStopTrigger = 1;
extern double StopLoss = 186;
extern double TakeProfit = 250;
extern double Lots = 0.1;
extern double EquityStop = 9;
//---- Custom "Channel-1" Indicator and Filter Parameters
extern int Hours=36;
extern color col=SkyBlue;
extern double TF = 60; //--which bar period for the custom indicator to use
extern double upperproximity = 30; //---disallows long orders within this proximity to resistance line
extern double lowerproximity = 30; //---disallows short orders within this proximity to the support line
//+-----------close based on not triggering trailing stop in allotted time----------------+
extern int MonitorInMinutes = 60; // minutes after open to check state of trade
extern int ThresholdMove = 11; // if after that time we don't have +'x' pips we will exit
extern int MinsMultiplier = 600; // multiplies the MonitorInMinutes to make minutes (if 'x'=60) into hours
//+----------------------end of allotted time user inputs-----------------------------+
//+-----------------------------end of user inputs----------------------------------+
//+------------------------------------------------------------------+
//| expert start function
//+------------------------------------------------------------------+
int start(){
CloseOrder();
int cnt, ticket;
if(Bars<100){
Print("bars less than 100");
return(0);
}
//+----------------------Get Moving Average(s) Data----------------------------------------+
double currentlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period longEMA
double currentshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,0);//--current period shortEMA
double trendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period TrendsetterEMA
double minorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,0);//--current period MinortrendsetterEMA
double prevlong=iMA(NULL,0,LongEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period longEMA
double prevshort=iMA(NULL,0,ShortEMA,0,MODE_EMA,PRICE_CLOSE,1);//--previous period shortEMA
double prevtrendsetter=iMA(NULL,0,Trendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period TrendsetterEMA
double prevminorts=iMA(NULL,0,Minortrendsetter,0,MODE_EMA,PRICE_CLOSE,1);//--previous period MinortrendsetterEMA
//+----------------------------end of Get Moving Average(s) Data-----------------------------+
//+--------------------channel filter---------------------------+
double resistance = iCustom(NULL,TF,"Channel-1",Hours,col,0,0);
double support = iCustom(NULL,TF,"Channel-1",Hours,col,2,0);
//+------------------- end channel filter------------------------+
//+---------Obnoxious money management code needs revision----------------+
int total=OrdersTotal();
if(total<1){
if(AccountFreeMargin()<(1000*Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
//+---------end of Obnoxious money management code-----------------+
//+---------------------------------------Order Entry--------------------------------------------+
//+---------enter long positions----------+
if (prevshortcurrentlong && currentshort>currentlong>Trendsetter && Ask > resistance - upperproximity*Point){ //---conditions to open long positions change as desired
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
//+---------enter short positions----------+
if (prevshort>prevlong && currentshort<currentlong && currentshort<currentlong<Trendsetter && Ask < support + lowerproximity*Point){ //---conditions to open short positions change as desired
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,0,Red);
if(ticket>0) {
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES )) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
}
//+---------end of order entry-------------------------+
//+-------------------------Trailing Stop Code------------------------------------+
for(cnt=0;cnt<total;cnt++) {
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
if(OrderType()==OP_BUY){
if(TrailingStop>0) {if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {
if(OrderStopLoss()<Bid-Point*TrailingStop) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}else{
if(TrailingStop>0) {if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
//+-------------------------End of Trailing Stop Code----------------------------+
//+---------------------Equity Stop Code---------------------------+
if((AccountEquity()+ EquityStop)<AccountBalance()) {
{
int ttotal = OrdersTotal();
for(int i=ttotal-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, Red );
break;
//Close opened short positions
case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
}
if(result == false)
{
Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
Sleep(3000);
}
}
return(0);
}
}
}
}
}
//+---------------------End of Equity Stop Code---------------------------+
//|
//+---------------------Close Based on Time-------------------------------+
//+--------------needs revision, not working as desired---------------------+
//+------------I want it to close IF and ONLY IF trailing stop is NOT triggered-------------+
void CloseOrder()
{
double Profit=ThresholdMove*Point;
int total = OrdersTotal();
for (int cnt = 0 ; cnt < total ; cnt++)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)
{
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
}
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
}
}
}
}
//+---------------------------end of close on time code---------------+ok ich muss diesen Teil des Codes jetzt verstehen....
erste Zeile zählt
zweite Zeile wählt die gezählten Aufträge aus
dritte Zeile...das verwirrt mich...ich DENKE, es will wissen, ob der ausgewählte Auftrag ein Verkauf ist...aber was hat es mit der "0? Ich meine, es gibt hier FÜNF 'wenn' Zeilen...
Ich schätze, wenn eine davon wahr ist, dann wird die Order geändert, andernfalls...ich schätze, es geht zu den ...else' und ...nun, das muss irgendwie mit Long- und Short-Positionen umgehen können, aber ich verstehe es noch nicht.
Da ich Kriterien hinzufügen möchte, um Long- oder Short-Positionen zu schließen, die auf der Kreuzung des LongEMA mit dem MinortrendsetterEMA basieren, bin ich mir nicht sicher, wo in all dem, um es zu tun.
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
if(OrderType()==OP_BUY){
if(TrailingStop>0) {if(Bid-OrderOpenPrice()>Point*TrailingStopTrigger) {
if(OrderStopLoss()<Bid-Point*TrailingStop) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}else{
if(TrailingStop>0) {if((OrderOpenPrice()-Ask)>(Point*TrailingStopTrigger)) {
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}Ok, ich verstehe, dass alle if's und elses führen zu thess Zeilen. dies sind die, die ich brauche, um zu verstehen...
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
Ich muss mehr darüber erfahren, wie diese Zeilen zum Ändern von Aufträgen aufgebaut sind... sind das diejenigen, die sowohl die Aufträge schließen als auch ändern, oder ändern sie nur die Aufträge und etwas anderes schließt die Aufträge?
Sehen Sie sich die Hilfe in MetaEditor an
OP_BUY 0 Buying position.
OP_SELL 1 Selling position.
OP_BUYLIMIT 2 Buy limit pending position.
OP_SELLLIMIT 3 Sell limit pending position.
OP_BUYSTOP 4 Buy stop pending position.
OP_SELLSTOP 5 Sell stop pending position.
[/PHP]
so, <= OP_SELL is OP_BUY or OP_SELL. Just instead of using
[PHP]if((OrderType()==OP_SELL) || (OrderType()==OP_BUY) ...Einfach weniger tippen
So geht's
void CloseOrders(int op)
{
int tik[30], t = 0;
for(int i =0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && MagicNum==OrderMagicNumber() && OrderType() == op){
tik[t] = OrderTicket(); t++;
}
}
}
for (i = 0; i<t; i++)
{
if(OrderSelect(tik,SELECT_BY_TICKET)){
double prc = Bid;
if (op == OP_SELL) prc = Ask;
CloseOrder(tik, OrderLots(), prc);
}
}
}Aufruf : CloseOrder(OP_BUY); // Schließen Sie alle Kaufaufträge
oder
CloseOrder(OP_SELL); // Schließen Sie alle Verkaufsaufträge
Der Grund dafür, dass ich alle Aufträge in einem Array aufbewahre und dann lösche, ist, dass wenn ich den Auftrag an Position 1 schließe, der nächste wieder 1 wird und wir ein Problem haben.
Das habe ich vergessen
{
int CloseCnt, err;
// try to close 3 Times
CloseCnt = 0;
color clr = Violet;
if (OrderType() == OP_SELL)
clr = Orange;
while (CloseCnt < 3)
{
if (OrderClose(ticket,numLots,close_price,Slippage,clr))
{
CloseCnt = 3;
}
else
{
err=GetLastError();
Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));
if (err > 0) CloseCnt++;
}
}
}
[/PHP]
and dont forget to add this line after #property link
[PHP]#property link "http://www.elihayun.com"
#include
Ich bin immer noch verwirrt...
Verstehen Sie, dass ich diesen Code ursprünglich nicht erstellt habe. Ich arbeite daran, zu verstehen, was jemand anderes gemacht hat, und ihn zu ändern. Ich habe meinen Namen erst jetzt an die Grundstücksgrenze gesetzt, nachdem ich ihn so stark verändert habe, dass er kaum noch Ähnlichkeit mit dem Original hat. Ich habe jetzt mehr verändert, als ich unverändert gelassen habe. Es gibt immer noch einige Aspekte, die ich nicht verstehe und die ich deshalb nicht ändern konnte.
Was ich suche, ist der Code, der die Aufträge schließt... es scheint, dass all dies nur modifiziert wird, um den Trailing Stop zu aktualisieren.
Dies ist mehr als ein Weg, um zu schließen.
Im Moment hat dieser EA die Möglichkeit, mit einem Stop Loss zu schließen.
mit einem Trailing-Stop zu schließen.
mit einem Take-Profit-Ziel zu schließen.
oder nach Ablauf einer bestimmten Zeit nach der Eröffnung zu schließen.
Was er nicht hat, was ich aber gerne hätte, ist die Fähigkeit zu schließen, wenn das LongEMA auf das MinortrendsetterEMA zurückgeht. er könnte dies tun, indem er nach oben kreuzt, um eine Short-Position zu schließen, oder nach unten kreuzt, um eine Long-Position zu schließen. Wie kann ich das machen? Ich meine, mit all diesen anderen Schließungsoptionen, wo setze ich den neuen Code, um all diese anderen Schließungsoptionen zu überschreiben?
Wenn ich einen Aspekt dieser Option nicht verwenden möchte, stelle ich die Kriterien dieses Parameters einfach so extrem ein, dass er nie ausgelöst wird, d. h. ich schalte das Kriterium im Grunde aus. Auf diese Weise können die anderen Kriterien zeigen, was sie ergeben würden.
Ich habe das hier vergessen
{
int CloseCnt, err;
// try to close 3 Times
CloseCnt = 0;
color clr = Violet;
if (OrderType() == OP_SELL)
clr = Orange;
while (CloseCnt < 3)
{
if (OrderClose(ticket,numLots,close_price,Slippage,clr))
{
CloseCnt = 3;
}
else
{
err=GetLastError();
Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));
if (err > 0) CloseCnt++;
}
}
}
[/PHP]
and dont forget to add this line after #property link
[PHP]#property link "http://www.elihayun.com"
#include
Ok, vielen Dank!
Dies ist also im Grunde nur ein Schließungscode?
Wird dies schließen sowohl offene Long-und Short-Positionen?
Wie würde ich diesen Code verwenden, um zu schließen, wenn das Longema auf dem Minortrendsetterema zurückkreuzen würde? nach oben kreuzen, wenn es short geöffnet hatte und nach unten kreuzen, wenn es long geöffnet hatte?
p.s. Ich werde erst später am Nachmittag wieder an den Computer gehen. Ich werde dann nachsehen.
noch eine Frage ...
Was bedeutet "tauschen"?
Jedes Mal, wenn Sie sich entscheiden, eine LONG-Position zu eröffnen, rufen Sie auf: CloseOrders(OP_SELL);
und vice versa.
Sehen Sie sich Ihren Code an, in dem Sie die Orders öffnen.
Sie müssen nicht prüfen, ob es eine zu schließende Order gibt. Die Routine wird das für Sie tun.
BTW, ich poste einen Code, um 2006.07.02 Art von Zelle zu Datum in Excel zu konvertieren. Sehen Sie sich Ihren Beitrag dort an