|
Programmierung MQL5 Hier gehts rund ums Programmieren in MQL5. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Selbst EAs entwickeln - WIE?
Liebes Forum,
ich bin neu hier und freue mich, dass ich ein nettes und vor allem deutschsprachiges Metatrader- und Expert Advisor-Forum gefunden habe. Zu meiner Person: Ich habe noch nie Forex oder mit dem MT live getradet und interessiere mich vor allem für die EA-Programmierung von eigenen Handelsstrategien. Das ist auch eine gute Überleitung zu meiner Frage. Wie fange ich am besten an eigene EAs zu programmieren? Was muss ich lesen? Was muss ich können? Wie steige ich am besten in das ganze Thema ein? Eine konkrete Handelsstrategie habe ich noch nicht im Auge / Kopf. Ich würde mir beispielsweise gerne kreuzende MAs anschauen und den einen oder anderen Indikator als zusätzlichen Filter anschauen und das durch einen Backtest laufen lassen. Das Moneymanagement möchte ich so gestalten, dass die Positionsgröße abhängig vom Kontostand aufbaut wird. Gruß Casch |
|
|||
Was muss ich lesen? Was muss ich können?
Code:
//+------------------------------------------------------------------+ //| MA.mq5 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //--- input parameters input int StopLoss=100; input int TakeProfit=100; input int MA_Period=57; input int MA_Period1=3; input int EA_Magic=35; input double Lot=1.0; //--- int ma1Handle; int maHandle; double ma1Val[]; double maVal[]; double p_close; int STP,TKP; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { ma1Handle=iMA(_Symbol,_Period,MA_Period1,0,MODE_LWMA,PRICE_CLOSE); maHandle=iMA(_Symbol,_Period,MA_Period,0,MODE_EMA,PRICE_CLOSE); if(ma1Handle<0 || maHandle<0) { Alert("ERROR: ",GetLastError(),"!!"); return(-1); } STP = StopLoss; TKP = TakeProfit; if(_Digits==5 || _Digits==3) { STP = STP*10; TKP = TKP*10; } return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { IndicatorRelease(ma1Handle); IndicatorRelease(maHandle); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(Bars(_Symbol,_Period)<60) { Alert("ERROR"); return; } static datetime Old_Time; datetime New_Time[1]; bool IsNewBar=false; int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) { if(Old_Time!=New_Time[0]) { IsNewBar=true; if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("new bar",New_Time[0],"alt bar",Old_Time); Old_Time=New_Time[0]; } } else { Alert("ERROR =",GetLastError()); ResetLastError(); return; } if(IsNewBar==false) { return; } int Mybars=Bars(_Symbol,_Period); if(Mybars<60) { Alert("ERROR"); return; } MqlTick latest_price; MqlTradeRequest mrequest; MqlTradeResult mresult; MqlRates mrate[]; ZeroMemory(mrequest); ArraySetAsSeries(mrate,true); ArraySetAsSeries(ma1Val,true); ArraySetAsSeries(maVal,true); if(!SymbolInfoTick(_Symbol,latest_price)) { Alert("ERROR:",GetLastError(),"!!"); return; } if(CopyRates(_Symbol,_Period,0,3,mrate)<0) { Alert("ERROR:",GetLastError(),"!!"); return; } if(CopyBuffer(ma1Handle,0,0,3,ma1Val)<0) { Alert("ERROR:",GetLastError(),"!!"); return; } if(CopyBuffer(maHandle,0,0,3,maVal)<0) { Alert("ERROR:",GetLastError()); return; } bool Buy_opened=false; bool Sell_opened=false; if(PositionSelect(_Symbol)==true) { if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { Buy_opened=true; } else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { Sell_opened=true; } } p_close=mrate[1].close; bool Buy_Condition_1=(maVal[0]>maVal[1]) && (maVal[1]>maVal[2]); bool Buy_Condition_2=(ma1Val[0]>ma1Val[1]) &&(ma1Val[1]>ma1Val[2]); bool Buy_Condition_3=(p_close>maVal[1]); bool Buy_Condition_4 =(maVal[0]>ma1Val[0]); if(Buy_Condition_1 && Buy_Condition_2) { if(Buy_Condition_3 && Buy_Condition_4) { if(Buy_opened) { return; } mrequest.action = TRADE_ACTION_DEAL; mrequest.price = NormalizeDouble(latest_price.ask,_Digits); mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); mrequest.symbol = _Symbol; mrequest.volume = Lot; mrequest.magic = EA_Magic; mrequest.type = ORDER_TYPE_BUY; mrequest.type_filling = ORDER_FILLING_FOK; mrequest.deviation=100; OrderSend(mrequest,mresult); if(mresult.retcode==10009 || mresult.retcode==10008) { Alert(" #:",mresult.order,"!!"); } else { Alert("ERROR:",GetLastError()); return; } } } bool Sell_Condition_1 = (maVal[0]<maVal[1]) && (maVal[1]<maVal[2]); bool Sell_Condition_2 = (p_close <maVal[1]); bool Sell_Condition_3=(ma1Val[0]<ma1Val[1]) && (ma1Val[1]<ma1Val[2]); bool Sell_Condition_4=(maVal[0]<ma1Val[0]); if(Sell_Condition_1 && Sell_Condition_2) { if(Sell_Condition_3 && Sell_Condition_4) { if(Sell_opened) { return; } mrequest.action = TRADE_ACTION_DEAL; mrequest.price = NormalizeDouble(latest_price.bid,_Digits); mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); mrequest.symbol = _Symbol; mrequest.volume = Lot; mrequest.magic = EA_Magic; mrequest.type= ORDER_TYPE_SELL; mrequest.type_filling = ORDER_FILLING_FOK; mrequest.deviation=100; OrderSend(mrequest,mresult); if(mresult.retcode==10009 || mresult.retcode==10008) //Request is completed or order placed { Alert(" #:",mresult.order,"!!"); } else { Alert("ERROR:",GetLastError()); return; } } } return; } //+------------------------------------------------------------------+ Geändert von pako (05.11.13 um 16:33 Uhr) |
|
|||
Was soll er denn damit anfangen?
Als erstes wäre die Frage zu klären, ob er überhaupt eine Programmiersprache beherrscht, vorzugsweise C. Wenn gute Kenntnisse in C bereits vorliegen, ist wenigsten die Basis da. Desweiteren steht die Frage, inwiefern er bereits im Forex tätig war und das wenigstens mit Demokonten, denn ohne umfangreiches Marktwissen und das Wissen um die Begrifflichkeiten, wird es kein gutes Programm werden. Das wäre dann so, als würde ich mit meinen sehr guten C-Kenntnissen ein Betriebwirtschaftsprogramm erstellen müssen, obwohl ich das gar nicht gerlernt oder studiert habe. Nein, ohne Fachwissen im Forex wird das nichts richtiges. Also, C (oder andere Sprache) + Fachwissen und dann die Spezifitäten von MQL4!! lernen, die es leider nur in englisch gibt. Und dann während des Lesens und Lernens gleichzeitig kleine Codebeispiele von EAs, Indikatoren und Scripten sich anschauen, die Befehle und Funktionen analysieren, nachschlagen und selber anwenden, z.B. durch Spielen in den Codebeispielen mittels Veränderung von Parametern usw. Also, schrittweises Herangehen und nicht gleich den Porsche fahren wollen! traderdoc Geändert von traderdoc (05.11.13 um 18:13 Uhr) |
|
||||
Zum erwähnten Buch gibt es diesen Link zu Amazon. Vielleicht helfen dir die Kundenmeinungen darunter weiter. Die Syntax soll wohl nicht mehr dem neuesten Stand der Sciptsprache entsprechen.
http://www.amazon.de/Expert-Advisor-.../dp/0982645902
__________________
An der Börse gibt‘s nur Schmerzensgeld – erst kommen die Schmerzen, dann das Geld! (André Kostolany) |
|
|||
Zitat:
sowie die unendlichen Programme die bereits geschrieben worden und unter MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader und www.mql5.com einsehbar sind, weil der Quellcode zur Verfügung steht. Dort kann man sich unerschöpflich bedienen und sich Techniken abgucken, die in keinem Buch stehen. Und ansonsten heißt es nur: üben, üben und nochmal üben. Den selbstgeschrieben Code ändern, das Ergebnis der Änderung beobachten, richtig interpretieren und wiederum ändern, bis man der Meinung ist, mit diesem Detail richtig umgehen zu können. Ich persönlich finde das Schwierigste an dieser Sprache, die Umsetzung von Zeitproblemen. Denn es existieren Funktionen, die entweder auf der Brokerzeit oder auf der PC-Zeit basieren. Aber auch die Berücksichtigung der Wochenschlußzeiten und die Umsetzung von Zeitranges, die v.a. über Nacht laufen etc., bedürfen in kommenden Updates des MQL einer drastischen Überarbeitung und Vereinfachung. traderdoc traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
Stichworte |
ea, ea entwickeln, ea programmieren, expert advisor, expert advisor entwickeln, expert advisor programmieren, programmieren, programmierung |
|
|