xBest_RV3.47

xBest_RV3.47最新版

官方版无广告695

更新日期:2022-03-06分类标签: 语言:中文平台:没限制

104 人已下载 手机查看

//+——————————————————————+
// P L E A S E – D O N O T D E L E T E A N Y T H I N G ! ! !
// ————————————————————————————————-
// xBest Rv3.47
//
// by xJhamil yamilhurtado@gmail.com
// Modfied by Rodolfo rodolfo.leonardo@gmail.com
//
//————————————————————————————————–
// THIS EA IS 100 % FREE OPENSOURCE, WHICH MEANS THAT IT’S NOT A COMMERCIAL PRODUCT
// ————————————————————————————————-

#property copyright “xBest Rv3.47”
#property link “https://goo.gl/6mXoPZ”
#property version “3.47”
#property description “xBest Rv3.47 – Grid Hedging Expert Advisor ”
#property description “This EA init a cycle of buy or sell depending of signaling, it start with the base”
#property description “lot and increase the size at every step by its factor and set a global take profit,”
#property description “if daily target profit is hit then close all orders, also have a time filtering,”
#property description “you can enable hedging after especified quantity of loss orders.”
#property description “Coder init: xJhamil, Mail: yamilhurtado@gmail.com”
#property description “Alter 2018-03-25: Rmorais, Mail: rodolfo.leonardo@gmail.com”
#property strict
//—
enum ENUM_LOT_MODE
{
LOT_MODE_FIXED = 1, // Fixed Lot
LOT_MODE_PERCENT = 2, // Percent Lot
};

//+——————————————————————+
//| |
//+——————————————————————+
enum ENUM_TYPE_GRID_LOT
{
fix_lot = 0, // Fixed Start Lot 0.01 / 0.01 / 0.01 / 0.01 / 0.01 /………….
Summ_lot = 1, // Summ Sart Lot 0.01 / 0.02 / 0.03 / 0.04 / 0.05 /………….
Martingale = 2, // Martingale Lot 0.01 / 0.02 / 0.04 / 0.08 / 0.16 /………….
Step_lot = 3 // Step Lot 0.01 / 0.01 / 0.01 / 0.02 / 0.02 / 0.02 / 0.03 / 0.03 / 0.03 / 0.04 / 0.04 / 0.04 /…………
};

//— input parameters
extern string Version__ = “—————————————————————-“;
extern string Version1__ = “—————–xBest Rv3.47 ——————————–“;
extern string Version2__ = “—————————————————————-“;

extern string InpChartDisplay__ = “————————Display Info——————–“;
extern bool InpChartDisplay = true; // Display Info
extern bool InpDisplayInpBackgroundColor = TRUE; // Display background color
extern color InpBackgroundColor = Black; // background color

extern string Switches = “————————— Switches ————————— “;
extern bool InpManualInitGrid = FALSE; // Start MANUAL Order Grid (Only if A / B Enable)
extern bool InpOpenNewOrders = TRUE; // Open New Orders ?
extern bool OpenNewOrdersGrid = TRUE; // Enable Grid ?
extern bool InpCloseAllNow = false; // closes all orders now
extern string Magic = “——–Magic Number Engine———“;
extern string Magic_ = “——–If all the engines are disabled runs a motor in buy and sell ———“;
input bool InpEnableEngineA = TRUE; // Enable Engine A [BUY]
input int InpMagic = 7799; // Magic Number A
input bool InpEnableEngineB = TRUE; // Enable Engine B [SELL]
input int InpMagic2 = 9977; // Magic Number B
extern string ConfigLOTE__ = “—————————Config Lot INIT————————————–“;
input ENUM_LOT_MODE InpLotMode = LOT_MODE_PERCENT; // Lot Mode
input double InpFixedLot = 0.01; // Fixed Lot
input double InpPercentLot = 0.03; // Percent Lot
input int InpTakeProfit = 6000; // Take Profit in Pips

extern string XBEST_ConfigGrid__ = “—————————Config Grid————————————–“;
input ENUM_TYPE_GRID_LOT TypeGridLot = Martingale; // Type Grid Lot
input int InpGridSize = 3; // Step Size in Pips
input double InpGridFactor = 2; // Grid Increment Factor (If Martingale)
input int InpGridStepLot = 4; // STEP LOT (If Step Lot)
input double InpMaxLot = 99; // Max Lot
input int InpHedgex = 2; // After Level Change Lot A to B (Necessari all Engine Enable)
input bool GridAllDirect = false; // Enable Grid Dual Side

extern string FilterOpenOneCandle__ = “——————–Filter One Order by Candle————–“;
input bool InpOpenOneCandle = true; // Open one order by candle
input ENUM_TIMEFRAMES InpTimeframeBarOpen = PERIOD_CURRENT; // Timeframe OpenOneCandle

extern string MinimalProfitClose__ = “——————–Minimal Profit Close/ Protect Grid ————–“;
input bool InpEnableMinProfit = true; // Enable Minimal Profit Close
input bool ProtectGridLastFist = true; // Enable Protect Grid Last save Firsts
input double MinProfit = 10.00; // Minimal Profit Close /Protect Grid
input int QtdTradesMinProfit = 10; // Qtd Trades to Minimal Profit Close/ Protect Grid
extern string Config__ = “—————————Config————————————–“;
input int InpHedge = 0; // Hedge After Level
input int InpDailyTarget = 50; // Daily Target in Money

extern string MovingAverageConfig__ = “—————————–Moving Average———————–“;
input ENUM_TIMEFRAMES InpMaFrame = PERIOD_CURRENT; // Moving Average TimeFrame
input int InpMaPeriod = 34; // Moving Average Period
input ENUM_MA_METHOD InpMaMethod = MODE_EMA; // Moving Average Method
input ENUM_APPLIED_PRICE InpMaPrice = PRICE_OPEN; // Moving Average Price
input int InpMaShift = 0; // Moving Average Shift

extern string HILOConfig__ = “—————————–HILO——————–“;
input bool EnableSinalHILO = true; //Enable Sinal HILO
input bool InpHILOFilterInverter = false; // If True Invert Filter
input ENUM_TIMEFRAMES InpHILOFrame = PERIOD_CURRENT; // HILO TimeFrame
input int InpHILOPeriod = 3; // HILO Period
input ENUM_MA_METHOD InpHILOMethod = MODE_EMA; // HILO Method
input int InpHILOShift = 0; // HILO Shift

double indicator_low;
double indicator_high;
double diff_highlow;
bool isbidgreaterthanima;

extern string TrailingStop__ = “——————–Trailling Stop————–“;
extern bool InpUseTrailingStop = true; // Use Trailling Stop´?
extern int InpTrailStart = 20; // TraillingStart
extern int InpTrailStop = 20; // Size Trailling stop

extern string BreakEven = “——————–Break Even————–“;
extern bool InpUseBreakEven = true; // Use Break Even ?
extern int InpBreakEvenStart = 15; // Break Even Start
extern int InpBreakEvenStep = 3; // Break Even Step

extern string TakeEquitySTOP__ = “————————Take Equity STOP —————“;
extern bool InpUseTakeEquityStop = true; // Usar Take EquityStop?
extern double InpProfitCloseandSTOP = 50.0; // Closes all orders once Float hits this $ amount

extern string FilterSpread__ = “—————————-Filter Max Spread——————–“;
input int InpMaxSpread = 24; // Max Spread in Pips

extern string EquityCaution__ = “————————Filter Caution of Equity —————“;
extern bool InpUseEquityCaution = TRUE; // EquityCaution?
extern double InpTotalEquityRiskCaution = 20; // Total % Risk to EquityCaution
extern ENUM_TIMEFRAMES InpTimeframeEquityCaution = PERIOD_D1; // Timeframe as EquityCaution

extern string EquitySTOP__ = “————————Filter Equity STOP —————“;
extern bool InpUseEquityStop = true; // Usar EquityStop?
extern double InpTotalEquityRisk = 60.0; // Total % Risk to EquityStop
extern bool InpAlertPushEquityLoss = false; //Send Alert to Celular
extern bool InpCloseAllEquityLoss = false; // Close all orders in TotalEquityRisk

/////////////////////////////////////////////////////
extern string FFCall__ = “—————————-Filter News FFCall————————“;

extern int InpMinsBeforeNews = 60; // mins before an event to stay out of trading
extern int InpMinsAfterNews = 20; // mins after an event to stay out of trading
extern bool InpUseFFCall = true;
extern bool InpIncludeHigh = true;

///////////////////////////////////////////////
extern string TimeFilter__ = “————————-Filter DateTime—————————“;
extern bool InpUtilizeTimeFilter = true;
extern bool InpTrade_in_Monday = true;
extern bool InpTrade_in_Tuesday = true;
extern bool InpTrade_in_Wednesday = true;
extern bool InpTrade_in_Thursday = true;
extern bool InpTrade_in_Friday = true;

