From mql4 to C# cAlgo cBoot ? How do you create a cBoot by converting mql4?

Created at 05 Dec 2018, 18:05
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
TG

tgjobscv

Joined 05.12.2018

From mql4 to C# cAlgo cBoot ? How do you create a cBoot by converting mql4?
05 Dec 2018, 18:05


Hi.

How do you create a cBoot by converting mql4?

Brain V2 mql4

#include <stdlib.mqh>

//---- input parameters
extern string     Expert_Name    = "BrainExpert_v2";

extern int        Magic          = 52000;
extern int        Slippage       =     3;

extern string     Main_data      = " Trade Volume & Trade Method";
extern double     Lots           =     0.01;
extern double     TakeProfit     =     0;    // Take Profit Value 
extern int        StopLossMode   =     2;    // Stop Loss Mode 
extern int        TrailStopMode  =     2;    // Trailing Stop Mode 
extern double     BreakEven      =     0;    // Break-Even Value
extern int        SessionStart   =     0;    // Start Hour of Trade Session 
extern int        SessionEnd     =    24;    // End Hour of Trade Session
extern bool       SignalMail     = false; 

extern string     Inputs         = " BrainTrend parameters ";
extern int        TimeFrame      =    60;    // Large Time Frame in min
extern int        NumBars        =   500;
extern int        ConfirmBars    =     3;
extern double     Use_pSAR       =     0;
extern double     pSAR_Step      =  0.02;
extern double     pSAR_Maximum   =   0.2;
extern double     Use_Stoch      =     0;
extern int        Kperiod        =    14; 
extern int        Dperiod        =     5;
extern int        slowing        =     5;
extern double     UpLevel        =    75;
extern double     DnLevel        =    25;
extern double     Use_iTrend     =     0;
extern int        FDSize         = 30;
extern int        FDPrice        = PRICE_MEDIAN;
extern double     FDTreshold     = 1.5;


extern string     MM_inputs      = " MoneyManagement by L.Williams ";
extern bool       MM             = false;    // ÌÌ Switch
extern double     MMRisk         =  0.15;    // Risk Factor
extern double     MaxLoss        =  1000;    // Maximum Loss by 1 Lot

int      OrderBar=0;
double   Lotsi;
int      BEvent=0, TriesNum=5;
datetime CurrBar,PrevBar;
double   pointvalue=1;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
  if (Digits == 4 || Digits == 2) pointvalue = Point;
  else if (Digits == 5 || Digits == 3) pointvalue = 10.0 * Point;
  CurrBar = iTime(Symbol(),TimeFrame,0);
  PrevBar = iTime(Symbol(),TimeFrame,1);
//----
   return(0);
  }

// ---- Scan Trades
int ScanTrades()
{   
   int total = OrdersTotal();
   int numords = 0;bool tck;
      
   for(int cnt=0; cnt<total; cnt++) 
   {        
   tck=OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == Magic) 
   numords++;
   }
   return(numords);
}  

int ConfirmSignal(int mode,int num)
{   
   int result = 0; 
   
   
   for (int i=num;i>=1;i--)
   { 
   double hiBT1 = iCustom(Symbol(),0,"BrainTrend1",NumBars,1,i); 
   double loBT1 = iCustom(Symbol(),0,"BrainTrend1",NumBars,0,i);
   double hi = High[i];
   double lo = Low[i];
   double fde1 = iCustom(NULL,0,"Fractal dimesion Ehlers",FDSize,FDPrice,FDTreshold,2,i);
   double fde2 = iCustom(NULL,0,"Fractal dimesion Ehlers",FDSize,FDPrice,FDTreshold,2,i+1); 
   if (mode==1 && result >= 0 && fde1 < fde2 && (hiBT1 != lo && loBT1 != hi)) {result+=1;}
   //else {result=0;break;}
   if (mode==2 && result <= 0 && fde1 < fde2 && (hiBT1 != hi && loBT1 != lo)) {result-=1;}  
   //else {result=0;break;}
   }
   
   return(result); 
}

