Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4484
Beiträge: 40719
Benutzer: 6.868
Aktive Benutzer: 253
Links: 80
Wir begrüßen unseren neuesten Benutzer: huseceti
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 15 Stunden
- huseceti
vor einem Tag
- petra25
vor 4 Tagen
- hk0163
vor 4 Tagen
- magnr1
vor 5 Tagen
- boypac007

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 78
Gesamt: 79
Team: 0
Team:  
Benutzer:  Indikator-Trading
Freunde anzeigen

Empfehlungen

Like Tree1Likes
Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 24.05.20
Neues Mitglied
 
Registriert seit: May 2020
Beiträge: 18
berndao befindet sich auf einem aufstrebenden Ast
Standard 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.

Geändert von berndao (24.05.20 um 20:43 Uhr) Grund: Ergänzung
Mit Zitat antworten
  #2 (permalink)  
Alt 24.05.20
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 29
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #3 (permalink)  
Alt 24.05.20
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 952
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

Das ganze Prinzip wird nicht funktionieren, weil man immer noch die Spreads wieder rein bekommen muss.
Mit Zitat antworten
  #4 (permalink)  
Alt 24.05.20
Neues Mitglied
 
Registriert seit: May 2020
Beiträge: 18
berndao befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
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.
Mit Zitat antworten
  #5 (permalink)  
Alt 25.05.20
Neues Mitglied
 
Registriert seit: May 2020
Beiträge: 18
berndao befindet sich auf einem aufstrebenden Ast
Standard

Nachdem ich mal Ask und Bid an den richtigen Stellen eingesetzt habe, läuft es nun :-)
Mit Zitat antworten
  #6 (permalink)  
Alt 25.05.20
Neues Mitglied
 
Registriert seit: May 2020
Beiträge: 18
berndao befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #7 (permalink)  
Alt 25.05.20
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 29
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #8 (permalink)  
Alt 25.05.20
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.376
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Also, ich würde zuerst mal statt

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


OrderSelect(BuyTrade,SELECT_BY_TICKET);

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


OrderSelect(SellTrade,SELECT_BY_TICKET);

schreiben.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
Mit Zitat antworten
  #9 (permalink)  
Alt 25.05.20
Neues Mitglied
 
Registriert seit: May 2020
Beiträge: 18
berndao befindet sich auf einem aufstrebenden Ast
Standard

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? :-)
Mit Zitat antworten
  #10 (permalink)  
Alt 25.05.20
Neues Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 29
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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

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

Die einfachste Lösung für dein nun neu entstandenes Problem ist die OrderSelect() Funktion in eine if-Abfrage zu packen.
berndao likes this.
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 20:00 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2020 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------