Kann mir vielleicht jemand den Grund-Code für einen EA mit verschiedenen MA zusammenstellen?

 

Ich möchte gerade einen eigenen EA zusammen bauen.

Kann mir vielleicht jemand den Grund-Code zusammenstellen für folgende Anforderungen?

Ich denke das sollte für jemand aus dem Forum ein Kinderspiel sein, aber ich bin noch ganz am Anfang. Und hierfür gleich am Anfang einen Experten zu beauftragen kann ich mir nicht leisten.

Modifizieren kann ich ihn dann schon. Aber ich weiß noch nicht wie ich die Werte bekomme und fallend/steigend/Differenzen berechnen sowie nur Buy oder Sell zulassen kann. 

Wäre super.

 

EA in MQL5 für MT5

 

Signale

Signal_MA1 (Bsp.EMA50) mit Shiftfunktion (Verschiebung auf auf X-Achse)

Signal_MA2 (Bsp.EMA40) mit Shiftfunktion (Verschiebung auf auf X-Achse)

Signal_MA3 (Bsp.EMA20) mit Shiftfunktion (Verschiebung auf auf X-Achse)

Signal_MA4 (Bsp.SMA12) mit Shiftfunktion (Verschiebung auf auf X-Achse)

Signal_MA5 (Bsp.SMA6) mit Shiftfunktion (Verschiebung auf auf X-Achse)

 

Von mir im Programm dann einstellbar, gerne auch durch ausblenden/ändern im MQL5-Code:

Handel wenn

  • Signal_MA1 fällt (oder steigt) und
  • Signal_MA2 fällt (oder steigt) und
  • Signal_MA3 fällt (oder steigt) und
  • Signal_MA4 um x.xx > Signal_MA5 oder (um x.xx < Signal_MA5)
  • EA soll Sell und Buy (oder Nur Sell) (oder nur Buy) handeln
 

Jeder der dir helfen würde weiß das es mit dem eine  "Stück" Code nicht getan ist. Es wird ein Faß ohne Boden werden da du immer neue Fragen hast.

 

Du musst lernen den Code zu verstehen , der Weg über andere hilft dir nicht weiter.

Schon mal den Artikel versucht ? Da ist alles drin was du suchst.

https://www.mql5.com/de/articles/171 

 Gruß

Der MQL5-Assistent: Erstellen von Expert-Systemen ohne Programmierung
Der MQL5-Assistent: Erstellen von Expert-Systemen ohne Programmierung
  • 2016.03.14
  • MetaQuotes Software Corp.
  • www.mql5.com
Möchten Sie eine Handelsstrategie ausprobieren, ohne Zeit mit Programmieren zu vergeuden? In dem Assistenten („Wizard“) von MQL5 können Sie einfach die Art der Handelssignale auswählen, Module zur Pflege der Positionen und für die Kapitalverwaltung hinzufügen, und fertig ist der Lack! Erstellen Sie eigene Modulumsetzungen oder bestellen Sie sie mithilfe des Dienstes „Freie Mitarbeit“, und kombinieren Sie Ihre neuen Module mit den bereits vorhandenen.
 

Einen Artikel für Einsteiger den ich recht gut finde ist hier https://www.mql5.com/de/articles/100

Und auch sonst gibt's Artikel und Codebeispiele wie Sand am Meer.

Viel Erfolg !

Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5
Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5
  • 2016.01.12
  • Samuel Olowoyo
  • www.mql5.com
Die Programmierung des Expert Advisors in MQL5 ist einfach und kann problemlos erlernt werden. In diesem Leitfaden werden nacheinander die zum Schreiben eines einfachen Expert Advisors auf Grundlage einer entwickelten Handels-Strategie erforderlichen, grundlegenden Schritte erklärt. Es werden hier die Struktur eines Expert Advisors, die Verwendung eingebauter technischer Indikatoren und Handels-Funktionen, die Details des Fehlersuch(Debug)-Modus und die Verwendung des Strategie-Testers präsentiert.
 
