Firebird v63 TVD

Author: Copyright � 2005, TraderSeven
Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reached
Indicators Used
Relative Vigor indexMoving average indicator
Miscellaneous
It issuies visual alerts to the screenIt plays sound alertsUses files from the file systemIt reads information from a fileIt writes information to file
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
81.00 %
Total Trades 275
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -0.07
Gross Profit 76.80
Gross Loss -95.00
Total Net Profit -18.20
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
62.00 %
Total Trades 715
Won Trades 652
Lost trades 63
Win Rate 0.91 %
Expected payoff -0.17
Gross Profit 195.60
Gross Loss -315.00
Total Net Profit -119.40
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
84.00 %
Total Trades 240
Won Trades 224
Lost trades 16
Win Rate 0.93 %
Expected payoff -0.05
Gross Profit 67.20
Gross Loss -80.00
Total Net Profit -12.80
-100%
-50%
0%
50%
100%
Firebird v63 TVD
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+-----------------------------------------------------------------------------+
//|                              Firebird v0.63 - MA envelope exhaustion system |
//+-----------------------------------------------------------------------------+
#property copyright "Copyright © 2005, TraderSeven"
#property link      "TraderSeven@gmx.net"
 
//            \\|//             +-+-+-+-+-+-+-+-+-+-+-+             \\|// 
//           ( o o )            |T|r|a|d|e|r|S|e|v|e|n|            ( o o )
//    ~~~~oOOo~(_)~oOOo~~~~     +-+-+-+-+-+-+-+-+-+-+-+     ~~~~oOOo~(_)~oOOo~~~~
// Firebird calculates a 10 day SMA and then shifts it up and down 2% to for a channel.
// For the calculation of this SMA either close (more trades) or H+L (safer trades) is used.
// When the price breaks a band a postion in the opposite of the current trend is taken.
// If the position goes against us we simply open an extra position to average.
// 50% of the trades last a day. 45% 2-6 days 5% longer or just fail.
//
//01010100 01110010 01100001 01100100 01100101 01110010 01010011 01100101 01110110 01100101 01101110 
// Credits fly to:
// Vooch for the backtesting fix.
// Hugues Du Bois for the multi currency code.
// Jackie Griffin for some debugging.
// Many people in the MT forum for testing and feedback
// Ron added [2006 03 08 (Mar 08)]
//   maxDrawDown and maxOrders to track DD and number of open orders 
//   Divergence to protect from trends
// Renato added [2006 03 19 (Mar 19)]
//   RVI to reduce the DD in case of a runaway trend
//----------------------- USER INPUT
extern int MA_length = 10;
extern int MA_timeframe = 30;              // hdb did I add this ? lol
extern int MAtype = 0;//0=close, 1=HL		 
extern double Percent = 0.1;
extern int TradeOnFriday = 1; // >0 trades on friday
extern int slip = 100;//exits only
extern double Lots = 0.01; // modified by Renato
extern int TakeProfit = 30;
extern int Stoploss = 500;// total loss on all open positions in pips // modified by Renato
//extern double TrailingStop = 5;

// Ron added for iFXAnalyzer
extern int Fast_Period=23;
extern int Fast_Price = PRICE_OPEN;
extern int Slow_Period=84;
extern int Slow_Price = PRICE_OPEN;
extern int DivergenceLimit=7;

extern int PipStep = 30;//if position goes this amount of pips against you add another.
extern double IncreasementType = 0;//0=just add every PipStep,  >0 =OrdersToal()^x *Pipstep

double Stopper=0;
double KeepStopLoss=0;
double KeepAverage;
double dummy;
double spread=0;
double CurrentPipStep;
int    OrderWatcher=0;

// Ron Adds
int maxDD=0;
int maxOO=0;

extern int PipsLoss = 500; // included by Renato
color clOpenBuy = DodgerBlue; // included by Renato
color clModiBuy = DodgerBlue; // included by Renato
color clCloseBuy = DodgerBlue; // included by Renato
color clOpenSell = Red; // included by Renato
color clModiSell = Red; // included by Renato
color clCloseSell = Red; // included by Renato
color clDelete = White; // included by Renato
string Name_Expert = "Firebird v63H"; // included by Renato
string NameFileSound = "expert.wav"; // included by Renato
extern int MAXTrades=3; // maximum number of trades to have open at once
extern int GMT = 2; // InterbankFX // included by Renato
extern int DST = 0; // 0=Standard 1=Daylight Saving // included by Renato
extern int OpeningHour = 0; // included by Renato
extern int ClosingHour = 23; // included by Renato
extern int writelog = 0;

int init() {
  LogWrite(Symbol()+",M"+Period());
}

//----------------------- MAIN PROGRAM LOOP
int start()
{

LogWrite(TimeToStr(CurTime())+" - "+"Bid="+Bid);

int MagicNumber=MagicfromSymbol(); 
Comment(MagicNumber);

switch(MagicNumber) {// included by Renato
case 26910: // EURUSD,M30 // optmized 06/03/20
   MA_length=18; 
   MA_timeframe=30;
   MAtype=0;
   Percent=0.15; 
   TradeOnFriday=1;
   Lots=0.5;
   TakeProfit=30; 
   Stoploss=300;
   PipStep=5; 
   IncreasementType=0.0;
   OpeningHour = 6; // included by Renato
   ClosingHour = 14; // included by Renato
   break;
case 25803: // GBPUSD,M30 // optmized 06/03/22
   MA_length=18;
   MA_timeframe=30;
   MAtype=0;
   Percent=0.35;
   TradeOnFriday=1;
   Lots=0.1;
   TakeProfit=30;
   Stoploss=300;
   PipStep=7;
   IncreasementType=0.0;
   OpeningHour = 7; // included by Renato
   ClosingHour = 15; // included by Renato
   break;
case 26715: // EURCHF,M30 // optmized 06/03/20
   MA_length=18; 
   MA_timeframe=30; 
   MAtype=0; 
   Percent=0.1; 
   TradeOnFriday=1; 
   Lots=0.5; 
   TakeProfit=10; 
   Stoploss=300; 
   PipStep=7; 
   IncreasementType=0.0; 
   OpeningHour = 6; // included by Renato
   ClosingHour = 14; // included by Renato
   break;
/*case : // USDCHF,M30
   DVLimit = 8; // included by Renato
   OpeningHour = 6; // included by Renato
   ClosingHour = 14; // included by Renato
   break;*/
/*case : // USDCHF,M30
   DVLimit = 8; // included by Renato
   OpeningHour = 6; // included by Renato
   ClosingHour = 14; // included by Renato
   break;*/
/*case : // USDJPY,M30
   DVLimit = 8; // included by Renato
   OpeningHour = 23; // included by Renato
   ClosingHour = 7; // included by Renato
   break;*/
/*case : // USDAUD,M30
   DVLimit = 8; // included by Renato
   OpeningHour = 23; // included by Renato
   ClosingHour = 6; // included by Renato
   break;*/
/*default:
   if (!(IsTesting() || IsDemo())) 
   Alert("This advisor is suited for the EURUSD,M30 or GBPUSD,M30 charts only"); 
   return(0);
   break;
*/}

//Comment("Percent=",Percent); // included by Renato

double PriceTarget;
double AveragePrice;
int OpeningDay;

if ( DayOfWeek()==6 && Hour()>=20 ) { Comment("weekend"); return(0); } // included by Renato
if ( !(IsTesting() || IsDemo()) ) { if (LossCheck()) { Alert("excessive loss!"); PlaySound("alert.wav"); return(0); }} // included by Renato

//Ron Adds
int Diverge=divergence(Fast_Period,Slow_Period,Fast_Price,Slow_Price,0)/Point;
if(AccountBalance()-AccountEquity() > maxDD) maxDD=AccountBalance()-AccountEquity();
if(MyOrdersTotal()>maxOO) maxOO=OrdersTotal(); //modified by Renato

// Renato adds
double RVI=iRVI(NULL,0,10,MODE_MAIN,0)-iRVI(NULL,0,10,MODE_MAIN,1); // included by Renato
int Slope=Diverge-divergence(Fast_Period,Slow_Period,Fast_Price,Slow_Price,1)/Point;

Comment("maxDD=",maxDD," - maxOO=",maxOO," - CurDiv=",Slope);

//----------------------- CALCULATE THE NEW PIPSTEP
CurrentPipStep=PipStep;
if(IncreasementType>0)
  {
  CurrentPipStep=MathSqrt(MyOrdersTotal())*PipStep; // modified by Renato
  CurrentPipStep=MathPow(MyOrdersTotal(),IncreasementType)*PipStep; // modified by Renato
  } 
LogWrite("CurrentPipStep="+CurrentPipStep);

//----------------------- 
int Direction=0;//1=long, 11=avoid long, 2=short, 22=avoid short
if (Day()!=5 || TradeOnFriday >0)
{
   int cnt=0, total;
   int myTotal =0;                     // hdb
   total=OrdersTotal(); 
   LogWrite("OrdersTotal="+OrdersTotal());
   LogWrite("MyOrdersTotal="+MyOrdersTotal());
   if(MyOrdersTotal()==0) OpeningDay=DayOfYear(); // modified by Renato
 
    for(cnt=0;cnt<total;cnt++)
     {
     if ( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber) && (OrderComment()==GetCommentForOrder()) )    // hdb - only symbol and magic  // modified by Renato
      {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       double LastPrice=OrderOpenPrice();
       myTotal = myTotal +1;           // hdb - count of relevant trades
      }
    }
//   OrderSelect(total, SELECT_BY_POS, MODE_TRADES);      // removed hdb           
LogWrite("LastPrice="+LastPrice);

/////////////////////////////////////////////////////////////////////////////////////////
// BACKTESTER FIX:  DO NOT PLACE AN ORDER IF WE JUST CLOSED
// AN ORDER WITHIN Period() MINUTES AGO
/////////////////////////////////////////////////////////////////////////////////////////
datetime orderclosetime;
string   rightnow;
int      rightnow2;
int      TheHistoryTotal=HistoryTotal();
int      difference;
int      flag=0;
   for(cnt=0;cnt<TheHistoryTotal;cnt++) 
    {
    if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY)==true)
       {
        if ( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber) && (OrderComment()==GetCommentForOrder()) )       // hdb - only symbol and magic  // modified by Renato
            {
               orderclosetime=OrderCloseTime();
               rightnow=Year()+"-"+Month()+"-"+Day()+" "+Hour()+":"+Minute()+":"+Seconds();
               rightnow2=StrToTime(rightnow);
               difference=rightnow2-orderclosetime;
               if(Period()*60*2>difference) 
                  { // At least 2 periods away!
                   flag=1;   // Throw a flag
                   break;
                  }
              }
         }
     }

/////////////////////////////////////////////////////////////////////////////////////////
if(flag!=1) 
{   
   
//----------------------- PREVIOUS OPEN PRICE

OrderWatcher=0;
 
total=OrdersTotal(); 
for(cnt=(total-1);cnt>=0;cnt--){
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
//   Print("ordersymbol = ", OrderSymbol(), " OrderOpenPrice= ", DoubleToStr(OrderOpenPrice(), 10));
   if ( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber) && (OrderComment()==GetCommentForOrder()) )  // hdb - only symbol and magic  // modified by Renato
   {
           LastPrice=OrderOpenPrice();
//           Comment("LastPrice= ",DoubleToStr(LastPrice, 10));
//           Print("cnt= ", cnt, " ordersymbol = ", OrderSymbol(), " OrderOpenPrice= ", DoubleToStr(OrderOpenPrice(), 10), " lastprice= ",DoubleToStr(LastPrice, 10 ));
           break;
    } 
}

LogWrite("LastPrice="+LastPrice);

//Print("ordersymbol = ", OrderSymbol(), " OrderOpenPrice= ", DoubleToStr(OrderOpenPrice(), 10), " lastprice= ",DoubleToStr(LastPrice, 10 ));

// Ron added divergence check
//if ( MathAbs(diverge)>DivergenceLimit ) Comment("Divergence!"); else {

