Diskussion zum Artikel "Automatisiertes Risikomanagement für das Bestehen der Herausforderungen von Prop-Firmen"

 

Neuer Artikel Automatisiertes Risikomanagement für das Bestehen der Herausforderungen von Prop-Firmen :

Dieser Artikel erläutert den Aufbau eines Expert Advisors für GOLD, der für Prop-Firmen entwickelt wurde und sich durch Breakout-Filter, eine Analyse über mehrere Zeitrahmen, ein robustes Risikomanagement sowie einen strengen Schutz vor Drawdowns auszeichnet. Der EA hilft Händlern, die Herausforderungen von Prop-Firmen zu bestehen, indem er Regelverstöße vermeidet und die Handelsausführung unter volatilen Marktbedingungen stabilisiert.

Dies ist ein Artikel, den ich mit dem einzigen Ziel geschrieben habe, ein kürzlich aufgetauchtes Phänomen in Form des Handels mit Prop-Firmen anzusprechen. Die Sache ist, der Handel mit einer Prop-Firma als Ganzes ist nicht nur ein sehr attraktives, lukratives, und lohnendes Unterfangen, sondern verlangt die Bewältigung großer Herausforderungen und Hindernisse, wenn man beschließt, diesen Weg zu gehen. Das häufigste Hindernis, mit dem die meisten Händler konfrontiert sind, die sich an die Herausforderungen einer Prop-Firma wagen, ist nicht ein Mangel an Strategie, Technik oder Geschicklichkeit, sondern vielmehr die strengen Beschränkungen und Handelsregeln, die von der Prop-Firma festgelegt wurden und die eingehalten werden müssen, damit ein Händler beweisen kann, dass er Zugang zu einem Live-Handelskonto erhält.

Die Sache ist die, dass ein Händler den Markt gut analysieren, sich an seinen Handelsplan halten, Handelsgeschäfte ausführen und sogar Trends erkennen kann, was für den persönlichen Handel mit eigenem Kapital gut genug sein mag, aber nicht für den Handel mit Prop-Firmen, bei dem ein Händler sich an die Regeln halten und Grenzen setzen muss.

Einige der häufigsten Regeln, Ziele und Grenzen sind:

  • Man sollte die festgelegte Grenze für die tägliche Drawdown nicht überschreiten, die normalerweise um Mitternacht zurückgesetzt wird. Die verschiedenen Prop-Firmen haben unterschiedliche Limits, und auch die Art des Kontos, das man erwirbt, kann ein Faktor für das Drawdown-Limit sein.
  • Ein Händler sollte das festgelegte Limit für den Gesamtdrawdown nicht verletzen, da dies den Handel mit dem betreffenden Konto beenden würde. Die Höchstbeträge variieren für die verschiedenen Prop-Firmen und auch die Arten von Konten.  
  • Ein Händler sollte nicht versuchen, von plötzlichen, heftigen und volatilen Marktbewegungen während der Veröffentlichung von Nachrichten zu profitieren, da dies ein sehr gefährliches und hohes Risiko für das Konto darstellen kann, da die Richtung fehlt oder die Preisbewegung unruhig ist.
  • Ein Händler sollte auch das gleiche Risikoprofil und die gleiche Exposition während des Handelszeitraums beibehalten, um eine gleichmäßige und stabile Kapitalkurve zu erhalten und Händler zu vermeiden, die eine zu große Hebelwirkung haben oder versuchen, alles in einem einzigen Handel zu setzen. 
  • Die Händler müssen außerdem jeden Tag diszipliniert handeln und dürfen sich nicht an Aktivitäten beteiligen, die ein Risiko für die Prop-Firma oder das Konto darstellen, oder sich an ungerechtfertigten Praktiken wie Arbitragehandel oder Hochfrequenzhandel beteiligen.