Christian:

Jeder der dir helfen würde weiß das es mit dem eine  "Stück" Code nicht getan ist. Es wird ein Faß ohne Boden werden da du immer neue Fragen hast.

 

Du musst lernen den Code zu verstehen , der Weg über andere hilft dir nicht weiter.

Schon mal den Artikel versucht ? Da ist alles drin was du suchst.

https://www.mql5.com/de/articles/171 

 Gruß

Hallo Christian,

 vielen Dank.

Das was auf deinem angegebenen Link zu finden ist, weiß ich schon alles. 

Einen EA mit 5 MAs kann ich erstellen und die Trailing- und Moneyeigenschaften einstellen habe ich auch kein Problem. Auch das Optimieren usw. alles easy.

Aber woher ich diese Parameter bekomme, das war meine Frage.

Von mir im Programm dann einstellbar, gerne auch durch ausblenden/ändern im MQL5-Code:

Handel wenn

  • Signal_MA1 fällt (oder steigt) und
  • Signal_MA2 fällt (oder steigt) und
  • Signal_MA3 fällt (oder steigt) und
  • Signal_MA4 um x.xx > Signal_MA5 oder (um x.xx < Signal_MA5)
  • EA soll Sell und Buy (oder Nur Sell) (oder nur Buy) handeln 
 

Du hast ihn leider nur überflogen und nicht verstanden.

Mit Hilfe des Wizard ist der EA im nu erstellt.

Die verschieden MAs eintragen

Unter filter0 ...filter1 ...filter2 sind alle Mas zu finden. Du musst sie nur noch so kombinieren wie du sie brauchst.

Der Wizard erstellt OOP Code der für einen Anfänger schwerer zu verstehen ist. Aber es einem leichter macht schnell viel Code zu erzeugen.

Baue einen EA damit und nimm erst einmal nur ein MA .

 

Verändere denn Filter0 und lerne die Effekte. Erst dann bist du in der Lage die gewünschte Bedingung zum Handeln selbst zu erstellen.

 

Gruß 

 
Otto:

Einen Artikel für Einsteiger den ich recht gut finde ist hier https://www.mql5.com/de/articles/100

Und auch sonst gibt's Artikel und Codebeispiele wie Sand am Meer.

Viel Erfolg !

Vielen Dank.

Habe soeben etwa die Hälfte gelesen.

Kann mir vorstellen, dass ich hier meine Fragen beantwortet finde.

Ich suche einfach die Werte und wie man die weiter verarbeitet. 

 

Ich sende hier mal einen kompletten EA aus dem was im standard MT5 dabei ist.

Das Problem ist das jeder Programmierer seinen eigene Handschrift hat. Und ein un der selbe EA kann auf x verschieden Arten geschrieben werden.

Für einen der den Code nicht lesen kann sehen alle verscheiden aus. Nur der der den lesen kann erkennt die unterschiedliche Schreibweise. Es gibt nicht DEN Code. Aber das nur nebenbei.

So hier der Code

//+------------------------------------------------------------------+
//|                                              Moving Averages.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

input double MaximumRisk        = 2;       // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor

input int    MovingPeriodEURUSD = 13;      // Moving Average period on EURUSD
input int    MovingShiftEURUSD  = 0;       // Moving Average shift on EURUSD

input int    MovingPeriodGBPUSD = 13;      // Moving Average period on GBPUSD
input int    MovingShiftGBPUSD  = 0;       // Moving Average shift on GBPUSD

input int    MovingPeriodUSDCHF = 13;      // Moving Average period on USDCHF
input int    MovingShiftUSDCHF  = 0;       // Moving Average shift on USDCHF

input int    MovingPeriodUSDJPY = 13;      // Moving Average period on USDJPY
input int    MovingShiftUSDJPY  = 0;       // Moving Average shift on USDJPY

