Author: Copyright � 2007, Tinytjan
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Moving average indicatorCommodity channel indexStochastic oscillator
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
59.00 %
Total Trades 325
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -0.20
Gross Profit 95.18
Gross Loss -160.65
Total Net Profit -65.47
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
62.00 %
Total Trades 666
Won Trades 146
Lost trades 520
Win Rate 0.22 %
Expected payoff -0.18
Gross Profit 201.48
Gross Loss -322.40
Total Net Profit -120.92
-100%
-50%
0%
50%
100%
Kloss_
//+------------------------------------------------------------------+
//|                                                       Kloss_.mq4 |
//|                                       Copyright © 2007, Tinytjan |
//|                                                 tinytjan@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Tinytjan"
#property link      "tinytjan@mail.ru"

#define STUPID 0x60BE57

extern string     Lots_Desc         =  "if 0 dynamic lot is applied";
extern double     Lots              =  0;

extern string     RiskPercentage_Desc =  "actual only of Lots == 0, percentage of the risk for opening order";
extern int        RiskPercentage    =  0;

extern int        Slippage          =  2;

extern string     Target_Desc       =  "Take Profit -- none if 0";
extern int        Target            =  152;

extern string     Loss_Desc         =  "Stop Loss -- none if 0";
extern int        Loss              =  48;

extern int        MA                =  1;

extern int        CCI               =  10;

extern int        StochasticK       =  5;

extern int        StochasticD       =  3;

extern int        StochasticS       =  3;

extern string     CCIDiffer_Desc    =  "CCIDiffer and -CCIDiffer are signal levels";
extern int        CCIDiffer         =  120;

extern string     StochDiffer_Desc  =  "50 + StochDiffer and 50 - StochDiffer are signal levels";
extern int        StochDiffer       =  20;

extern string     MaxOrders_Desc    =  "no limit if 0";
extern int        MaxOrders         =  3;

double LotsToBid;
string symbol;

void CloseBuys(int MagicNumber, int Slippage)
{
   for(int i = 0; i < OrdersTotal(); i++)
   {
      // already closed
      if(OrderSelect(i, SELECT_BY_POS) == false) continue;
      // not current symbol
      if(OrderSymbol() != Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber() != MagicNumber) continue;
      
      if(OrderType() == OP_BUY)
      {
         if(OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Blue))
         {
            i--;
         }
         RefreshRates();
      }
   }
}

void CloseSells(int MagicNumber, int Slippage)
{
   for(int i = 0; i < OrdersTotal(); i++)
   {
      // already closed
      if(OrderSelect(i, SELECT_BY_POS) == false) continue;
      // not current symbol
      if(OrderSymbol() != Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber() != MagicNumber) continue;
      
      if(OrderType() == OP_SELL)
      {
         if (OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red))
         {
            i--;
         }
         RefreshRates();
      }
   }
}

int GetOrdersCount(int MagicNumber, int Type)
{
   int count = 0;
   
   for(int i = 0; i < OrdersTotal(); i++)
   {
      // already closed
      if(OrderSelect(i, SELECT_BY_POS) == false) continue;
      // not current symbol
      if(OrderSymbol() != Symbol()) continue;
      // order was opened in another way
      if(OrderMagicNumber() != MagicNumber) continue;
      
      if(OrderType() == Type)
      {
         count++;
      }
   }
   
   return (count);
}

double GetLotsToBid(int RiskPercentage)
{
   double margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
   double minLot = MarketInfo(Symbol(), MODE_MINLOT);
   double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   double account = AccountFreeMargin();
   
   double percentage = account*RiskPercentage/100;
   
   double lots = MathRound(10*percentage/margin)/10;
   
   if(lots < minLot)
   {
      lots = minLot;
   }
   
   if(lots > maxLot)
   {
      lots = maxLot;
   }

   return (lots);
}

void OpenBuy()
{
   double TP = 0;
   if (Target > 0)
   {
      TP = Bid + Target*Point;
   }

   double SL = 0;
   if (Loss > 0)
   {
      SL = Bid - Loss*Point;
   }
   
   if (Lots == 0) LotsToBid = GetLotsToBid(RiskPercentage);
   
   OrderSend(Symbol(), OP_BUY, LotsToBid, Ask, Slippage, SL, TP, NULL, STUPID, 0, Blue);
}

void OpenSell()
{
   double TP = 0;
   if (Target > 0)
   {
      TP = Ask - Target*Point;
   }

   double SL = 0;
   if (Loss > 0)
   {
      SL = Ask + Loss*Point;
   }
   
   if (Lots == 0) LotsToBid = GetLotsToBid(RiskPercentage);
   
   OrderSend(Symbol(), OP_SELL, LotsToBid, Bid, Slippage, SL, TP, NULL, STUPID, 0, Red);
}

void Check()
{
   double ma = iMA(symbol, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, 5);
   double cci = iCCI(symbol, 0, CCI, PRICE_WEIGHTED, 0);
   double stoch = iStochastic(symbol, 0, StochasticK, StochasticD, StochasticS, MODE_SMA, 0, MODE_MAIN, 0);
   
   if (cci < -CCIDiffer && stoch < 50 - StochDiffer && Open[1] > ma)
   {
      if (GetOrdersCount(STUPID, OP_SELL) > 0)
      {
         CloseSells(STUPID, Slippage);
         return;
      }
      if (GetOrdersCount(STUPID, OP_BUY) < MaxOrders || MaxOrders == 0) 
      {
         OpenBuy();
      }
   }

   if (cci > CCIDiffer && stoch > 50 + StochDiffer && Close[1] < ma)
   {
      if (GetOrdersCount(STUPID, OP_BUY) > 0)
      {
         CloseBuys(STUPID, Slippage);
         return;
      }
      if (GetOrdersCount(STUPID, OP_SELL) < MaxOrders || MaxOrders == 0) 
      {
         OpenSell();
      }
   }
}

int init()
{
   LotsToBid = Lots;
   symbol = Symbol();
}

datetime LastTime = 0;

int start()
{
   if (LastTime == 0)
   {
      LastTime = TimeCurrent();
      return (0);
   }
   
   // Trading only when tick is opening
   //if (TimeCurrent() - LastTime > 20)
   {
      // Check for open new orders and close current ones
      Check();
      LastTime = TimeCurrent();
   }

   return(0);
}

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