extern string InpStartHour = “00:00”;
extern string InpEndHour = “23:59”;

extern string _Visor1_ = “—————————–Visor 1 ——————–“;
extern bool Visor1_Show_the_Time = True;
extern bool Visor1_Show_the_Price = True;

extern color Visor1_Price_Up_Color = LawnGreen;
extern color Visor1_Price_Down_Color = Tomato;
extern int Visor1_Price_X_Position = 10;
extern int Visor1_Price_Y_Position = 10;
extern int Visor1_Price_Size = 20;
double Visor1_Old_Price;

extern int Visor1_Porcent_X_Position = 10;
extern int Visor1_Porcent_Y_Position = 70;
extern int Visor1_Porcent_Size = 20;

extern int Visor1_Symbol_X_Position = 10;
extern int Visor1_Symbol_Y_Position = 40;
extern int Visor1_Symbol_Size = 20;

extern int Visor1_Chart_Timezone = -5;
extern color Visor1_Time_Color = Yellow;
extern int Visor1_Time_Size = 17;
extern int Visor1_Time_X_Position = 10;
extern int Visor1_Time_Y_Position = 10;

extern int Visor1_Spread_Size = 10;
extern int Visor1_Spread_X_Position = 10;
extern int Visor1_Spread_Y_Position = 100;

color Visor1_FontColor = Black;

int Visor1_Sinal = 0;

//LOT_MODE_FIXED
//—
int SlipPage = 3;
bool GridAll = false;

//—

bool m_hedging1, m_target_filter1;
int m_direction1, m_current_day1, m_previous_day1;
double m_level1, m_buyer1, m_seller1, m_target1, m_profit1;
double m_pip1, m_size1, m_take1;
datetime m_datetime_ultcandleopen1;
datetime m_time_equityrisk1;
double m_mediaprice1, profit1;
int m_orders_count1;
double m_lastlot1;

bool m_hedging2, m_target_filter2;
int m_direction2, m_current_day2, m_previous_day2;
double m_level2, m_buyer2, m_seller2, m_target2, m_profit2;
double m_pip2, m_size2, m_take2;
datetime m_datetime_ultcandleopen2;
datetime m_time_equityrisk2;
double m_mediaprice2;
int m_orders_count2;
double m_lastlot2, profit2;

string m_symbol;
bool m_news_time;
double m_spreadX;
double Spread;
bool m_initpainel;
string m_filters_on;
double m_profit_all;
datetime m_time_equityriskstopall;

//+——————————————————————+
//| Expert initialization function |
//+——————————————————————+
int OnInit()
{
if (!IsTradeAllowed())
Alert(“Not TradeAllowed”);

Spread = 2.0;
if (InpManualInitGrid)
{

DrawRects(250, 15, Gray, 80, 50, “SELL”);
DrawRects(420, 15, Gray, 80, 50, “BUY”);
DrawRects(600, 15, Gray, 80, 50, “CLOSE ALL BUY”);
DrawRects(770, 15, Gray, 80, 50, “CLOSE ALL SELL”);
}

//—
m_symbol = Symbol();

if (Digits == 3 || Digits == 5)
m_pip1 = 10.0 * Point;
else
m_pip1 = Point;
m_size1 = InpGridSize * m_pip1;
m_take1 = InpTakeProfit * m_pip1;
m_hedging1 = false;
m_target_filter1 = false;
m_direction1 = 0;

m_datetime_ultcandleopen1 = -1;
m_time_equityrisk1 = -1;
m_orders_count1 = 0;
m_lastlot1 = 0;

if (Digits == 3 || Digits == 5)
m_pip2 = 10.0 * Point;
else
m_pip2 = Point;
m_size2 = InpGridSize * m_pip2;
m_take2 = InpTakeProfit * m_pip2;
m_hedging2 = false;
m_target_filter2 = false;
m_direction2 = 0;

m_datetime_ultcandleopen2 = -1;
m_time_equityrisk2 = -1;
m_orders_count2 = 0;
m_lastlot2 = 0;

m_filters_on = “”;
m_initpainel = true;

//—
printf(“xBest v3.47 – Grid Hedging Expert Advisor “);
return (INIT_SUCCEEDED);
}
//+——————————————————————+
//| Expert deinitialization function |
//+——————————————————————+
void OnDeinit(const int reason)
{
ObjectDelete(“Market_Price_Label”);
ObjectDelete(“Time_Label”);
ObjectDelete(“Porcent_Price_Label”);
ObjectDelete(“Spread_Price_Label”);
ObjectDelete(“Simbol_Price_Label”);
//—
}

