Modify and existing EA and to create a addwinner function that increase the position size when position is positive.

MQL4 지표 전문가

작업 종료됨

실행 시간 3 일
고객의 피드백
Simply one of the best programmers that I encountered so far here. He managed to debug my existing EA and added some new features in it.
피고용인의 피드백
Best job. Happy working with him.

명시

I only accept only programmer whose rating is good and also did more than 50 jobs.

I need the source code and also the programmer should allow me to test the code for 2 more days and to make reasonable adjustment if there is any problem with the code.

I need someone to make modification to an existing MQL4 EA

Attached is the EA, this EA is solely use on Dow Jones Industrial Average, NASDAQ and SPX.

//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                                                          Zhiming |
//|                         https://www.offshorecapitalsolutions.com |
//+------------------------------------------------------------------+
#property copyright "Zhiming"
#property link      "https://www.offshorecapitalsolutions.com"

//--- Trade Setup Module Inputs

extern string           Note0="Period for Moving Average";
extern int FastMA=5;
extern int FastMaShift=0;
extern ENUM_MA_METHOD      FastMaMethod=0;
extern ENUM_APPLIED_PRICE  FastMaAppliedTo=0;
extern int SlowMA=21;
extern int SlowMaShift=0;
extern ENUM_MA_METHOD      SlowMaMethod=0;
extern ENUM_APPLIED_PRICE  SlowMaAppliedTo=0;

extern string           Note1="ATR period for risk management";
extern int              ATRPeriod=20;
extern int              Number_Of_ATR=4;

//---Risk Reward Stop
extern string           Note2="Percentage at Risk and the Reward Ratio";
extern double           RiskPercent=2;
extern double           Reward_ratio=4;

//--- This part has to go with the Breakeven Module
extern string           Note3="If UseMoveToBreakeven=true, this will activate the Breakeven Stop";
extern bool             UseMoveToBreakeven=TRUE;
extern int              ATRToBreakeven=1;
extern double           ATRToLockIn=0.5;

//--- Trailing Stop Module
extern string           Note4="Trailing stop, UseTrailingStop = true will activate trailing stop";
extern bool             UseTrailingStop=TRUE;
extern double           KTATR=2;


//---Day and Date Filter
extern string           Note5="Day and Date Filter";
extern bool             Sunday = true;
extern bool             Monday = true;
extern bool             Tuesday = true;
extern bool             Wednesday = true;
extern bool             Thursday = true;
extern bool             Friday = true;
extern bool             NFP_Friday = true;
extern bool             NFP_ThursdayBefore = true;
extern bool             ChristmasHolidays = true;
extern double           XMAS_DayBeginBreak = 15;
extern bool             NewYearsHolidays = true;
extern double           NewYears_DayEndBreak = 3;

//---Time Filter Module
extern string           Note6="Time Filter";
extern bool             UseTimeFilter=false;
extern int              start_time_hour=22;
extern int              start_time_minute=0;
extern int              end_time_hour=18;
extern int              end_time_minute=0;
extern int              gmt=0;

//--- Syncronize the Tick Size and Lot Size Inputs
extern string           Note7="Magic Number";
extern int              MagicNumber=21013;

double pips;
bool  OrderModifyResult=false;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   double ticksize = MarketInfo(Symbol(),MODE_TICKSIZE); //For FX
   if(ticksize == 0.00001 || Point==0.001)
   pips = ticksize*10;
   else pips = ticksize;
//---
   }
   
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---Delete all objects on chart------------------------------------------------------------------------------  

//------------------------------------------------------------------------------------------------------------
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
//---
if(OpenOrdersThisPair(Symbol())>=1) //Start scanning opportunity to move up breakeven and trailing stop
      {
         if(UseMoveToBreakeven)MoveToBreakeven(); 
         if(UseTrailingStop)AdjustTrail();
      }
   if(UseTimeFilter==1)
      {
         bool time_in_range=is_time_in_range(TimeCurrent(),start_time_hour,start_time_minute,end_time_hour,end_time_minute,gmt);
         if(time_in_range==1)
            {
               if(IsNewCandle())CheckForKTSRTrade();
               return(0);
            }
      } 
else
   
   if(UseTimeFilter==0)
      {
         if(IsNewCandle())CheckForKTSRTrade();
         return(0);
      }        
  } 
  
