Auftrag automatisch nach einem bestimmten Zeitraum und/oder SL schließen - Seite 3

 

Das ist völlig falsch ...

OrderSelect(BuyTicket || SellTicket, SELECT_BY_TICKET);

(BuyTicket || SellTicket) ergibt true oder false ... und in diesem Fall wird true oder false als 1 oder 0 angesehen ... nicht als Ihre SellTicket- oder Buyticket-Nummer ...

Stoploss = 40 ... wenn Sie einen Stoploss in OrderSend verwenden, ist es ein Preis ... nicht eine Anzahl von Pips, Slippage ist eine Anzahl von Pips ... lesen Sie die Dokumentation: OrderSend

stoploss - Stoploss-Level.
takeprofit - Take-Profit-Niveau.
 

Okay, ich weiß, was Sie meinen, ich brauche also einen Befehl, um die Bestellung auszuwählen, während Sie OrderSelect verwenden... oder ist OrderSelect in diesem Fall generell falsch?

 

Lesen Sie die Docs... OrderSelect wird benötigt, um die Bestellung auszuwählen , bevor Sie Funktionen wie OrderLots, OrderTicket, OrderOpenPrice usw. verwenden können. "Hinweis: Die Bestellung muss zuvor mit der FunktionOrderSelect()ausgewählt worden sein."

Wenn Sie keine Informationen zu einer bestehenden Bestellung benötigen, brauchen Sie OrderSelect nicht. Wenn doch, dann schon.

 
RaptorUK:

Lesen Sie die Docs... OrderSelect wird benötigt, um die Bestellung auszuwählen , bevor Sie Funktionen wie OrderLots, OrderTicket, OrderOpenPrice usw. verwenden können. "Hinweis: Die Bestellung muss zuvor mit der FunktionOrderSelect()ausgewählt worden sein."

Wenn Sie keine Informationen zu einer bestehenden Bestellung benötigen, brauchen Sie OrderSelect nicht. Wenn doch, dann schon.


Momentan denke ich, dass ich diese Informationen brauche, denn wenn eine Position am Markt ist, muss ich sie schließen und durch eine andere ersetzen. Ich dachte, OrderSelect würde mir auf diese Weise helfen. Aber wenn OrderSelect nur für offene Orders und nicht für die aktive Position am Markt gilt, ist es nicht nützlich. Liege ich da richtig?

Aber wenn OrderSelect nicht hilft, wie kann ich dann die aktiven Positionen schließen?

Mit freundlichen Grüßen

Marc

 
Wenn Sie keine schwebenden Aufträge verwenden und offene Aufträge haben, handelt es sich entweder um einen Kauf- oder einen Verkaufsauftrag ... einen Marktauftrag.
 
//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Digits2Round=2;
extern int PercentOfFreeDepo=1;
extern int Slippage=5;
extern int MagicNumber =1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int TradeHour18=18;
extern int TradeHour20=20;
extern int TradeHour12=12;
extern int TradeHour23=23;
extern int StopLoss=40;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(AccountBalance()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risk/(StopLoss/0.0001)*0.1,Digits2Round);
//===================== Lets determine lot size and risk ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n","Acceptable risk is ",PercentOfFreeDepo, "% = ",Risk," of the free money ",FreeDepo," in lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
    {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
       if((OrderOpenTime()+3600) < TimeCurrent())
          { 
           if (OrderType() == OP_BUY)          
              {
               bool Closed = OrderClose(OrderTicket() ,OrderLots(), Ask, UseSlippage, Red);           
               openbuy = 0;
              }
           if (OrderType() == OP_SELL)          
              {
               Closed = OrderClose(OrderTicket() ,OrderLots(), Bid, UseSlippage, Red);  
               opensell = 0;         
              }              
          }
       }
    }


//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue);
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
} 

//----
return(0);
}
//+------------------------------------------------------------------+
//Pip Point Function
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;
return (CalcPoint);
}

//Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

This seems to be mostly correct, but now I need to know why the prog only executes the sell order @ 12 & 23...and not the buy orders...?
 

nirvanamac:

Das scheint größtenteils richtig zu sein, aber jetzt muss ich wissen, warum das Programm nur die Verkaufsaufträge bei 12 und 23 ausführt und nicht die Kaufaufträge...?

Wahrscheinlich tut es das... und es erzeugt wahrscheinlich einen Fehler, den Sie nicht abfangen...

Versuchen Sie es...

//BuyOrder 
if ((TradeHour3==Hour())||(TradeHour4==Hour())||(TradeHour7==Hour())||(TradeHour10==Hour())||(TradeHour17==Hour())||(TradeHour18==Hour())||(TradeHour20== Hour()) && openbuy == 0) //Signal Buy
{
  openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage ,Ask - StopLoss * Point,0,"time trader buy order ",MagicNumber,0,Blue); 
  if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//SellOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
  opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0,"time trader sell order ",MagicNumber,0,Green);
  if (opensell < 0) Print("OrderSend OP_SELL failed, error: ", GetLastError() );

} 