//+——————————————————————+
//| |
//+——————————————————————+
void Informacoes()
{

string Ls_64;

int Li_84;

if (!IsOptimization())
{
Visor1Handling();
Ls_64 = “\n\n “;
Ls_64 = Ls_64 + “==========================\n”;
Ls_64 = Ls_64 + ” ” + ” xBest FULL Hedge v3.47 2018-03-26 ” + “\n”;
Ls_64 = Ls_64 + “==========================\n”;
// Ls_64 = Ls_64 + ” Broker: ” + AccountCompany() + “\n”;
Ls_64 = Ls_64 + ” Time of Broker:” + TimeToStr(TimeCurrent(), TIME_DATE | TIME_SECONDS) + “\n”;
// Ls_64 = Ls_64 + ” Currenci: ” + AccountCurrency() + “\n”;
//Ls_64 = Ls_64 + ” Spread: ” + m_spreadX + ” pips\n”;
//Ls_64 = Ls_64 + “==========================\n”;
Ls_64 = Ls_64 + ” Grid Size : ” + (string)InpGridSize + ” Pips \n”;
Ls_64 = Ls_64 + ” TakeProfit: ” + (string)InpTakeProfit + ” Pips \n”;
Ls_64 = Ls_64 + ” Lot Mode : ” + (string)InpLotMode + ” \n”;
Ls_64 = Ls_64 + ” Exponent Factor: ” + (string)InpGridFactor + ” pips\n”;
Ls_64 = Ls_64 + ” Daily Target: ” + (string)InpDailyTarget + “\n”;
// Ls_64 = Ls_64 + ” Hedge After Level: ” + (string)InpHedge + ” \n”;
Ls_64 = Ls_64 + ” InpMaxSpread: ” + (string)InpMaxSpread + ” pips\n”;
Ls_64 = Ls_64 + “==========================\n”;
// Ls_64 = Ls_64 + ” Spread: ” + (string)MarketInfo(Symbol(), MODE_SPREAD) + ” \n”;
Ls_64 = Ls_64 + ” Equity: ” + DoubleToStr(AccountEquity(), 2) + ” \n”;
Ls_64 = Ls_64 + ” Last Lot : | A : ” + DoubleToStr(m_lastlot1, 2) + ” | B : ” + DoubleToStr(m_lastlot2, 2) + ” \n”;
Ls_64 = Ls_64 + ” Orders Opens : ” + string(CountTrades()) + ” | A : ” + (string)m_orders_count1 + ” | B : ” + (string)m_orders_count2 + ” \n”;
Ls_64 = Ls_64 + ” Profit/Loss: ” + DoubleToStr(m_profit_all, 2) + ” | A : ” + DoubleToStr(CalculateProfit(InpMagic), 2) + ” | B : ” + DoubleToStr(CalculateProfit(InpMagic2), 2) + ” \n”;
Ls_64 = Ls_64 + ” ==========================\n”;
Ls_64 = Ls_64 + ” EquityCautionFilter : ” + (string)InpUseEquityCaution + ” \n”;
Ls_64 = Ls_64 + ” TotalEquityRiskCaution : ” + DoubleToStr(InpTotalEquityRiskCaution, 2) + ” % \n”;
Ls_64 = Ls_64 + ” EquityStopFilter : ” + (string)InpUseEquityStop + ” \n”;
Ls_64 = Ls_64 + ” TotalEquityRiskStop : ” + DoubleToStr(InpTotalEquityRisk, 2) + ” % \n”;
Ls_64 = Ls_64 + ” NewsFilter : ” + (string)InpUseFFCall + ” \n”;
Ls_64 = Ls_64 + ” TimeFilter : ” + (string)InpUtilizeTimeFilter + ” \n”;
Ls_64 = Ls_64 + ” ==========================\n”;
Ls_64 = Ls_64 + m_filters_on;

Comment(Ls_64);

Li_84 = 16;
if (InpDisplayInpBackgroundColor)
{
if (m_initpainel || Seconds() % 5 == 0)
{
m_initpainel = FALSE;
for (int count_88 = 0; count_88 < 12; count_88++)
{
for (int count_92 = 1; count_92 < Li_84; count_92++)
{
ObjectDelete(“background” + (string)count_88 + (string)count_92);
ObjectDelete(“background” + (string)count_88 + ((string)(count_92 + 1)));
ObjectDelete(“background” + (string)count_88 + ((string)(count_92 + 2)));
ObjectCreate(“background” + (string)count_88 + (string)count_92, OBJ_LABEL, 0, 0, 0);
ObjectSetText(“background” + (string)count_88 + (string)count_92, “n”, 30, “Wingdings”, InpBackgroundColor);
ObjectSet(“background” + (string)count_88 + (string)count_92, OBJPROP_XDISTANCE, 20 * count_88);
ObjectSet(“background” + (string)count_88 + (string)count_92, OBJPROP_YDISTANCE, 23 * count_92 + 9);
}
}
}
}
else
{
if (m_initpainel || Seconds() % 5 == 0)
{
m_initpainel = FALSE;
for (int count_88 = 0; count_88 < 9; count_88++)
{
for (int count_92 = 0; count_92 < Li_84; count_92++)
{
ObjectDelete(“background” + (string)count_88 + (string)count_92);
ObjectDelete(“background” + (string)count_88 + ((string)(count_92 + 1)));
ObjectDelete(“background” + (string)count_88 + ((string)(count_92 + 2)));
}
}
}
}
}
}
//+——————————————————————+
//| Expert tick function |
//+——————————————————————+
void OnTick()
{

bool TradeNow = true;
if (m_orders_count1 == 0)
ObjectDelete(“AvgA”);

if (m_orders_count2 == 0)
ObjectDelete(“AvgB”);

m_profit_all = CalculateProfit();

if (InpCloseAllNow)
{
CloseThisSymbolAll(InpMagic);
CloseThisSymbolAll(InpMagic2);
InpManualInitGrid = true;
}

if (InpUseTakeEquityStop == true && m_profit_all >= InpProfitCloseandSTOP)
{
CloseThisSymbolAll(InpMagic);
CloseThisSymbolAll(InpMagic2);
}

m_lastlot2 = FindLastSellLot(InpMagic2);
m_lastlot1 = FindLastBuyLot(InpMagic);

if (InpManualInitGrid)
{
if (m_lastlot1 > 0 || !InpEnableEngineA)
{
ObjectSetInteger(0, “_lBUY”, OBJPROP_BGCOLOR, Gray);
ObjectSetInteger(0, “_lCLOSE ALL BUY”, OBJPROP_BGCOLOR, Green);
}
else
{
ObjectSetInteger(0, “_lBUY”, OBJPROP_BGCOLOR, Blue);
ObjectSetInteger(0, “_lCLOSE ALL BUY”, OBJPROP_BGCOLOR, Gray);
}

if (m_lastlot2 > 0 || !InpEnableEngineB)
{
ObjectSetInteger(0, “_lSELL”, OBJPROP_BGCOLOR, Gray);
ObjectSetInteger(0, “_lCLOSE ALL SELL”, OBJPROP_BGCOLOR, Green);
}
else
{
ObjectSetInteger(0, “_lSELL”, OBJPROP_BGCOLOR, Red);
ObjectSetInteger(0, “_lCLOSE ALL SELL”, OBJPROP_BGCOLOR, Gray);
}

if (ObjectGetInteger(0, “_lBUY”, OBJPROP_STATE) && !(m_orders_count1 > 0 || !InpEnableEngineA))
{
xBest(“A”, 1, 0, true, InpMagic, m_orders_count1, m_mediaprice1, m_hedging1, m_target_filter1,
m_direction1, m_current_day1, m_previous_day1, m_level1, m_buyer1, m_seller1,
m_target1, m_profit1, m_pip1, m_size1, m_take1, m_datetime_ultcandleopen1,
m_time_equityrisk1, profit1);
// Alert(“BUY”);
ObjectSetInteger(0, “_lBUY”, OBJPROP_STATE, false);
}

if (ObjectGetInteger(0, “_lSELL”, OBJPROP_STATE) && !(m_orders_count2 > 0 || !InpEnableEngineA))
{
xBest(“B”, -1, 0, true, InpMagic2, m_orders_count2, m_mediaprice2, m_hedging2,
m_target_filter2, m_direction2, m_current_day2, m_previous_day2,
m_level2, m_buyer2, m_seller2, m_target2, m_profit2, m_pip2,
m_size2, m_take2, m_datetime_ultcandleopen2,
m_time_equityrisk2, profit2);
// Alert(“SELL”);
ObjectSetInteger(0, “_lSELL”, OBJPROP_STATE, false);
}

if (ObjectGetInteger(0, “_lCLOSE ALL SELL”, OBJPROP_STATE))
{
// Alert(“CLOSE ALL SELL”);
CloseThisSymbolAll(InpMagic2);
ObjectSetInteger(0, “_lCLOSE ALL SELL”, OBJPROP_STATE, false);
}

if (ObjectGetInteger(0, “_lCLOSE ALL BUY”, OBJPROP_STATE))
{
// Alert(“CLOSE ALL BUY”);
CloseThisSymbolAll(InpMagic);
ObjectSetInteger(0, “_lCLOSE ALL BUY”, OBJPROP_STATE, false);
}
}

if (InpUseEquityStop)
{
if (m_profit_all < 0.0 && MathAbs(m_profit_all) > InpTotalEquityRisk / 100.0 * AccountEquity())
{
if (InpCloseAllEquityLoss)
{
CloseThisSymbolAll(InpMagic);
CloseThisSymbolAll(InpMagic2);
Print(“Closed All to Stop Out”);
}
if (InpAlertPushEquityLoss)
SendNotification(“EquityLoss Alert ” + (string)m_profit_all);

m_time_equityriskstopall = iTime(NULL, PERIOD_MN1, 0);
// m_filters_on += “Filter UseEquityStop ON \n”;
return;
}
else
{
m_time_equityriskstopall = -1;
}
}
if (InpChartDisplay)
Informacoes();

RefreshRates();

m_filters_on = “”;

if (m_time_equityriskstopall == iTime(NULL, PERIOD_MN1, 0) && (m_profit_all < 0.0 && MathAbs(m_profit_all) > InpTotalEquityRisk / 100.0 * AccountEquity()))
{
m_filters_on += “Filter EquitySTOP ON \n”;
TradeNow = false;
}

//FILTER SPREAD
m_spreadX = (double)MarketInfo(Symbol(), MODE_SPREAD) * m_pip2;
if ((int)MarketInfo(Symbol(), MODE_SPREAD) > InpMaxSpread)
{
m_filters_on += “Filter InpMaxSpread ON \n”;
TradeNow = false;
}

//FILTER NEWS
if (InpUseFFCall)
NewsHandling();

if (m_news_time && InpUseFFCall)
{
m_filters_on += “Filter News ON \n”;
TradeNow = false;
}

//FILTER DATETIME
if (InpUtilizeTimeFilter && !TimeFilter())
{
m_filters_on += “Filter TimeFilter ON \n”;
TradeNow = false;
}

int Sinal = 0;

int SinalMA = 0;
int SinalHilo = 0;

if (iClose(NULL, 0, 0) > iMA(NULL, InpMaFrame, InpMaPeriod, 0, InpMaMethod, InpMaPrice, InpMaShift))
SinalMA = 1;
if (iClose(NULL, 0, 0) < iMA(NULL, InpMaFrame, InpMaPeriod, 0, InpMaMethod, InpMaPrice, InpMaShift))
SinalMA = -1;

SinalHilo = GetSinalHILO();

Sinal = (SinalHilo + SinalMA) / (1 + DivSinalHILO());

double LotsHedge = 0;

//FILTER EquityCaution
if (m_orders_count1 == 0)
m_time_equityrisk1 = -1;

//Se todos Motores estiverem desabilitados
if (!InpEnableEngineB && !InpEnableEngineA)
{
if (m_time_equityrisk1 == iTime(NULL, InpTimeframeEquityCaution, 0))
{
m_filters_on += “Filter EquityCaution S ON \n”;
TradeNow = false;
}

xBest(“S”, Sinal, TradeNow, LotsHedge, InpMagic, m_orders_count1, m_mediaprice1, m_hedging1, m_target_filter1,
m_direction1, m_current_day1, m_previous_day1, m_level1, m_buyer1, m_seller1,
m_target1, m_profit1, m_pip1, m_size1, m_take1, m_datetime_ultcandleopen1,
m_time_equityrisk1, profit1);
}
else
{

if (m_profit_all >= 1.0 && (m_orders_count2 > 12 || m_orders_count1 > 12))
{
CloseThisSymbolAll(InpMagic);
CloseThisSymbolAll(InpMagic2);
Print(” KillAll true because protect DD: “);
}

if (!InpManualInitGrid)
{
if (m_time_equityrisk1 == iTime(NULL, InpTimeframeEquityCaution, 0) && m_time_equityrisk2 != iTime(NULL, InpTimeframeEquityCaution, 0))
{
m_filters_on += “Filter EquityCaution A ON \n”;
TradeNow = false;
}

// if(m_time_equityrisk2 == iTime(NULL, InpTimeframeEquityCaution, 0)) {
if (m_orders_count2 > InpHedgex && InpHedgex != 0)
{
LotsHedge = m_lastlot2 / InpGridFactor;
}

if (Sinal == 1 && InpEnableEngineA)
xBest(“A”, 1, TradeNow, LotsHedge, InpMagic, m_orders_count1, m_mediaprice1, m_hedging1, m_target_filter1,
m_direction1, m_current_day1, m_previous_day1, m_level1, m_buyer1, m_seller1,
m_target1, m_profit1, m_pip1, m_size1, m_take1, m_datetime_ultcandleopen1,
m_time_equityrisk1, profit1);

if (m_orders_count2 == 0)
m_time_equityrisk2 = -1;

if (m_time_equityrisk2 == iTime(NULL, InpTimeframeEquityCaution, 0) && m_time_equityrisk1 != iTime(NULL, InpTimeframeEquityCaution, 0))
{
m_filters_on += “Filter EquityCaution B ON \n”;
TradeNow = false;
}

// if(m_time_equityrisk1 == iTime(NULL, InpTimeframeEquityCaution, 0)) {
if (m_orders_count1 > InpHedgex && InpHedgex != 0)
{
LotsHedge = m_lastlot1 / InpGridFactor;
}

if (Sinal == -1 && InpEnableEngineB)
xBest(“B”, -1, TradeNow, LotsHedge, InpMagic2, m_orders_count2, m_mediaprice2, m_hedging2,
m_target_filter2, m_direction2, m_current_day2, m_previous_day2,
m_level2, m_buyer2, m_seller2, m_target2, m_profit2, m_pip2,
m_size2, m_take2, m_datetime_ultcandleopen2,
m_time_equityrisk2, profit2);
}
else
{

xBest(“A”, 0, TradeNow, LotsHedge, InpMagic, m_orders_count1, m_mediaprice1, m_hedging1, m_target_filter1,
m_direction1, m_current_day1, m_previous_day1, m_level1, m_buyer1, m_seller1,
m_target1, m_profit1, m_pip1, m_size1, m_take1, m_datetime_ultcandleopen1,
m_time_equityrisk1, profit1);

xBest(“B”, 0, TradeNow, LotsHedge, InpMagic2, m_orders_count2, m_mediaprice2, m_hedging2,
m_target_filter2, m_direction2, m_current_day2, m_previous_day2,
m_level2, m_buyer2, m_seller2, m_target2, m_profit2, m_pip2,
m_size2, m_take2, m_datetime_ultcandleopen2,
m_time_equityrisk2, profit2);
}
}
}
//+——————————————————————+
//| |
//+——————————————————————+
void xBest(string Id, int Sinal, bool TradeNow, double LotsHedge, int vInpMagic, int &m_orders_count, double &m_mediaprice, bool &m_hedging, bool &m_target_filter,
int &m_direction, int &m_current_day, int &m_previous_day,
double &m_level, double &m_buyer, double &m_seller, double &m_target, double &m_profit,
double &m_pip, double &m_size, double &m_take, datetime &vDatetimeUltCandleOpen,
datetime &m_time_equityrisk, double &profit)
{

//— Variable Declaration
int index, orders_total, order_ticket, order_type, ticket, hour;
double volume_min, volume_max, volume_step, lots;
double account_balance, margin_required, risk_balance;
double order_open_price, order_lots;

//— Variable Initialization
int buy_ticket = 0, sell_ticket = 0, orders_count = 0, buy_ticket2 = 0, sell_ticket2 = 0;
int buyer_counter = 0, seller_counter = 0;
bool was_trade = false, close_filter = false;
bool long_condition = false, short_condition = false;
double orders_profit = 0.0, level = 0.0;
double buyer_lots = 0.0, seller_lots = 0.0;
double buyer_sum = 0.0, seller_sum = 0.0, sell_lot = 0, buy_lot = 0;
;
double buy_price = 0.0, sell_price = 0.0;
double bid_price = Bid, ask_price = Ask;
double close_price = iClose(NULL, 0, 0);
double open_price = iOpen(NULL, 0, 0);
datetime time_current = TimeCurrent();
bool res = false;
m_spreadX = 2.0 * m_pip;

//— Base Lot Size
account_balance = AccountBalance();
volume_min = SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MIN);
volume_max = SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_MAX);
volume_step = SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_STEP);
lots = volume_min;