//--- iMA handlers
int          ExtHandleEURUSD=0;
int          ExtHandleGBPUSD=0;
int          ExtHandleUSDCHF=0;
int          ExtHandleUSDJPY=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- we can trade just on demo account
   int check=CheckAccount();
   if(check<0) // trading is prohibited
      return(check);
//--- create MA on EURUSD
   int res=CreateMA(ExtHandleEURUSD,MovingPeriodEURUSD,MovingShiftEURUSD,"EURUSD");
   if(res<0) return(res);
//--- create MA on GBPUSD
   res=CreateMA(ExtHandleGBPUSD,MovingPeriodGBPUSD,MovingShiftGBPUSD,"GBPUSD");
   if(res<0) return(res);

//--- create MA on USDCHF
   res=CreateMA(ExtHandleUSDCHF,MovingPeriodUSDCHF,MovingShiftUSDCHF,"USDCHF");
   if(res<0) return(res);
//--- create MA on USDJPY
   res=CreateMA(ExtHandleUSDJPY,MovingPeriodUSDJPY,MovingShiftUSDJPY,"USDJPY");
   if(res<0) return(res);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for EURUSD
   if(ExtHandleEURUSD)
     {
      if(PositionSelect("EURUSD")) CheckForClose("EURUSD",ExtHandleEURUSD);
      else                         CheckForOpen("EURUSD",ExtHandleEURUSD);
     }
//--- check for GBPUSD
   if(ExtHandleGBPUSD)
     {
      if(PositionSelect("GBPUSD")) CheckForClose("GBPUSD",ExtHandleGBPUSD);
      else                         CheckForOpen("GBPUSD",ExtHandleGBPUSD);
     }
//--- check for USDCHF
   if(ExtHandleUSDCHF)
     {
      if(PositionSelect("USDCHF")) CheckForClose("USDCHF",ExtHandleUSDCHF);
      else                         CheckForOpen("USDCHF",ExtHandleUSDCHF);
     }
//--- check for USDJPY
   if(ExtHandleUSDJPY)
     {
      if(PositionSelect("USDJPY")) CheckForClose("USDJPY",ExtHandleUSDJPY);
      else                         CheckForOpen("USDJPY",ExtHandleUSDJPY);
     }
//---
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

//---
  }
//+------------------------------------------------------------------+
//|  Cretae Moving Average for the symbol                            |
//+------------------------------------------------------------------+
int CreateMA(int &handle,const int period,const int shift,const string symbol)
  {
   if(period>5)
     {
      //--- check symbol
      if(SymbolInMarketWatch(symbol))
        {
         ExtHandleUSDJPY=iMA(symbol,_Period,period,shift,MODE_SMA,PRICE_CLOSE);
         if(ExtHandleUSDJPY==INVALID_HANDLE)
           {
            printf("Error creating MA indicator for ",symbol);
            return(-4);
           }
        }
      else
        {
         Print(__FUNCTION__,"Failed to add ",symbol);
         return(-5);
        }
     }
//--- Indicator was successfully created
   return(0);
  }
//+------------------------------------------------------------------+
//|  Check if Symbol is in MarketWatch                               |
//+------------------------------------------------------------------+
bool SymbolInMarketWatch(const string symbol)
  {
//---
   bool found=false;
//--- The number of symbols available in MarketWatch
   int total=SymbolsTotal(true);
//--- Go through all symbols
   for(int i=0;i<total;i++)
     {
      if(symbol==SymbolName(i,true))
        {
         found=true;
         break;
        }
     }
//--- If the symbol is not found in Market Watch
   if(!found)
     {
      //--- Try to add it there
      if(!SymbolSelect(symbol,true))
        {
         //--- Unsuccessful execution
         Print(__FUNCTION__,": Failed to add ",symbol);
         return(false); // No symbol in MarketWatch
        }
     }
//--- The symbol exists in MarketWatch
   return(true);
  }
//+------------------------------------------------------------------+
//|  Trading is allowed just on demo account                         |
//+------------------------------------------------------------------+
int CheckAccount()
  {
//--- Check if autotrading is allowed
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
     {
      Alert("Autotrading is disabled in the terminal, the EA will be removed");
      return(-1);
     }
//--- Trading on a real account is prohibited
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
     {
      Alert("The EA is not allowed to trade on a real account!");
      return(-2);
     }
//--- Can we trade on the current account (prohibited when using an investor password)
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Alert("Trading on this account is prohibited");
      return(-3);
     }
//--- Checks have been passed successfully
   return(0);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))               return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                              return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/100.0/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int i=orders-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=symbol) continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0) break;
         if(profit<0.0) losses++;
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
void CheckForOpen(string symbol,int handle)
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1) return;
//--- get current Moving Average
   double   ma[2];
   if(CopyBuffer(handle,0,0,2,ma)!=2)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- check signals
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0]) signal=ORDER_TYPE_SELL;    // sell conditions
   else
      if(rt[0].open<ma[0] && rt[0].close>ma[0]) signal=ORDER_TYPE_BUY;  // buy conditions
//--- additional checking
   if(signal!=WRONG_VALUE)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionOpen(symbol,signal,TradeSizeOptimized(symbol),
                               SymbolInfoDouble(symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               0,0);
           }
//---
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForClose(string symbol,int handle)
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1) return;
//--- get current Moving Average
   double   ma[1];
   if(CopyBuffer(handle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- positions already selected before
   bool signal=false;
   long type=PositionGetInteger(POSITION_TYPE);

   if(type==(long)POSITION_TYPE_BUY   && rt[0].open>ma[0] && rt[0].close<ma[0]) signal=true;
   if(type==(long)POSITION_TYPE_SELL  && rt[0].open<ma[0] && rt[0].close>ma[0]) signal=true;
//--- additional checking
   if(signal)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionClose(symbol,3);
           }
//---
  }
//+------------------------------------------------------------------+

 Hier ist genau die Stelle an der die Bedingungen stehen. Also wo entschieden wird ob ein Trade startet. 

   if(rt[0].open>ma[0] && rt[0].close<ma[0]) signal=ORDER_TYPE_SELL;    // sell conditions
   else
      if(rt[0].open<ma[0] && rt[0].close>ma[0]) signal=ORDER_TYPE_BUY;  // buy conditions

 Setz dich in Ruhe davor und versuche JEDE Zeile zu verstehen was da genau gemacht wird. 

Zeit Zeit Zeit .......:-) ist der Schlüssel  

 

if(rt[0].open>ma[0] && rt[0].close<ma[0]) signal=ORDER_TYPE_SELL;    // sell conditions

 

ma[0] ist der aktuelle Wert des MA

ma[1] wäre der davor

usw...

 

Wenn  ma[0] kleiner als ma[1]  = fallender MA 

 
Christian:

Ich sende hier mal einen kompletten EA aus dem was im standard MT5 dabei ist.

Das Problem ist das jeder Programmierer seinen eigene Handschrift hat. Und ein un der selbe EA kann auf x verschieden Arten geschrieben werden.

Für einen der den Code nicht lesen kann sehen alle verscheiden aus. Nur der der den lesen kann erkennt die unterschiedliche Schreibweise. Es gibt nicht DEN Code. Aber das nur nebenbei.

So hier der Code

//+------------------------------------------------------------------+
//|                                              Moving Averages.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>

input double MaximumRisk        = 2;       // Maximum Risk in percentage
input double DecreaseFactor     = 3;       // Descrease factor

input int    MovingPeriodEURUSD = 13;      // Moving Average period on EURUSD
input int    MovingShiftEURUSD  = 0;       // Moving Average shift on EURUSD

