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 MQL5 (http://www.expert-advisor.com/forum/forumdisplay.php?f=221)
-   -   Selbst EAs entwickeln - WIE? (http://www.expert-advisor.com/forum/showthread.php?t=3320)

Casch 05.11.13 15:49

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

pako 05.11.13 16:08

Was muss ich lesen? Was muss ich können? :D


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;
  }
//+------------------------------------------------------------------+


traderdoc 05.11.13 17:50

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

Aktien Andy 11.10.15 11:04

Moin ;)

Mir wurde das Buch von Andrew R. Young (Expert Advisor Programming for MT4) empfohlen; er hat auch eins für MT5 geschrieben. Leider kann ich Dir noch nicht sagen, ob das Buch gut ist, da ich es gerade erst bestellt habe.

Auch ich will mich mit der Programmierung befassen, da ich einige Grundideen austesten möchte.

Das Thema backtesting ist ein Thema für sich, da könnte man schon allein ein Buch drüber schreiben ;) Mit backtesting befasse ich mich schon länger.

Für kreuzende EAs gibt es einige fertige EAs, mit denen Du erst einmal anfangen kannst. Warum diese von den Autoren frei zur Verfügung gestellt werden liegt auf der Hand (man kann damit keine dauerhaften Gewinne erzielen).

Wenn Du nur zwei oder drei einfache Ideen testen möchtest, dann musst Du überlegen, ob es da nicht einfacher ist, dir das programmieren zu lassen.

Grüße aus dem hohen Norden sendet

Andreas

kbtrade 12.10.15 15:05

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

traderdoc 12.10.15 19:28

Zitat:

Zitat von kbtrade (Beitrag 31276)
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

Die besten Lehrer für diese Materie sind immer noch die engl. Version der MQL4-Doku und die über 4000 Seiten dicke deutsche Version der MQL5-Doku,
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


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