if ( Hour()<OpeningHour+GMT+DST || Hour()>ClosingHour+GMT+DST ) Comment("bad hours.");  else { // included by Renato
if ( AccountFreeMargin()<100*Lots ) Comment("Not enough margin!"); else {
if ( MyOrdersTotal() >= MAXTrades ) Comment("Orders limit!"); else {

//----------------------- ENTER POSITION BASED ON OPEN
if(MAtype==0)
   {
   double myMA =iMA(NULL,MA_timeframe,MA_length,0,MODE_SMA,PRICE_OPEN,0);
   
//   Print(" Top, Bid ",myMA*(1+Percent/100),"  ",Bid);
//   if((myMA*(1+Percent/100))<Bid) Print(" Top, Bid ",myMA*(1+Percent/100),"  ",Bid);

   // Go SHORT -> Only sell if >= 30 pips above previous position entry 
   if ( (myMA*(1+Percent/100))<Bid && Direction!=22 && (Bid>=(LastPrice+(CurrentPipStep*Point)) || MyOrdersTotal()==0) && Diverge<-DivergenceLimit && Slope>0 && RVI<0 ) // modified by Renato
 	  {
      OrderSend(Symbol(),OP_SELL,Lots,Bid,slip,Bid+(Stoploss*Point),Bid-(TakeProfit*Point),GetCommentForOrder(),MagicNumber,0,clOpenSell);  // modified by Renato
      OrderWatcher=1;
      Direction=2;
     }   
   if ( (myMA*(1-Percent/100))>Ask && Direction!=11 && (Ask<=(LastPrice-(CurrentPipStep*Point)) || MyOrdersTotal()==0) && Diverge>DivergenceLimit && Slope<0 && RVI>0 ) // Go LONG -> Only buy if >= 30 pips below previous position entry // modified by Renato
     {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,slip,Ask-(Stoploss*Point),Ask+(TakeProfit*Point),GetCommentForOrder(),MagicNumber,0,clOpenBuy);  // modified by Renato
      OrderWatcher=1;
      Direction=1;
     } 
   }     
//----------------------- ENTER POSITION BASED ON HIGH/LOW
if(MAtype==1)
  {
   if ( (iMA(NULL,MA_timeframe,MA_length,0,MODE_SMA,PRICE_HIGH,0)*(1+Percent/100))<Bid && Direction!=22 && (Bid>=(LastPrice+(CurrentPipStep*Point)) || MyOrdersTotal()==0)) // Go SHORT -> Only sell if >= 30 pips above previous position entry	// modified by Renato
 	  {
      OrderSend(Symbol(),OP_SELL,Lots,Bid,slip,Bid+(Stoploss*Point),Bid-(TakeProfit*Point),GetCommentForOrder(),MagicNumber,0,clOpenSell);  // modified by Renato
      OrderWatcher=1;
      Direction=2;
     }   
   if ( (iMA(NULL,MA_timeframe,MA_length,0,MODE_SMA,PRICE_LOW,0)*(1-Percent/100))>Ask && Direction!=11 && (Ask<=(LastPrice-(CurrentPipStep*Point)) || MyOrdersTotal()==0)) // Go LONG -> Only buy if >= 30 pips below previous position entry	 // modified by Renato
     {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,slip,Ask-(Stoploss*Point),Ask+(TakeProfit*Point),GetCommentForOrder(),MagicNumber,0,clOpenBuy);  // modified by Renato
      OrderWatcher=1;
      Direction=1;
     } 
  } 

} // end of MAXTrades limit // included by Renato
} // end of margin test // included by Renato
} // end of timefilter // included by Renato
} // end of flag test                  
//----------------------- CALCULATE AVERAGE OPENING PRICE 
   total=OrdersTotal(); 
   AveragePrice=0;  
   int myOrderType = -1;            // hdb
   myTotal = 0;                     // hdb - count of relevant trades