//+------------------------------------------------------------------+

int OpenOrdersThisPair(string pair) // This has to be include in part of the Order Entry and Modification Modules.
{
   int total=0;
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
      }
      return(total);
}   

bool IsNewCandle() //This is to reduce the computer burden
{
   static int BarsOnChart=0;
   if(BarsOnChart == Bars)
   return(false);
   BarsOnChart = Bars;
   return(true);
}

void CheckForKTSRTrade() //Trade Setup Mudule
{
   double PreviousFast = iMA(NULL,0,FastMA,FastMaShift,FastMaMethod,FastMaAppliedTo,2);
   double CurrentFast = iMA(NULL,0,FastMA,FastMaShift,FastMaMethod,FastMaAppliedTo,1);
   double PreviousSlow = iMA(NULL,0,SlowMA,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
   double CurrentSlow = iMA(NULL,0,SlowMA,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);   
   if(PreviousFast < PreviousSlow && CurrentFast > CurrentSlow)OrderEntry(0);
   if(PreviousFast > PreviousSlow && CurrentFast < CurrentSlow)OrderEntry(1);
}


void OrderEntry(int direction) // Order Entry and Modification Modules.
{
   double tickvalue=MarketInfo(Symbol(),MODE_TICKVALUE);
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskAmount=(Equity*RiskPercent*0.01)/tickvalue;
   double ATR_Risk=iATR(Symbol(),0,ATRPeriod,1);
   double ATR_Risk_Range=ATR_Risk*Number_Of_ATR;
   double buy_stop_price=Ask-ATR_Risk_Range;
   double pips_to_bsl=Ask-buy_stop_price;
   double buy_takeprofit_price=Ask+pips_to_bsl * Reward_ratio;
   double sell_stop_price=Bid+ATR_Risk_Range;
   double pips_to_ssl=sell_stop_price-Bid;
   double sell_takeprofit_price=Bid-pips_to_ssl* Reward_ratio;
   
if(direction==0)
   {
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskAmount/ (pips_to_bsl/pips) ) ;
      if(OpenOrdersThisPair(Symbol())==0)int buyticket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,bsl,btp,NULL,MagicNumber,0,Green);
         if(buyticket>0)OrderModifyResult=OrderModify(buyticket,OrderOpenPrice(),bsl,btp,0,Green);
   }      
         
if(direction==1)
   {  
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskAmount/ (pips_to_ssl/pips) ) ; 
      if(OpenOrdersThisPair(Symbol())==0)int sellticket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,3,ssl,stp,NULL,MagicNumber,0,Red);       
         if(sellticket>0)OrderModifyResult=OrderModify(sellticket,OrderOpenPrice(),ssl,stp,0,Red);
   }
}

//--- Trailing Stop Module Function
void AdjustTrail()
{
   int bar=0, i=0;
   double KTBTrailingStop=0.0, KTSTrailingStop=0.0;
   bool ans=false;

//buy order section
   for(int b=OrdersTotal()-1;b>=0;b--)
      {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_BUY)
                  {
                                        bar=iBarShift(Symbol(),0,OrderOpenTime());
                     KTBTrailingStop=iHigh(Symbol(),0, iHighest(Symbol(),0,MODE_HIGH,bar+1,0)) - KTATR * iATR(Symbol(),0,ATRPeriod,iHighest(Symbol(),0,MODE_HIGH,bar,1));
                        if(Bid - KTBTrailingStop > OrderStopLoss())
                        {
                           i=0;ans=false;
                           while(!ans&&i<3)
                           { 
                            if(i>0)Sleep(1000);
                            ans=OrderModify(OrderTicket(),OrderOpenPrice(),KTBTrailingStop,OrderTakeProfit(),0,clrOrange);
                            i++;
                           }//while(!ans&&i<3)
                        }
                   }
                }
  