if (InpLotMode == LOT_MODE_FIXED)
lots = InpFixedLot;
else if (InpLotMode == LOT_MODE_PERCENT)
{
risk_balance = InpPercentLot * AccountBalance() / 100.0;
margin_required = MarketInfo(m_symbol, MODE_MARGINREQUIRED);
lots = MathRound(risk_balance / margin_required, volume_step);
if (lots < volume_min)
lots = volume_min;
if (lots > volume_max)
lots = volume_max;
}

//— Daily Calc
m_current_day = TimeDayOfWeek(time_current);
if (m_current_day != m_previous_day)
{
m_target_filter = false;
m_target = 0.0;
}
m_previous_day = m_current_day;

//— Calculation Loop
orders_total = OrdersTotal();
m_mediaprice = 0;
double BuyProfit = 0;
double SellProfit = 0;
int countFirts = 0;
double Firts2SellProfit = 0;
double Firts2BuyProfit = 0;
int Firtsticket[50];
double LastSellProfit = 0;
double LastBuyProfit = 0;
int Lastticket = 0;

for (index = orders_total – 1; index >= 0; index–)
{
if (!OrderSelect(index, SELECT_BY_POS, MODE_TRADES))
continue;
if (OrderMagicNumber() != vInpMagic || OrderSymbol() != m_symbol)
continue;
order_open_price = OrderOpenPrice();
order_ticket = OrderTicket();
order_type = OrderType();
order_lots = OrderLots();

//—
if (order_type == OP_BUY)
{

//— Set Last Buy Order
if (order_ticket > buy_ticket)
{

buy_price = order_open_price;
buy_ticket = order_ticket;
LastBuyProfit = OrderProfit() + OrderCommission() + OrderSwap();
Lastticket = order_ticket;
buy_lot = order_lots;
}

buyer_sum += (order_open_price – m_spreadX) * order_lots;

buyer_lots += order_lots;
buyer_counter++;
orders_count++;
m_mediaprice += order_open_price * order_lots;
if (OrderProfit() > 0)
BuyProfit += OrderProfit() + OrderCommission() + OrderSwap();
}

//—
if (order_type == OP_SELL)
{

//— Set Last Sell Order
if (order_ticket > sell_ticket)
{

sell_price = order_open_price;
sell_ticket = order_ticket;
LastSellProfit = OrderProfit() + OrderCommission() + OrderSwap();
Lastticket = order_ticket;
sell_lot = order_lots;
}

seller_sum += (order_open_price + m_spreadX) * order_lots;

seller_lots += order_lots;
seller_counter++;
orders_count++;
m_mediaprice += order_open_price * order_lots;
if (OrderProfit() > 0)
SellProfit += OrderProfit() + OrderCommission() + OrderSwap();
}

//—
orders_profit += OrderProfit();
}

//Close
if (ProtectGridLastFist && orders_count > QtdTradesMinProfit)
{
int ordticket[100];

Firts2BuyProfit = FindFirstOrderTicket(vInpMagic, Symbol(), OP_BUY, QtdTradesMinProfit, ordticket);

if (LastBuyProfit > (Firts2BuyProfit * -1) + MinProfit)
{
CloseAllTicket(OP_BUY, Lastticket, vInpMagic);

for (int i = 0; i < QtdTradesMinProfit; i++)
{
CloseAllTicket(OP_BUY, ordticket[i], vInpMagic);
}
}

Firts2SellProfit = FindFirstOrderTicket(vInpMagic, Symbol(), OP_SELL, QtdTradesMinProfit, ordticket);

if (LastSellProfit > (Firts2SellProfit * -1) + MinProfit)
{

CloseAllTicket(OP_SELL, Lastticket, vInpMagic);

for (int i = 0; i < QtdTradesMinProfit; i++)
{
CloseAllTicket(OP_SELL, ordticket[i], vInpMagic);
}
}
}

m_orders_count = orders_count;
m_profit = orders_profit;
if ((seller_counter + buyer_counter) > 0)
m_mediaprice = NormalizeDouble(m_mediaprice / (buyer_lots + seller_lots), Digits);