if (MyOrdersTotal()>1 && OrderWatcher==1)
   {
     for(cnt=0;cnt<total;cnt++)
     {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

       if ( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber) && (OrderComment()==GetCommentForOrder()) )  // hdb - only symbol and magic // modified by Renato
        {
        AveragePrice=AveragePrice+OrderOpenPrice();
//        myOrderType = OrderType();           // hdb - keep order type   
        myTotal = myTotal+1;                 // hdb - count of relevant trades
        }
     }
   AveragePrice=AveragePrice/MathMax(myTotal,1);        // hdb myTotal
   Comment("AveragePrice: ",AveragePrice,"  myTotal: ",myTotal); // modified by Renato 
   }
//----------------------- RECALCULATE STOPLOSS & PROFIT TARGET BASED ON AVERAGE OPENING PRICE
// OrderSelect(0, SELECT_BY_POS, MODE_TRADES);   // hdb removed    
/*
    if(myOrderType==OP_BUY  && OrderWatcher==1 && myTotal>1)  // Calculate profit/stop target for long 
      {
      PriceTarget=AveragePrice+(TakeProfit*Point);
      Stopper=AveragePrice-(((Stoploss*Point)/myTotal)); 
      }
    if(myOrderType==OP_SELL && OrderWatcher==1 && myTotal>1) // Calculate profit/stop target for short
      {
      PriceTarget=AveragePrice-(TakeProfit*Point);
      Stopper=AveragePrice+(((Stoploss*Point)/myTotal)); 
      }
*/
//      Comment("AveragePrice= ", AveragePrice);
//----------------------- IF NEEDED CHANGE ALL OPEN ORDERS TO THE NEWLY CALCULATED PROFIT TARGET    
if(OrderWatcher==1 && myTotal>1)// check if average has really changed
  { 
   total=OrdersTotal(); 
    for(cnt=0;cnt<total;cnt++)
       {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);  
       if ( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber) && (OrderComment()==GetCommentForOrder()) )  // hdb - only symbol and magic // modified by Renato
          {
    if(OrderType()==OP_BUY  && OrderWatcher==1 && myTotal>1)  // Calculate profit/stop target for long // modified by Renato
      {
      PriceTarget=AveragePrice+(TakeProfit*Point);
      Stopper=AveragePrice-(((Stoploss*Point)/myTotal)); 
      }
    if(OrderType()==OP_SELL && OrderWatcher==1 && myTotal>1) // Calculate profit/stop target for short // modified by Renato
      {
      PriceTarget=AveragePrice-(TakeProfit*Point);
      Stopper=AveragePrice+(((Stoploss*Point)/myTotal)); 
      }
//    OrderModify(OrderTicket(),0,Stopper,PriceTarget,0,Yellow);//set all positions to averaged levels
          } 
       } 
  }
//----------------------- KEEP TRACK OF STOPLOSS TO AVOID RUNAWAY MARKETS
// Sometimes the market keeps trending so strongly the system never reaches it's target.
// This means huge drawdown. After stopping out it falls in the same trap over and over.
// The code below avoids this by only accepting a signal in teh opposite direction after a SL was hit.
// After that all signals are taken again. Luckily this seems to happen rarely. 
if (MyOrdersTotal()>0) // modified by Renato
   {
    myOrderType = -1;                // hdb
    myTotal = 0;                     // hdb - count of relevant trades
    total=OrdersTotal(); 
    for(cnt=0;cnt<total;cnt++)
       {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            
       if ( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicNumber) && (OrderComment()==GetCommentForOrder()) )  // hdb - only symbol and magic // modified by Renato
          {
            KeepStopLoss=OrderStopLoss();
            AveragePrice=AveragePrice+OrderOpenPrice();
            myTotal = myTotal +1;                // hdb - count of relevant trades
            myOrderType = OrderType();           // hdb - keep order type   
          }
       }
   
   AveragePrice=AveragePrice/MathMax(myTotal,1);        // hdb myTotal
   KeepAverage=AveragePrice;
   Direction =0;
   if(myOrderType==OP_BUY) 
      { Direction=1;  } //long 
     else 
      { if (myOrderType==OP_SELL) Direction=2;  }//short
   }