input int    MovingPeriodGBPUSD = 13;      // Moving Average period on GBPUSD
input int    MovingShiftGBPUSD  = 0;       // Moving Average shift on GBPUSD

input int    MovingPeriodUSDCHF = 13;      // Moving Average period on USDCHF
input int    MovingShiftUSDCHF  = 0;       // Moving Average shift on USDCHF

input int    MovingPeriodUSDJPY = 13;      // Moving Average period on USDJPY
input int    MovingShiftUSDJPY  = 0;       // Moving Average shift on USDJPY

//--- iMA handlers
int          ExtHandleEURUSD=0;
int          ExtHandleGBPUSD=0;
int          ExtHandleUSDCHF=0;
int          ExtHandleUSDJPY=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- we can trade just on demo account
   int check=CheckAccount();
   if(check<0) // trading is prohibited
      return(check);
//--- create MA on EURUSD
   int res=CreateMA(ExtHandleEURUSD,MovingPeriodEURUSD,MovingShiftEURUSD,"EURUSD");
   if(res<0) return(res);
//--- create MA on GBPUSD
   res=CreateMA(ExtHandleGBPUSD,MovingPeriodGBPUSD,MovingShiftGBPUSD,"GBPUSD");
   if(res<0) return(res);

//--- create MA on USDCHF
   res=CreateMA(ExtHandleUSDCHF,MovingPeriodUSDCHF,MovingShiftUSDCHF,"USDCHF");
   if(res<0) return(res);
//--- create MA on USDJPY
   res=CreateMA(ExtHandleUSDJPY,MovingPeriodUSDJPY,MovingShiftUSDJPY,"USDJPY");
   if(res<0) return(res);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for EURUSD
   if(ExtHandleEURUSD)
     {
      if(PositionSelect("EURUSD")) CheckForClose("EURUSD",ExtHandleEURUSD);
      else                         CheckForOpen("EURUSD",ExtHandleEURUSD);
     }
//--- check for GBPUSD
   if(ExtHandleGBPUSD)
     {
      if(PositionSelect("GBPUSD")) CheckForClose("GBPUSD",ExtHandleGBPUSD);
      else                         CheckForOpen("GBPUSD",ExtHandleGBPUSD);
     }
//--- check for USDCHF
   if(ExtHandleUSDCHF)
     {
      if(PositionSelect("USDCHF")) CheckForClose("USDCHF",ExtHandleUSDCHF);
      else                         CheckForOpen("USDCHF",ExtHandleUSDCHF);
     }
//--- check for USDJPY
   if(ExtHandleUSDJPY)
     {
      if(PositionSelect("USDJPY")) CheckForClose("USDJPY",ExtHandleUSDJPY);
      else                         CheckForOpen("USDJPY",ExtHandleUSDJPY);
     }
//---
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

//---
  }
//+------------------------------------------------------------------+
//|  Cretae Moving Average for the symbol                            |
//+------------------------------------------------------------------+
int CreateMA(int &handle,const int period,const int shift,const string symbol)
  {
   if(period>5)
     {
      //--- check symbol
      if(SymbolInMarketWatch(symbol))
        {
         ExtHandleUSDJPY=iMA(symbol,_Period,period,shift,MODE_SMA,PRICE_CLOSE);
         if(ExtHandleUSDJPY==INVALID_HANDLE)
           {
            printf("Error creating MA indicator for ",symbol);
            return(-4);
           }
        }
      else
        {
         Print(__FUNCTION__,"Failed to add ",symbol);
         return(-5);
        }
     }
//--- Indicator was successfully created
   return(0);
  }
