MQL5 Multi currency big boss big candle ea
//+------------------------------------------------------------------+
//| BigBossCandleAtrCalMulticurrency.mq5 |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
double ATR[];
#include <Trade\Trade.mqh>
CTrade trade;
datetime ExitTime;
enum stmode
{
BUY=1,
SELL=2,
BOTH=3,
};
string stgmodes;
input ENUM_TIMEFRAMES Timeframe=0;
input stmode StrategyMode = BOTH;
input string TradeStartTime = "00:00";
input string TradeStopTime = "23:36";
input bool CandleClosing=false;
input bool useclosingpercentage=false;
input double closingpercentage=80;
input double CandleRange=14;
input double AveragingStep=14;
input double NumberOfTrades;
input double Quantity;
input string QtyCalType;
input double QuantityMultiplier;
input double RangePercentage;
input double StoplossStepLevel;
input double TargetRangePercentage;
input double MagicNumber;
input bool USESL;
input bool useRMS=true;
input double maxprofit;
input double maxloss;
input double PercentSqoffAccount;
double Ltp,quantity, Sl_Val,updated_high,updated_low,perval,fixed_low_sell,fixed_high_buy,range,NextOrderQty;
string InitialTrade= NULL,check= NULL,orderlog=NULL;
bool ActivateSl=false,EAActivated=false,tradingenable=true;
struct SymbolData
{
string symbol; // Symbol name
double last_close_price; // Last close price
double low;
double high;
double open;
double close;
double range;
double diff_to_high;
double diff_to_low;
double atr;
double candlerange;
double averagingstep;
bool rangecondition;
string InitialTrade;
double AveragingStepCount;
double NextTradeVal;
double quantity;
double NextOrderQty;
double updated_high;
double fixed_low_sell;
double previous_target_val;
double perval;
double target_val;
double Sl_Val;
bool ActivateSl;
datetime ExitTime;
double updated_low;
double fixed_high_buy ;
};
SymbolData symbolDataArray[];
//| Expert initialization function |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int OnInit()
{
//---
quantity=Quantity;
string symbols[] = {"EURUSD","USDCHF","GBPUSD","USDJPY","AUDUSD"};
ArrayResize(symbolDataArray, ArraySize(symbols));
for(int i = 0; i < ArraySize(symbols); i++)
{
symbolDataArray[i].symbol = symbols[i];
symbolDataArray[i].InitialTrade = "NOTTAKEN";
symbolDataArray[i].quantity=Quantity;
symbolDataArray[i].rangecondition=false;
symbolDataArray[i].ActivateSl=false;
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//| Expert tick function |
//+------------------------------------------------------------------+
double percentagevalue;
double mtm,combined_pnl,low,high,close,diff_to_high,diff_to_low,NextTradeVal,target_val,previous_target_val,open;
double crange,bodysize;
int AveragingStepCount=0;
int currentday=0;
bool IsNewDay()
{
MqlDateTime time1,time2;
TimeToStruct(iTime(Symbol(),PERIOD_D1,0),time1);
TimeToStruct(iTime(Symbol(),PERIOD_D1,1),time2);
int today=time1.day,yesterday=time2.day;
// Alert("today: "+today+"yesterday: "+yesterday+"currentday: "+currentday);
if(currentday!=today)
{
// Alert("Oce running");
currentday=today;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double total,accbal,desiredper;
void OnTick()
{
if(StrategyMode==BOTH)
{
stgmodes="BOTH";
}
else
if(StrategyMode==BUY)
{ stgmodes="BUY";}
else
if(StrategyMode==SELL)
{ stgmodes="SELL";}
mtm=AccountInfoDouble(ACCOUNT_PROFIT);
for(int i = 0; i < ArraySize(symbolDataArray); i++)
{
if(useRMS==true)
{
if(mtm>maxprofit && maxprofit>0)
{
tradingenable=false;
close_all_sell_position();
symbolDataArray[i].rangecondition=false;
symbolDataArray[i].quantity=Quantity;
symbolDataArray[i].InitialTrade = "NOTTAKEN";
symbolDataArray[i].target_val = 0;
symbolDataArray[i].Sl_Val = 0;
symbolDataArray[i].AveragingStepCount = 0;
symbolDataArray[i].updated_low = 0;
symbolDataArray[i].fixed_high_buy = 0;
symbolDataArray[i].updated_high = 0;
symbolDataArray[i].fixed_low_sell = 0;
close_all_buy_position();
Alert("Max profit acheived closing all position");
}
if(mtm<maxloss && maxloss<0)
{
tradingenable=false;
close_all_sell_position();
close_all_buy_position();
symbolDataArray[i].quantity=Quantity;
symbolDataArray[i].InitialTrade = "NOTTAKEN";
symbolDataArray[i].target_val = 0;
symbolDataArray[i].Sl_Val = 0;
symbolDataArray[i].AveragingStepCount = 0;
symbolDataArray[i].updated_low = 0;
symbolDataArray[i].fixed_high_buy = 0;
symbolDataArray[i].updated_high = 0;
symbolDataArray[i].fixed_low_sell = 0;
symbolDataArray[i].rangecondition=false;
Alert("Max loss acheived closing all position");
}
}
}
if(IsNewDay()==true)
{
tradingenable=true;
Alert("Day changed we can take new trades");
}
if(TimeCurrent()>StringToTime(TradeStartTime) && TimeCurrent()<StringToTime(TradeStopTime))
{
EAActivated = true;
}
else
{
EAActivated = false;
}
if(EAActivated == true)
{
check="Trading enabled";
}
if(EAActivated == false)
{
check="Trading Disabled";
}
if (PercentSqoffAccount>0){
total=mtm+ Today_Closed_Profit() ;
accbal=AccountInfoDouble(ACCOUNT_BALANCE);
desiredper=accbal*PercentSqoffAccount*0.01;
if (total>=desiredper){
close_all_sell_position();
close_all_buy_position();
Alert("No more trsdes will be taken today ");
EAActivated = false;
}
}
for(int i = 0; i < ArraySize(symbolDataArray); i++)
{
symbolDataArray[i].last_close_price = iClose(symbolDataArray[i].symbol, Timeframe, 0);
int atrval=iATR(symbolDataArray[i].symbol,Timeframe,CandleRange);
ArraySetAsSeries(ATR,true);
CopyBuffer(atrval,0,0,3,ATR);
if(CandleClosing==false)
{
symbolDataArray[i].atr=ATR[0];
symbolDataArray[i].candlerange=ATR[0];
symbolDataArray[i].averagingstep=ATR[0];
symbolDataArray[i].low= iLow(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].high= iHigh(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].open= iOpen(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].close= iClose(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].range=symbolDataArray[i].high-symbolDataArray[i].low;
symbolDataArray[i].diff_to_high=symbolDataArray[i].close - symbolDataArray[i].high;
symbolDataArray[i].diff_to_high =MathAbs(symbolDataArray[i].diff_to_high);
symbolDataArray[i].diff_to_low=symbolDataArray[i].close - symbolDataArray[i].low;
symbolDataArray[i].diff_to_low =MathAbs(symbolDataArray[i].diff_to_low);
}
if(CandleClosing==true)
{
symbolDataArray[i].atr=ATR[1];
symbolDataArray[i].candlerange=ATR[1];
symbolDataArray[i].averagingstep=ATR[1];
symbolDataArray[i].low= iLow(symbolDataArray[i].symbol,Timeframe,1);
symbolDataArray[i].high= iHigh(symbolDataArray[i].symbol,Timeframe,1);
symbolDataArray[i].close= iClose(symbolDataArray[i].symbol,Timeframe,1);
symbolDataArray[i].open= iOpen(symbolDataArray[i].symbol,Timeframe,1);
symbolDataArray[i].range=symbolDataArray[i].high-symbolDataArray[i].low;
symbolDataArray[i].diff_to_high=symbolDataArray[i].close - symbolDataArray[i].high;
symbolDataArray[i].diff_to_high =MathAbs(symbolDataArray[i].diff_to_high);
symbolDataArray[i].diff_to_low=symbolDataArray[i].close - symbolDataArray[i].low;
symbolDataArray[i].diff_to_low =MathAbs(symbolDataArray[i].diff_to_low);
}
}
for(int i = 0; i < ArraySize(symbolDataArray); i++)
{
if(useclosingpercentage==true&& CandleClosing==true)
{
if(iClose(symbolDataArray[i].symbol,Timeframe,1) > iOpen(symbolDataArray[i].symbol,Timeframe,1))
{
crange=0;
bodysize=0;
percentagevalue=0;
crange=iHigh(symbolDataArray[i].symbol,Timeframe,1)-iLow(symbolDataArray[i].symbol,Timeframe,1);
bodysize=iClose(symbolDataArray[i].symbol,Timeframe,1)-iOpen(symbolDataArray[i].symbol,Timeframe,1);
percentagevalue= crange*closingpercentage*0.01;
if(symbolDataArray[i].rangecondition==false&&bodysize>=percentagevalue&&crange>symbolDataArray[i].candlerange)
{
symbolDataArray[i].rangecondition=true;
}
}
if(iClose(symbolDataArray[i].symbol,Timeframe,1)<iOpen(symbolDataArray[i].symbol,Timeframe,1))
{
crange=0;
bodysize=0;
percentagevalue=0;
crange=iHigh(symbolDataArray[i].symbol,Timeframe,1)-iLow(symbolDataArray[i].symbol,Timeframe,1);
bodysize=iOpen(symbolDataArray[i].symbol,Timeframe,1)-iClose(symbolDataArray[i].symbol,Timeframe,1);
percentagevalue= crange*closingpercentage*0.01;
if(symbolDataArray[i].rangecondition==false&&bodysize>=percentagevalue&&crange>symbolDataArray[i].candlerange)
{
symbolDataArray[i].rangecondition=true;
}
}
}
if(useclosingpercentage==false)
{
symbolDataArray[i].rangecondition=true;
}
}
for(int i = 0; i < ArraySize(symbolDataArray); i++)
{
if(
symbolDataArray[i].rangecondition==true&&
tradingenable==true&&
symbolDataArray[i].range >= symbolDataArray[i].candlerange &&
symbolDataArray[i].InitialTrade == "NOTTAKEN" &&
symbolDataArray[i].diff_to_high < symbolDataArray[i].diff_to_low && EAActivated == true&&
symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0) &&
(stgmodes=="BOTH" || stgmodes=="SELL")
)
{
symbolDataArray[i].InitialTrade = "SHORT";
symbolDataArray[i].AveragingStepCount = symbolDataArray[i].AveragingStepCount + 1;
symbolDataArray[i].NextTradeVal = symbolDataArray[i].close + symbolDataArray[i].averagingstep;
symbolDataArray[i].quantity=Quantity;
if(CandleClosing==true)
{
symbolDataArray[i].NextTradeVal = symbolDataArray[i].high + symbolDataArray[i].averagingstep;
}
if(QtyCalType=="MUL")
{ symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}
if(QtyCalType=="ADD")
{ symbolDataArray[i].NextOrderQty =symbolDataArray[i].quantity +QuantityMultiplier;}
symbolDataArray[i].updated_high = symbolDataArray[i].high;
symbolDataArray[i].fixed_low_sell = symbolDataArray[i].low;
symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_high;
symbolDataArray[i].perval= symbolDataArray[i].updated_high- symbolDataArray[i].fixed_low_sell;
Alert("perval: "+symbolDataArray[i].perval+" updated_high: "+symbolDataArray[i].updated_high+" updated_low: "+symbolDataArray[i].updated_low);
if(StoplossStepLevel>0)
{
symbolDataArray[i].Sl_Val=StoplossStepLevel*AveragingStep;
symbolDataArray[i].Sl_Val=SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_BID)+symbolDataArray[i].Sl_Val;
}
symbolDataArray[i].target_val = symbolDataArray[i].perval * TargetRangePercentage * 0.01;
symbolDataArray[i].target_val = symbolDataArray[i].updated_high - symbolDataArray[i].target_val;
orderlog = "Initial Short order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+
",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val+
",Sl_Val= "+symbolDataArray[i].Sl_Val+"Previous candle check time: "+iTime(symbolDataArray[i].symbol,Timeframe,1)+"diff_to_high: "+symbolDataArray[i].diff_to_high +"diff_to_low:"+symbolDataArray[i].diff_to_low;
Alert(orderlog);
trade.Sell(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_BID),_Digits),0,0,"Sell backtest order");
}
if(symbolDataArray[i].rangecondition==true&&
tradingenable==true&&
symbolDataArray[i].range >= symbolDataArray[i].candlerange &&
symbolDataArray[i].InitialTrade == "NOTTAKEN" &&
symbolDataArray[i].diff_to_high > symbolDataArray[i].diff_to_low &&
EAActivated == true&&
symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0)&&
(stgmodes=="BOTH" || stgmodes=="BUY")
)
{
symbolDataArray[i].InitialTrade = "BUY";
symbolDataArray[i].AveragingStepCount = symbolDataArray[i].AveragingStepCount + 1;
symbolDataArray[i].NextTradeVal = symbolDataArray[i].close - symbolDataArray[i].averagingstep;
quantity=Quantity;
if(CandleClosing==true)
{
symbolDataArray[i].NextTradeVal = symbolDataArray[i].low - symbolDataArray[i].averagingstep;
}
if(QtyCalType=="MUL")
{ symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}
if(QtyCalType=="ADD")
{ symbolDataArray[i].NextOrderQty =symbolDataArray[i].quantity +QuantityMultiplier;}
if(StoplossStepLevel>0)
{
symbolDataArray[i].Sl_Val=StoplossStepLevel*AveragingStep;
symbolDataArray[i].Sl_Val=SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_ASK)-symbolDataArray[i].Sl_Val;
}
symbolDataArray[i].updated_low= symbolDataArray[i].low;
symbolDataArray[i].fixed_high_buy = symbolDataArray[i].high;
symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_low;
symbolDataArray[i].perval=symbolDataArray[i].fixed_high_buy - symbolDataArray[i].updated_low;
Alert("perval: "+symbolDataArray[i].perval+" updated_high: "+symbolDataArray[i].updated_high+" updated_low: "+symbolDataArray[i].updated_low);
symbolDataArray[i].target_val= symbolDataArray[i].perval * TargetRangePercentage * 0.01;
symbolDataArray[i].target_val = symbolDataArray[i].updated_low+ symbolDataArray[i].target_val;
orderlog = "Initial Buy order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+
",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val+
",Sl_Val= "+symbolDataArray[i].Sl_Val+"Previous candle check time: "+iTime(symbolDataArray[i].symbol,Timeframe,1)+"diff_to_high: "+symbolDataArray[i].diff_to_high +"diff_to_low:"+symbolDataArray[i].diff_to_low;
Alert(orderlog);
trade.Buy(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_ASK),_Digits),0,0,"Buy backtest order");
}
if(
tradingenable==true&&
symbolDataArray[i].InitialTrade == "BUY" &&
symbolDataArray[i].close <= symbolDataArray[i].NextTradeVal &&
symbolDataArray[i].NextTradeVal > 0 &&
symbolDataArray[i].AveragingStepCount < NumberOfTrades&&symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0)
)
{
symbolDataArray[i].AveragingStepCount = symbolDataArray[i].AveragingStepCount + 1;
symbolDataArray[i].NextTradeVal = symbolDataArray[i].close - symbolDataArray[i].averagingstep;
if(CandleClosing==true)
{
symbolDataArray[i].NextTradeVal = symbolDataArray[i].low - symbolDataArray[i].averagingstep;
}
symbolDataArray[i].quantity= symbolDataArray[i].NextOrderQty;
if(QtyCalType == "MUL")
{ symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}
if(QtyCalType == "ADD")
{ symbolDataArray[i].NextOrderQty= symbolDataArray[i].quantity + QuantityMultiplier;}
symbolDataArray[i].updated_low = symbolDataArray[i].low;
symbolDataArray[i].previous_target_val= symbolDataArray[i].updated_low;
symbolDataArray[i].perval = symbolDataArray[i].fixed_high_buy - symbolDataArray[i].updated_low;
Alert("perval: "+symbolDataArray[i].perval+" symbolDataArray[i].updated_high: "+updated_high+" symbolDataArray[i].updated_low: "+updated_low);
symbolDataArray[i].target_val = symbolDataArray[i].perval* TargetRangePercentage* 0.01;
symbolDataArray[i].target_val = symbolDataArray[i].updated_low +symbolDataArray[i].target_val;
if(symbolDataArray[i].AveragingStepCount == NumberOfTrades)
{
symbolDataArray[i].ActivateSl = false;
// Sl_Val = close - AveragingStep;
}
orderlog = "Buy order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val;
Alert(orderlog);
trade.Buy(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_ASK),_Digits),0,0,"Buy backtest order");
}
if(
tradingenable==true&&symbolDataArray[i].InitialTrade == "SHORT" &&
symbolDataArray[i].close >= symbolDataArray[i].NextTradeVal &&
symbolDataArray[i].NextTradeVal > 0 &&
symbolDataArray[i].AveragingStepCount < NumberOfTrades&&symbolDataArray[i].ExitTime != iTime(symbolDataArray[i].symbol,Timeframe,0)
)
{
Alert("Atempt sell order");
symbolDataArray[i].AveragingStepCount = AveragingStepCount + 1;
symbolDataArray[i].NextTradeVal = symbolDataArray[i].close + AveragingStep;
if(CandleClosing==true)
{
symbolDataArray[i].NextTradeVal = symbolDataArray[i].high + symbolDataArray[i].averagingstep;
}
symbolDataArray[i].quantity=symbolDataArray[i].NextOrderQty;
if(QtyCalType== "MUL")
{symbolDataArray[i].NextOrderQty = symbolDataArray[i].quantity * QuantityMultiplier;}
if(QtyCalType== "ADD")
{ symbolDataArray[i].NextOrderQty =symbolDataArray[i].quantity +QuantityMultiplier;}
symbolDataArray[i].updated_high= symbolDataArray[i].high;
symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_high;
symbolDataArray[i].perval= symbolDataArray[i].updated_high- symbolDataArray[i].fixed_low_sell;
Alert("perval: "+symbolDataArray[i].perval+" updated_high: "+symbolDataArray[i].updated_high+" updated_low: "+symbolDataArray[i].updated_low);
symbolDataArray[i].target_val = symbolDataArray[i].perval* TargetRangePercentage * 0.01;
symbolDataArray[i].target_val = symbolDataArray[i].updated_high-target_val;
if(symbolDataArray[i].AveragingStepCount == NumberOfTrades)
{
symbolDataArray[i].ActivateSl = false;
// Sl_Val = close + AveragingStep;
}
orderlog = "Short order executed @ "+symbolDataArray[i].symbol+"for lotsize="+symbolDataArray[i].quantity+",Step = "+symbolDataArray[i].AveragingStepCount+",Target1 = "+symbolDataArray[i].target_val;
Alert(orderlog);
trade.Sell(symbolDataArray[i].quantity,symbolDataArray[i].symbol,NormalizeDouble(SymbolInfoDouble(symbolDataArray[i].symbol,SYMBOL_BID),_Digits),0,0,"Sell backtest order");
}
///---# target calculation
if(symbolDataArray[i].InitialTrade == "SHORT")
{
symbolDataArray[i].updated_high = takeprofit_calculation(symbolDataArray[i].high,symbolDataArray[i].InitialTrade,
symbolDataArray[i].previous_target_val);
symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_high;
symbolDataArray[i].perval = symbolDataArray[i].updated_high- symbolDataArray[i].fixed_low_sell;
// Alert("perval: "+perval+" updated_high: "+updated_high+" updated_low: "+updated_low);
symbolDataArray[i].target_val = symbolDataArray[i].perval * TargetRangePercentage * 0.01;
symbolDataArray[i].target_val = symbolDataArray[i].updated_high - symbolDataArray[i].target_val;
}
if(InitialTrade== "BUY")
{
symbolDataArray[i].updated_low = takeprofit_calculation(symbolDataArray[i].low, symbolDataArray[i].InitialTrade,
symbolDataArray[i].previous_target_val);
symbolDataArray[i].previous_target_val = symbolDataArray[i].updated_low;
symbolDataArray[i].perval = symbolDataArray[i].fixed_high_buy - symbolDataArray[i].updated_low;
// Alert("perval: "+perval+" updated_high: "+updated_high+" updated_low: "+updated_low);
symbolDataArray[i].target_val = symbolDataArray[i].perval * TargetRangePercentage * 0.01;
symbolDataArray[i].target_val= symbolDataArray[i].updated_low +symbolDataArray[i].target_val;
}
// target and stoploss execution
if(
symbolDataArray[i].InitialTrade == "SHORT" &&
symbolDataArray[i].last_close_price >=symbolDataArray[i].Sl_Val &&
symbolDataArray[i].Sl_Val > 0 &&USESL==true
)
{
symbolDataArray[i].rangecondition=false;
orderlog = "Stoploss Executed For Short Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;
Alert(orderlog);
symbolDataArray[i].InitialTrade = "NOTTAKEN";
symbolDataArray[i].target_val = 0;
symbolDataArray[i].Sl_Val = 0;
symbolDataArray[i].quantity = Quantity;
ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].AveragingStepCount = 0;
symbolDataArray[i].updated_low = 0;
symbolDataArray[i].fixed_high_buy = 0;
symbolDataArray[i].updated_high = 0;
symbolDataArray[i].fixed_low_sell = 0;
close_sell_position(symbolDataArray[i].symbol);
}
if(
symbolDataArray[i].InitialTrade == "SHORT" &&
symbolDataArray[i].last_close_price <=symbolDataArray[i].target_val &&
symbolDataArray[i].target_val > 0
)
{
symbolDataArray[i].rangecondition=false;
orderlog = "Target Executed For Short Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;
Alert(orderlog);
symbolDataArray[i].InitialTrade = "NOTTAKEN";
symbolDataArray[i].target_val = 0;
symbolDataArray[i].Sl_Val = 0;
symbolDataArray[i].quantity = Quantity;
symbolDataArray[i].ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].AveragingStepCount = 0;
symbolDataArray[i].updated_low = 0;
symbolDataArray[i].fixed_high_buy = 0;
symbolDataArray[i].updated_high = 0;
symbolDataArray[i].fixed_low_sell = 0;
close_sell_position(symbolDataArray[i].symbol);
}
if(
symbolDataArray[i].InitialTrade== "BUY" &&
symbolDataArray[i].last_close_price <= symbolDataArray[i].Sl_Val &&
symbolDataArray[i].Sl_Val > 0&&USESL==true
)
{
symbolDataArray[i].rangecondition=false;
symbolDataArray[i].InitialTrade = "NOTTAKEN";
symbolDataArray[i].target_val = 0;
symbolDataArray[i].Sl_Val = 0;
orderlog = "Stoploss Executed For Buy Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;
Alert(orderlog);
symbolDataArray[i].ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].AveragingStepCount= 0;
symbolDataArray[i].quantity = Quantity;
symbolDataArray[i].updated_low = 0;
symbolDataArray[i].fixed_high_buy= 0;
symbolDataArray[i].updated_high= 0;
symbolDataArray[i].fixed_low_sell = 0;
close_buy_position(symbolDataArray[i].symbol);
}
if(
symbolDataArray[i].InitialTrade== "BUY" &&
symbolDataArray[i].last_close_price >= symbolDataArray[i].target_val &&
symbolDataArray[i].target_val > 0
)
{
symbolDataArray[i].InitialTrade = "NOTTAKEN";
symbolDataArray[i].target_val = 0;
symbolDataArray[i].Sl_Val = 0;
symbolDataArray[i].rangecondition=false;
orderlog = "Target Executed For Buy Trade All Position Exited @ "+symbolDataArray[i].symbol+"@ price"+ symbolDataArray[i].close+", high:"+symbolDataArray[i].updated_high+", low="+ symbolDataArray[i].fixed_low_sell;
Alert(orderlog);
symbolDataArray[i].ExitTime = iTime(symbolDataArray[i].symbol,Timeframe,0);
symbolDataArray[i].AveragingStepCount= 0;
symbolDataArray[i].quantity = Quantity;
symbolDataArray[i].updated_low = 0;
symbolDataArray[i].fixed_high_buy= 0;
symbolDataArray[i].updated_high= 0;
symbolDataArray[i].fixed_low_sell = 0;
close_buy_position(symbolDataArray[i].symbol);
}
//---Main for loop
//---
}
// PrintSymbolDataArray();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PrintSymbolDataArray()
{
for(int i = 0; i < ArraySize(symbolDataArray); i++)
{
Print("Symbol: ", symbolDataArray[i].symbol,
", Ltp: ", DoubleToString(symbolDataArray[i].last_close_price, 5),
", low: ", DoubleToString(symbolDataArray[i].low, 5),
", high: ", DoubleToString(symbolDataArray[i].high, 5),
", open: ", DoubleToString(symbolDataArray[i].open, 5),
", close: ", DoubleToString(symbolDataArray[i].close, 5),
", range: ", DoubleToString(symbolDataArray[i].range, 5),
", diff_to_high: ", DoubleToString(symbolDataArray[i].diff_to_high, 5),
", diff_to_low: ", DoubleToString(symbolDataArray[i].diff_to_low, 5),
", atr: ", DoubleToString(symbolDataArray[i].atr, 5),
", candlerange: ", DoubleToString(symbolDataArray[i].candlerange, 5),
", averagingstep: ", DoubleToString(symbolDataArray[i].averagingstep, 5),
", rangecondition: ", symbolDataArray[i].rangecondition,
", InitialTrade: ", symbolDataArray[i].InitialTrade,
", AveragingStepCount: ", DoubleToString(symbolDataArray[i].AveragingStepCount, 5),
", NextTradeVal: ", DoubleToString(symbolDataArray[i].NextTradeVal, 5),
", quantity: ", DoubleToString(symbolDataArray[i].quantity, 5),
", NextOrderQty: ", DoubleToString(symbolDataArray[i].NextOrderQty, 5),
", updated_high: ", DoubleToString(symbolDataArray[i].updated_high, 5),
", fixed_low_sell: ", DoubleToString(symbolDataArray[i].fixed_low_sell, 5),
", previous_target_val: ", DoubleToString(symbolDataArray[i].previous_target_val, 5),
", Sl_Val: ", DoubleToString(symbolDataArray[i].Sl_Val, 5),
", ActivateSl: ", symbolDataArray[i].ActivateSl,
", perval: ", DoubleToString(symbolDataArray[i].perval, 5),
", target_val: ", DoubleToString(symbolDataArray[i].target_val, 5),
", ExitTime: ", DoubleToString(symbolDataArray[i].ExitTime, 5),
", updated_low: ", DoubleToString(symbolDataArray[i].updated_low, 5),
", fixed_high_buy: ", DoubleToString(symbolDataArray[i].fixed_high_buy, 5)
);
}
}
//+------------------------------------------------------------------+
void close_sell_position(string sym)
{
for(int i = 0; i < ArraySize(symbolDataArray); i++)
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
string currencypair=PositionGetSymbol(i);
int position_direction=PositionGetInteger(POSITION_TYPE);
if(currencypair==sym && position_direction == POSITION_TYPE_SELL)
{
int ticket=PositionGetTicket(i);
trade.PositionClose(ticket);
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double takeprofit_calculation(double updated_price, string tradetype,double previous_target_value)
{
if(tradetype == "SHORT")
{
if(updated_price >= previous_target_value)
{previous_target_value = updated_price;}
}
if(tradetype == "BUY")
{
if(updated_price <= previous_target_value)
{
previous_target_value = updated_price;
return previous_target_value;
}
}
return previous_target_value;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void close_buy_position(string sym)
{
for(int i = 0; i < ArraySize(symbolDataArray); i++)
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
string currencypair=PositionGetSymbol(i);
int position_direction=PositionGetInteger(POSITION_TYPE);
if(currencypair==sym && position_direction == POSITION_TYPE_BUY)
{
int ticket=PositionGetTicket(i);
trade.PositionClose(ticket);
}
}
}
}
//+------------------------------------------------------------------+
void close_all_sell_position()
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
string currencypair=PositionGetSymbol(i);
int position_direction=PositionGetInteger(POSITION_TYPE);
{
int ticket=PositionGetTicket(i);
trade.PositionClose(ticket);
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void close_all_buy_position()
{
for(int i=PositionsTotal()-1; i>=0; i--)
{
string currencypair=PositionGetSymbol(i);
int position_direction=PositionGetInteger(POSITION_TYPE);
{
int ticket=PositionGetTicket(i);
trade.PositionClose(ticket);
}
}
}
//+------------------------------------------------------------------+
double Today_Closed_Profit()
{
MqlDateTime SDateTime;
TimeToStruct(TimeCurrent(),SDateTime);
SDateTime.hour=0;
SDateTime.min=0;
SDateTime.sec=0;
datetime from_date=StructToTime(SDateTime); // From date
SDateTime.hour=23;
SDateTime.min=59;
SDateTime.sec=59;
datetime to_date=StructToTime(SDateTime); // To date
to_date+=60*60*24;
HistorySelect(from_date,to_date);
int trades_of_day=0;
double wining_trade=0.0;
double losing_trade=0.0;
double total_profit=0.0;
uint total=HistoryDealsTotal();
ulong ticket=0;
//--- for all deals
for(uint i=0; i<total; i++)
{
//--- try to get deals ticket
if((ticket=HistoryDealGetTicket(i))>0)
{
long entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
if(entry==DEAL_ENTRY_IN)
continue;
//--- get deals properties
trades_of_day++;
double deal_commission=HistoryDealGetDouble(ticket,DEAL_COMMISSION);
double deal_swap=HistoryDealGetDouble(ticket,DEAL_SWAP);
double deal_profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
double profit=deal_commission+deal_swap+deal_profit;
if(profit>0.0)
wining_trade+=profit;
if(profit<0.0)
losing_trade+=profit;
total_profit+=profit;
}
}
return total_profit;
}
//---
Comments
Post a Comment