int TradeSignal()
{   
   
   double buyBT1  = iCustom(Symbol(),TimeFrame,"BrainTrend1Sig",NumBars,0,0,1,1);
   double buyBT2  = iCustom(Symbol(),TimeFrame,"BrainTrend2Sig",NumBars,0,1);
   
   double sellBT1 = iCustom(Symbol(),TimeFrame,"BrainTrend1Sig",NumBars,0,0,0,1);
   double sellBT2 = iCustom(Symbol(),TimeFrame,"BrainTrend2Sig",NumBars,1,1);
   
   if (Use_pSAR > 0)
   {
   double SAR = iSAR(NULL,TimeFrame,pSAR_Step,pSAR_Maximum,1);
      if (SAR < Close[1]) int pSAR =  1;
      else
      if (SAR > Close[1]) pSAR = -1;
   }
   
   if (Use_Stoch > 0)
   {
   double StoMain = iStochastic(NULL,TimeFrame,Kperiod,Dperiod,slowing,MODE_SMA,0,MODE_MAIN,1);
   double StoSig  = iStochastic(NULL,TimeFrame,Kperiod,Dperiod,slowing,MODE_SMA,0,MODE_SIGNAL,1);
      if (StoMain > StoSig && StoMain < DnLevel && StoSig < DnLevel ) int Stoch = 1;    
      else
      if (StoMain < StoSig && StoMain > UpLevel && StoSig > UpLevel ) Stoch = -1;
   }   
   
   if (Use_iTrend > 0)
   {
   int Bands_Mode_0_2 = 0;  // =0-2 MODE_MAIN, MODE_LOW, MODE_HIGH
   int Power_Price_0_6= 0; // =0-6 PRICE_CLOSE,PRICE_OPEN,PRICE_HIGH,PRICE_LOW,PRICE_MEDIAN,PRICE_TYPICAL,PRICE_WEIGHTED
   int Price_Type_0_3 = 0;  // =0-3 PRICE_CLOSE,PRICE_OPEN,PRICE_HIGH,PRICE_LOW
   int Bands_Period   = 20;
   int Bands_Deviation= 2;
   int Power_Period   = 13;
  
   double iTrend1 = iCustom(Symbol(),TimeFrame,"iTrend",Bands_Mode_0_2,Power_Price_0_6,Price_Type_0_3,Bands_Period,Bands_Deviation,Power_Period,NumBars,0,1);
   double iTrend2 = iCustom(Symbol(),TimeFrame,"iTrend",Bands_Mode_0_2,Power_Price_0_6,Price_Type_0_3,Bands_Period,Bands_Deviation,Power_Period,NumBars,1,1);
   
      if(iTrend1 > 0 && iTrend2 < 0) int iTrend = 1;
      else
      if(iTrend2 > 0 && iTrend1 < 0) iTrend = -1;
   }
   if (TimeHour(CurTime()) >= SessionStart && TimeHour(CurTime()) <= SessionEnd)
   {
      if ( 
         buyBT1>0 && sellBT1<=0 
         && 
         buyBT2>0 && sellBT2<=0 
         && 
         ConfirmSignal(1,ConfirmBars)==ConfirmBars
         &&
         (pSAR == 1 || Use_pSAR == 0) 
         &&
         (Stoch == 1 || Use_Stoch == 0)
         &&
         (iTrend == 1 || Use_iTrend == 0)
         ) return( 1);
   
      if ( 
         buyBT1<=0 && sellBT1>0 
         && 
         buyBT2<=0 && sellBT2>0 
         && 
         ConfirmSignal(2,ConfirmBars)==-ConfirmBars
         && 
         (pSAR == -1 || Use_pSAR == 0)
         &&
         (Stoch == -1 || Use_Stoch == 0)
         &&
         (iTrend == -1 || Use_iTrend == 0)
         ) return(-1);
   }
   return(0);
}

double MoneyManagement ( bool flag, double aLots, double risk, double maxloss)
{
   Lotsi=Lots;
	    
   if ( flag ) Lotsi=aLots*NormalizeDouble(aLots*AccountFreeMargin()*risk/maxloss,1);   
     
   if (Lotsi<0.01) Lotsi=0.01;  
      
   return(Lotsi);
}   


void TrailStop()
{
   int    error;  
   bool   result=false;
   double Gain = 0;
    bool tck;
   for (int cnt=0;cnt<OrdersTotal();cnt++)
   { 
   tck=OrderSelect(cnt, SELECT_BY_POS);   
   int mode=OrderType();    
      if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
      {
         if (mode==OP_BUY) 
         {
			   if (TrailStopMode == 1 ) 
			   double BuyStop = NormalizeDouble(iCustom(Symbol(),TimeFrame,"BrainTrend1StopLine",NumBars,1,1),Digits);   
			   if (TrailStopMode == 2 )
			   BuyStop = NormalizeDouble(iCustom(Symbol(),TimeFrame,"BrainTrend2StopLine",NumBars,0,0,1),Digits); 
			   
			   
			   if ( BreakEven>0 && BEvent==0 )
			   {
			   Gain = (MarketInfo(Symbol(),MODE_BID) - OrderOpenPrice())/pointvalue;
			      if( Gain >= BreakEven && OrderStopLoss()<=OrderOpenPrice()+1*pointvalue) 
			      {
			      BuyStop = NormalizeDouble(OrderOpenPrice()+1*pointvalue,Digits);
			      BEvent=1;
			      }
			   }
			   
			   if ( BuyStop > NormalizeDouble(OrderStopLoss(),Digits)) 
			   {
			      for(int k = 0 ; k < TriesNum; k++)
               {
               result = OrderModify(OrderTicket(),OrderOpenPrice(),
			                           BuyStop,
			                           OrderTakeProfit(),0,Lime);
               error=GetLastError();
                  if(error==0) break;
                  else {Sleep(5000); RefreshRates(); continue;}
               }   		 
            }            
         }   
// - SELL Orders          
         if (mode==OP_SELL)
         {
            if (TrailStopMode == 1 ) 
			   double SellStop = NormalizeDouble(iCustom(Symbol(),TimeFrame,"BrainTrend1StopLine",NumBars,0,1),Digits);   
			   if (TrailStopMode == 2 )
			   SellStop = NormalizeDouble(iCustom(Symbol(),TimeFrame,"BrainTrend2StopLine",NumBars,0,1,1),Digits); 
            
            if ( BreakEven > 0 && BEvent==0)
			   {
			   Gain = (OrderOpenPrice()-MarketInfo(Symbol(),MODE_ASK))/pointvalue;
			      if( Gain >= BreakEven && OrderStopLoss()>=OrderOpenPrice()-1*pointvalue) 
			      {
			      SellStop = NormalizeDouble(OrderOpenPrice()-1*pointvalue,Digits);
			      BEvent=-1;
			      }
			   }
			           
            if( SellStop < NormalizeDouble(OrderStopLoss(),Digits) && SellStop > 0) 
            {
               for( k = 0 ; k < TriesNum; k++)
               {
               result = OrderModify(OrderTicket(),OrderOpenPrice(),
			                           SellStop,
			                           OrderTakeProfit(),0,Orange);
               error=GetLastError();
                  if(error==0) break;
                  else {Sleep(5000); RefreshRates(); continue;}
               }
            }	    
         }
      }
   }     
}

// ---- Open Sell Orders
void SellOrdOpen()
{		     
   double SellPrice = Bid;
   double StopPrice = Bid;
   int    Mode = OP_SELL;
        	  
   if (StopLossMode == 1) 
   double SellStop  = iCustom(Symbol(),TimeFrame,"BrainTrend1Sig",NumBars,0,0,0,1);
   else
   if (StopLossMode == 2) 
   SellStop  = iCustom(Symbol(),TimeFrame,"BrainTrend2Sig",NumBars,1,1);
	else SellStop = 0;
	
   if (TakeProfit  > 0) double SellProfit = SellPrice - TakeProfit*pointvalue; 
   else SellProfit=0;
   
	int ticket = OrderSend( Symbol(),Mode,MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
	                        NormalizeDouble(SellPrice , Digits),
	                        Slippage,
	                        NormalizeDouble(SellStop  , Digits),
	                        NormalizeDouble(SellProfit, Digits),
	                        Expert_Name+" SELL",Magic,0,Red);
   
   if(ticket > 0) 
   {
      if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) 
      {
		OrderBar =iBars(OrderSymbol(),TimeFrame);
		Print("SELL order opened : ", OrderOpenPrice());
      BEvent=0;
      if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
		}
   }
	else 	
   if(GetLastError()>0)
   Print("SELL: OrderSend failed with error #",GetLastError());
   
   
}
// ---- Open Buy Orders
void BuyOrdOpen()
{		     
   double BuyPrice  = Ask;
   double StopPrice = Ask;
   int    Mode      = OP_BUY;
      
   if (StopLossMode == 1) 
   double BuyStop  = iCustom(Symbol(),TimeFrame,"BrainTrend1Sig",NumBars,0,0,1,1);
   else
   if (StopLossMode == 2) 
   BuyStop  = iCustom(Symbol(),TimeFrame,"BrainTrend2Sig",NumBars,0,1);
   else BuyStop = 0;
   
   if (TakeProfit  > 0) double BuyProfit= BuyPrice + TakeProfit*pointvalue;  
   else BuyProfit=0;  
		 
	int ticket = OrderSend(Symbol(),Mode, MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
	                   NormalizeDouble(BuyPrice , Digits),
	                   Slippage,
	                   NormalizeDouble(BuyStop  , Digits), 
	                   NormalizeDouble(BuyProfit, Digits),
	                   Expert_Name+" BUY",Magic,0,Blue);
      
   if(ticket > 0) 
   {
      if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) 
      {
		OrderBar =iBars(OrderSymbol(),TimeFrame); 
		Print("BUY order opened : ", OrderOpenPrice());
      BEvent=0;
      if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
		}
   }
	else 	
   if(GetLastError()>0)      
   Print("BUY : OrderSend failed with error #",GetLastError());

   
} 

void CloseOrder(int mode)  
{
   bool result=false; 
   int  total=OrdersTotal();
   bool tck;
   for (int i=0; i<=OrdersTotal(); i++)  
   {
   tck=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderMagicNumber() == Magic && OrderSymbol() == Symbol()) 
      {
      if ((mode == 0 || mode ==1) && OrderType()==OP_BUY ) result=CloseAtMarket(OrderTicket(),OrderLots(),Aqua);
      if ((mode == 0 || mode ==2) && OrderType()==OP_SELL) result=CloseAtMarket(OrderTicket(),OrderLots(),Pink);
      }
   }
}


bool CloseAtMarket(int ticket,double lot,color clr) 
{
   bool result = false; 
   int  ntr;
      
   int tries=0;
   while (!result && tries < TriesNum) 
   {
      ntr=0; 
      //while (ntr<5 && !IsTradeAllowed()) { ntr++; Sleep(5000); }
      RefreshRates();
      result=OrderClose(ticket,lot,OrderClosePrice(),Slippage,clr);
      tries++;
   }
   if (!result) Print("Error closing order : ",ErrorDescription(GetLastError()));
   return(result);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if(iBars(Symbol(),TimeFrame)< 100 || IsTradeAllowed()==false) return(0); 
      
   if(AccountFreeMargin()< 1000*MoneyManagement ( MM, Lots, MMRisk, MaxLoss))
   {
   Print("We have no money. Free Margin = ", AccountFreeMargin());
   return(0);  
   }
   CurrBar = iTime(Symbol(),TimeFrame,0);
   //PrevBar = iTime(Symbol(),TimeFrame,1);
   
   if (CurrBar != PrevBar)
   {
      if(ScanTrades()>0)
      {
      if (TradeSignal()>0) CloseOrder(2);
      if (TradeSignal()<0) CloseOrder(1);
      }
      
      if(ScanTrades()==0)
      {
      if (TradeSignal()>0) BuyOrdOpen() ;
      if (TradeSignal()<0) SellOrdOpen();
      }
   }
   else
   if(ScanTrades()>0)
   {
   if(BreakEven>0 || TrailStopMode>0) TrailStop();
   }
   PrevBar = CurrBar;
   
//----
   return(0);
} //start()
//+------------------------------------------------------------------+

After converted to C# everything

Error : Unable to load assembly: Algo file 'C:\Users\John\Documents\cAlgo\Sources\Robots\..\Indicators\BrainTrend1_Indicator.algo' does not exist.

Robots \ .. \ Indicators does not exist

Indicators are in a different folder

 

How to fix it ?

How do I add alerts when the H1 H4 indicator signal appears ?! Important!

 

Greetings.


@tgjobscv
Replies

tgjobscv
05 Dec 2018, 18:07

'stdlib.mqh' stdlib.mqh 1 1

0 error(s), 0 warning(s), compile time: 145 msec 1 1

 

stdlib.mqh

This is necessary?

How to transfer Brain Trader EA to C #


@tgjobscv

PanagiotisCharalampous
06 Dec 2018, 09:18

Hi tgjobscv,

You can consider contacting a Consultant to convert the cBot for you.

Best Regards,

Panagiotis


@PanagiotisCharalampous