Autor: Eugene Mmene

 
Breakout_and_Risk_manager_EA.mq5
Trade.mqh
Object.mqh
StdLibErr.mqh
OrderInfo.mqh
HistoryOrderInfo.mqh
PositionInfo.mqh
DealInfo.mqh
idenfitier 'SymbolName' already used Breakout_and_Risk_manager_EA.mq5 41 8
   built-in 'SymbolName' 0
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 83 18
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 85 18
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 86 45
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 88 31
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 88 21
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 89 51
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 106 37
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 106 27
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 107 41
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 107 31
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 108 39
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 108 29
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 116 29
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 116 19
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 117 29
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 117 19
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 206 96
implicit conversion from 'unknown' to 'string' Breakout_and_Risk_manager_EA.mq5 206 85
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 241 164
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 241 154
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 241 216
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 241 206
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 253 51
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 253 41
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 255 177
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 255 167
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 262 67
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 262 57
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 262 99
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 262 131
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 262 121
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 262 89
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 263 53
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 263 84
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 263 74
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 263 43
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 263 149
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 263 139
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 270 52
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 270 42
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 275 39
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 277 51
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 284 52
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 284 42
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 289 40
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 291 51
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 143 93
implicit conversion from 'unknown' to 'string' Breakout_and_Risk_manager_EA.mq5 143 83
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 147 75
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 306 94
implicit conversion from 'unknown' to 'string' Breakout_and_Risk_manager_EA.mq5 306 83
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 313 103
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 313 93
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 313 146
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 313 136
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 323 35
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 329 35
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 336 47
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 336 37
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 356 35
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 434 35
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 434 25
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 465 34
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 465 59
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 465 49
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 465 24
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 466 46
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 466 36
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 472 32
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 472 56
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 472 46
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 472 22
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 473 46
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 473 36
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 479 47
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 479 37
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 482 47
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 482 37
open parenthesis expected Breakout_and_Risk_manager_EA.mq5 483 47
implicit conversion from 'number' to 'string' Breakout_and_Risk_manager_EA.mq5 483 37
47 errors, 34 warnings 47 34

Ich habe den Mql5-Quellcode heruntergeladen, das ist eine Menge Arbeit, vielen Dank dafür, aber oben sind alle Warnungen und Fehler, die der MetaEditor auswirft, wenn er den Code kompiliert.

Wie könnte das bitte behoben werden?

 

Ersetze String TradeSymbol = _Symbol;

Dann alle Vorkommen von SymbolName durch TradeSymbol ersetzen

 
Austin Reade Mql5-Quellcode heruntergeladen, das ist eine Menge Arbeit, vielen Dank dafür, aber oben sind alle Warnungen und Fehler, die der MetaEditor auswirft, wenn er den Code kompiliert.

Wie könnte das bitte behoben werden?

Aaah, das tut mir leid, ich glaube, ich weiß, woher die Fehler kommen, ich werde sie beheben und erneut hochladen.
 
Laurent Xavier Richer #:

Ersetzen string TradeSymbol = _Symbol;

Dann alle Vorkommen von SymbolName durch TradeSymbol ersetzen

Spot an
 
#property copyright "Copyright 2025, Crystal Forex"
#property link ""
#property version   "1.50"
#property description "🚀 DOMINIEREN PROP-FIRMEN: Exklusiv für XAUUSD entwickelt, um Herausforderungen zu meistern."
#property description "🛡️ INSTITUTIONELLER SCHUTZ: Fest kodierte Drawdown- und Equity-Guards sorgen dafür, dass Sie niemals gegen Regeln verstoßen."
#property description "📈 ADAPTIVE AUSBRÜCHE: Intelligente Nachrichtenfilter und Multi-Timeframe-Logik fangen massive Goldbewegungen ein."
#property description "💰 FUNDED READY: Vollständig automatisierte Disziplin, um Ihr Trading in eine professionelle Karriere zu verwandeln."

#include <Trade\Trade.mqh>

