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)
-   -   Error 130 und 138 bei EA Ausführung? (http://www.expert-advisor.com/forum/showthread.php?t=6674)

berndao 24.05.20 20:34

Error 130 und 138 bei EA Ausführung?
 
Hallo,
ich habe etwas rumgewerkelt und den folgenden E Code zusammengeschustert:
Code:

//+------------------------------------------------------------------+
//|                                                    10 20 EA.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                            https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict

input int pipsStopLoss=18;
input double takemulti=2.5;
input double lotsize=0.01;
int BuyTrade;
int SellTrade;

#include <Allerlei 1.mqh>

datetime LastActiontime;
//used to determine if a new bar has been formed



void InitializeVariables(){
  BuyTrade=0;
  SellTrade=0;
}


//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit(){
//---
  Print("Start Time is= ",TimeCurrent());
  LastActiontime=Time[1];
  //Print("die Zahl ",1.23456789," gerundet auf die ",_Digits,"te Nachkommastelle ergibt ", roundD(1.23456789));
  //Print("");
  //Print( DoubleToString(Wert, _Digits) );
 
  InitializeVariables();
 
 
//---
  return(INIT_SUCCEEDED);
}
 
 

 
 
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick() {
  RefreshRates();
  //only allows action if a new bar has formed
  if(LastActiontime==Time[1]){
    ActionsOncePerTick();
    return;
  }
  else
  {
    ActionsOncePerTick();
    ActionsOncePerBar();
    LastActiontime=Time[1];
    return;
  } 
//+------------------------------------------------------------------+
}


void ActionsOncePerBar(){

  //Print("Last Bar Time is= ",Time[1], "and last Close Price is= ",DoubleToString(Close[1],_Digits));
  Print("At the previous Bar, are the Bollinger Bands contracting? ", BBcontract() );
  Print("by how much compared to the previous bar? ", DoubleToString(BBContpercent(),2));
  Print("");
 


}

void ActionsOncePerTick(){
  RefreshRates();

  CheckTrades();
  return;
}

void CheckTrades(){
  RefreshRates();
  if(OrdersTotal()==0){
    InitializeVariables();
    OpenTrades();
  }
  else{
    UpdateTrades();
  }
}

void OpenTrades(){
 OpenBuyTrade();
 OpenSellTrade();
 
}


void OpenBuyTrade(){
  RefreshRates();
  double stoploss=NormalizeDouble(Bid-Point*pipsStopLoss,Digits);
  double takeprofit=NormalizeDouble(Bid+Point*takemulti*pipsStopLoss,Digits);
  RefreshRates();
  BuyTrade=OrderSend(Symbol(),OP_BUY,lotsize,Bid,3,stoploss,takeprofit);

}


void OpenSellTrade(){
  RefreshRates();

  double stoploss=NormalizeDouble(Bid+Point*pipsStopLoss,Digits);
  double takeprofit=NormalizeDouble(Bid-Point*takemulti*pipsStopLoss,Digits);
  RefreshRates();c
  SellTrade=OrderSend(Symbol(),OP_BUY,lotsize,Bid,3,stoploss,takeprofit);

}

void UpdateTrades(){
  RefreshRates();

  //Buy Trade
  OrderSelect(BuyTrade,SELECT_BY_TICKET);
  if(OrderStopLoss()<Bid-Point*pipsStopLoss){
    RefreshRates();
    OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*pipsStopLoss,Digits),OrderTakeProfit(),0,Blue);
  }

  OrderSelect(SellTrade,SELECT_BY_TICKET);
  if(OrderStopLoss()>Bid+Point*pipsStopLoss){
    RefreshRates();
    OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid+Point*pipsStopLoss,Digits),OrderTakeProfit(),0,Blue);
  }
 
}


Was er tun soll:
Er soll, wenn keine offene Trade da sind, 2 Trades gleichzeitig aufmachen:
einen Buytrade, bei dem der Stoploss bspw. 10 Pips ist und der Takeprofit 25 Punkte (eben das 2,5 fache des stoploss).
und einen selltrade der im prinzip das selbe gespiegelt ist, also stoploss 10 pips über dem bidpreis und takeprofit 25 punkte unter dem bid preis.