color avgLine = Blue;
if (seller_lots > 0)
avgLine = Red;

if (buyer_lots > 0 || seller_lots > 0)
SetHLine(avgLine, “Avg” + Id, m_mediaprice, 0, 3);
else
ObjectDelete(“Avg” + Id);

if (InpUseTrailingStop)
TrailingAlls(InpTrailStart, InpTrailStop, m_mediaprice, vInpMagic);

if (InpUseBreakEven)
BreakEvenAlls(InpBreakEvenStart, InpBreakEvenStep, m_mediaprice, vInpMagic);

//— Calc
if (orders_count == 0)
{
m_target += m_profit;
m_hedging = false;
}
profit = m_target + orders_profit;

//— Close Conditions
if (InpDailyTarget > 0 && m_target + orders_profit >= InpDailyTarget)
m_target_filter = true;
//— This ensure that buy and sell positions close at the same time when hedging is enabled
if (m_hedging && ((m_direction > 0 && bid_price >= m_level) || (m_direction < 0 && ask_price <= m_level)))
close_filter = true;

//— Close All Orders on Conditions
if (m_target_filter || close_filter)
{

CloseThisSymbolAll(vInpMagic);

// m_spread=0.0;
return;
}

//— Open Trade Conditions
if (!m_hedging)
{
if (orders_count > 0 && !GridAll)
{
if (OpenNewOrdersGrid == true && TradeNow)
{
if (m_time_equityrisk1 != iTime(NULL, InpTimeframeEquityCaution, 0))
{
if (GridAllDirect)
{
if (buyer_counter > 0 && ask_price – buy_price >= m_size)
long_condition = true;
if (seller_counter > 0 && sell_price – bid_price >= m_size)
short_condition = true;
}
if (buyer_counter > 0 && buy_price – ask_price >= m_size)
long_condition = true;
if (seller_counter > 0 && bid_price – sell_price >= m_size)
short_condition = true;
}
}
}
else
{

if (InpOpenNewOrders && TradeNow)
{
hour = TimeHour(time_current);
if (InpManualInitGrid || (!InpUtilizeTimeFilter || (InpUtilizeTimeFilter && TimeFilter())))
{

if (Sinal == 1)
long_condition = true;
if (Sinal == -1)
short_condition = true;
}
}
}
}
else
{
if (m_direction > 0 && bid_price <= m_seller)
short_condition = true;
if (m_direction < 0 && ask_price >= m_buyer)
long_condition = true;
}

// CONTROL DRAWDOWN
double vProfit = CalculateProfit(vInpMagic);

if (vProfit < 0.0 && MathAbs(vProfit) > InpTotalEquityRiskCaution / 100.0 * AccountEquity())
{
m_time_equityrisk = iTime(NULL, InpTimeframeEquityCaution, 0);
}
else
{
m_time_equityrisk = -1;
}

//— Hedging
if (InpHedge > 0 && !m_hedging)
{
if (long_condition && buyer_counter == InpHedge)
{
// m_spread = Spread * m_pip;
m_seller = bid_price;
m_hedging = true;
return;
}
if (short_condition && seller_counter == InpHedge)
{
// m_spread= Spread * m_pip;
m_buyer = ask_price;
m_hedging = true;
return;
}
}

//— Lot Size
if (LotsHedge != 0 && orders_count == 0)
{
lots = LotsHedge;
}
else
{
//lots = MathRound(lots * MathPow(InpGridFactor, orders_count), volume_step);

double qtdLots = (sell_lot + buy_lot);
if (long_condition)

lots = MathRound(CalcLot(TypeGridLot, OP_BUY, orders_count, qtdLots, lots, InpGridFactor, InpGridStepLot), volume_step);
if (short_condition)

lots = MathRound(CalcLot(TypeGridLot, OP_SELL, orders_count, qtdLots, lots, InpGridFactor, InpGridStepLot), volume_step);

if (m_hedging)
{
if (long_condition)
lots = MathRound(seller_lots * 3, volume_step) – buyer_lots;
if (short_condition)
lots = MathRound(buyer_lots * 3, volume_step) – seller_lots;
}
}
if (lots < volume_min)
lots = volume_min;
if (lots > volume_max)
lots = volume_max;
if (lots > InpMaxLot)
lots = InpMaxLot;

//— Open Trades Based on Conditions
if ((InpManualInitGrid && orders_count == 0) || (!InpOpenOneCandle || (InpOpenOneCandle && vDatetimeUltCandleOpen != iTime(NULL, InpTimeframeBarOpen, 0))))
{
vDatetimeUltCandleOpen = iTime(NULL, InpTimeframeBarOpen, 0);
if (long_condition)
{
if (buyer_lots + lots == seller_lots)
lots = seller_lots + volume_min;
ticket = OpenTrade(OP_BUY, lots, ask_price, vInpMagic, Id);
if (ticket > 0)
{
res = OrderSelect(ticket, SELECT_BY_TICKET);
order_open_price = OrderOpenPrice();
buyer_sum += order_open_price * lots;
buyer_lots += lots;
m_level = NormalizeDouble((buyer_sum – seller_sum) / (buyer_lots – seller_lots), Digits) + m_take;
if (!m_hedging)
level = m_level;
else
level = m_level + m_take;
if (buyer_counter == 0)
m_buyer = order_open_price;
m_direction = 1;
was_trade = true;
}
}

if (short_condition)
{
if (seller_lots + lots == buyer_lots)
lots = buyer_lots + volume_min;
ticket = OpenTrade(OP_SELL, lots, bid_price, vInpMagic, Id);
if (ticket > 0)
{
res = OrderSelect(ticket, SELECT_BY_TICKET);
order_open_price = OrderOpenPrice();
seller_sum += order_open_price * lots;
seller_lots += lots;
m_level = NormalizeDouble((seller_sum – buyer_sum) / (seller_lots – buyer_lots), Digits) – m_take;
if (!m_hedging)
level = m_level;
else
level = m_level – m_take;
if (seller_counter == 0)
m_seller = order_open_price;
m_direction = -1;
was_trade = true;
}
}
}
if (InpEnableMinProfit && !ProtectGridLastFist)
{
if (BuyProfit >= MinProfit && buyer_counter >= QtdTradesMinProfit)
CloseAllTicket(OP_BUY, buy_ticket, vInpMagic);

if (SellProfit >= MinProfit && seller_counter >= QtdTradesMinProfit)
CloseAllTicket(OP_SELL, sell_ticket, vInpMagic);
}