//+------------------------------------------------------------------+
//|  Check if Symbol is in MarketWatch                               |
//+------------------------------------------------------------------+
bool SymbolInMarketWatch(const string symbol)
  {
//---
   bool found=false;
//--- The number of symbols available in MarketWatch
   int total=SymbolsTotal(true);
//--- Go through all symbols
   for(int i=0;i<total;i++)
     {
      if(symbol==SymbolName(i,true))
        {
         found=true;
         break;
        }
     }
//--- If the symbol is not found in Market Watch
   if(!found)
     {
      //--- Try to add it there
      if(!SymbolSelect(symbol,true))
        {
         //--- Unsuccessful execution
         Print(__FUNCTION__,": Failed to add ",symbol);
         return(false); // No symbol in MarketWatch
        }
     }
//--- The symbol exists in MarketWatch
   return(true);
  }
//+------------------------------------------------------------------+
//|  Trading is allowed just on demo account                         |
//+------------------------------------------------------------------+
int CheckAccount()
  {
//--- Check if autotrading is allowed
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
     {
      Alert("Autotrading is disabled in the terminal, the EA will be removed");
      return(-1);
     }
//--- Trading on a real account is prohibited
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL)
     {
      Alert("The EA is not allowed to trade on a real account!");
      return(-2);
     }
//--- Can we trade on the current account (prohibited when using an investor password)
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Alert("Trading on this account is prohibited");
      return(-3);
     }
//--- Checks have been passed successfully
   return(0);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))               return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                              return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/100.0/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int i=orders-1;i>=0;i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=symbol) continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0) break;
         if(profit<0.0) losses++;
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open position conditions                               |
//+------------------------------------------------------------------+
void CheckForOpen(string symbol,int handle)
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1) return;
//--- get current Moving Average
   double   ma[2];
   if(CopyBuffer(handle,0,0,2,ma)!=2)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- check signals
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0]) signal=ORDER_TYPE_SELL;    // sell conditions
   else
      if(rt[0].open<ma[0] && rt[0].close>ma[0]) signal=ORDER_TYPE_BUY;  // buy conditions
//--- additional checking
   if(signal!=WRONG_VALUE)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionOpen(symbol,signal,TradeSizeOptimized(symbol),
                               SymbolInfoDouble(symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
                               0,0);
           }
//---
  }
//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
void CheckForClose(string symbol,int handle)
  {
   MqlRates rt[2];
//--- go trading only for first ticks of new bar
   if(CopyRates(symbol,_Period,0,2,rt)!=2)
     {
      Print("CopyRates of ",symbol," failed, no history");
      return;
     }
   if(rt[1].tick_volume>1) return;
//--- get current Moving Average
   double   ma[1];
   if(CopyBuffer(handle,0,0,1,ma)!=1)
     {
      Print("CopyBuffer from iMA failed, no data");
      return;
     }
//--- positions already selected before
   bool signal=false;
   long type=PositionGetInteger(POSITION_TYPE);

   if(type==(long)POSITION_TYPE_BUY   && rt[0].open>ma[0] && rt[0].close<ma[0]) signal=true;
   if(type==(long)POSITION_TYPE_SELL  && rt[0].open<ma[0] && rt[0].close>ma[0]) signal=true;
//--- additional checking
   if(signal)
      if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
         if(Bars(symbol,_Period)>100)
           {
            CTrade trade;
            trade.PositionClose(symbol,3);
           }
//---
  }
//+------------------------------------------------------------------+

 Hier ist genau die Stelle an der die Bedingungen stehen. Also wo entschieden wird ob ein Trade startet. 

   if(rt[0].open>ma[0] && rt[0].close<ma[0]) signal=ORDER_TYPE_SELL;    // sell conditions
   else
      if(rt[0].open<ma[0] && rt[0].close>ma[0]) signal=ORDER_TYPE_BUY;  // buy conditions

 Setz dich in Ruhe davor und versuche JEDE Zeile zu verstehen was da genau gemacht wird. 

Zeit Zeit Zeit .......:-) ist der Schlüssel  

Vielen Dank Christian,

hast Dir ja viel Mühe gemacht um den Code so zu gestalten, dass man ihn nicht 1:1 verwenden kann :-)