Gedacht ist das Ganze für sehr volatile Märkte wo es wild auf und ab geht.
egal ob es nahc Tradeeröffnung auf odder ab geht, einer der beiden Trades wird takeprofit erreichen, der andere den stoploss auslösen und in summe verbleibt ein kleiner profit.

so das prinzip.

jedenfalls soll der EA bei jedem neuen Balken gucken, ob shcon Trades aufsind.

Falls nein, macht er die 2 gegensätzlichen trades wie oben erwähnt auf.

Falls ja, dann zieht er im Sinne eines TrailingStoploss den stoploss desjenigen Trades nach, zu dessen Gunsten sich der Preis verändert hat.

nur gab es bei der Ausführung dann fehler.

Anfangs bekam ich Error 131, der sich beheben ließ indem ich die vorgegebene Lotsize von 0.001 (wohl unzulässig klein) auf 0.01 anhob (obwohl der Broker microlots anbeitet, also keine Ahnung wieso das nicht geht. vielleicht weils ein Demoaccount ist?)

Danach kommen aber 2 Fehler die ich nicht nachvollziehen kann was sie bedeuten bzw. wodurch sie verursacht werden:

error 130 und 138 im direkten Wechsel, für jeden Balken neu.


Das Journal sieht auszugsweise so aus:
Code:

2020.05.24 20:32:55.908        EURGBP,H4: 26851 tick events (24 bars, 27852 bar states) processed in 0:00:01.906 (total time 0:00:11.984)
2020.05.24 20:32:55.908        2020.04.02 23:58:09  10 20 EA EURGBP,H4: OrderSend error 130
2020.05.24 20:32:55.908        2020.04.02 23:58:09  10 20 EA EURGBP,H4: OrderSend error 138
2020.05.24 20:32:55.908        2020.04.02 23:58:07  10 20 EA EURGBP,H4: OrderSend error 130
2020.05.24 20:32:55.908        2020.04.02 23:58:07  10 20 EA EURGBP,H4: OrderSend error 138
2020.05.24 20:32:55.908        2020.04.02 23:57:30  10 20 EA EURGBP,H4: OrderSend error 130
2020.05.24 20:32:55.908        2020.04.02 23:57:30  10 20 EA EURGBP,H4: OrderSend error 138
2020.05.24 20:32:55.908        2020.04.02 23:56:52  10 20 EA EURGBP,H4: OrderSend error 130
2020.05.24 20:32:55.908        2020.04.02 23:56:52  10 20 EA EURGBP,H4: OrderSend error 138
2020.05.24 20:32:55.908        2020.04.02 23:56:15  10 20 EA EURGBP,H4: OrderSend error 130
2020.05.24 20:32:55.908        2020.04.02 23:56:15  10 20 EA EURGBP,H4: OrderSend error 138
2020.05.24 20:32:55.908        2020.04.02 23:55:37  10 20 EA EURGBP,H4: OrderSend error 130
2020.05.24 20:32:55.908        2020.04.02 23:55:37  10 20 EA EURGBP,H4: OrderSend error 138

Kennt sich Jemand aus was das bedeutet und was ich falsch mache?
Ich bin mir eigentlich recht sicher dass ich die OrderSend() und OrderModify() Befehle inklusive Parameter richtig angewendet habe :-/

Edit: In der Allerlei 1.mqh steht nichts, was ich hier überhaupt benutzt habe.
war insofern sinnfrei das einzubinde.

Indikator-Trading 24.05.20 21:11

Error 130 ist "Invalid stops"
Error 138 ist "Requote"

Kontrolliere die Werte für TP und SL. Lass sie dir am besten mit Print() direkt mit dem ASK Preis vor der Orderausführung anzeigen.
Außerdem kaufst du bei Buy kaufst du mit dem ASK Preis.

https://book.mql4.com/appendix/errors

MA-EA 24.05.20 22:36

Das ganze Prinzip wird nicht funktionieren, weil man immer noch die Spreads wieder rein bekommen muss. ;)

berndao 24.05.20 23:09

Zitat:

Zitat von Indikator-Trading (Beitrag 43773)
Error 130 ist "Invalid stops"
Error 138 ist "Requote"

Kontrolliere die Werte für TP und SL. Lass sie dir am besten mit Print() direkt mit dem ASK Preis vor der Orderausführung anzeigen.
Außerdem kaufst du bei Buy kaufst du mit dem ASK Preis.

https://book.mql4.com/appendix/errors


Up, das hatte ich doch glatt vergessen :-)

Muss ich nochmal durchgehen, die ganzen Berechnungen.

berndao 25.05.20 11:02

Nachdem ich mal Ask und Bid an den richtigen Stellen eingesetzt habe, läuft es nun :-)

berndao 25.05.20 16:30

Und gleich die nächste Inkompetenz meinerseits:

hier der Code
Code:

//+------------------------------------------------------------------+
//|                                                    10 20 EA.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                            https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict

input int pipsStopLoss=18;
input double lotsize=0.01;
int BuyTrade;
int SellTrade;

//for TradeUpdate Function
double NewStopLoss;

#include <Allerlei 1.mqh>

datetime LastActiontime;
//used to determine if a new bar has been formed



void InitializeVariables(){
  BuyTrade=0;
  SellTrade=0;
}


//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit(){
//---
  Print("Start Time is= ",TimeCurrent());
  LastActiontime=Time[1];
  //Print("die Zahl ",1.23456789," gerundet auf die ",_Digits,"te Nachkommastelle ergibt ", roundD(1.23456789));
  //Print("");
  //Print( DoubleToString(Wert, _Digits) );
 
  InitializeVariables();
 
 
//---
  return(INIT_SUCCEEDED);
}
 
 

 
 
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick() {
  RefreshRates();
  //only allows action if a new bar has formed
  if(LastActiontime==Time[1]){
    ActionsOncePerTick();
    return;
  }
  else
  {
    ActionsOncePerTick();
    ActionsOncePerBar();
    LastActiontime=Time[1];
    return;
  } 
//+------------------------------------------------------------------+
}


void ActionsOncePerBar(){

  //Print("Last Bar Time is= ",Time[1], "and last Close Price is= ",DoubleToString(Close[1],_Digits));
  Print("At the previous Bar, are the Bollinger Bands contracting? ", BBcontract() );
  Print("by how much compared to the previous bar? ", DoubleToString(BBContpercent(),2));
  Print("");
 


}

void ActionsOncePerTick(){
  RefreshRates();

  CheckTrades();
  return;
}

void CheckTrades(){
  RefreshRates();
  if(OrdersTotal()==0){
    InitializeVariables();
    OpenTrades();
  }
  else{
    UpdateTrades();
  }
}

void OpenTrades(){
 OpenBuyTrade();
 OpenSellTrade();
 
}


void OpenBuyTrade(){
  RefreshRates();
  double stoploss=NormalizeDouble(Bid-Point*pipsStopLoss,Digits);
  RefreshRates();
  BuyTrade=OrderSend(Symbol(),OP_BUY,lotsize,Ask,3,stoploss,0);

}


void OpenSellTrade(){
  RefreshRates();
  double stoploss=NormalizeDouble(Ask+Point*pipsStopLoss,Digits);
  RefreshRates();
  SellTrade=OrderSend(Symbol(),OP_SELL,lotsize,Bid,3,stoploss,0);

}