//sell order section
   for(int s=OrdersTotal()-1;s>=0;s--)
      {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_SELL)
                                        {
                                        bar=iBarShift(Symbol(),0,OrderOpenTime());
                              KTSTrailingStop=iLow(Symbol(),0, iLowest(Symbol(),0,MODE_LOW,bar+1,0) ) + KTATR * iATR(Symbol(),0,ATRPeriod,iLowest(Symbol(),0,MODE_LOW,bar,1));
                              if(OrderStopLoss()> KTSTrailingStop - Ask)
                              {
                                 i=0;ans=false;
                                 while(!ans&&i<3)
                                 { 
                                  if(i>0)Sleep(1000);
                                  ans=OrderModify(OrderTicket(),OrderOpenPrice(),KTSTrailingStop,OrderTakeProfit(),0,clrOrange);
                                  i++;
                                 }
                              }
 
                                        }               
       }                 
}

void MoveToBreakeven() //Breakeven Stop Module
{
   double BEATR=iATR(NULL,0,ATRPeriod,1)*ATRToBreakeven;
   double LockInATR=iATR(NULL,0,ATRPeriod,1) * ATRToLockIn;
   for(int b=OrdersTotal()-1; b >= 0; b--)
      {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber) //If this is not true, it will not move down further
            if(OrderSymbol()==Symbol())   
               if(OrderType()==OP_BUY)
                  if(Bid-OrderOpenPrice()>BEATR) //This need to add the pips definition from ini init
                     if(OrderOpenPrice()>OrderStopLoss())
                        OrderModifyResult=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+(LockInATR),OrderTakeProfit(),0,Lime);                  
      }
   for(int s=OrdersTotal()-1; s >= 0; s--)
      {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber) //If this is not true, it will not move down further
            if(OrderSymbol()==Symbol())   
               if(OrderType()==OP_SELL)
                  if(OrderOpenPrice()-Ask>BEATR) //This need to add the pips definition from ini init
                     if(OrderOpenPrice()<OrderStopLoss())
                        OrderModifyResult=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-(LockInATR),OrderTakeProfit(),0,Lime);                  
      }  
}

//Day and Date Filter-----------------------------------------------------------------------------------------
bool DaytoTrade(){
bool daytotrade = false;

if(DayOfWeek() == 0 && Sunday) daytotrade = true;
if(DayOfWeek() == 1 && Monday) daytotrade = true;
if(DayOfWeek() == 2 && Tuesday) daytotrade = true;
if(DayOfWeek() == 3 && Wednesday) daytotrade = true;
if(DayOfWeek() == 4 && Thursday) daytotrade = true;
if(DayOfWeek() == 5 && Friday) daytotrade = true;
if(DayOfWeek() == 5 && Day() < 8 && !NFP_Friday ) daytotrade = false;
if(DayOfWeek() == 4 && Day() < 8 && !NFP_ThursdayBefore ) daytotrade = false;
if(Month() == 12 && Day() > XMAS_DayBeginBreak && !ChristmasHolidays ) daytotrade = false;
if(Month() == 1 && Day() < NewYears_DayEndBreak && !NewYearsHolidays ) daytotrade = false;

return(daytotrade);}

//------------------------------------------------------------------------------------------------------------

//Time Filter-------------------------------------------------------------------------------------------------
bool is_time_in_range(datetime time,int start_hour,int start_min,int end_hour,int end_min,int gmt_offset=0)
  {
   if(gmt_offset!=0)
     {
      start_hour+=gmt_offset;
      end_hour+=gmt_offset;
     }
   if(start_hour>23) start_hour=(start_hour-23)-1;
   else if(start_hour<0) start_hour=23+start_hour+1;
   if(end_hour>23) end_hour=(end_hour-23)-1;
   else if(end_hour<0) end_hour=23+end_hour+1;
   int hour=TimeHour(time);
   int minute=TimeMinute(time);
   int t = (hour*3600)+(minute*60);
   int s = (start_hour*3600)+(start_min*60);
   int e = (end_hour*3600)+(end_min*60);
   if(s==e)
      return true;
   else if(s<e)
     {
      if(t>=s && t<e)
         return true;
     }
   else if(s>e)
     {
      if(t>=s || t<e)
         return true;
     }
   return false;
  }
  
//------------------------------------------------------------------------------------------------------------

In this EA, the trailing stop is suppose to:

For buy trade, it will look at the highest high bar after the buy trade is initiated. Based on the high of the highest bar and minus off ATR(s) of the previous bar and come out with KTBTrailingStop. If the existing stoploss and the order entry price is below the KTBTrailingStop, then modify the existing stop to KTBTrailingStop. If the KTBTrailingStop is below the order entry price and the existing stop loss price, do not make any changes.

For sell trade, it will look at the lowest low bar after the sell trade is initiated. Based on the low of the lowest bar and plus ATR(s) of the previous bar and come out with KTSTrailingStop. If the existing stoploss and the order entry price is above the KTSTrailingStop, then modify the existing stop to KTSTrailingStop. If the KTSTrailingStop is above the order entry price and the existing stop loss price, do not make any changes.

For the trailing stop, I noticed the existing code did not trigger after the conditions are met. Please see if there are any changes need to be made.

The existing breakeven stop works perfectly but I am not sure if the int start() is correctly written. What I want is:

1.      if the UseMoveToBreakeven=FALSE and the UseTrailingStop=TRUE, the EA should be able to use TrailingStop only and should not be using the BreakevenStop.

2.      if the UseMoveToBreakeven=FALSE and the UseTrailingStop=FALSE, the EA should not be able to use TrailingStop and should not be using the BreakevenStop.

3.      if the UseMoveToBreakeven=TRUE and the UseTrailingStop=FALSE, the EA should not be able to use TrailingStop only and should be using the BreakevenStop.

4.      if the UseMoveToBreakeven=TRUE and the UseTrailingStop=TRUE, the EA should be able to use TrailingStop and the BreakevenStop.

So upon initiate a position, if the price moves to its favour and trigger the breakeven loss function, the stoploss will move toward the level determined by the breakeven function.

If the price did not move in favour and did not trigger the breakeven loss function, the stop loss should stay at the risk level.

After the price triggered the breakeven function, it will depend on the trailing stop function without changing the price target.

For the OrderSend part, I need the EA to do resend the order if there is any error. The resend of order should look something like:

for(int i=OrderTotal()-1; i >=0;i--)
{       
        if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
        {
                if(OrderType()==OP-BUY && OrderMagicNumber()==Magic Number)
                {
                        while(true)
                        {
                                bool result = OrderClose(OrderTicket(),OrderLots(),Bid, 3, Red);
                                if(result!= true)
                                {
                                        int err = GetLastError(); Print("LastError = ",err);
                                }
                                else err = 0;
                                switch(err)
                                {
                                        case 135://ERR_PRICE_CHANGED
                                        case 136://ERR_OFF_QUOTES
                                        case 137://ERR_BROKER_BUSY
                                        case 138://ERR_REQUOTE
                                        case 146:sleep(1000);RefreshRates();i++;break;//ERR_TRADE_CONTEXT_BUSY
                                }
                        }
                }
        }
}

Also need to create a function for the EA to add on more position when the existing position is making profit.  This add more winning position function should only be activated when the price moves in favour of the position by 3 ATRs and when a new high is formed after a long position is initiated or a new low is formed after a short position is initiated.

There should be an input to key in the factor (1-10) and for the ATR that moves in the favour of the position as well.  

Since this function is similar with the trailing stop function, it should come in before the trailing stop function. It should add on more position before the EA moves higher for the long trailing stop and before the EA moves lower for the short tailing stop.

The input should have a bool UseAddWinner=TRUE to activate this function and the function should start with AddWinner() just like the way I do it for AdjustTrail()

The example is below.

Long Position

Current long Position 5 contract and average cost is 24,600

Highest high after initiate long position 24,900

Offer price now is 24,871 and the bid price is 24,870.9

Stop loss price is 24,720

Factor = 3

Average price after buy more contract = ((Stop Loss Price – Average Price) * (1/Factor)) + Average Price

((24,720 - 24,600) * (1/3)) + 24,600 = 24,640

Calculation to buy number of contract = Current Long Position / ((Offer Price - Average price after buy more contract) / (Average price after buy more contract - Current Average Price))

5 / ((24,871 - 24,640) / (24,640 - 24,600))

= 0.866

Round down to the nearest 2 decimal place = 0.86

 

Short Position

Current short Position 3.5 contract and average cost is 24,700

Lowest low after initiate long position 24200

Offer price now is 24,351 and the bid price is 24,350.9

Stop loss price is 24,500

Factor = 3

Average price after short more contract = ((Stop Loss Price – Current Average Price) * (1/Factor)) + Current Average Price