//+------------------------------------------------------------------+
//| Eingabeparameter|
//+------------------------------------------------------------------+
input group "Risk Management"
input double RiskPct = 2.0;               // Basisrisiko pro Handel %
input double MaxLossUSD = 110.0;          // Maximaler Verlust pro Handel in USD (Hard Cap)
input double DailyDDLimit = 2.5;          // Tägliches Drawdown-Limit (%)
input double OverallDDLimit = 5.5;        // Gesamte Absenkungsgrenze (%)
input double TargetBalanceOrEquity = 108000.0; // Ziel ist es, die Herausforderung zu bestehen

input group "Strategy Settings"
input int    ATR_Prd = 14;                // ATR-Zeitraum
input int    Brk_Prd = 10;                // Rückblick auf den Ausbruch (Balken)
input double MinBrkStr = 0.1;             // Minimale Ausbruchsstärke (ATR-Multiplikator)
input int    EMA_Prd = 20;                // EMA-Periode für Trendfilter
input bool   useHTF = true;               // HTF (D1/H4) Richtungsfilter verwenden

input group "News Filter"
input bool   NewsFilt = true;             // Nachrichtenfilter einschalten
input int    NewsPause = 15;              // Minuten Pause vor/nach den Nachrichten

//+------------------------------------------------------------------+
//| Globale Variablen|
//+------------------------------------------------------------------+
double CurRisk = RiskPct;
double LastEqHigh = 0;
double StartingBalance = 0;
double DailyBalance = 0;
datetime LastDay = 0;
bool ProfitTargetReached = false;
bool DailyDDReached = false;
double dynBrkStr = MinBrkStr; 

CTrade trade;
int h_ema_d1 = INVALID_HANDLE;
int h_ema_h4 = INVALID_HANDLE;
string WorkSymbol; // Umbenannt, um Konflikte mit der integrierten Funktion SymbolName() zu vermeiden

// Struktur für zeitraumspezifische Daten
struct TimeframeData {
   ENUM_TIMEFRAMES tf;
   int h_atr;
   datetime lastSig;
   datetime lastBar;
};
TimeframeData tfs[];

// Struktur für Nachrichtenereignisse
struct NewsEvt {
   datetime time;
   int impact; // 0=Niedrig, 1=Mittel, 2=Hoch
};
NewsEvt newsCal[];
int newsCnt = 0;

//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
{
datetime ExpiryDate = D'2025.12.30'; // Legen Sie hier Ihr Ablaufdatum fest (JJJJ.MM.TT)
   
   if(TimeCurrent() > ExpiryDate)
   {
      Alert("Trial Expired! Please contact the developer: https://www.mql5.com/de/users/jawadtrader22/seller");
      Print("Trial Expired! Please contact the developer.");
      return(INIT_FAILED); // Dies stoppt die Initialisierung des EA
   }
   if(AccountInfoDouble(ACCOUNT_BALANCE) < 100.0) {
      Print("Error: Balance too low for Prop Firm logic.");
      return(INIT_FAILED);
   }

   WorkSymbol = _Symbol;
   if(!SymbolSelect(WorkSymbol, true)) {
      Print("Failed to select symbol.");
      return(INIT_FAILED);
   }

   StartingBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   LastEqHigh = AccountInfoDouble(ACCOUNT_EQUITY);
   DailyBalance = StartingBalance;
   LastDay = (datetime)(TimeCurrent() / 86400 * 86400); 

   ArrayResize(tfs, 2);
   tfs[0].tf = PERIOD_M15;
   tfs[1].tf = PERIOD_H1;

   for(int i = 0; i < 2; i++) {
      tfs[i].h_atr = iATR(WorkSymbol, tfs[i].tf, ATR_Prd);
      tfs[i].lastBar = 0;
      if(tfs[i].h_atr == INVALID_HANDLE) {
         Print("Failed to create ATR handle.");
         return(INIT_FAILED);
      }
   }

   h_ema_d1 = iMA(WorkSymbol, PERIOD_D1, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);
   h_ema_h4 = iMA(WorkSymbol, PERIOD_H4, EMA_Prd, 0, MODE_EMA, PRICE_CLOSE);

   if(h_ema_d1 == INVALID_HANDLE || h_ema_h4 == INVALID_HANDLE) {
      Print("Failed to create HTF EMA handles.");
      return(INIT_FAILED);
   }

   if(NewsFilt) FetchNewsCalendar();

   Print("EA Initialized. Target: ", DoubleToString(TargetBalanceOrEquity, 2));
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   IndicatorRelease(h_ema_d1);
   IndicatorRelease(h_ema_h4);
   for(int i = 0; i < ArraySize(tfs); i++) {
      IndicatorRelease(tfs[i].h_atr);
   }
   Print("EA Deinitialized.");
}