//Update Trades
void UpdateTrades(){
  RefreshRates();
 
//+------------------------------------------------------------------+
//| Buy Trade                                                        |
//+------------------------------------------------------------------+
  OrderSelect(BuyTrade,SELECT_BY_TICKET);
  NewStopLoss=OrderStopLoss();
 
  RefreshRates();
  //berechne neuen StopLoss
  if(OrderStopLoss()<Bid-Point*pipsStopLoss){
    NewStopLoss=NormalizeDouble(Bid-Point*pipsStopLoss,Digits);
  }
 
  //nur Stoploss anpassen
  RefreshRates();
  OrderModify(OrderTicket(),OrderOpenPrice(),NewStopLoss,0,0,Blue);
   
 
 
 
 

//+------------------------------------------------------------------+
//| Sell Trade                                                      |
//+------------------------------------------------------------------+
 

  OrderSelect(BuyTrade,SELECT_BY_TICKET);
  NewStopLoss=OrderStopLoss();
 
  RefreshRates();
  //berechne neuen StopLoss
  if(OrderStopLoss()>Ask+Point*pipsStopLoss){
    NewStopLoss=NormalizeDouble(Ask+Point*pipsStopLoss,Digits);
  }
 
  //nur Stoploss anpassen
  RefreshRates();
  OrderModify(OrderTicket(),OrderOpenPrice(),NewStopLoss,0,0,Blue);
   
 
 
}


Soll an sich einfahc nur, wenn keine Trades auf sind, einen Buy und eine n Sell Trade gleichzeitig aufmachen.
kein Takeprofit, sondern bei Beidem nur StopLoss.
Jene StopLoss sollen dann, wenn der aktuelle Preis sich vom StopLoss entfernt hat (sprich: der Abstand zwischen aktuellem Preis und Stoploss größer geworden ist), nachgezogen werden (ein manuell gebauter TralingStopLoss).

Nun erhalt eich wiederum andere Errors, die irgendwie mit den Ordernummern nun Probleme haben:

Code:

2020.05.25 16:22:11.603        EURGBP,H4: 235692 tick events (144 bars, 236693 bar states) processed in 0:00:44.328 (total time 0:00:52.484)
2020.05.25 16:22:11.603        2020.04.02 23:58:09  Tester: order #84 is closed
2020.05.25 16:22:11.603        2020.04.02 23:58:09  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:58:09  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:58:09  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:58:09  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:58:07  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:58:07  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:58:07  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:58:07  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:57:30  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:57:30  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:57:30  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:57:30  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:56:52  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:56:52  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:56:52  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:56:52  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:56:15  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:56:15  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:56:15  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:56:15  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:55:37  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:55:37  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function
2020.05.25 16:22:11.602        2020.04.02 23:55:37  10 0 EA EURGBP,H4: OrderModify error 4108
2020.05.25 16:22:11.602        2020.04.02 23:55:37  10 0 EA EURGBP,H4: unknown ticket 83 for OrderModify function


Indikator-Trading 25.05.20 20:41

Wahrscheinlich liegt es daran, dass einer deiner Trades bereits im SL war, du aber dennoch nach diesem suchst.

Code:

if(OrdersTotal()==0)
Du sagst ja, wenn min. 1 Trade offen ist, dann checkst du den SL des Buy und Sell Trades, egal ob die aktuell noch offen sind oder nicht.

traderdoc 25.05.20 21:05

Also, ich würde zuerst mal statt

//+------------------------------------------------------------------+
//| Sell Trade |
//+------------------------------------------------------------------+


OrderSelect(BuyTrade,SELECT_BY_TICKET);

//+------------------------------------------------------------------+
//| Sell Trade |
//+------------------------------------------------------------------+


OrderSelect(SellTrade,SELECT_BY_TICKET);

schreiben.

traderdoc

berndao 25.05.20 21:09

Das ist natürlich ein Argument! :-)

Mir fällt gerade etwas sehr offensichtliches auf:
Irgendwie dachte ich die ganze Zeit nur so:
Entweder sind 2 trades auf oder keine.

Dass aber einer davon shcon zu ist wegen stoploss, der andere aber noch läuft, da habe ich irgendwie gar nicht dran gedacht :O

Da muss ich mal schwer mein konzept überdneken, wie ich das sinnvoll löse...


sowas wie try{} catch kennt MQL4 nicht zufällig, oder? :-)

Indikator-Trading 25.05.20 21:59

Schön das dir das jetzt auffällt... das übrigens genau DAS was ich vorher geschrieben habe...……..

Wie der Wendler so gerne sagt, "EGAL!!!!" :rolleyes:

Die einfachste Lösung für dein nun neu entstandenes Problem ist die OrderSelect() Funktion in eine if-Abfrage zu packen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:32 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