if(KeepStopLoss!=0)
  {
  spread=MathAbs(KeepAverage-KeepStopLoss)/2;
  dummy=(Bid+Ask)/2;
  if (KeepStopLoss<(dummy+spread) && KeepStopLoss>(dummy-spread))
     {
     // a stoploss was hit
     if(Direction==1) Direction=11;// no more longs
     if(Direction==2) Direction=22;// no more shorts
     }
  KeepStopLoss=0;
  }    
}
}

// Ron added for divergence filter
double divergence(int F_Period, int S_Period, int F_Price, int S_Price, int mypos)
  {
   int i;
   double maF1, maF2, maS1, maS2;
   double dv1, dv2;
   maF1=iMA(Symbol(),0,F_Period,0,MODE_SMA,F_Price,mypos);
   maS1=iMA(Symbol(),0,S_Period,0,MODE_SMA,S_Price,mypos);
   dv1=(maF1-maS1);
   maF2=iMA(Symbol(),0,F_Period,0,MODE_SMA,F_Price,mypos+1);
   maS2=iMA(Symbol(),0,S_Period,0,MODE_SMA,S_Price,mypos+1);
   dv2=((maF1-maS1)-(maF2-maS2));
   return(dv1);
//   return(dv1-dv2);
  }

int MagicfromSymbol() { // included by Renato 
   int MagicNumber=0;  
   for (int i=0; i<5; i++) {  
      MagicNumber=MagicNumber*3+StringGetChar(Symbol(),i);  
   }  
   MagicNumber=MagicNumber*3+Period();  
   return(MagicNumber);  
}  

bool LossCheck() { // included by Renato
   int handle = FileOpen(LogFileName(),FILE_CSV|FILE_READ,";");  
   if (handle>0) { 
      int lsteqty = FileReadNumber(handle); 
      FileClose(handle); 
   } 
   else lsteqty = 0; 
   if (lsteqty==0) {   
     handle = FileOpen(LogFileName(),FILE_CSV|FILE_WRITE,";");  
     FileWrite(handle,AccountEquity());  
     FileClose(handle); 
   } 
   if (lsteqty-AccountEquity()>=PipsLoss*GetSizeLot()) return(True); 
   else return(False);  
} 

string LogFileName() { // included by Renato
    string stryear = DoubleToStr(Year(),0); 
    string strmonth = DoubleToStr(Month(),0); 
    if (StringLen(strmonth)<2) strmonth = "0"+strmonth; 
    string strday = DoubleToStr(Day(),0); 
    if (StringLen(strday)<2) strday = "0"+strday; 
    return(stryear+strmonth+strday+".log"); 
} 

void LogWrite(string content) {
  if (writelog==1) {
    int handle = FileOpen(Name_Expert+".log",FILE_CSV|FILE_WRITE,";");  
    FileSeek(handle,0,SEEK_END);
    FileWrite(handle,content);  
    FileFlush(handle);
    FileClose(handle); 
  }
}

int MyOrdersTotal() { // included by Renato
   int Mytotal=0; 
   for (int i=0; i<OrdersTotal(); i++) { 
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       if ( (OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicfromSymbol()) && (OrderComment()==GetCommentForOrder()) ) 
          Mytotal++; 
   }  
   return(Mytotal); 
} 

string GetCommentForOrder() { return(Name_Expert); }  // included by Renato
double GetSizeLot() { return(Lots);}  // included by Renato
double GetSlippage() { return((Ask-Bid)/Point); } // included by Renato

//----------------------- TO DO LIST
// 1st days profit target is the 30 pip line *not* 30 pips below average as usually. -----> Day()
// Trailing stop -> trailing or S/R or pivot target
// Realistic stop loss
// Avoid overly big positions
// EUR/USD  30 pips / use same value as CurrentPipStep
// GBP/CHF  50 pips / use same value as CurrentPipStep 
// USD/CAD  35 pips / use same value as CurrentPipStep 

//----------------------- OBSERVATIONS
// GBPUSD not suited for this system due to not reversing exhaustions. Maybe use other types of MA
// EURGBP often sharp reversals-> good for trailing stops?
// EURJPY deep pockets needed.

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---