//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
{
   // Tägliche Rücksetzlogik ---
   datetime currentDay = (datetime)(TimeCurrent() / 86400 * 86400);
   if(currentDay > LastDay) {
      DailyBalance = AccountInfoDouble(ACCOUNT_BALANCE);
      LastDay = currentDay;
      DailyDDReached = false;
      Print("New Day. Daily Balance Reset to: ", DoubleToString(DailyBalance, 2));
   }

   // Prop-Firmenchecks ---
   if(DailyDDReached || ProfitTargetReached) return;

   double equity = AccountInfoDouble(ACCOUNT_EQUITY);
   double balance = AccountInfoDouble(ACCOUNT_BALANCE);

   if(balance >= TargetBalanceOrEquity || equity >= TargetBalanceOrEquity) {
      CloseAllPositions();
      ProfitTargetReached = true;
      Print("PROFIT TARGET REACHED! Trading Stopped.");
      return;
   }

   double dailyDD = (DailyBalance - equity) / DailyBalance * 100.0;
   double overallDD = (StartingBalance - equity) / StartingBalance * 100.0;

   if(dailyDD >= DailyDDLimit || overallDD >= OverallDDLimit) {
      CloseAllPositions();
      DailyDDReached = true;
      Print("DRAWDOWN LIMIT BREACHED! Daily: ", DoubleToString(dailyDD, 2), "%, Overall: ", DoubleToString(overallDD, 2), "%");
      return;
   }

   --- Nachrichten Update ---
   static datetime lastNewsFetch = 0;
   if(NewsFilt && TimeCurrent() >= lastNewsFetch + 4*3600) {
      FetchNewsCalendar();
      lastNewsFetch = TimeCurrent();
   }
   if(NewsFilt && IsNews()) return;

   --- Strategie-Schleife ---
   for(int i = 0; i < ArraySize(tfs); i++) 
   {
      ManageTrades(tfs[i].tf);

      if(!NewBar(tfs[i].tf, tfs[i].lastBar)) continue;

      if(PositionsTotal() < 5) 
      {
         double atrVal = GetIndicatorVal(tfs[i].h_atr, 0);
         
         bool buySignal = BuyBrk(tfs[i].tf) && (!useHTF || BullTrend());
         bool sellSignal = SellBrk(tfs[i].tf) && (!useHTF || BearTrend());

         if(buySignal) {
             double sl = SymbolInfoDouble(WorkSymbol, SYMBOL_ASK) - (atrVal * 1.5);
             double tp = SymbolInfoDouble(WorkSymbol, SYMBOL_ASK) + (atrVal * 3.0);
             double lots = CalcLots(MathAbs(SymbolInfoDouble(WorkSymbol, SYMBOL_ASK) - sl));
             
             if(lots > 0) {
                 trade.SetExpertMagicNumber(MagicNumber(tfs[i].tf));
                 trade.Buy(lots, WorkSymbol, 0, sl, tp, "Gold Breakout Buy");
             }
         }
         else if(sellSignal) {
             double sl = SymbolInfoDouble(WorkSymbol, SYMBOL_BID) + (atrVal * 1.5);
             double tp = SymbolInfoDouble(WorkSymbol, SYMBOL_BID) - (atrVal * 3.0);
             double lots = CalcLots(MathAbs(sl - SymbolInfoDouble(WorkSymbol, SYMBOL_BID)));
             
             if(lots > 0) {
                 trade.SetExpertMagicNumber(MagicNumber(tfs[i].tf));
                 trade.Sell(lots, WorkSymbol, 0, sl, tp, "Gold Breakout Sell");
             }
         }
      }
   }
}