((24,500 - 24,700) * (1/3)) + 24,700 = 24,633.33

Calculation to short number of contract = Current Short Position / ((Bid Price - Average price after short more contract)/(Average price after short more contract – Current Average Price))

3.5 / ((24,350.9 - 24,633.33) / (24,633.33 - 24,700))

= 0.826

Round down to the nearest 2 decimal place = 0.82









응답함

1
개발자 1
등급
(277)
프로젝트
334
55%
중재
14
36% / 29%
기한 초과
1
0%
무료
비슷한 주문
EA based on CSV 50+ USD
Hello Developers, I need some consultation to help narrow down an idea and develop an EA. I have a csv file that stores data like this: Date portfolio portfolio_value 18/11/2025 ['EURNZD', 'EURCAD', 'EURJPY', 'EURCHF', 'AUDNZD', 'AUDCAD', 'AUDJPY', 'AUDCHF', 'USDNZD', 'USDCAD', 'USDJPY', 'USDCHF', 'GBPNZD', 'GBPCAD', 'GBPJPY', 'GBPCHF'] 1.7970698812202368 19/11/2025 ['CHFAUD', 'CHFNZD', 'CHFGBP', 'CHFJPY', 'EURAUD'
* For Buy - Time = greater than _______ and Less than ______ Remove SL , Time = greater than _______ Replace SL At _______ and also Spread= Less than ( points) ________ ( Same condition for sell side also ) at opposite direction . * For Buy - Time = greater than ______ and price is Below _______ and spread is lower than ( points) _____ cut loss . ( Same condition for sell side also) At opposite direction
Trading can take us to the top but trading robots would take us to the sky with trades, money and more. Trading is about learning how to make money and become successful without pressure. I need an excellent trading robot with excellent skills and knowledge
The strategy is already fully defined with exact logic, scoring system, entry rules, risk management, and execution protection (spread, slippage, deviation). The strategy is already fully defined with exact logic, scoring system, entry rules, risk management, and execution protection (spread, slippage, deviation). Please follow the specification strictly without any discretionary interpretation
Job Description: I am looking for a skilled MQL5 developer to create a custom Expert Advisor (EA). The trading strategy relies on standard indicators, but requires precise execution logic and strict risk management rules. Key Technical Requirements & Skills Needed: Multi-Timeframe (MTF): Basic ability to read one indicator's data from a higher timeframe (M15) while the EA runs on a lower timeframe (M5). Instant
EA MACENIC PRO V12L 30 - 50 USD
Ready made robot for executing trades because don't have PC or laptop does it come as license key that allows straight extension to be a ready made of change your mind and the match is still hustling and I recommend exness broker on any. Strategy of a mobile robot arrena that execute trades it self and 24/7 operational system that enhances power of electronic art technology with automatic EA optimization
Società di investimento con attività tra Sanremo e Monaco ricerca un giovane collaboratore con esperienza nell’utilizzo avanzato di MetaTrader 5. Si richiede la conoscenza della lingua ITALIANA e INGLESE. Si richiede una chiamata conoscitiva. Il collaboratore si occuperà di: • eseguire backtest di strategie di trading su MT5 • effettuare ottimizzazioni parametri tramite Strategy Tester • analizzare risultati e
Need Python developer to use MetaApi.cloud Python API (ready SDK) to build a real-time equity curve chart. Project is simple and details will be shared privately. Only apply if you have strong Python experience
VR Rsi Robot is an expert advisor for MetaTrader 5, built on the classic RSI (Relative Strength Index) indicator but utilizing a multi-timeframe approach. The core idea is to filter signals received from the faster timeframe (H1) with confirmation from the higher timeframe (D1). This approach reduces the number of false entries and increases the probability of following a sustained trend. The expert opens positions
SMA 30+ USD
You are an expert AI Trading Analyst specializing in Simple Moving Average (SMA) Trend Following strategies. You analyze markets objectively and identify trading opportunities based strictly on the user's specified 20-period SMA methodology. Adapt your analysis to match the user's trend-following style. TRADE IDEA REQUIREMENTS: - entry: Entry at 20 SMA crossover or price relative to 20 SMA (must align with trend

프로젝트 정보

예산
30+ USD