Ihr OrderClose ist falsch ... Sie öffnen einen Buy at Ask, um einen Buy zu schließen, Sie Sell ... Sie Sell at Bid, Sie öffnen einen Sell at Bid, um einen Sell zu schließen, Sie Buy ... Sie Buy at Ask.

 
RaptorUK:
Ihr OrderClose ist falsch ... Sie eröffnen einen Buy at Ask, um einen Buy zu schließen, verkaufen Sie ... Sie verkaufen zum Bid, Sie eröffnen einen Sell at Bid, um einen Sell zu schließen, kaufen Sie ... Sie kaufen zum Ask.
Oder, da Sie den Auftrag bereits ausgewählt haben, verwenden Sie einfach
Closed = OrderClose(OrderTicket() ,OrderLots(), OrderClosePrice(), UseSlippage, Red);  
Und Sie müssen die Auftragsart nicht mehr unterscheiden.
 

Vielen Dank für Ihre Hilfe...Ich habe den Code mit Ihren Hinweisen geändert. Es sieht folgendermaßen aus:

//+------------------------------------------------------------------+
//| Der Stundentrader.mq4 |
//| Der Marc |
//| Es gibt gar keine Internetseite |
//+------------------------------------------------------------------+
#property copyright "Der Marc"
#property link "Es gibt gar keine Internetseite"

//Wichtige Variablen
extern double Minlot=0.01;
extern int Ziffern2Runde=2;
extern int PercentOfFreeDepo=1;
extern int Schlupf=5;
extern int MagischeZahl=1;
extern int TradeHour3=3;
extern int TradeHour4=4;
extern int TradeHour7=7;
extern int TradeHour10=10;
extern int TradeHour17=17;
extern int HandelsStunde18=18;
extern int HandelsStunde20=20;
extern int HandelsStunde12=12;
extern int TradeHour23=23;
extern int StopLoss=400;

//Globale Variablen
int BuyTicket;
int SellTicket;
double UsePoint;
int UseSlippage;

int openbuy = 0;
int opensell = 0;
//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion |
//+------------------------------------------------------------------+
int init()
{
UsePoint = PipPoint(Symbol());
UseSlippage = GetSlippage(Symbol(), Slippage);
}

//+------------------------------------------------------------------+
//| Expertenstartfunktion |
//+------------------------------------------------------------------+
int start()
{
double FreeDepo=NormalizeDouble(Kontostand()-AccountMargin(),Digits2Round);
double Risk=NormalizeDouble((FreeDepo*PercentOfFreeDepo/100),Digits2Round);
double Lot=NormalizeDouble(Risiko/(StopLoss/0,0001)*0,1,Digits2Round);
//===================== Lässt die Losgröße und das Risiko bestimmen ===================================
if ( Lot<Minlot )
{
Lot=Minlot;
}
Comment( "\n", "Akzeptables Risiko ist ",PercentOfFreeDepo,"% = ",Risk," des freien Geldes ",FreeDepo," in Lots = ",Lot);
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if((OrderOpenTime()+3600) < TimeCurrent())
{
if (OrderType() == OP_BUY || OP_SELL)
{
bool Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
openbuy = 0;
opensell = 0;
}
if (OrderType() == OP_SELL)
{
Closed = OrderClose(OrderTicket(),OrderLots(), OrderClosePrice(), UseSlippage, Red);
opensell = 0;
openbuy = 0;
}
}
}
}
//BuyOrder
if ((TradeHour3==Stunde())||(TradeHour4==Stunde())||(TradeHour7==Stunde())||(TradeHour10==Stunde())||(TradeHour17==Stunde())||(TradeHour18==Stunde())||(TradeHour20== Stunde()) && openbuy == 0) //Kaufsignal
{
openbuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,Ask - StopLoss * Point,0, "time trader buy order ",MagicNumber,0,Blue);
if (openbuy < 0) Print("OrderSend OP_BUY failed, error: ", GetLastError() );
}
//VerkaufsOrder
if ((TradeHour12==Hour())||(TradeHour23==Hour())&& opensell == 0) //Signal Sell
{
opensell=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid + StopLoss * Point,0, "time trader sell order ",MagicNumber,0,Green);
if (opensell < 0) Print("OrderSend OP_SELL fehlgeschlagen, Fehler: ", GetLastError() );
}

//----
return(0);
}
//+------------------------------------------------------------------+
//PipPoint-Funktion
double PipPoint (string Currency)
{
int CalcDigits = MarketInfo(Währung, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0,0001;
return (CalcPoint);
}

//Get Slippage Funktion
int GetSlippage(string Währung, int SlippagePips)
{
int CalcDigits = MarketInfo(Währung, MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return (CalcSlippage);
}

Während der Ausführung des Backtests gibt es eine Fehlermeldung ERR_INVALID_TICKET (4108).

 

Nicht alle Aufträge wurden ausgeführt

Könnte es sein, dass der Fehler damit zusammenhängt, dass der SL vorher ausgelöst wurde?