//+------------------------------------------------------------------+
//| Hilfsfunktionen|
//+------------------------------------------------------------------+
double CalcLots(double slPointsDistance)
{
   if(slPointsDistance <= 0) return 0.0;
   double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
   double riskMoney = accountBalance * (CurRisk / 100.0);
   if(riskMoney > MaxLossUSD) riskMoney = MaxLossUSD; // Harte Kappe
   
   double tickValue = SymbolInfoDouble(WorkSymbol, SYMBOL_TRADE_TICK_VALUE);
   double tickSize = SymbolInfoDouble(WorkSymbol, SYMBOL_TRADE_TICK_SIZE);
   if(tickValue == 0 || tickSize == 0) return 0.0;
   
   double lots = riskMoney / ( (slPointsDistance / tickSize) * tickValue );
   double minLot = SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_MIN);
   double maxLot = SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_MAX);
   double stepLot = SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_STEP);
   
   lots = MathFloor(lots / stepLot) * stepLot;
   if(lots < minLot) return 0.0;
   if(lots > maxLot) lots = maxLot;
   return lots;
}

void ManageTrades(ENUM_TIMEFRAMES tf)
{
   for(int i = PositionsTotal()-1; i >= 0; i--)
   {
      ulong ticket = PositionGetTicket(i);
      if(!PositionSelectByTicket(ticket)) continue;
      if(PositionGetString(POSITION_SYMBOL) != WorkSymbol) continue;
      if(PositionGetInteger(POSITION_MAGIC) != MagicNumber(tf)) continue; 

      double openPrice = PositionGetDouble(POSITION_PRICE_OPEN);
      double sl = PositionGetDouble(POSITION_SL);
      double tp = PositionGetDouble(POSITION_TP);
      double lots = PositionGetDouble(POSITION_VOLUME);
      double currentPrice = PositionGetDouble(POSITION_PRICE_CURRENT);
      long type = PositionGetInteger(POSITION_TYPE);
      
      int tfIdx = (tf == PERIOD_M15) ? 0 : 1;
      double atr = GetIndicatorVal(tfs[tfIdx].h_atr, 0);

      // Notausstieg
      if(type == POSITION_TYPE_BUY && SellBrk(tf)) { trade.PositionClose(ticket); continue; }
      if(type == POSITION_TYPE_SELL && BuyBrk(tf)) { trade.PositionClose(ticket); continue; }

      // Teilweise schließen & BE
      double dist = (type == POSITION_TYPE_BUY) ? (currentPrice - openPrice) : (openPrice - currentPrice);
      if(dist > (atr * 2.5)) {
         bool isBE = (type == POSITION_TYPE_BUY && sl >= openPrice) || (type == POSITION_TYPE_SELL && sl <= openPrice);
         if(!isBE && lots >= SymbolInfoDouble(WorkSymbol, SYMBOL_VOLUME_MIN) * 2) {
             trade.PositionClosePartial(ticket, lots / 2.0);
             trade.PositionModify(ticket, openPrice, tp);
         }
      }

      // Nachlaufender Stopp
      double trailDist = atr * 1.6;
      if(type == POSITION_TYPE_BUY) {
         double newSL = currentPrice - trailDist;
         if(newSL > sl && newSL < currentPrice) trade.PositionModify(ticket, newSL, tp);
      }
      else if(type == POSITION_TYPE_SELL) {
         double newSL = currentPrice + trailDist;
         if(newSL < sl || sl == 0) trade.PositionModify(ticket, newSL, tp);
      }
   }
}