//— Setup Global Take Profit
if (was_trade)
{
orders_total = OrdersTotal();
for (index = orders_total – 1; index >= 0; index–)
{
if (!OrderSelect(index, SELECT_BY_POS, MODE_TRADES))
continue;
if (OrderMagicNumber() != vInpMagic || OrderSymbol() != m_symbol)
continue;
order_type = OrderType();
if (m_direction > 0)
{
if (order_type == OP_BUY)
res = OrderModify(OrderTicket(), OrderOpenPrice(), 0.0, level, 0);
if (order_type == OP_SELL)
res = OrderModify(OrderTicket(), OrderOpenPrice(), level, 0.0, 0);
}
if (m_direction < 0)
{
if (order_type == OP_BUY)
res = OrderModify(OrderTicket(), OrderOpenPrice(), level, 0.0, 0);
if (order_type == OP_SELL)
res = OrderModify(OrderTicket(), OrderOpenPrice(), 0.0, level, 0);
}
}
}
}
//+——————————————————————+
int OpenTrade(int cmd, double volume, double price, int vInpMagic, string coment, double stop = 0.0, double take = 0.0)
{
return OrderSend(m_symbol, cmd, volume, price, SlipPage, stop, take, coment, vInpMagic, 0);
}
double MathRound(double x, double m) { return m * MathRound(x / m); }
double MathFloor(double x, double m) { return m * MathFloor(x / m); }
double MathCeil(double x, double m) { return m * MathCeil(x / m); }
//+——————————————————————+
//| |
//+——————————————————————+
int CountTrades()
{
int l_count_0 = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–)
{
if (!OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || (OrderMagicNumber() != InpMagic && OrderMagicNumber() != InpMagic2))
continue;
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == InpMagic || OrderMagicNumber() == InpMagic2))
if (OrderType() == OP_SELL || OrderType() == OP_BUY)
l_count_0++;
}
return (l_count_0);
}
//+——————————————————————+
//| |
//+——————————————————————+
int CountTrades(int vInpMagic)
{
int l_count_0 = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–)
{
if (!OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || (OrderMagicNumber() != vInpMagic))
continue;
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == vInpMagic))
if (OrderType() == OP_SELL || OrderType() == OP_BUY)
l_count_0++;
}
return (l_count_0);
}
//+——————————————————————+
//| |
//+——————————————————————+
int CountTradesSell(int vInpMagic)
{
int l_count_0 = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–)
{
if (!OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || (OrderMagicNumber() != vInpMagic))
continue;
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == vInpMagic))
if (OrderType() == OP_SELL)
l_count_0++;
}
return (l_count_0);
}
//+——————————————————————+
//| |
//+——————————————————————+
int CountTradesBuy(int vInpMagic)
{
int l_count_0 = 0;
for (int l_pos_4 = OrdersTotal() – 1; l_pos_4 >= 0; l_pos_4–)
{
if (!OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || (OrderMagicNumber() != vInpMagic))
continue;
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == vInpMagic))
if (OrderType() == OP_BUY)
l_count_0++;
}
return (l_count_0);
}
//+——————————————————————+
//| |
//+——————————————————————+
double CalculateProfit()
{
double ld_ret_0 = 0;
for (int g_pos_344 = OrdersTotal() – 1; g_pos_344 >= 0; g_pos_344–)
{
if (!OrderSelect(g_pos_344, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || (OrderMagicNumber() != InpMagic && OrderMagicNumber() != InpMagic2))
continue;
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == InpMagic || OrderMagicNumber() == InpMagic2))
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
ld_ret_0 += OrderProfit();
}
return (ld_ret_0);
}
//+——————————————————————+
//| |
//+——————————————————————+
double CalculateProfit(int vInpMagic)
{
double ld_ret_0 = 0;
for (int g_pos_344 = OrdersTotal() – 1; g_pos_344 >= 0; g_pos_344–)
{
if (!OrderSelect(g_pos_344, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || (OrderMagicNumber() != vInpMagic))
continue;
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == vInpMagic))
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
ld_ret_0 += OrderProfit();
}
return (ld_ret_0);
}
//+——————————————————————+
//| |
//+——————————————————————+
bool TimeFilter()
{

bool _res = false;
datetime _time_curent = TimeCurrent();
datetime _time_start = StrToTime(DoubleToStr(Year(), 0) + “.” + DoubleToStr(Month(), 0) + “.” + DoubleToStr(Day(), 0) + ” ” + InpStartHour);
datetime _time_stop = StrToTime(DoubleToStr(Year(), 0) + “.” + DoubleToStr(Month(), 0) + “.” + DoubleToStr(Day(), 0) + ” ” + InpEndHour);
if (((InpTrade_in_Monday == true) && (TimeDayOfWeek(Time[0]) == 1)) ||
((InpTrade_in_Tuesday == true) && (TimeDayOfWeek(Time[0]) == 2)) ||
((InpTrade_in_Wednesday == true) && (TimeDayOfWeek(Time[0]) == 3)) ||
((InpTrade_in_Thursday == true) && (TimeDayOfWeek(Time[0]) == 4)) ||
((InpTrade_in_Friday == true) && (TimeDayOfWeek(Time[0]) == 5)))

if (_time_start > _time_stop)
{
if (_time_curent >= _time_start || _time_curent <= _time_stop)
_res = true;
}
else if (_time_curent >= _time_start && _time_curent <= _time_stop)
_res = true;

return (_res);
}
//+——————————————————————+
//| |
//+——————————————————————+
bool isCloseLastOrderNotProfit(int MagicNumber)
{
datetime t = 0;
double ocp, osl, otp;
int i, j = -1, k = OrdersHistoryTotal();
for (i = 0; i < k; i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (t < OrderCloseTime())
{
t = OrderCloseTime();
j = i;
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
{
ocp = NormalizeDouble(OrderClosePrice(), Digits);
osl = NormalizeDouble(OrderStopLoss(), Digits);
otp = NormalizeDouble(OrderTakeProfit(), Digits);
if (OrderProfit() < 0)
return (True);
}
return (False);
}
//+——————————————————————+
//| |
//+——————————————————————+
double FindLastSellLot(int MagicNumber)
{
double l_lastLote = 0;
int l_ticket_8;
//double ld_unused_12 = 0;
int l_ticket_20 = 0;
for (int l_pos_24 = OrdersTotal() – 1; l_pos_24 >= 0; l_pos_24–)
{
if (!OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber)
continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL)
{
l_ticket_8 = OrderTicket();
if (l_ticket_8 > l_ticket_20)
{
l_lastLote += OrderLots();
//ld_unused_12 = l_ord_open_price_0;
l_ticket_20 = l_ticket_8;
}
}
}
return (l_lastLote);
}
//+——————————————————————+
//| |
//+——————————————————————+
double FindLastBuyLot(int MagicNumber)
{
double l_lastorder = 0;
int l_ticket_8;
//double ld_unused_12 = 0;
int l_ticket_20 = 0;
for (int l_pos_24 = OrdersTotal() – 1; l_pos_24 >= 0; l_pos_24–)
{
if (!OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber)
continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY)
{
l_ticket_8 = OrderTicket();
if (l_ticket_8 > l_ticket_20)
{
l_lastorder += OrderLots();
//ld_unused_12 = l_ord_open_price_0;
l_ticket_20 = l_ticket_8;
}
}
}
return (l_lastorder);
}
//+——————————————————————+
//| |
//+——————————————————————+
void ShowError(int error, string complement)
{

if (error == 1 || error == 130)
{
return;
}

//string ErrorText=ErrorDescription(error);
// StringToUpper(ErrorText);
Print(complement, “: Ordem: “, OrderTicket(), “. Falha ao tentar alterar ordem: “, error, ” “);
ResetLastError();
}
//+——————————————————————+
//| |
//+——————————————————————+
void TrailingAlls(int ai_0, int ai_4, double a_price_8, int MagicNumber)
{
int li_16;

double m_pip = 1.0 / MathPow(10, Digits – 1);
if (Digits == 3 || Digits == 5)
m_pip = 1.0 / MathPow(10, Digits – 1);
else
m_pip = Point;

double l_ord_stoploss_20;
double l_price_28;
bool foo = false;
if (ai_4 != 0)
{
for (int l_pos_36 = OrdersTotal() – 1; l_pos_36 >= 0; l_pos_36–)
{
if (OrderSelect(l_pos_36, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber)
continue;
if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_BUY)
{
li_16 = (int)NormalizeDouble((Bid – a_price_8) / Point, 0);
if (li_16 < (ai_0 * m_pip))
continue;
l_ord_stoploss_20 = OrderStopLoss();
l_price_28 = Bid – (ai_4 * m_pip);
l_price_28 = ValidStopLoss(OP_BUY, Bid, l_price_28);
if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 > l_ord_stoploss_20))
{
// Somente ajustar a ordem se ela estiver aberta
if (CanModify(OrderTicket()) && a_price_8 < l_price_28)
{
ResetLastError();
foo = OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Aqua);
if (!foo)
{
ShowError(GetLastError(), “Normal”);
}
}
}
}
if (OrderType() == OP_SELL)
{
li_16 = (int)NormalizeDouble((a_price_8 – Ask) / Point, 0);
if (li_16 < (ai_0 * m_pip))
continue;
l_ord_stoploss_20 = OrderStopLoss();
l_price_28 = Ask + (ai_4 * m_pip);
l_price_28 = ValidStopLoss(OP_SELL, Ask, l_price_28);
if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 < l_ord_stoploss_20))
{
// Somente ajustar a ordem se ela estiver aberta
if (CanModify(OrderTicket()) && a_price_8 > l_price_28)
{
ResetLastError();
foo = OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Red);
if (!foo)
{
ShowError(GetLastError(), “Normal”);
}
}
}
}
}
Sleep(1000);
}
}
}
}
//+——————————————————————+
//| |
//+——————————————————————+
void CloseThisSymbolAll(int vInpMagic)
{
bool foo = false;
for (int l_pos_0 = OrdersTotal() – 1; l_pos_0 >= 0; l_pos_0–)
{
if (!OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() == Symbol())
{
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == vInpMagic))
{
if (OrderType() == OP_BUY)
foo = OrderClose(OrderTicket(), OrderLots(), Bid, SlipPage, Blue);

if (OrderType() == OP_SELL)
foo = OrderClose(OrderTicket(), OrderLots(), Ask, SlipPage, Red);
}
Sleep(1000);
}
}
}
//+——————————————————————+
//| |
//+——————————————————————+
void CloseThisSymbolAll()
{
bool foo = false;
for (int l_pos_0 = OrdersTotal() – 1; l_pos_0 >= 0; l_pos_0–)
{
if (!OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES))
{
continue;
}
if (OrderSymbol() == Symbol())
{
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == InpMagic || OrderMagicNumber() == InpMagic2))
{
if (OrderType() == OP_BUY)
foo = OrderClose(OrderTicket(), OrderLots(), Bid, SlipPage, Blue);

if (OrderType() == OP_SELL)
foo = OrderClose(OrderTicket(), OrderLots(), Ask, SlipPage, Red);
}
Sleep(1000);
}
}
}
//+——————————————————————+
//| |
//+——————————————————————+
bool CanModify(int ticket)
{

return OrdersTotal() > 0;
/*
if( OrderType() == OP_BUY || OrderType() == OP_SELL)
return OrderCloseTime() == 0;

return false;

/*
bool result = false;

OrderSelect(ticket, SELECT_BY_TICKET
for(int i=OrdersHistoryTotal()-1;i>=0;i–){
if( !OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) ){ continue; }
if(OrderTicket()==ticket){
result=true;
break;
}
}

return result;
*/
}
// Function to check if it is news time
void NewsHandling()
{
static int PrevMinute = -1;

if (Minute() != PrevMinute)
{
PrevMinute = Minute();

// Use this call to get ONLY impact of previous event
int impactOfPrevEvent =
(int)iCustom(NULL, 0, “FFCal”, true, true, false, true, true, 2, 0);

// Use this call to get ONLY impact of nexy event
int impactOfNextEvent =
(int)iCustom(NULL, 0, “FFCal”, true, true, false, true, true, 2, 1);

int minutesSincePrevEvent =
(int)iCustom(NULL, 0, “FFCal”, true, true, false, true, false, 1, 0);

int minutesUntilNextEvent =
(int)iCustom(NULL, 0, “FFCal”, true, true, false, true, false, 1, 1);

m_news_time = false;
if ((minutesUntilNextEvent <= InpMinsBeforeNews) ||
(minutesSincePrevEvent <= InpMinsAfterNews))
{
m_news_time = true;
}
}
} //newshandling

void CloseAllTicket(int aType, int ticket, int MagicN)
{
for (int i = OrdersTotal() – 1; i >= 0; i–)
if (OrderSelect(i, SELECT_BY_POS))
if (OrderSymbol() == Symbol())
if (OrderMagicNumber() == MagicN)
{
if (OrderType() == aType && OrderType() == OP_BUY)
if (OrderProfit() > 0 || OrderTicket() == ticket)
if (!OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits()), SlipPage, clrRed))
Print(” OrderClose OP_BUY Error N”, GetLastError());

if (OrderType() == aType && OrderType() == OP_SELL)
if (OrderProfit() > 0 || OrderTicket() == ticket)
if (!OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits()), SlipPage, clrRed))
Print(” OrderClose OP_SELL Error N”, GetLastError());
}
}

void DrawRects(int xPos, int yPos, color clr, int width = 150, int height = 17, string Texto = “”)
{

string id = “_l” + Texto;

ObjectDelete(0, id);

ObjectCreate(0, id, OBJ_BUTTON, 0, 100, 100);
ObjectSetInteger(0, id, OBJPROP_XDISTANCE, xPos);
ObjectSetInteger(0, id, OBJPROP_YDISTANCE, yPos);
ObjectSetInteger(0, id, OBJPROP_BGCOLOR, clr);
ObjectSetInteger(0, id, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, id, OBJPROP_XSIZE, 150);
ObjectSetInteger(0, id, OBJPROP_YSIZE, 35);

ObjectSetInteger(0, id, OBJPROP_WIDTH, 0);
ObjectSetString(0, id, OBJPROP_FONT, “Arial”);
ObjectSetString(0, id, OBJPROP_TEXT, Texto);
ObjectSetInteger(0, id, OBJPROP_SELECTABLE, 0);

ObjectSetInteger(0, id, OBJPROP_BACK, 0);
ObjectSetInteger(0, id, OBJPROP_SELECTED, 0);
ObjectSetInteger(0, id, OBJPROP_HIDDEN, 1);
ObjectSetInteger(0, id, OBJPROP_ZORDER, 1);

ObjectSetInteger(0, id, OBJPROP_STATE, false);
}
void SetHLine(color vColorSetHLine, string vNomeSetHLine = “”, double vBidSetHLine = 0.0, int vStyleSetHLine = 0, int vTamanhoSetHLine = 1)
{
if (vNomeSetHLine == “”)
vNomeSetHLine = DoubleToStr(Time[0], 0);
if (vBidSetHLine <= 0.0)
vBidSetHLine = Bid;
if (ObjectFind(vNomeSetHLine) < 0)
ObjectCreate(vNomeSetHLine, OBJ_HLINE, 0, 0, 0);
ObjectSet(vNomeSetHLine, OBJPROP_PRICE1, vBidSetHLine);
ObjectSet(vNomeSetHLine, OBJPROP_COLOR, vColorSetHLine);
ObjectSet(vNomeSetHLine, OBJPROP_STYLE, vStyleSetHLine);
ObjectSet(vNomeSetHLine, OBJPROP_WIDTH, vTamanhoSetHLine);
}

double ValidStopLoss(int type, double price, double SL)
{

double mySL;
double minstop;

minstop = MarketInfo(Symbol(), MODE_STOPLEVEL);
if (Digits == 3 || Digits == 5)
minstop = minstop / 10;

mySL = SL;
if (type == OP_BUY)
{
if ((price – mySL) < minstop * Point)
// mySL = price – minstop * Point;
mySL = 0;
}
if (type == OP_SELL)
{
if ((mySL – price) < minstop * Point)
//mySL = price + minstop * Point;
mySL = 0;
}

return (NormalizeDouble(mySL, MarketInfo(Symbol(), MODE_DIGITS)));
}
/*
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{

//sparam: Name of the graphical object, on which the event occurred

// did user click on the chart ?
if (id == CHARTEVENT_OBJECT_CLICK)
{
// and did he click on on of our objects
if (StringSubstr(sparam, 0, 2) == “_l”)
{

// did user click on the name of a pair ?
int len = StringLen(sparam);
// Alert(sparam);
//
if (StringSubstr(sparam, len – 3, 3) == “BUY” || StringSubstr(sparam, len – 3, 3) == “ELL”)
{
if (InpManualInitGrid)
{

//Aciona 1ª Ordem do Grid
if (StringSubstr(sparam, len – 3, 3) == “sBUY” && !(m_orders_count1 > 0 || !InpEnableEngineA))
{
//BUY
xBest(“A”, 1, 0, InpMagic, m_orders_count1, m_mediaprice1, m_hedging1, m_target_filter1,
m_direction1, m_current_day1, m_previous_day1, m_level1, m_buyer1, m_seller1,
m_target1, m_profit1, m_pip1, m_size1, m_take1, m_datetime_ultcandleopen1,
m_time_equityrisk1);
// Alert(“BUY”);
}
if (StringSubstr(sparam, len – 3, 3) == “sELL” && !(m_orders_count2 > 0 || !InpEnableEngineA))
{
//SELL
xBest(“B”, -1, 0, InpMagic2, m_orders_count2, m_mediaprice2, m_hedging2,
m_target_filter2, m_direction2, m_current_day2, m_previous_day2,
m_level2, m_buyer2, m_seller2, m_target2, m_profit2, m_pip2,
m_size2, m_take2, m_datetime_ultcandleopen2,
m_time_equityrisk2);
// Alert(“SELL”);
}
}
}
}
}
} */
//———————————————–
int DivSinalHILO()
{
if (!EnableSinalHILO)
return (0);
else
return (1);
}

int GetSinalHILO()
{
int vRet = 0;

if (!EnableSinalHILO)
vRet;

indicator_low = iMA(NULL, InpHILOFrame, InpHILOPeriod, 0, InpHILOMethod, PRICE_LOW, InpHILOShift);
indicator_high = iMA(NULL, InpHILOFrame, InpHILOPeriod, 0, InpHILOMethod, PRICE_HIGH, InpHILOShift);

diff_highlow = indicator_high – indicator_low;
isbidgreaterthanima = Bid >= indicator_low + diff_highlow / 2.0;

if (Bid < indicator_low)
vRet = -1;
else if (Bid > indicator_high)
vRet = 1;

if (InpHILOFilterInverter)
vRet = vRet * -1;

return vRet;
}

string ToStr(double ad_0, int ai_8)
{
return (DoubleToStr(ad_0, ai_8));
}

//+——————————————————————+
//| |
//+——————————————————————+
void BreakEvenAlls(int ai_0, int ai_4, double MediaPrice, int MagicNumber)
{
int PipsDiffMedia;

double m_pip = 1.0 / MathPow(10, Digits – 1);
if (Digits == 3 || Digits == 5)
m_pip = 1.0 / MathPow(10, Digits – 1);
else
m_pip = Point;

double l_ord_stoploss_20;
double l_price_28;
bool foo = false;
if (ai_0 != 0)
{
for (int l_pos_36 = OrdersTotal() – 1; l_pos_36 >= 0; l_pos_36–)
{
if (OrderSelect(l_pos_36, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber)
continue;
if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber)
{
if (OrderType() == OP_BUY)
{
PipsDiffMedia = (int)NormalizeDouble((Bid – MediaPrice) / Point, 0);
// Comment(PipsDiffMedia);
if (PipsDiffMedia <= (ai_0 * m_pip))
continue;
l_ord_stoploss_20 = OrderStopLoss();
l_price_28 = MediaPrice + (ai_4 * m_pip);
l_price_28 = ValidStopLoss(OP_BUY, Bid, l_price_28);
if (Bid >= (MediaPrice + (ai_4 * m_pip)) && (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 > l_ord_stoploss_20)))
{
// Somente ajustar a ordem se ela estiver aberta
if (CanModify(OrderTicket()))
{
ResetLastError();
foo = OrderModify(OrderTicket(), MediaPrice, l_price_28, OrderTakeProfit(), 0, Aqua);
if (!foo)
{
ShowError(GetLastError(), “Normal”);
}
}
}
}
if (OrderType() == OP_SELL)
{
PipsDiffMedia = (int)NormalizeDouble((MediaPrice – Ask) / Point, 0);
if (PipsDiffMedia <= (ai_0 * m_pip))
continue;
l_ord_stoploss_20 = OrderStopLoss();
l_price_28 = MediaPrice – (ai_4 * m_pip);
l_price_28 = ValidStopLoss(OP_SELL, Ask, l_price_28);
if (Ask <= (MediaPrice – (ai_4 * m_pip)) && (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 < l_ord_stoploss_20)))
{
// Somente ajustar a ordem se ela estiver aberta
if (CanModify(OrderTicket()))
{
ResetLastError();
foo = OrderModify(OrderTicket(), MediaPrice, l_price_28, OrderTakeProfit(), 0, Red);
if (!foo)
{
ShowError(GetLastError(), “Normal”);
}
}
}
}
}
Sleep(1000);
}
}
}
}

void Visor1Handling()
{
if (Visor1_Show_the_Price == true)
{
string Market_Price = DoubleToStr(Bid, Digits);

ObjectCreate(“Market_Price_Label”, OBJ_LABEL, 0, 0, 0);

if (Bid > Visor1_Old_Price)
ObjectSetText(“Market_Price_Label”, Market_Price, Visor1_Price_Size, “Comic Sans MS”, Visor1_Price_Up_Color);
if (Bid < Visor1_Old_Price)
ObjectSetText(“Market_Price_Label”, Market_Price, Visor1_Price_Size, “Comic Sans MS”, Visor1_Price_Down_Color);
Visor1_Old_Price = Bid;

ObjectSet(“Market_Price_Label”, OBJPROP_XDISTANCE, Visor1_Price_X_Position);
ObjectSet(“Market_Price_Label”, OBJPROP_YDISTANCE, Visor1_Price_Y_Position);
ObjectSet(“Market_Price_Label”, OBJPROP_CORNER, 1);
}

if (Bid > iClose(0, 1440, 1))
{
Visor1_FontColor = LawnGreen;
Visor1_Sinal = 1;
}

if (Bid < iClose(0, 1440, 1))
{
Visor1_FontColor = Tomato;
Visor1_Sinal = -1;
}

string Porcent_Price = DoubleToStr(((iClose(0, 1440, 0) / iClose(0, 1440, 1)) – 1) * 100, 3) + ” %”;
//—-
ObjectCreate(“Porcent_Price_Label”, OBJ_LABEL, 0, 0, 0);
ObjectSetText(“Porcent_Price_Label”, Porcent_Price, Visor1_Porcent_Size, “Arial”, Visor1_FontColor);
ObjectSet(“Porcent_Price_Label”, OBJPROP_CORNER, 1);
ObjectSet(“Porcent_Price_Label”, OBJPROP_XDISTANCE, Visor1_Porcent_X_Position);
ObjectSet(“Porcent_Price_Label”, OBJPROP_YDISTANCE, Visor1_Porcent_Y_Position);

string Symbol_Price = Symbol();

ObjectCreate(“Simbol_Price_Label”, OBJ_LABEL, 0, 0, 0);
ObjectSetText(“Simbol_Price_Label”, Symbol_Price, Visor1_Symbol_Size, “Arial”, DeepSkyBlue);
ObjectSet(“Simbol_Price_Label”, OBJPROP_CORNER, 1);
ObjectSet(“Simbol_Price_Label”, OBJPROP_XDISTANCE, Visor1_Symbol_X_Position);
ObjectSet(“Simbol_Price_Label”, OBJPROP_YDISTANCE, Visor1_Symbol_Y_Position);

string Spreead = “Spread : ” + (MarketInfo(Symbol(), MODE_SPREAD)) + ” pips”;
ObjectCreate(“Spread_Price_Label”, OBJ_LABEL, 0, 0, 0);
ObjectSetText(“Spread_Price_Label”, Spreead, Visor1_Spread_Size, “Arial”, White);
ObjectSet(“Spread_Price_Label”, OBJPROP_CORNER, 1);
ObjectSet(“Spread_Price_Label”, OBJPROP_XDISTANCE, Visor1_Spread_X_Position);
ObjectSet(“Spread_Price_Label”, OBJPROP_YDISTANCE, Visor1_Spread_Y_Position);
//———————————-

if (Visor1_Show_the_Time == true)
{
int MyHour = TimeHour(TimeCurrent());
int MyMinute = TimeMinute(TimeCurrent());
int MyDay = TimeDay(TimeCurrent());
int MyMonth = TimeMonth(TimeCurrent());
int MyYear = TimeYear(TimeCurrent());
string MySemana = TimeDayOfWeek(TimeCurrent());
string NewMinute = “”;

if (MyMinute < 10)
{
NewMinute = (“0” + MyMinute);
}
else
{
NewMinute = DoubleToStr(TimeMinute(TimeCurrent()), 0);
}

string NewHour = DoubleToStr(MyHour + Visor1_Chart_Timezone, 0);

ObjectCreate(“Time_Label”, OBJ_LABEL, 0, 0, 0);
ObjectSetText(“Time_Label”, MyDay + “-” + MyMonth + “-” + MyYear + ” ” + NewHour + “:” + NewMinute, Visor1_Time_Size, “Comic Sans MS”, Visor1_Time_Color);

ObjectSet(“Time_Label”, OBJPROP_XDISTANCE, Visor1_Time_X_Position);
ObjectSet(“Time_Label”, OBJPROP_YDISTANCE, Visor1_Time_Y_Position);
}
}

double CalcLot(int TypeLot, int TypeOrder, int vQtdTrades, double LastLot, double StartLot, double GridFactor, int GridStepLot)
{
double rezult = 0;
switch (TypeLot)
{
case 0: // Standart lot
if (TypeOrder == OP_BUY || TypeOrder == OP_SELL)
rezult = StartLot;
break;

case 1: // Summ lot
rezult = StartLot * vQtdTrades;

break;

case 2: // Martingale lot
// rezult = StartLot * MathPow(GridFactor, vQtdTrades);
rezult = MathRound(StartLot * MathPow(InpGridFactor, vQtdTrades), SymbolInfoDouble(m_symbol, SYMBOL_VOLUME_STEP));
break;

case 3: // Step lot
if (vQtdTrades == 0)
rezult = StartLot;
if (vQtdTrades % GridStepLot == 0)
rezult = LastLot + StartLot;
else
rezult = LastLot;

break;
}
return rezult;
}

double FindFirstOrderTicket(int magic, string Symb, int Type, int QtdProfit, int &tickets[])
{
int Ticket = 0;
double profit = 0;
datetime EarliestOrder = D’2099/12/31′;
int c = 0;
double ordprofit[100];
for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderType() == Type && OrderSymbol() == Symb && OrderMagicNumber() == magic)
{
if (EarliestOrder > OrderOpenTime())
{
EarliestOrder = OrderOpenTime();
Ticket = OrderTicket();
profit = OrderProfit() + OrderCommission() + OrderSwap();
if(profit < 0){
tickets[c] = Ticket;
ordprofit[c] = profit;
c++;}
}
}
}
}

for (int i = 0; i < QtdProfit; i++)
{
profit += ordprofit[i];
}

return profit; // Returns 0 if no matching orders
}

如果你对文件有了解,请帮助投票!

If you are familiar with the file, please help vote!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位投票人。

相关资源

暂无评论

暂无评论...
Ads Blocker Image Powered by Code Help Pro

检测到广告拦截程序!!!Ads Blocker Detected!!!

我们检测到您正在使用扩展来屏蔽广告。请通过禁用这些广告屏蔽程序或者把网站加入白名单来支持我们。

We have detected that you are using an extension to block advertisements. Please support us by disabling these advertising blocking programs or adding the website to the whitelist.