Mache ich ohnehin nicht. Ich möchte schon wirklich verstehen, was mein EA macht und lerne jeden Tag dazu. 

Auf jeden fall eine super Basis, habe schon ein paar interessante Zeilen entdeckt.

Werde mich Morgen dran machen, alles zu verstehen. Melde mich dann wieder.

Nochmals vielen Dank. 

 
Manfred289:

Vielen Dank Christian,

hast Dir ja viel Mühe gemacht um den Code so zu gestalten, dass man ihn nicht 1:1 verwenden kann :-)

Mache ich ohnehin nicht. Ich möchte schon wirklich verstehen, was mein EA macht und lerne jeden Tag dazu. 

Auf jeden fall eine super Basis, habe schon ein paar interessante Zeilen entdeckt.

Werde mich Morgen dran machen, alles zu verstehen. Melde mich dann wieder.

Nochmals vielen Dank. 

Wenn du meintest das er nicht funktioniert hier der link dazu https://www.mql5.com/de/articles/download/403/multimovings.mq5

 

if(ichschreibanders[0].open>mama[0] && ichschreibanders[0].close<mama[0]) signal=ORDER_TYPE_SELL;    // sell conditions
   else
      if(ichschreibanders[0].open<mama[0] && ichschreibanders[0].close>mama[0]) signal=ORDER_TYPE_BUY;  // buy conditions

 Habe den selben Code mal auf meine Weise geschrieben .....erkennst du jetzt warum es nicht einfügbar ist ? 

 

Aber ich denke du meintest das du hier von uns ein Stück Code bekommst den du nur copy and paste artig bei dir ins irgendwo einfügen kannst.

Genau da ist dein Denkfehler. Du kannst keinen Code "einfügen" du musst ihn immer anpassen da du ja immer andere Namen von Variablen hast oder andere Strukturen.

Trenn dich davon den leichten Weg zu gehen.....sonst wirst du nur die Gewinne der anderen bezahlen  

 
Christian:

Wenn du meintest das er nicht funktioniert hier der link dazu https://www.mql5.com/de/articles/download/403/multimovings.mq5

 

if(ichschreibanders[0].open>mama[0] && ichschreibanders[0].close<mama[0]) signal=ORDER_TYPE_SELL;    // sell conditions
   else
      if(ichschreibanders[0].open<mama[0] && ichschreibanders[0].close>mama[0]) signal=ORDER_TYPE_BUY;  // buy conditions

 Habe den selben Code mal auf meine Weise geschrieben .....erkennst du jetzt warum es nicht einfügbar ist ? 

 

Aber ich denke du meintest das du hier von uns ein Stück Code bekommst den du nur copy and paste artig bei dir ins irgendwo einfügen kannst.

Genau da ist dein Denkfehler. Du kannst keinen Code "einfügen" du musst ihn immer anpassen da du ja immer andere Namen von Variablen hast oder andere Strukturen.

Trenn dich davon den leichten Weg zu gehen.....sonst wirst du nur die Gewinne der anderen bezahlen  

Hallo Christian,

was Du sagst ist alles korrekt und verstehe ich auch.

Aber ich weiß nicht woher ich die Werte bekomme für die MAs.

Wenn ich mir standardmäßig z.B. 4 MAs reinhole dann bekomme ich z.B. folgenden Anfangscode und die Auswertung ob gekauft und verkauft werden soll erfolgt nach dem Standardprocedere. 