bool BuyBrk(ENUM_TIMEFRAMES tf)
{
   double close1 = iClose(WorkSymbol, tf, 1);
   int highIdx = iHighest(WorkSymbol, tf, MODE_HIGH, Brk_Prd, 2);
   if(highIdx < 0) return false;
   double highVal = iHigh(WorkSymbol, tf, highIdx);
   int tfIdx = (tf == PERIOD_M15) ? 0 : 1;
   double atr = GetIndicatorVal(tfs[tfIdx].h_atr, 1);
   return (close1 > (highVal + (atr * dynBrkStr)));
}

bool SellBrk(ENUM_TIMEFRAMES tf)
{
   double close1 = iClose(WorkSymbol, tf, 1);
   int lowIdx = iLowest(WorkSymbol, tf, MODE_LOW, Brk_Prd, 2);
   if(lowIdx < 0) return false;
   double lowVal = iLow(WorkSymbol, tf, lowIdx);
   int tfIdx = (tf == PERIOD_M15) ? 0 : 1;
   double atr = GetIndicatorVal(tfs[tfIdx].h_atr, 1);
   return (close1 < (lowVal - (atr * dynBrkStr)));
}

bool BullTrend()
{
   double d1_ema = GetIndicatorVal(h_ema_d1, 1);
   double d1_close = iClose(WorkSymbol, PERIOD_D1, 1);
   return (d1_close > d1_ema);
}

bool BearTrend()
{
   double d1_ema = GetIndicatorVal(h_ema_d1, 1);
   double d1_close = iClose(WorkSymbol, PERIOD_D1, 1);
   return (d1_close < d1_ema);
}

bool IsNews()
{
   datetime now = TimeCurrent();
   for(int i=0; i<newsCnt; i++) {
       if(newsCal[i].impact < 2) continue; 
       if(now >= newsCal[i].time - (NewsPause * 60) && now <= newsCal[i].time + (NewsPause * 60)) return true;
   }
   return false;
}

void FetchNewsCalendar()
{
   // Platzhalter: Nachrichtenzähler zur Sicherheit zurücksetzen
   newsCnt = 0; 
}

void CloseAllPositions()
{
   for(int i = PositionsTotal() - 1; i >= 0; i--) {
      ulong ticket = PositionGetTicket(i);
      if(PositionSelectByTicket(ticket) && PositionGetString(POSITION_SYMBOL) == WorkSymbol) {
         trade.PositionClose(ticket);
      }
   }
}

double GetIndicatorVal(int handle, int index)
{
   double buf[1];
   if(CopyBuffer(handle, 0, index, 1, buf) < 0) return 0.0;
   return buf[0];
}

bool NewBar(ENUM_TIMEFRAMES tf, datetime &last_bar_time)
{
   datetime curr_bar_time = iTime(WorkSymbol, tf, 0);
   if(curr_bar_time != last_bar_time) {
      last_bar_time = curr_bar_time;
      return true;
   }
   return false;
}

long MagicNumber(ENUM_TIMEFRAMES tf)
{
   if(tf == PERIOD_M15) return 1015;
   if(tf == PERIOD_H1) return 1060;
   return 1000;
}
Vollständiger Code Kopieren Einfügen
Dateien:
propfirm.mq5  27 kb
 
Austin Reade Mql5-Quellcode heruntergeladen, das ist eine Menge Arbeit, vielen Dank dafür, aber oben sind alle Warnungen und Fehler, die der MetaEditor auswirft, wenn er den Code kompiliert.

Wie könnte das bitte behoben werden?

hier ist der korrigierte Code
 
Muhammad Jawad Shabir #:
Vollständiger Code zum Kopieren und Einfügen
Der Code ist nicht der gleiche, auch die Ergebnisse sind sehr unterschiedlich mein Kerl