The 20's v0.30 [ea]

Author: Copyright � 2005, TraderSeven
Price Data Components
Series array that contains open time of each bar
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself
Miscellaneous
Uses files from the file systemIt writes information to file
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
140.00 %
Total Trades 4
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff 0.50
Gross Profit 7.00
Gross Loss -5.00
Total Net Profit 2.00
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
12.00 %
Total Trades 4
Won Trades 1
Lost trades 3
Win Rate 0.25 %
Expected payoff -3.30
Gross Profit 1.80
Gross Loss -15.00
Total Net Profit -13.20
-100%
-50%
0%
50%
100%
The 20's v0.30 [ea]
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                   The 20's v0.30 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, TraderSeven"
#property link      "TraderSeven@gmx.net"

#include <stdlib.mqh>                  // Include this file in case of needing to retrieve error descriptions
 
//            \\|//             +-+-+-+-+-+-+-+-+-+-+-+             \\|// 
//           ( o o )            |T|r|a|d|e|r|S|e|v|e|n|            ( o o )
//    ~~~~oOOo~(_)~oOOo~~~~     +-+-+-+-+-+-+-+-+-+-+-+     ~~~~oOOo~(_)~oOOo~~~~
// This EA has 2 main parts.
// Variation=0
// If previous bar opens in the lower 20% of its range and closes in the upper 20% of its range then sell on previous high+10pips.
// If previous bar opens in the upper 20% of its range and closes in the lower 20% of its range then buy on previous low-10pips.
// 
// Variation=1
// The previous bar is an inside bar that has a smaller range than the 3 bars before it.
// If todays bar opens in the lower 20% of yesterdays range then buy.
// If todays bar opens in the upper 20% of yesterdays range then sell.
//
//01010100 01110010 01100001 01100100 01100101 01110010 01010011 01100101 01110110 01100101 01101110 

#define Magic_Num  1002                // ID for The20s Strategy
#define Buy 1
#define Sell 0

extern int Variation=0;

extern int Stoploss=50;
extern int TrailingStop=5;
extern int LockProfit=30;
extern int TakeProfit=100;
extern int LockOutLossValue=10;

extern bool LockInProfit=False;
extern bool LockOutLoss=False;
extern bool LotOptimized=False;
extern bool OverwriteLog=False;

extern int Slippage=3;
extern double Lots=0.1;
extern double MaximumRisk=0.02;
extern double DecreaseFactor=3;

bool LockInProfitFlag;
bool LockOutLossFlag;
int LastTrade=-1, FileHandle;

int init()
{
   if(OverwriteLog==True)
      FileHandle = FileOpen("20sExpert.txt",FILE_WRITE);
   else
      FileHandle = FileOpen("20sExpert.txt",FILE_READ|FILE_WRITE);
   FileSeek(FileHandle,0,SEEK_END);
   if(FileHandle<1)
   {
      Print("File 20sExpert.txt error: ", GetLastError());
      return(-1);
   }

   return(0);
}

int deinit()                           
{                                      
   FileClose(FileHandle);
   return(0);
}

int start()
{
int h = TimeHour(CurTime());
int m = TimeMinute(CurTime());



   int BuyPositions,SellPositions;
   double LastBarsRange,Top20,Bottom20;

   if(IsTradeAllowed()==False)
   {
      Print("Error 1: Expert Advisor not allowed to trade");
      return(-1);
   }

   if(LockProfit<=LockOutLossValue && LockInProfit==True && LockOutLoss==True)
   {      
      Print("LockProfit must be greater than LockOutLossValue");
      return(-1);
   }
   
   if(DetermineOpenPositions(BuyPositions, SellPositions)>1)
      Print("Warning: Multiple trades open simultaneously [",BuyPositions+SellPositions,"]");

   if(BuyPositions+SellPositions==1)
      CheckForClose(BuyPositions,SellPositions);
   
   if(BuyPositions+SellPositions==0)
   {
      LastBarsRange=(High[1]-Low[1]);
      Top20=High[1]-(LastBarsRange*0.20);
      Bottom20=Low[1]+(LastBarsRange*0.20);

      if(Variation==0 && h==0 && m==0)
      {
         if(Open[1]>=Top20 && Close[1]<=Bottom20 && Low[0]<=Low[1]+10*Point)
            OpenOrder(Buy);
         else if(Open[1]<=Bottom20 && Close[1]>=Top20 && High[0]>=High[1]+10*Point)
            OpenOrder(Sell);
      }
      else if(Variation==1 && h==0 && m==0)
      { 
         if((High[4]-Low[4])>LastBarsRange && (High[3]-Low[3])>LastBarsRange && (High[2]-Low[2])>LastBarsRange && High[2]>High[1] && Low[2]<Low[1])
         {
            if(Open[0]<=Bottom20)
               OpenOrder(Buy);  
            if(Open[0]>=Top20)
               OpenOrder(Sell);
         }
      }
   }
}

int OpenOrder(bool OpenType)
{
   if(OpenType==Buy && LastTrade!=DayOfYear())
   {
      if(OrderSend(Symbol(),OP_BUY,LotOptimized(),Ask,Slippage,Ask-Stoploss*Point,Ask+TakeProfit*Point,"The 20's Strategy",Magic_Num,0,Blue) == -1)
      {
         Print("OP_BUY, Err = (", GetLastError(),") ",ErrorDescription(GetLastError()));
         return(-1);
      }
      else
      {
         FileWrite(FileHandle,"Buy @ "+TimeToStr(CurTime(),TIME_DATE|TIME_MINUTES)+": "+Symbol()+" Vol: "+LotOptimized()+" Balance: "+AccountBalance());
         LastTrade=DayOfYear();
         LockOutLossFlag=False;
         LockInProfitFlag=False;
      }
   }
   else if(OpenType==Sell && LastTrade!=DayOfYear())
   {
      if(OrderSend(Symbol(),OP_SELL,LotOptimized(),Bid,Slippage,Bid+Stoploss*Point,Bid-TakeProfit*Point,"The 20's Strategy",Magic_Num,0,Red) == -1)
      {
         Print("OP_SELL, Err = (", GetLastError(),") ",ErrorDescription(GetLastError()));
         return(-1);
      }
      else
      {         
         FileWrite(FileHandle,"Sell @ "+TimeToStr(CurTime(),TIME_DATE|TIME_MINUTES)+": "+Symbol()+" Vol: "+LotOptimized()+" Balance: "+AccountBalance());
         LastTrade=DayOfYear();
         LockOutLossFlag=False;
         LockInProfitFlag=False;
      }
   }
   return(0);
}


int DetermineOpenPositions(int& BuyPositions, int& SellPositions)
{
   int i;

   for(i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==False) 
         break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_Num)
      {
         if(OrderType()==OP_BUY)
            BuyPositions++;
         if(OrderType()==OP_SELL)
            SellPositions++;
      }
   }
   if(BuyPositions+SellPositions==0)
   {      
      LockInProfitFlag=False;
      LockOutLossFlag=False;
   }
   return(BuyPositions+SellPositions);
}

int CheckForClose(int& BuyPositions, int& SellPositions)
{
   for(int i=0; i<OrdersTotal(); i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
         break;
      if(OrderMagicNumber()!=Magic_Num || OrderSymbol()!=Symbol()) 
         continue;

      if(OrderType()==OP_BUY)
      {
         if(LockOutLossFlag==False && LockOutLoss==True)
         {
            if(Bid-OrderOpenPrice()>=LockOutLossValue*Point && OrderStopLoss()<OrderOpenPrice())
            {
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Black);            
               LockOutLossFlag=True;
            }
         }
         
         if(LockInProfitFlag==False && LockInProfit==True)
         {
            if(Bid-OrderOpenPrice()>=LockProfit*Point)
               LockInProfitFlag=True;
         }
         
         if((Bid-OrderOpenPrice()>TrailingStop*Point && (LockInProfit==True && LockInProfitFlag==True)) || (Bid-OrderOpenPrice()>TrailingStop*Point && LockInProfit==False))
         {
            if(OrderStopLoss()<Bid-Point*TrailingStop)
            {
               OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Black);
               return(0);
            }
         }
      }
      else if(OrderType()==OP_SELL)
      {
         if(LockOutLossFlag==False && LockOutLoss==True)
         {
            if(OrderOpenPrice()-Ask>=LockOutLossValue*Point && OrderStopLoss()>OrderOpenPrice())
            {
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Black);            
               LockOutLossFlag=True;
            }
         }

         if(LockInProfitFlag==False && LockInProfit==True)
         {
            if(OrderOpenPrice()-Ask>=LockProfit*Point)
               LockInProfitFlag=True;
         }

         if((OrderOpenPrice()-Ask>TrailingStop*Point && (LockInProfit==True && LockInProfitFlag==True)) || (OrderOpenPrice()-Ask>TrailingStop*Point && LockInProfit==False))
         {
            if(OrderStopLoss()>Ask+TrailingStop*Point || OrderStopLoss()==0)
            {
               OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Black);
               return(0);
            }         
         }
      }
   }
   return(0);
}

double LotOptimized()
{
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break

   if(LotOptimized==True)
   {
      lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

      if(DecreaseFactor>0)
      {
         for(int i=orders-1;i>=0;i--)
         {
            if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
            {
               Print("Error in history!");
               break;
            }
            if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
               continue;
         
            if(OrderProfit()>0)
               break;
            if(OrderProfit()<0)
               losses++;
         }
      }
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

      if(lot<0.1)
         lot=0.1;
      return(lot);
   }
   else
      return(Lots);
 
 int h = TimeHour(CurTime());
int m = TimeMinute(CurTime()); 
Comment(h,":",m);    
  if(h==23 && m>=55)
   {
   OrderSelect(0, SELECT_BY_POS);
   if(OrderType()==OP_BUY)
     {
     OrderClose(OrderTicket(),1,Bid,1000*Point);
     }   
     
   if(OrderType()==OP_SELL)
     {
     OrderClose(OrderTicket(),1,Ask,1000*Point);     
     }
   }     
      
      
}


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 ---