#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalMA.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingFixedPips.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title                  ="4MA-test";  // Document name
ulong                    Expert_MagicNumber            =2159;        //
bool                     Expert_EveryTick              =false;       //
//--- inputs for main signal
input int                Signal_ThresholdOpen          =10;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose         =10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel             =0.0;         // Price level to execute a deal
input double             Signal_StopLevel              =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel              =50.0;        // Take Profit level (in points)
input int                Signal_Expiration             =4;           // Expiration of pending orders (in bars)
input int                Signal_0_MA_PeriodMA          =4800;        // Moving Average(4800,0,...) Period of averaging
input int                Signal_0_MA_Shift             =0;           // Moving Average(4800,0,...) Time shift
input ENUM_MA_METHOD     Signal_0_MA_Method            =MODE_EMA;    // Moving Average(4800,0,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_0_MA_Applied           =PRICE_CLOSE; // Moving Average(4800,0,...) Prices series
input double             Signal_0_MA_Weight            =1.0;         // Moving Average(4800,0,...) Weight [0...1.0]
input int                Signal_1_MA_PeriodMA          =960;         // Moving Average(960,0,...) Period of averaging
input int                Signal_1_MA_Shift             =0;           // Moving Average(960,0,...) Time shift
input ENUM_MA_METHOD     Signal_1_MA_Method            =MODE_EMA;    // Moving Average(960,0,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_1_MA_Applied           =PRICE_CLOSE; // Moving Average(960,0,...) Prices series
input double             Signal_1_MA_Weight            =1.0;         // Moving Average(960,0,...) Weight [0...1.0]
input int                Signal_2_MA_PeriodMA          =288;         // Moving Average(288,0,...) Period of averaging
input int                Signal_2_MA_Shift             =0;           // Moving Average(288,0,...) Time shift
input ENUM_MA_METHOD     Signal_2_MA_Method            =MODE_EMA;    // Moving Average(288,0,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_2_MA_Applied           =PRICE_CLOSE; // Moving Average(288,0,...) Prices series
input double             Signal_2_MA_Weight            =1.0;         // Moving Average(288,0,...) Weight [0...1.0]
input int                Signal_3_MA_PeriodMA          =9;           // Moving Average(9,0,MODE_SMA,...) Period of averaging
input int                Signal_3_MA_Shift             =0;           // Moving Average(9,0,MODE_SMA,...) Time shift
input ENUM_MA_METHOD     Signal_3_MA_Method            =MODE_SMA;    // Moving Average(9,0,MODE_SMA,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_3_MA_Applied           =PRICE_CLOSE; // Moving Average(9,0,MODE_SMA,...) Prices series
input double             Signal_3_MA_Weight            =1.0;         // Moving Average(9,0,MODE_SMA,...) Weight [0...1.0]
input int                Signal_4_MA_PeriodMA          =9;           // Moving Average(9,6,MODE_SMA,...) Period of averaging
input int                Signal_4_MA_Shift             =6;           // Moving Average(9,6,MODE_SMA,...) Time shift
input ENUM_MA_METHOD     Signal_4_MA_Method            =MODE_SMA;    // Moving Average(9,6,MODE_SMA,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_4_MA_Applied           =PRICE_CLOSE; // Moving Average(9,6,MODE_SMA,...) Prices series
input double             Signal_4_MA_Weight            =1.0;         // Moving Average(9,6,MODE_SMA,...) Weight [0...1.0] 

 

aber ích möchte ja die Werte berechnen und kaufen und verkaufen wie ich möchte.

Kaufen wenn die hier aufgeführten Bedingungen zusammentreffen (Beispiel)

- Signal_1_MA steigt (( wie bekomme ich aus o.a. Signalen diesen Wert, z.B. Signal_1_MA[0]>Signal_1_MA[1] ))

- Signal_2_MA steigt (( wie bekomme ich aus o.a. Signalen diesen Wert, z.B. Signal_2_MA[0]>Signal_2_MA[1] ))

- Signal_3_MA um 0,05 größer als Signal_4_MA (( wie bekomme ich aus o.a. Signalen diesen Wert, z.B. Signal_4_MA[0]+0,05>Signal_3_MA[1] ))

und wie führe ich dann den handel aus, also nur kaufen wenn o.g. Bedingungen erfüllt sind. 

 

Irgendwann werde ich das Handbuch lesen und dann selbst raus finden wie ich es programmieren muss. 

Grund der Beschwerde: