Idea to Optimization

 

Hello Everyone!

I have the following idea, when i made a optimization in MT4 i can't optimie balance and drawdown, and because of that i think in the following idea:

for example: when my buy conditions are TRUE, i set a new parameter "flag",

then i check if the new Balance is greather or equal to last balance, if true, balance2 = balance1, if no, i have a conter "a",

variable a counts the looses, then i set a variable n_Loses (Number of looses that I'm going to accept, for example 30 looses in total)

then if a > n_loses, flag =1, so i can't buy anymore, so when i do my optimization, i'll have an optimization with a maximum of n_loses

Here is the fragment of code:

if (Buy1_1 < Buy1_2 && ... && flag ==0){ 
   Order = SIGNAL_BUY; 

   balance1 = AccountBalance();
   if ( balance1 >= balance2){
      balance2 = balance1;
   }else{
      a++;
   }
   if(a > n_Loses){
      flag =1;
   }else{
      flag=0;
   }  
}


The problem that i have is when i perform this, the value of "a", a increase to 85 in the first loose.


Somebody can help me to make this rigth?


Sorry about my english.

greetings everyone!

 
alej0:
Somebody can help me to make this rigth?
Not without seeing all the code. What is balance2, where is it defined, static, global, how is it set? Where is this code, are you incrementing 'a' per tick, per bar, or per trade?
 
#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4


extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 1.0;
extern int Slippage = 3;
extern bool UseStopLoss = True;
extern int StopLoss = 30;
extern bool UseTakeProfit = True;
extern int TakeProfit = 60;
extern bool UseTrailingStop = True;
extern int TrailingStop = 30;
extern int bK = 5;
extern int bD1 = 3;
extern int bD2 = 3;

extern int cK = 5;
extern int cD1 = 3;
extern int cD2 = 3;

extern int sma = 500;
extern int close_buy = 50;
extern int close_sell = 50;
extern int sts_max = 90;
extern int sts_min = 10;

extern int b_mode = 0;
extern int s_mode = 0;
extern int bc_mode = 0;
extern int sc_mode = 0;

 bool flag = 0;
 double balance1;
 double balance2=0;
 extern int n_perdidas =1;
int a=0;


int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;

   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;



   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;

   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+

double Buy2_1 = iMA(NULL, 0, sma, 0, MODE_EMA, PRICE_CLOSE, Current + 0);
double Buy2_2 = iClose(NULL, 0, Current + 0);


double Buy1_1 = iStochastic(NULL, 0, bK, bD1, bD2, MODE_SMA, 0, b_mode, Current + 0);
double Buy1_2 = sts_min;

double Sell2_1 = iMA(NULL, 0, sma, 0, MODE_EMA, PRICE_CLOSE, Current + 0);
double Sell2_2 = iClose(NULL, 0, Current + 0);


double Sell1_1 = iStochastic(NULL, 0, bK, bD1, bD2, MODE_SMA, 0, s_mode, Current + 0);
double Sell1_2 = sts_max;


double CloseBuy1_1 = iStochastic(NULL, 0, cK, cD1, cD2, MODE_SMA, 0, bc_mode, Current + 0);
double CloseBuy1_2 = close_buy;

double CloseSell1_1 = iStochastic(NULL, 0, cK, cD1, cD2, MODE_SMA, 0, sc_mode, Current + 0);
double CloseSell1_2 = close_sell;

   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+

   //Check position
   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+

                     if (CloseBuy1_1 == CloseBuy1_2) Order = SIGNAL_CLOSEBUY;


            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+

                     if (CloseSell1_1 == CloseSell1_2) Order = SIGNAL_CLOSESELL;


            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }

   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+

   if (Buy1_1 < Buy1_2 && Buy2_1 < Buy2_2 && flag == 0){ 
   Order = SIGNAL_BUY;
   
   balance1 = AccountBalance();
if ( balance1 >= balance2){
balance2 = balance1;
}else{
a++;
}
if(a > n_perdidas){
flag =1;
}else {flag=0;}   
   }

   if (Sell1_1 > Sell1_2 && Sell2_1 > Sell2_2 && flag == 0){ 
   Order = SIGNAL_SELL;
   
balance1 = AccountBalance();
if ( balance1 >= balance2){
balance2 = balance1;
}else{
a++;
}
if(a > n_perdidas){
flag =1;
}else {flag=0;}   
      }


   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+

   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
                                Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
                        } else {
                                Print("Error opening BUY order : ", GetLastError());
                        }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
                                Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
                        } else {
                                Print("Error opening SELL order : ", GetLastError());
                        }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   if (!EachTickMode) BarCount = Bars;

   return(0);
}
//+------------------------------------------------------------------+
 

Sorry by no say anything in the last post, i was getting an error "Text is too long"

Well, answering to your questions:

balance2 in the begining is 0, because in that case if i compare with balance1 (balance actual), will be always grather than 0, and all those variables are global,

a is incrementing per tick,


The idea is very simple (the strategy), but what i really wanna do is fix my optimization problem,


I hope you can help me now


Regards

 

can someone help me edit sar ohlc to use heiken ashi ohlc

Hi, I have an MTF indicator that uses sar, however I'd like the sar to calculate heiken ashi ohlc, and not the normal type

Can you tell me how I can do this, my mtf indicator calls to the sar indicator to calculate sar formula, I think it is calling to the internal indicator in mt4 that can not edit

you can skype or email if you can assist and like to talk about it

skype sty671

email sty671@gmail.com

I can also supply the original file that I'm trying to use heiken ashi ohlc for

Reason: