und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
- Ansichten:
- 898
- Rating:
- Veröffentlicht:
- 2016.04.06 13:23
- Aktualisiert:
- 2016.11.22 07:34
-
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Ab und zu bekomme ich neue Ideen für neue implementierbare Strategien, welche ich im Strategie-Tester testen möchte. Dazu habe ich früher immer meinen vorherigen EA geladen, jeden nicht benötigten Programmtext gelöscht
und anschließend meinen neuen Programmcode geschrieben womit ich dann einen neuen EA hatte. Vor einiger Zeit habe ich dafür nun eine neue Lösung gefunden. Ich habe eine Vorlage, bzw. ein Schema für meine zukünftigen EAs entwickelt.
Dieses ist entstanden, als ich darüber nachgedacht hatte verschiedene Strategien in einem EA zu programmieren und zwischen diesen hin und herschalten zu können, je nach Periode (trend, choppy,... ).
Ich benötigte ein EA Schema, welches es mir erlaubte den gesamten "Aktionscode" und den gesamten "Strategiecode" zusammen zu bringen. Letztendlich habe ich ein Schema gefunden, welches ich hier mit euch teilen möchte.
Die Hauptstruktur dieses EA ist die folgende:
ActionCode - Diese Bereich beinhaltet Code, der unabhängig von Strategien ist
StrategyCode - Dieser Bereich beinhaltet den Code für Strategien
Der Aktionscode wird über den Aufruf des Strategiecodes durchgeführt und der Rückgabewert kann wiederum von dem Aktionscode verarbeitet werden.
ActionCode Part
int _STRATEGY_NUMBER = 1; #define _OPEN_LONG 1 #define _OPEN_SHORT 2 #define _CLOSE_LONG 3 #define _CLOSE_SHORT 4 #define _GET_LONG_STOPLOSS_PRICE 5 #define _GET_SHORT_STOPLOSS_PRICE 6 #define _GET_LONG_TAKEPROFIT_PRICE 7 #define _GET_SHORT_TAKEPROFIT_PRICE 8 #define _GET_LOTS 9 #define _GET_TRAILED_STOPLOSS_PRICE 10 #define _GET_TRAILED_TAKEPROFIT_PRICE 11 #define _GET_TRADED_TIMEFRAME 12 #define _OPEN_PENDING_BUY_STOP 13 #define _OPEN_PENDING_SELL_STOP 14 #define _OPEN_PENDING_BUY_LIMIT 15 #define _OPEN_PENDING_SELL_LIMIT 16 #define _GET_PENDING_BUY_STOP_PRICE 17 #define _GET_PENDING_SELL_STOP_PRICE 18 #define _GET_PENDING_ORDER_EXPIRATION 19 int start() { double Stoploss = 0; double TakeProfit = 0; if(LastBarTraded()) return(0); if(OrdersTotal() > 0) { Stoploss = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_STOPLOSS_PRICE); TakeProfit = Strategy(_STRATEGY_NUMBER, _GET_TRAILED_TAKEPROFIT_PRICE); if(Stoploss != 0 || TakeProfit != 0) ModifyAllPositions(_MAGICNUMBER, Stoploss, TakeProfit); if(Strategy(_STRATEGY_NUMBER, _CLOSE_LONG) == 1) CloseAllLongPositions(_MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _CLOSE_SHORT) == 1) CloseAllShortPositions(_MAGICNUMBER); } if(!TradeAllowed(1)) return(0); if(Strategy(_STRATEGY_NUMBER, _OPEN_LONG) == 1) OpenPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _OPEN_SHORT) == 1) OpenPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER); if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_BUY_STOP) == 1) OpenPendingPosition(false, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_BUY_STOP_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_LONG_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION)); if(Strategy(_STRATEGY_NUMBER, _OPEN_PENDING_SELL_STOP) == 1) OpenPendingPosition(true, Strategy(_STRATEGY_NUMBER, _GET_LOTS), Strategy(_STRATEGY_NUMBER, _GET_PENDING_SELL_STOP_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_STOPLOSS_PRICE), Strategy(_STRATEGY_NUMBER, _GET_SHORT_TAKEPROFIT_PRICE), 3, _MAGICNUMBER, Strategy(_STRATEGY_NUMBER, _GET_PENDING_ORDER_EXPIRATION)); return(0); }
StrategyCode part
double Strategy(int STRATEGY, int COMMAND) { switch(STRATEGY) { // Eine kurze Beschreibung der Strategie case 1: { return(Strategy_001(COMMAND)); } // Eine kurze Beschreibung der Strategie case 2: { return(Strategy_002(COMMAND)); } //... <s0>// Eine kurze Beschreibung der Strategie case 99: { return(Strategy_099(COMMAND)); } } return(0); } double Strategy_001(int COMMAND) { string _SYMBOL = Symbol(); int _TIMEFRAME = getStrategyTimeframeByNumber(_STRATEGY_TIMEFRAME); double result = 0; int i; switch(COMMAND) { case _OPEN_LONG: { // break; // if(!OpenNewBar()) // break; if(Open long condition is true) result = 1; break; } case _OPEN_SHORT: { // break; // if(!OpenNewBar()) // break; if(Open short condition is true) result = 1; break; } case _CLOSE_LONG: { // break; if(Close long condition is true) result = 1; break; } case _CLOSE_SHORT: { // break; if(Close short condition is true) result = 1; break; } case _GET_LONG_STOPLOSS_PRICE: { // break; result = Long SL price break; } case _GET_SHORT_STOPLOSS_PRICE: { // break; result = Short SL price break; } case _OPEN_PENDING_BUY_STOP: { break; } case _OPEN_PENDING_SELL_STOP: { break; } case _GET_PENDING_BUY_STOP_PRICE: { break; } case _GET_PENDING_SELL_STOP_PRICE: { break; } case _GET_LONG_TAKEPROFIT_PRICE: { break; } case _GET_SHORT_TAKEPROFIT_PRICE: { break; } case _GET_TRAILED_STOPLOSS_PRICE: { break; } case _GET_TRAILED_TAKEPROFIT_PRICE: { break; } case _GET_LOTS: { result = Lot amount; break; } case _GET_TRADED_TIMEFRAME: { result = _TIMEFRAME; break; } case _GET_PENDING_ORDER_EXPIRATION: { break; } } return(result); }
Man kann deutlich sehen, dass die Implementierung von neuen Strategien in das selbe Schema sehr einfach ist. Fügen Sie lediglich ein neues CASE in die Strategy() Funktion ein und fügen Sie eine neue Funktion Strategy_NNN() mit den zugehörigen Strategie-Regeln hinzu.
Dieses Schema passt nur zu Strategien, die nur eine offene Positionen gleichzeitig erlauben und einen Standard-"Workflow" besitzen.
Als Beispiel habe ich Programmcode über nicht erfolgreiche Strategien hinzugefügt (diesen finden Sie im angehängten Code)
Ich hoffe, ich konnte damit einige von Euch inspirieren und vielleicht gibt es ja auch neue Ideen, die dieses Konzept weiter verbessern können.Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/en/code/8625

Ein weiterer Indikator, der den Tick Chart anzeigt, was wohl für die Pipsers interessant sein dürfte. Er hat einige Besonderheiten.

Umwandler für das Lesen und Schreiben mit MySQL

Ein weiterer Fibo Indikator.

Dieser Indikator zeigt mit Pfeilen an, wo man kaufen und verkaufen sollte. In einem Markt mit einem Trend bringt dieser Indikator ein Profit, wenn es keinen Trend gibt dann gibt es leider auch keinen Profit.