once per bar expert.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «once per bar expert.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Данный файл является торговым советником для MetaTrader 4, созданным в конструкторе fxDreema. Советник работает на входящих тиках и выполняет последовательность действий, заданную блоками: ожидание нового бара, закрытие рыночных позиций, удаление отложенных ордеров, выставление отложенных ордеров на покупку и продажу, перевод позиций в безубыток и повторное удаление отложенных ордеров при наличии открытых позиций.
Логика построена на цепочке блоков, каждый из которых может быть включён или выключен. Советник использует стандартные торговые операции MetaTrader 4, фильтрацию ордеров по группе, символу и типу, а также вспомогательные механизмы: виртуальные стопы, учёт времени жизни ордеров, OCO-связки и обработку торговых событий. На графике отображается служебная информация о спреде и статусе работы.
Советник не содержит встроенной стратегии входа по индикаторам: выставление отложенных ордеров выполняется по уровням, вычисляемым от свечей, с заданными смещениями, стоп-лоссом и тейк-профитом. Управление капиталом и параметры риска задаются настройками.
Настройки программы
| Настройка | Описание |
|---|---|
| Priceoffset | Смещение цены, используемое при расчёте уровней отложенных ордеров. |
| inp2 | Заголовок группы настроек блока ожидания нового бара. |
| inp2_TIMEFRAME | Таймфрейм, по которому определяется появление нового бара. |
| inp2_PassMaxTimes | Количество новых баров, которое необходимо пропустить перед выполнением последующих блоков. |
| inp3 | Заголовок группы настроек блока закрытия рыночных позиций. |
| inp3_OrdersScope | Режим выбора ордеров по группе: конкретная группа, все ордера или только открытые вручную. |
| inp3_SymbolScope | Режим выбора ордеров по символу: только текущий символ или все символы. |
| inp3_BuysOrSells | Фильтр закрываемых позиций по направлению: покупки, продажи или оба направления. |
| inp4 | Заголовок группы настроек блока удаления отложенных ордеров. |
| inp4_OrdersScope | Режим выбора ордеров по группе: конкретная группа, все ордера или только открытые вручную. |
| inp4_SymbolScope | Режим выбора ордеров по символу: только текущий символ или все символы. |
| inp4_BuysOrSells | Фильтр удаляемых отложенных ордеров по направлению: покупки, продажи или оба направления. |
| inp4_LimitsOrStops | Фильтр удаляемых отложенных ордеров по типу: лимитные, стоповые или оба типа. |
| inp5_OrdersGroup | Номер группы, используемый для магического номера выставляемых ордеров на покупку. |
| inp5_dPrice_CandleID | Номер свечи, от которой берётся цена для расчёта уровня отложенного ордера на покупку. |
| inp5_dPrice_TIMEFRAME | Таймфрейм свечи, используемой для расчёта цены отложенного ордера на покупку. |
| inp5_PriceOffset | Смещение цены от вычисленного уровня при выставлении отложенного ордера на покупку. |
| inp5_VolumeSize | Фиксированный размер лота для отложенного ордера на покупку. |
| inp5_dlStopLoss_CandleID | Номер свечи, от которой берётся уровень для расчёта стоп-лосса отложенного ордера на покупку. |
| inp5_TakeProfitPips | Размер тейк-профита в пунктах для отложенного ордера на покупку. |
| inp6 | Заголовок группы настроек блока выставления отложенного ордера на продажу. |
| inp6_OrdersGroup | Номер группы, используемый для магического номера выставляемых ордеров на продажу. |
| inp6_dPrice_CandleID | Номер свечи, от которой берётся цена для расчёта уровня отложенного ордера на продажу. |
| inp6_dPrice_TIMEFRAME | Таймфрейм свечи, используемой для расчёта цены отложенного ордера на продажу. |
| inp6_PriceOffset | Смещение цены от вычисленного уровня при выставлении отложенного ордера на продажу. |
| inp6_VolumeSize | Фиксированный размер лота для отложенного ордера на продажу. |
| inp6_dlStopLoss_CandleID | Номер свечи, от которой берётся уровень для расчёта стоп-лосса отложенного ордера на продажу. |
| inp6_TakeProfitPips | Размер тейк-профита в пунктах для отложенного ордера на продажу. |
| inp7_OnProfitPips | Размер прибыли в пунктах, при достижении которого позиция переводится в безубыток. |
| inp7_BEPoffsetPips | Смещение уровня безубытка в пунктах относительно цены открытия позиции. |
| inp7_OrdersScope | Режим выбора ордеров по группе: конкретная группа, все ордера или только открытые вручную. |
| inp7_SymbolScope | Режим выбора ордеров по символу: только текущий символ или все символы. |
| inp7_BuysOrSells | Фильтр позиций для перевода в безубыток по направлению: покупки, продажи или оба направления. |
| inp8_OrdersScope | Режим выбора ордеров по группе: конкретная группа, все ордера или только открытые вручную. |
| inp8_SymbolScope | Режим выбора ордеров по символу: только текущий символ или все символы. |
| inp8_BuysOrSells | Фильтр проверяемых позиций по направлению: покупки, продажи или оба направления. |
| inp9_OrdersScope | Режим выбора ордеров по группе: конкретная группа, все ордера или только открытые вручную. |
| inp9_SymbolScope | Режим выбора ордеров по символу: только текущий символ или все символы. |
| inp9_BuysOrSells | Фильтр удаляемых отложенных ордеров по направлению: покупки, продажи или оба направления. |
| inp9_LimitsOrStops | Фильтр удаляемых отложенных ордеров по типу: лимитные, стоповые или оба типа. |
| MagicStart | Начальное значение магического номера. Итоговый магический номер ордера вычисляется как сумма этого значения и номера группы. |
Поиск по коду файла
/************************************************************************************************************************/
/************************************************************************************************************************/
#define PROJECT_ID "mt4-2955"
#define VIRTUAL_STOPS_ENABLED false // true or false
#define VIRTUAL_STOPS_TIMEOUT 0//--
#define USE_EMERGENCY_STOPS "no" // "yes" to use emergency (hard stops) when virtual stops are in use. "always" to use EMERGENCY_STOPS_ADD as emergency stops when there is no virtual stop.
#define EMERGENCY_STOPS_REL 0 // Use 0 to disable hard stops when virtual stops are enabled. Use a value >=0 to automatically set hard stops with virtual. Example: if 2 is used, then hard stops will be 2 times bigger than virtual ones.
#define EMERGENCY_STOPS_ADD 0 // Add pips to relative size of emergency stops (hard stops)
#define ON_TRADE_REALTIME 0 //
#define ON_TIMER_PERIOD 60 // Timer event period (in seconds)
#define ENABLE_EVENT_TICK 1 // "Tick" event: 1 - enable, 0 - disable
#define ENABLE_EVENT_TRADE 0 // "Trade" event: 1 - enable, 0 - disable
#define ENABLE_EVENT_TIMER 0 // "Timer" event: 1 - enable, 0 - disable
#define TLOBJPROP_TIME1 801
#define OBJPROP_TL_PRICE_BY_SHIFT 802
#define OBJPROP_TL_SHIFT_BY_PRICE 803
#define OBJPROP_FIBOVALUE 804
#define OBJPROP_FIBOPRICEVALUE 805
#define OBJPROP_BARSHIFT1 807
#define OBJPROP_BARSHIFT2 808
#define OBJPROP_BARSHIFT3 809
#define SEL_CURRENT 0
#define SEL_INITIAL 1
extern double Priceoffset = 13.0; // Price offset
extern string inp2="(2) Once per bar";
extern int inp2_TIMEFRAME=PERIOD_H4; //
extern int inp2_PassMaxTimes=1; //
extern string inp3="(3) Close trades";
extern string inp3_OrdersScope="group"; //
extern string inp3_SymbolScope="symbol"; //
extern string inp3_BuysOrSells="both"; //
extern string inp4="(4) Delete pending orders";
extern string inp4_OrdersScope="group"; //
extern string inp4_SymbolScope="symbol"; //
extern string inp4_BuysOrSells="both"; //
extern string inp4_LimitsOrStops="both"; //
extern string inp5="(5) Buy pending order ";
extern string inp5_OrdersGroup=""; //
extern int inp5_dPrice_CandleID=1; //
extern int inp5_dPrice_TIMEFRAME=0; //
extern double inp5_PriceOffset=10; //
extern double inp5_VolumeSize=0.01; //
extern int inp5_dlStopLoss_CandleID=1; //
extern double inp5_TakeProfitPips=100; //
extern string inp6="(6) Sell pending order";
extern string inp6_OrdersGroup=""; //
extern int inp6_dPrice_CandleID=1; //
extern int inp6_dPrice_TIMEFRAME=0; //
extern double inp6_PriceOffset=10; //
extern double inp6_VolumeSize=0.01; //
extern int inp6_dlStopLoss_CandleID=1; //
extern double inp6_TakeProfitPips=100; //
extern string inp7="(7) Break even point (each trade) ";
extern double inp7_OnProfitPips=40; //
extern double inp7_BEPoffsetPips=5; //
extern string inp7_OrdersScope="group"; //
extern string inp7_SymbolScope="symbol"; //
extern string inp7_BuysOrSells="both"; //
extern string inp8="(8) If trade is running ";
extern string inp8_OrdersScope="group"; //
extern string inp8_SymbolScope="symbol"; //
extern string inp8_BuysOrSells="both"; //
extern string inp9="(9) Delete pending orders ";
extern string inp9_OrdersScope="group"; //
extern string inp9_SymbolScope="symbol"; //
extern string inp9_BuysOrSells="both"; //
extern string inp9_LimitsOrStops="stops"; //
extern int MagicStart=9903; // Magic Start (MagicNumber=MagicStart+Group#)
int FXD_CURRENT_FUNCTION_ID=0;
double FXD_MILS_INIT_END=0;
bool FXD_FIRST_TICK_PASSED=false;
bool FXD_BREAK=false;
bool FXD_CONTINUE=false;
bool FXD_CHART_IS_OFFLINE = false;
bool FXD_ONTIMER_TAKEN = false;
bool FXD_ONTIMER_TAKEN_IN_MILLISECONDS = false;
double FXD_ONTIMER_TAKEN_TIME = 0;
bool USE_VIRTUAL_STOPS = VIRTUAL_STOPS_ENABLED;
bool block1=true; // Pass
bool block2=true; // Once per bar
bool block3=true; // Close trades
bool block4=true; // Delete pending orders
bool block5=true; // Buy pending order
bool block6=true; // Sell pending order
bool block7=true; // Break even point (each trade)
bool block8=true; // If trade is running
bool block9=true; // Delete pending orders
/************************************************************************************************************************/
/************************************************************************************************************************/
int OnInit()
{
// код доступен только после оплаты
}
void OnTick()
{
// код доступен только после оплаты
}
void EventTrade()
{
OnTradeQueue(-1);
}
void OnTimer()
{
if (FXD_CHART_IS_OFFLINE && RefreshRates()) {
OnTick();
}
if (ON_TRADE_REALTIME == 1) {
OnTradeListener();
}
static int t0 = 0;
int t = 0;
bool ok = false;
if (FXD_ONTIMER_TAKEN)
{
if (FXD_ONTIMER_TAKEN_TIME > 0)
{
if (FXD_ONTIMER_TAKEN_IN_MILLISECONDS == true)
{
t = GetTickCount();
}
else
{
t = TimeLocal();
}
if ((t - t0) >= FXD_ONTIMER_TAKEN_TIME)
{
t0 = t;
ok = true;
}
}
if (ok == false) {
return;
}
}
}
void OnDeinit(const int reason)
{
EventKillTimer();
if (MQLInfoInteger(MQL_TESTER)) {
Print("Backtested in "+DoubleToStr((GetTickCount()-FXD_MILS_INIT_END)/1000, 2)+" seconds");
Print("Average ticks per second: "+DoubleToStr(TicksFromStart()/(GetTickCount()-FXD_MILS_INIT_END),0));
}
DrawStatus("stopped");
if (MQLInfoInteger(MQL_PROGRAM_TYPE) == PROGRAM_EXPERT)
{
switch(UninitializeReason())
{
case REASON_PROGRAM : Print("Expert Advisor self terminated"); break;
case REASON_REMOVE : Print("Expert Advisor removed from the chart"); break;
case REASON_RECOMPILE : Print("Expert Advisorhas been recompiled"); break;
case REASON_CHARTCHANGE : Print("Symbol or chart period has been changed"); break;
case REASON_CHARTCLOSE : Print("Chart has been closed"); break;
case REASON_PARAMETERS : Print("Input parameters have been changed by a user"); break;
case REASON_ACCOUNT : Print("Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings"); break;
case REASON_TEMPLATE : Print("A new template has been applied"); break;
case REASON_INITFAILED : Print("OnInit() handler has returned a nonzero value"); break;
case REASON_CLOSE : Print("Terminal has been closed"); break;
}
}
}
/************************************************************************************************************************/
/************************************************************************************************************************/
void block1(int _parent_=0)
{
if (block1==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=1;
block2(1); block7(1); block8(1);
}
void block2(int _parent_=0)
{
if (block2==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=2;
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
int TIMEFRAME=inp2_TIMEFRAME; // Timeframe
int PassMaxTimes=inp2_PassMaxTimes; // Max. times to pass
static int times = 0;
static datetime time0;
datetime time=iTime(SYMBOL,TIMEFRAME,0);
if (time0<time)
{
times++;
if (times >= PassMaxTimes)
{
time0=time;
times=0;
}
block3(2);
}
else {/* Yellow output */}
}
void block3(int _parent_=0)
{
if (block3==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=3;
string OrdersScope=inp3_OrdersScope; // Group mode
string OrdersGroup=""; // Group # (empty=Default)
string SymbolScope=inp3_SymbolScope; // Market mode
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
string BuysOrSells=inp3_BuysOrSells; // Filter by type
int OrderMinutes=0; // Only older than
double Slippage=4; // Slippage
color ArrowColor=DeepPink; // Arrow color
int closed_count=0;
bool finished=false;
while (finished==false) {
int count=0;
for (int pos=OrdersTotal()-1; pos>=0; pos--) {
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) {
if (FilterOrderBy(OrdersScope,OrdersGroup, SymbolScope,SYMBOL, BuysOrSells)) {
datetime time_diff = TimeCurrent()-attrOpenTime();
if (time_diff < 0) {time_diff = 0;} // this actually happens sometimes
if (time_diff >= 60*OrderMinutes)
{
if (CloseTrade(attrTicket(),Slippage,ArrowColor)) {closed_count++;}
count++;
}
}
}
}
if (count==0) {finished=true;}
}
block4(3);
}
void block4(int _parent_=0)
{
if (block4==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=4;
string OrdersScope=inp4_OrdersScope; // Group mode
string OrdersGroup=""; // Group # (empty=Default)
string SymbolScope=inp4_SymbolScope; // Market mode
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
string BuysOrSells=inp4_BuysOrSells; // Filter by type
string LimitsOrStops=inp4_LimitsOrStops; // Filter by pending type
double Slippage=4; // Slippage
color ArrowColor=DeepPink; // Arrow color
for (int pos=OrdersTotal()-1; pos>=0; pos--) {
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) {
if (FilterOrderBy(OrdersScope,OrdersGroup, SymbolScope,SYMBOL, BuysOrSells, LimitsOrStops, 1)) {
DeleteOrder(attrTicket(),ArrowColor);
}
}
}
block5(4);
}
void block5(int _parent_=0)
{
if (block5==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=5;
string OrdersGroup=inp5_OrdersGroup; // Group # (empty=Default)
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
string Price="dynamic"; // Open at price
double PriceOffset=inp5_PriceOffset; // Price offset
string VolumeMode="fixed"; // Money management
double VolumeSize=inp5_VolumeSize; // Lot size
double VolumeSizeRisk=50; // Risk fixed amount of money
double VolumeRisk=2.5; // Risk percent
double VolumePercent=100; // Volume size
double VolumeBlockPercent=3; // Block % of Balance
double FixedRatioUnitSize=0.01; // Fixed Ratio: Unit size
double FixedRatioDelta=20; // Fixed Ratio: Delta parameter
string StopLossMode="dynamicLevel"; // Stop-Loss mode
double StopLossPips=100; // in pips...
double StopLossPercentTP=100; // % of Take-Profit
string TakeProfitMode="fixed"; // Take-Profit mode
double TakeProfitPips=inp5_TakeProfitPips; // in pips...
double TakeProfitPercentSL=100; // % of Stop-Loss
string ExpMode="GTC"; // Expiration mode
int ExpDays=0; // Days
int ExpHours=40; // Hours
int ExpMinutes=0; // Minutes
int CreateOCO=0; // Create OCO order
double Slippage=4; // Slippage
string MyComment="Long pending order"; // Comment
color ArrowColorBuy=Blue; // Arrow color
SetSymbol(SYMBOL);
double op=0;
if (Price=="ask") {op=SymbolAsk();}
else if (Price=="bid") {op=SymbolBid();}
else if (Price=="mid") {op=(SymbolAsk()+SymbolBid())/2;}
else if (Price=="dynamic") {op=_candles("iHigh", "id", inp5_dPrice_CandleID, "00:00", CurrentSymbol(), inp5_dPrice_TIMEFRAME);}
op=op+toDigits(PriceOffset);
double sll=0, slp=0, tpl=0, tpp=0;
if (StopLossMode=="fixed") {slp=StopLossPips;}
else if (StopLossMode=="dynamicPips") {slp=_candles("iLow", "id", 1, "00:00", CurrentSymbol(), CurrentTimeframe());}
else if (StopLossMode=="dynamicDigits"){slp=toPips(_candles("iClose", "id", 0, "00:00", CurrentSymbol(), CurrentTimeframe()),SYMBOL);}
else if (StopLossMode=="dynamicLevel") {sll=_candles("iLow", "id", inp5_dlStopLoss_CandleID, "00:00", CurrentSymbol(), CurrentTimeframe());}
if (TakeProfitMode=="fixed") {tpp=TakeProfitPips;}
else if (TakeProfitMode=="dynamicPips") {tpp=_value(100);}
else if (TakeProfitMode=="dynamicDigits") {tpp=toPips(_value(0.0100),SYMBOL);}
else if (TakeProfitMode=="dynamicLevel") {tpl=_value(1);}
if (StopLossMode == "percentTP") {
if (tpp > 0) {slp = tpp*StopLossPercentTP/100;}
if (tpl > 0) {slp = toPips(MathAbs(SymbolAsk(SYMBOL) - tpl), SYMBOL)*StopLossPercentTP/100;}
}
if (TakeProfitMode == "percentSL") {
if (slp > 0) {tpp = slp*TakeProfitPercentSL/100;}
if (sll > 0) {tpp = toPips(MathAbs(SymbolAsk(SYMBOL) - sll), SYMBOL)*TakeProfitPercentSL/100;}
}
double lots=0;
double pre_sll=sll; if (pre_sll==0) {pre_sll=op;}
double pre_sl_pips=toPips(op-(pre_sll-toDigits(slp,SYMBOL)));
if (VolumeMode=="fixed") {lots=DynamicLots(VolumeMode, VolumeSize);}
else if (VolumeMode=="block-equity") {lots=DynamicLots(VolumeMode, VolumeBlockPercent);}
else if (VolumeMode=="block-balance") {lots=DynamicLots(VolumeMode, VolumeBlockPercent);}
else if (VolumeMode=="block-freemargin") {lots=DynamicLots(VolumeMode, VolumeBlockPercent);}
else if (VolumeMode=="equity") {lots=DynamicLots(VolumeMode, VolumePercent);}
else if (VolumeMode=="balance") {lots=DynamicLots(VolumeMode, VolumePercent);}
else if (VolumeMode=="freemargin") {lots=DynamicLots(VolumeMode, VolumePercent);}
else if (VolumeMode=="equityRisk") {lots=DynamicLots(VolumeMode, VolumeRisk, pre_sl_pips);}
else if (VolumeMode=="balanceRisk") {lots=DynamicLots(VolumeMode, VolumeRisk, pre_sl_pips);}
else if (VolumeMode=="freemarginRisk") {lots=DynamicLots(VolumeMode, VolumeRisk, pre_sl_pips);}
else if (VolumeMode=="fixedRisk") {lots=DynamicLots(VolumeMode, VolumeSizeRisk, pre_sl_pips);}
else if (VolumeMode=="fixedRatio") {lots=DynamicLots(VolumeMode, FixedRatioUnitSize, FixedRatioDelta);}
else if (VolumeMode=="dynamic") {lots=AlignLots(_value(0.1));}
datetime exp=ExpirationTime(ExpMode,ExpDays,ExpHours,ExpMinutes,_time(0, 0, "00:00", 1, "", 0, 0, 0, 0, 12, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, true));
int ticket=BuyLater(SYMBOL,lots,op,sll,tpl,slp,tpp,Slippage,exp,(MagicStart+(int)OrdersGroup),MyComment,ArrowColorBuy,CreateOCO);
if (ticket>0) {block6(5);} else {/* Gray output */}
}
double _candles(string iOHLC, string ModeCandleFindBy, int CandleID, string TimeStamp, string SYMBOL, int TIMEFRAME) {
double retval=0;
double cOpen=0;
double cHigh=0;
double cLow=0;
double cClose=0;
if (ModeCandleFindBy == "time")
{
CandleID = iCandleID(SYMBOL, TIMEFRAME, StrToTime(TimeStamp));
}
CandleID=CandleID+IndicatorMoreShift();
if (iOHLC=="iOpen") {retval=iOpen(SYMBOL, TIMEFRAME, CandleID);}
else if (iOHLC=="iHigh") {retval=iHigh(SYMBOL, TIMEFRAME, CandleID);}
else if (iOHLC=="iLow") {retval=iLow(SYMBOL, TIMEFRAME, CandleID);}
else if (iOHLC=="iClose") {retval=iClose(SYMBOL, TIMEFRAME, CandleID);}
else if (iOHLC=="iVolume") {retval=iVolume(SYMBOL, TIMEFRAME, CandleID);}
else if (iOHLC=="iTime") {retval=iTime(SYMBOL, TIMEFRAME, CandleID);}
else
{
if (iOHLC=="iMedian") {
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
retval=((cLow+cHigh)/2);
}
else if (iOHLC=="iTypical") {
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=((cLow+cHigh+cClose)/3);
}
else if (iOHLC=="iAverage") {
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=((cLow+cHigh+cClose+cClose)/4);
}
else if (iOHLC=="iTotal") {
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
retval=toPips(MathAbs(cHigh-cLow),SYMBOL);
}
else if (iOHLC=="iBody") {
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=toPips(MathAbs(cClose-cOpen),SYMBOL);
}
else if (iOHLC=="iUpperWick") {
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
retval=0;
if (cClose>cOpen) {
retval=toPips(MathAbs(cHigh-cClose),SYMBOL);
} else {
retval=toPips(MathAbs(cHigh-cOpen),SYMBOL);
}
}
else if (iOHLC=="iBottomWick") {
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
retval=0;
if (cClose>cOpen) {
retval=toPips(MathAbs(cOpen-cLow),SYMBOL);
} else {
retval=toPips(MathAbs(cClose-cLow),SYMBOL);
}
}
else if (iOHLC=="iBullTotal") {
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cHigh-cLow),SYMBOL);
if (cClose<cOpen) {return(EMPTY_VALUE);}
}
else if (iOHLC=="iBullBody") {
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cClose-cOpen),SYMBOL);
if (cClose<cOpen) {return(EMPTY_VALUE);}
}
else if (iOHLC=="iBullUpperWick") {
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cHigh-cClose),SYMBOL);
if (cClose<cOpen) {return(EMPTY_VALUE);}
}
else if (iOHLC=="iBullBottomWick") {
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cOpen-cLow),SYMBOL);
if (cClose<cOpen) {return(EMPTY_VALUE);}
}
else if (iOHLC=="iBearTotal") {
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cHigh-cLow),SYMBOL);
if (cOpen<cClose) {return(EMPTY_VALUE);}
}
else if (iOHLC=="iBearBody") {
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cOpen-cClose),SYMBOL);
if (cOpen<cClose) {return(EMPTY_VALUE);}
}
else if (iOHLC=="iBearUpperWick") {
cHigh=iHigh(SYMBOL,TIMEFRAME,CandleID);
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cHigh-cOpen),SYMBOL);
if (cOpen<cClose) {return(EMPTY_VALUE);}
}
else if (iOHLC=="iBearBottomWick") {
cLow=iLow(SYMBOL,TIMEFRAME,CandleID);
cOpen=iOpen(SYMBOL,TIMEFRAME,CandleID);
cClose=iClose(SYMBOL,TIMEFRAME,CandleID);
retval=toPips((cClose-cLow),SYMBOL);
if (cOpen<cClose) {return(EMPTY_VALUE);}
}
}
return(retval);
}
double _value(double Value) {
return(Value);
}
datetime _time(int ModeTime, int TimeSource, string TimeStamp, int TimeCandleID, string TimeMarket, int TimeCandleTimeframe, int TimeComponentYear, int TimeComponentMonth, int TimeComponentDay, int TimeComponentHour, int TimeComponentMinute, int TimeComponentSecond, int ModeTimeShift, int TimeShiftYears, int TimeShiftMonths, int TimeShiftWeeks, int TimeShiftDays, int TimeShiftHours, int TimeShiftMinutes, int TimeShiftSeconds, bool TimeSkipWeekdays) {
static datetime retval=0, retval0=0;
static int ModeTime0=0;
static int smodeshift=0;
if(ModeTime==0) {
if (TimeSource==1) {retval=TimeLocal();} else {retval=TimeCurrent();}
}
else if(ModeTime==1) {
retval=StringToTime(TimeStamp);
retval0=retval;
}
else if(ModeTime==2) {
retval = TimeFromComponents(TimeSource == 1, TimeComponentYear, TimeComponentMonth, TimeComponentDay, TimeComponentHour, TimeComponentMinute, TimeComponentSecond);
}
else if(ModeTime==3) {
if (TimeMarket=="") {TimeMarket=Symbol();}
retval=iTime(TimeMarket,TimeCandleTimeframe,TimeCandleID);
}
if (ModeTimeShift>0) {
int sh=1;
if (ModeTimeShift==1) {sh=-1;}
static int years0=0,months0=0;
if (
ModeTimeShift!=smodeshift
|| TimeShiftYears!=years0 || TimeShiftMonths!=months0
)
{
years0=TimeShiftYears; months0=TimeShiftMonths;
if (TimeShiftYears>0 || TimeShiftMonths>0) {
int year=0,month=0,week=0,day=0,hour=0,minute=0,second=0;
if (ModeTime==3) {
year=TimeComponentYear; month=TimeComponentYear; day=TimeComponentDay;
hour=TimeComponentHour; minute=TimeComponentMinute; second=TimeComponentSecond;
}
else {
year=TimeYear(retval); month=TimeMonth(retval); day=TimeDay(retval);
hour=TimeHour(retval); minute=TimeMinute(retval); second=TimeSeconds(retval);
}
year =year+TimeShiftYears*sh;
month =month+TimeShiftMonths*sh;
if (month<0) {month=12-month;}
else if (month>12) {month=month-12;}
retval=StrToTime(year+"."+month+"."+day+" "+hour+":"+minute+":"+second);
}
}
retval=retval+TimeShiftWeeks*604800*sh+TimeShiftDays*86400*sh+TimeShiftHours*3600*sh+TimeShiftMinutes*60*sh+TimeShiftSeconds*sh;
if (TimeSkipWeekdays==true) {
int weekday=TimeDayOfWeek(retval);
if (sh>0) { // forward
if (weekday==0) {retval=retval+86400;}
else if (weekday==6) {retval=retval+172800;}
}
else if (sh<0) { // back
if (weekday==0) {retval=retval-172800;}
else if (weekday==6) {retval=retval-86400;}
}
}
}
smodeshift=ModeTimeShift;
ModeTime0=ModeTime;
return(retval);
}
void block6(int _parent_=0)
{
if (block6==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=6;
string OrdersGroup=inp6_OrdersGroup; // Group # (empty=Default)
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
string Price="dynamic"; // Open at price
double PriceOffset=inp6_PriceOffset; // Price offset
string VolumeMode="fixed"; // Money management
double VolumeSize=inp6_VolumeSize; // Lot size
double VolumeSizeRisk=50; // Risk fixed amount of money
double VolumeRisk=2.5; // Risk percent
double VolumePercent=100; // Volume size
double VolumeBlockPercent=3; // Block % of Balance
double FixedRatioUnitSize=0.01; // Fixed Ratio: Unit size
double FixedRatioDelta=20; // Fixed Ratio: Delta parameter
string StopLossMode="dynamicLevel"; // Stop-Loss mode
double StopLossPips=100; // in pips...
double StopLossPercentTP=100; // % of Take-Profit
string TakeProfitMode="fixed"; // Take-Profit mode
double TakeProfitPips=inp6_TakeProfitPips; // in pips...
double TakeProfitPercentSL=100; // % of Stop-Loss
string ExpMode="GTC"; // Expiration mode
int ExpDays=0; // Days
int ExpHours=1; // Hours
int ExpMinutes=0; // Minutes
int CreateOCO=0; // Create OCO order
double Slippage=4; // Slippage
string MyComment="Short pending order"; // Comment
color ArrowColorSell=Red; // Arrow color
SetSymbol(SYMBOL);
double op=0;
if (Price=="ask") {op=SymbolAsk();}
else if (Price=="bid") {op=SymbolBid();}
else if (Price=="mid") {op=(SymbolAsk()+SymbolBid())/2;}
else if (Price=="dynamic") {op=_candles("iLow", "id", inp6_dPrice_CandleID, "00:00", CurrentSymbol(), inp6_dPrice_TIMEFRAME);}
op=op-toDigits(PriceOffset);
double sll=0, slp=0, tpl=0, tpp=0;
if (StopLossMode=="fixed") {slp=StopLossPips;}
else if (StopLossMode=="dynamicPips") {slp=_value(100);}
else if (StopLossMode=="dynamicDigits"){slp=toPips(_value(0.0100),SYMBOL);}
else if (StopLossMode=="dynamicLevel") {sll=_candles("iHigh", "id", inp6_dlStopLoss_CandleID, "00:00", CurrentSymbol(), CurrentTimeframe());}
if (TakeProfitMode=="fixed") {tpp=TakeProfitPips;}
else if (TakeProfitMode=="dynamicPips") {tpp=_value(100);}
else if (TakeProfitMode=="dynamicDigits") {tpp=toPips(_value(0.0100),SYMBOL);}
else if (TakeProfitMode=="dynamicLevel") {tpl=_value(1);}
if (StopLossMode == "percentTP") {
if (tpp > 0) {slp = tpp*StopLossPercentTP/100;}
if (tpl > 0) {slp = toPips(MathAbs(SymbolAsk(SYMBOL) - tpl), SYMBOL)*StopLossPercentTP/100;}
}
if (TakeProfitMode == "percentSL") {
if (slp > 0) {tpp = slp*TakeProfitPercentSL/100;}
if (sll > 0) {tpp = toPips(MathAbs(SymbolAsk(SYMBOL) - sll), SYMBOL)*TakeProfitPercentSL/100;}
}
double lots=0;
double pre_sll=sll; if (pre_sll==0) {pre_sll=op;}
double pre_sl_pips=toPips((pre_sll+toDigits(slp,SYMBOL))-op);
if (VolumeMode=="fixed") {lots=DynamicLots(VolumeMode, VolumeSize);}
else if (VolumeMode=="block-equity") {lots=DynamicLots(VolumeMode, VolumeBlockPercent);}
else if (VolumeMode=="block-balance") {lots=DynamicLots(VolumeMode, VolumeBlockPercent);}
else if (VolumeMode=="block-freemargin") {lots=DynamicLots(VolumeMode, VolumeBlockPercent);}
else if (VolumeMode=="equity") {lots=DynamicLots(VolumeMode, VolumePercent);}
else if (VolumeMode=="balance") {lots=DynamicLots(VolumeMode, VolumePercent);}
else if (VolumeMode=="freemargin") {lots=DynamicLots(VolumeMode, VolumePercent);}
else if (VolumeMode=="equityRisk") {lots=DynamicLots(VolumeMode, VolumeRisk, pre_sl_pips);}
else if (VolumeMode=="balanceRisk") {lots=DynamicLots(VolumeMode, VolumeRisk, pre_sl_pips);}
else if (VolumeMode=="freemarginRisk") {lots=DynamicLots(VolumeMode, VolumeRisk, pre_sl_pips);}
else if (VolumeMode=="fixedRisk") {lots=DynamicLots(VolumeMode, VolumeSizeRisk, pre_sl_pips);}
else if (VolumeMode=="fixedRatio") {lots=DynamicLots(VolumeMode, FixedRatioUnitSize, FixedRatioDelta);}
else if (VolumeMode=="dynamic") {lots=AlignLots(_value(0.1));}
datetime exp=ExpirationTime(ExpMode,ExpDays,ExpHours,ExpMinutes,_time(0, 0, "00:00", 1, "", 0, 0, 0, 0, 12, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, true));
int ticket=SellLater(SYMBOL,lots,op,sll,tpl,slp,tpp,Slippage,exp,(MagicStart+(int)OrdersGroup),MyComment,ArrowColorSell,CreateOCO);
if (ticket>0) {/* Orange output */} else {/* Gray output */}
}
void block7(int _parent_=0)
{
if (block7==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=7;
string OnProfitMode="fixed"; // On profit mode
double OnProfitPips=inp7_OnProfitPips; // Pips on profit
double OnProfitPercentSL=50; // Pips on profit (% of SL)
double OnProfitPercentTP=50; // Pips on profit (% of TP)
string BEoffsetMode="pips"; // BEP offset mode
double BEPoffsetPips=inp7_BEPoffsetPips; // Break even point offset
string OrdersScope=inp7_OrdersScope; // Group mode
string OrdersGroup=""; // Group # (empty=Default)
string SymbolScope=inp7_SymbolScope; // Market mode
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
string BuysOrSells=inp7_BuysOrSells; // Filter by type
for (int pos=OrdersTotal()-1; pos>=0; pos--) {
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) {
if (FilterOrderBy(OrdersScope,OrdersGroup, SymbolScope,SYMBOL, BuysOrSells)) {
SetSymbol(attrSymbol());
double PipsToSet;
if (OnProfitMode=="fixed") {PipsToSet=OnProfitPips;}
else if (OnProfitMode=="percentSL") {PipsToSet=toPips(MathAbs(attrOpenPrice()-attrStopLoss()))*OnProfitPercentSL/100;}
else if (OnProfitMode=="percentTP") {PipsToSet=toPips(MathAbs(attrOpenPrice()-attrTakeProfit()))*OnProfitPercentTP/100;}
if (
(attrType()==OP_BUY && (SymbolAsk()-attrOpenPrice() > toDigits(PipsToSet)) && (attrStopLoss() < attrOpenPrice()))
||
(attrType()==OP_SELL && (attrOpenPrice()-SymbolBid() > toDigits(PipsToSet)) && ((attrStopLoss() > attrOpenPrice()) || attrStopLoss()==0))
)
{
double be_offset=0;
if (BEoffsetMode=="pips") {
be_offset=toDigits(BEPoffsetPips);
if (attrType()==OP_SELL ) {be_offset=be_offset*(-1);}
}
ModifyStops(attrTicket(),attrOpenPrice()+be_offset,attrTakeProfit());
}
}
}
}
/* Orange output */
}
void block8(int _parent_=0)
{
if (block8==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=8;
string OrdersScope=inp8_OrdersScope; // Group mode
string OrdersGroup=""; // Group # (empty=Default)
string SymbolScope=inp8_SymbolScope; // Market mode
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
string BuysOrSells=inp8_BuysOrSells; // Filter by type
bool exist=false;
for (int pos=OrdersTotal()-1; pos>=0; pos--) {
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) {
if (FilterOrderBy(OrdersScope,OrdersGroup, SymbolScope,SYMBOL, BuysOrSells)) {
exist=true; break;
}
}
}
if (exist==true) {block9(8);} else {/* Yellow output */}
}
void block9(int _parent_=0)
{
if (block9==false || FXD_BREAK==true) {return;}
FXD_CURRENT_FUNCTION_ID=9;
string OrdersScope=inp9_OrdersScope; // Group mode
string OrdersGroup=""; // Group # (empty=Default)
string SymbolScope=inp9_SymbolScope; // Market mode
string SYMBOL=CurrentSymbol(); // Market (empty=Current)
string BuysOrSells=inp9_BuysOrSells; // Filter by type
string LimitsOrStops=inp9_LimitsOrStops; // Filter by pending type
double Slippage=4; // Slippage
color ArrowColor=DeepPink; // Arrow color
for (int pos=OrdersTotal()-1; pos>=0; pos--) {
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) {
if (FilterOrderBy(OrdersScope,OrdersGroup, SymbolScope,SYMBOL, BuysOrSells, LimitsOrStops, 1)) {
DeleteOrder(attrTicket(),ArrowColor);
}
}
}
/* Orange output */
}
/************************************************************************************************************************/
/************************************************************************************************************************/
double AccountBalanceAtStart()
{
static double memory=0;
if (memory==0) {memory=AccountBalance();}
return(memory);
}
double AlignLots(double lots, double lowerlots=0, double upperlots=0)
{
string symbol=GetSymbol();
double LotStep=MarketInfo(symbol,MODE_LOTSTEP);
double LotSize=MarketInfo(symbol,MODE_LOTSIZE);
double MinLots=MarketInfo(symbol,MODE_MINLOT);
double MaxLots=MarketInfo(symbol,MODE_MAXLOT);
double margin_required=MarketInfo(symbol,MODE_MARGINREQUIRED);
lots=MathRound(lots/LotStep)*LotStep;
if (lots<MinLots) {lots=MinLots;}
if (lots>MaxLots) {lots=MaxLots;}
if (lowerlots > 0)
{
lowerlots = MathRound(lowerlots/LotStep)*LotStep;
if (lots < lowerlots) {lots = lowerlots;}
}
if (upperlots > 0)
{
upperlots = MathRound(upperlots/LotStep)*LotStep;
if (lots > upperlots) {lots = upperlots;}
}
return (lots);
}
double AlignStopLoss(
string symbol,
int type,
double price,
double sll=0,
double slp=0,
bool consider_freezelevel=false
)
{
double sl=0;
if (MathAbs(sll)==EMPTY_VALUE) {sll=0;}
if (MathAbs(slp)==EMPTY_VALUE) {slp=0;}
if (sll==0 && slp==0) {return(0);} // no sl - return 0
if (price<=0) {Print("AlignStopLoss() error: No price entered");return(-1);}
double point =MarketInfo(symbol,MODE_POINT);
double digits =MarketInfo(symbol,MODE_DIGITS);
slp=slp*PipValue(symbol)*point;
int bs=1;
if (
type==OP_BUY
|| type==OP_BUYSTOP
|| type==OP_BUYLIMIT
)
{
bs=1;
}
else if (
type==OP_SELL
|| type==OP_SELLSTOP
|| type==OP_SELLLIMIT
)
{
bs=-1;
}
double askbid=price;
double bidask=price;
if (type==OP_BUY || type==OP_SELL)
{
double ask =MarketInfo(symbol,MODE_ASK);
double bid =MarketInfo(symbol,MODE_BID);
askbid=ask;
bidask=bid;
if (bs<0) {
askbid=bid;
bidask=ask;
}
}
if (sll==0 && slp!=0) {sll=price;}
if (sll>0) {sl=sll-slp*bs;}
if (sl<0) {return(-1);}
sl=NormalizeDouble(sl,digits);
double minstops=MarketInfo(symbol,MODE_STOPLEVEL);
if (consider_freezelevel==true) {
int freezelevel=MarketInfo(symbol,MODE_FREEZELEVEL);
if (freezelevel>minstops) {minstops=freezelevel;}
}
minstops=NormalizeDouble(minstops*point,digits);
double sllimit=bidask-minstops*bs; // SL min price level
if (sl>0) {
/*if (sl==askbid)
{
sl=0;
}
else */
if ((bs>0 && sl>askbid) || (bs<0 && sl<askbid))
{
string abstr="";
if (bs>0) {abstr="Ask";} else {abstr="Bid";}
Print(
"Error: Invalid SL requested (",
DoubleToStr(sl,digits),
" for ",abstr," price ",
askbid,
")"
);
return(-1);
}
else if ((bs>0 && sl>sllimit) || (bs<0 && sl<sllimit))
{
if (USE_VIRTUAL_STOPS) {
return(sl);
}
Print(
"Warning: Too short SL requested (",
DoubleToStr(sl,digits),
" or ",
DoubleToStr(MathAbs(sl-askbid)/point,0),
" points), minimum will be taken (",
DoubleToStr(sllimit,digits),
" or ",
DoubleToStr(MathAbs(askbid-sllimit)/point,0),
" points)"
);
sl=sllimit;
return(sl);
}
}
return(sl);
}
double AlignTakeProfit(
string symbol,
int type,
double price,
double tpl=0,
double tpp=0,
bool consider_freezelevel=false
)
{
double tp=0;
if (MathAbs(tpl)==EMPTY_VALUE) {tpl=0;}
if (MathAbs(tpp)==EMPTY_VALUE) {tpp=0;}
if (tpl==0 && tpp==0) {return(0);} // no tp - return 0
if (price<=0) {Print("AlignTakeProfit() error: No price entered");return(-1);}
double point =MarketInfo(symbol,MODE_POINT);
double digits =MarketInfo(symbol,MODE_DIGITS);
tpp=tpp*PipValue(symbol)*point;
int bs=1;
if (
type==OP_BUY
|| type==OP_BUYSTOP
|| type==OP_BUYLIMIT
)
{
bs=1;
}
else if (
type==OP_SELL
|| type==OP_SELLSTOP
|| type==OP_SELLLIMIT
)
{
bs=-1;
}
double askbid=price;
double bidask=price;
if (type==OP_BUY || type==OP_SELL)
{
double ask =MarketInfo(symbol,MODE_ASK);
double bid =MarketInfo(symbol,MODE_BID);
askbid=ask;
bidask=bid;
if (bs<0) {
askbid=bid;
bidask=ask;
}
}
if (tpl==0 && tpp!=0) {tpl=price;}
if (tpl>0) {tp=tpl+tpp*bs;}
if (tp<0) {return(-1);}
tp=NormalizeDouble(tp,digits);
double minstops=MarketInfo(symbol,MODE_STOPLEVEL);
if (consider_freezelevel==true) {
int freezelevel=MarketInfo(symbol,MODE_FREEZELEVEL);
if (freezelevel>minstops) {minstops=freezelevel;}
}
minstops=NormalizeDouble(minstops*point,digits);
double tplimit=bidask+minstops*bs; // TP min price level
if (tp>0) {
/*if (tp==askbid)
{
tp=0;
}
else */
if ((bs>0 && tp<askbid) || (bs<0 && tp>askbid))
{
string abstr="";
if (bs>0) {abstr="Ask";} else {abstr="Bid";}
Print(
"Error: Invalid TP requested (",
DoubleToStr(tp,digits),
" for ",abstr," price ",
askbid,
")"
);
return(-1);
}
else if ((bs>0 && tp<tplimit) || (bs<0 && tp>tplimit))
{
if (USE_VIRTUAL_STOPS) {
return(tp);
}
Print(
"Warning: Too short TP requested (",
DoubleToStr(tp,digits),
" or ",
DoubleToStr(MathAbs(tp-askbid)/point,0),
" points), minimum will be taken (",
DoubleToStr(tplimit,digits),
" or ",
DoubleToStr(MathAbs(askbid-tplimit)/point,0),
" points)"
);
tp=tplimit;
return(tp);
}
}
return(tp);
}
int ArraySearch(double &array[], double value)
{
static bool founded; founded=false;
static int index; index=0;
static int size;
size=ArraySize(array);
if (size>0)
{
for (int i=0; i<size; i++)
{
if (array[i]==value)
{
founded=true;
index=i;
break;
}
}
}
if (founded==true) {return (index);} else {return (-1);}
}
int ArraySearch(int &array[], int value)
{
static bool founded; founded=false;
static int index; index=0;
static int size;
size=ArraySize(array);
if (size>0)
{
for (int i=0; i<size; i++)
{
if (array[i]==value)
{
founded=true;
index=i;
break;
}
}
}
if (founded==true) {return (index);} else {return (-1);}
}
int ArraySearch(string &array[], string value)
{
static bool founded; founded=false;
static int index; index=0;
static int size;
size=ArraySize(array);
if (size>0)
{
for (int i=0; i<size; i++)
{
if (array[i]==value)
{
founded=true;
index=i;
break;
}
}
}
if (founded==true) {return (index);} else {return (-1);}
}
bool ArrayStrip(double &array[], double value)
{
bool stripped=false;
int size=ArraySize(array);
if (size>0)
{
int i=0; int x=0;
for (i=0; i<size; i++)
{
if (array[i]!=value)
{
array[x]=array[i];
x++;
} else {
stripped=true;
}
}
ArrayResize(array,x);
}
return (stripped);
}
bool ArrayStripKey(double &array[], double key)
{
static bool stripped; stripped=false;
static int size;
size = ArraySize(array);
if (size>0)
{
int i=0; int x=0;
for (i=0; i<size; i++)
{
if (i!=key)
{
array[x]=array[i];
x++;
} else {
stripped=true;
}
}
ArrayResize(array,x);
}
return (stripped);
}
bool ArrayStripKey(int &array[], int key)
{
static bool stripped; stripped=false;
static int size;
size = ArraySize(array);
if (size>0)
{
int i=0; int x=0;
for (i=0; i<size; i++)
{
if (i!=key)
{
array[x]=array[i];
x++;
} else {
stripped=true;
}
}
ArrayResize(array,x);
}
return (stripped);
}
bool ArrayStripKey(string &array[], string key)
{
static bool stripped; stripped=false;
static int size;
size = ArraySize(array);
if (size>0)
{
int i=0; int x=0;
for (i=0; i<size; i++)
{
if (i!=key)
{
array[x]=array[i];
x++;
} else {
stripped=true;
}
}
ArrayResize(array,x);
}
return (stripped);
}
bool ArrayValue(double &array[], double value)
{
bool founded=false;
int size=ArraySize(array);
for (int i=0; i<size; i++) {
if (array[i]==value) {founded=true; break;}
}
if (founded==false) {
ArrayResize(array,size+1);
array[size]=value;
return (true);
} else {
return (false);
}
}
bool ArrayValue(int &array[], int value)
{
bool founded=false;
int size=ArraySize(array);
for (int i=0; i<size; i++) {
if (array[i]==value) {founded=true; break;}
}
if (founded==false) {
ArrayResize(array,size+1);
array[size]=value;
return (true);
} else {
return (false);
}
}
bool ArrayValue(string &array[], string value)
{
bool founded=false;
int size=ArraySize(array);
for (int i=0; i<size; i++) {
if (array[i]==value) {founded=true; break;}
}
if (founded==false) {
ArrayResize(array,size+1);
array[size]=value;
return (true);
} else {
return (false);
}
}
double attrClosePrice(string sel="")
{
return(OrderClosePrice());
}
datetime attrCloseTime(string sel="")
{
return(OrderCloseTime());
}
string attrComment(string sel="")
{
return(OrderComment());
}
double attrCommission(string sel="")
{
if (sel=="e" || sel=="event") {return(e_attrCommission());}
return(OrderCommission());
}
datetime attrExpiration(string sel="")
{
return(OrderExpiration());
}
double attrLots(string sel="")
{
return(OrderLots());
}
int attrMagicNumber(string sel="")
{
return(OrderMagicNumber());
}
double attrOpenPrice(string sel="")
{
return(OrderOpenPrice());
}
datetime attrOpenTime(string sel="")
{
return(OrderOpenTime());
}
double attrProfit(string sel="")
{
return(OrderProfit());
}
double attrStopLoss()
{
if (USE_VIRTUAL_STOPS) {return(VirtualStopsDriver("get sl",OrderTicket()));}
return(OrderStopLoss());
}
double attrSwap(string sel="")
{
return(OrderSwap());
}
string attrSymbol(string sel="")
{
return(OrderSymbol());
}
double attrTakeProfit()
{
if (USE_VIRTUAL_STOPS) {return(VirtualStopsDriver("get tp",OrderTicket()));}
return(OrderTakeProfit());
}
int attrTicket()
{
return(OrderTicket());
}
double attrType(string sel="")
{
return(OrderType());
}
int BuyLater(
string symbol,
double lots,
double price,
double sll=0, // SL level
double tpl=0, // TO level
double slp=0, // SL adjust in points
double tpp=0, // TP adjust in points
double slippage=0,
datetime expiration=0,
int magic=0,
string comment="",
color arrowcolor=CLR_NONE,
bool oco = false
)
{
double ask=MarketInfo(symbol,MODE_ASK);
int type;
if (price==ask){type=OP_BUY;}
else if (price<ask) {type=OP_BUYLIMIT;}
else if (price>ask) {type=OP_BUYSTOP;}
int ticket=OrderCreate(
symbol,
type,
lots,
price,
sll,
tpl,
slp,
tpp,
slippage,
magic,
comment,
arrowcolor,
expiration,
oco
);
return(ticket);
}
double ChartEventParameterDouble(int cmd=0,double inp=-1) {static double mem=-1; if(cmd==1){mem=inp;} return(mem);}
double ChartEventParameterLong(int cmd=0,double inp=-1) {static double mem=-1; if(cmd==1){mem=inp;} return(mem);}
string ChartEventParameterString(int cmd=0,string inp="") {static string mem=""; if(cmd==1){mem=inp;} return(mem);}
int ChartEventType(int cmd=0,int inp=-1) {static int mem=-1; if(cmd==1){mem=inp;} return(mem);}
int CheckForTradingError(int error_code=-1, string msg_prefix="")
{
if (error_code<0) {
error_code=GetLastError();
}
int retval=0;
static int tryouts=0;
switch(error_code)
{
case 0:
retval=0;
break;
case 1: // No error returned
RefreshRates();
retval=1;
break;
case 4: //ERR_SERVER_BUSY
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
Sleep(1000);
RefreshRates();
retval=1;
break;
case 6: //ERR_NO_CONNECTION
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
while(!IsConnected()) {Sleep(100);}
while(IsTradeContextBusy()) {Sleep(50);}
RefreshRates();
retval=1;
break;
case 128: //ERR_TRADE_TIMEOUT
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
RefreshRates();
retval=1;
break;
case 129: //ERR_INVALID_PRICE
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
if (!IsTesting()) {while(RefreshRates()==false) {Sleep(1);}}
retval=1;
break;
case 130: //ERR_INVALID_STOPS
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Waiting for a new tick to retry.."));}
if (!IsTesting()) {while(RefreshRates()==false) {Sleep(1);}}
retval=1;
break;
case 135: //ERR_PRICE_CHANGED
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Waiting for a new tick to retry.."));}
if (!IsTesting()) {while(RefreshRates()==false) {Sleep(1);}}
retval=1;
break;
case 136: //ERR_OFF_QUOTES
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Waiting for a new tick to retry.."));}
if (!IsTesting()) {while(RefreshRates()==false) {Sleep(1);}}
retval=1;
break;
case 137: //ERR_BROKER_BUSY
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
Sleep(1000);
retval=1;
break;
case 138: //ERR_REQUOTE
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Waiting for a new tick to retry.."));}
if (!IsTesting()) {while(RefreshRates()==false) {Sleep(1);}}
retval=1;
break;
case 142: //This code should be processed in the same way as error 128.
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
RefreshRates();
retval=1;
break;
case 143: //This code should be processed in the same way as error 128.
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
RefreshRates();
retval=1;
break;
/*case 145: //ERR_TRADE_MODIFY_DENIED
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Waiting for a new tick to retry.."));}
while(RefreshRates()==false) {Sleep(1);}
return(1);
*/
case 146: //ERR_TRADE_CONTEXT_BUSY
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code),". Retrying.."));}
while(IsTradeContextBusy()) {Sleep(50);}
RefreshRates();
retval=1;
break;
default:
if (msg_prefix!="") {Print(StringConcatenate(msg_prefix,": ",ErrorMessage(error_code)));}
retval=2;
break;
}
if (retval==0) {tryouts=0;}
else if (retval==1) {
tryouts++;
if (tryouts>=10) {
tryouts=0;
retval=2;
} else {
Print("retry #"+tryouts+" of 10");
}
}
return(retval);
}
bool CloseTrade(int ticket, double slippage=0, color arrowcolor=CLR_NONE)
{
bool success=false;
if (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {return(false);}
while(true)
{
WaitTradeContextIfBusy();
success=OrderClose(ticket,attrLots(),attrClosePrice(),slippage*PipValue(attrSymbol()),arrowcolor);
if (success==true) {
if (USE_VIRTUAL_STOPS) {
VirtualStopsDriver("clear",ticket);
}
RegisterEvent("trade");
return(true);
}
int erraction=CheckForTradingError(GetLastError(), "Closing trade #"+ticket+" error");
switch(erraction)
{
case 0: break; // no error
case 1: continue; // overcomable error
case 2: break; // fatal error
}
break;
}
return(false);
}
string CurrentSymbol(string symbol="")
{
static string memory="";
if (symbol!="") {memory=symbol;} else
if (memory=="") {memory=Symbol();}
return(memory);
}
int CurrentTimeframe(int tf=-1)
{
static int memory=0;
if (tf>=0) {memory=tf;}
return(memory);
}
bool DeleteOrder(int ticket, color arrowcolor)
{
bool success=false;
if (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) {return(false);}
while(true)
{
WaitTradeContextIfBusy();
success=OrderDelete(ticket,arrowcolor);
if (success==true) {
if (USE_VIRTUAL_STOPS) {
VirtualStopsDriver("clear",ticket);
}
RegisterEvent("trade");
return(true);
}
int erraction=CheckForTradingError(GetLastError(), "Deleting order #"+ticket+" error");
switch(erraction)
{
case 0: break; // no error
case 1: continue; // overcomable error
case 2: break; // fatal error
}
break;
}
return(false);
}
void DrawSpreadInfo()
{
static bool allow_draw = true;
if (allow_draw==false) {return;}
if (MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)) {allow_draw=false;} // Allowed to draw only once in testing mode
static bool passed = false;
static double max_spread = 0;
static double min_spread = EMPTY_VALUE;
static double avg_spread = 0;
static double avg_add = 0;
static double avg_cnt = 0;
double current_spread = (SymbolInfoDouble(Symbol(),SYMBOL_ASK)-SymbolInfoDouble(Symbol(),SYMBOL_BID))/(CustomPoint(Symbol()));
if (current_spread > max_spread) {max_spread = current_spread;}
if (current_spread < min_spread) {min_spread = current_spread;}
avg_cnt++;
avg_add = avg_add + current_spread;
avg_spread = avg_add / avg_cnt;
int x=0; int y=0;
string name;
if (passed == false)
{
passed=true;
name="fxd_spread_current_label";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+1);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+1);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 18);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrDarkOrange);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "Spread:");
}
name="fxd_spread_max_label";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+148);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+17);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 7);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrOrangeRed);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "max:");
}
name="fxd_spread_avg_label";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+148);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+9);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 7);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrDarkOrange);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "avg:");
}
name="fxd_spread_min_label";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+148);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+1);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 7);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrGold);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "min:");
}
name="fxd_spread_current";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+93);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+1);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 18);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrDarkOrange);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "0");
}
name="fxd_spread_max";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+173);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+17);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 7);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrOrangeRed);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "0");
}
name="fxd_spread_avg";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+173);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+9);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 7);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrDarkOrange);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "0");
}
name="fxd_spread_min";
if (ObjectFind(0, name)==-1) {
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x+173);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y+1);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 7);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrGold);
ObjectSetString(0, name, OBJPROP_FONT, "Arial");
ObjectSetString(0, name, OBJPROP_TEXT, "min:");
}
}
ObjectSetString(0, "fxd_spread_current", OBJPROP_TEXT, DoubleToStr(current_spread,2));
ObjectSetString(0, "fxd_spread_max", OBJPROP_TEXT, DoubleToStr(max_spread,2));
ObjectSetString(0, "fxd_spread_avg", OBJPROP_TEXT, DoubleToStr(avg_spread,2));
ObjectSetString(0, "fxd_spread_min", OBJPROP_TEXT, DoubleToStr(min_spread,2));
}
string DrawStatus(string text="")
{
static string memory;
if (text=="") {
return(memory);
}
static bool passed = false;
int x=210; int y=0;
string name;
if (passed == false)
{
passed = true;
name="fxd_status_title";
ObjectCreate(0,name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0,name, OBJPROP_BACK, false);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0,name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0,name, OBJPROP_YDISTANCE, y+17);
ObjectSetString(0,name, OBJPROP_TEXT, "Status");
ObjectSetString(0,name, OBJPROP_FONT, "Arial");
ObjectSetInteger(0,name, OBJPROP_FONTSIZE, 7);
ObjectSetInteger(0,name, OBJPROP_COLOR, clrGray);
name="fxd_status_text";
ObjectCreate(0,name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0,name, OBJPROP_BACK, false);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
ObjectSetInteger(0,name, OBJPROP_XDISTANCE, x+2);
ObjectSetInteger(0,name, OBJPROP_YDISTANCE, y+1);
ObjectSetString(0,name, OBJPROP_FONT, "Arial");
ObjectSetInteger(0,name, OBJPROP_FONTSIZE, 12);
ObjectSetInteger(0,name, OBJPROP_COLOR, clrAqua);
}
if (text != memory) {
memory=text;
ObjectSetString(0,"fxd_status_text", OBJPROP_TEXT, text);
}
return(text);
}
double DynamicLots(string mode="balance", double value=0, double sl=0, string align="align", double RJFR_initial_lots=0)
{
double size=0;
string symbol=GetSymbol();
double LotStep=MarketInfo(symbol,MODE_LOTSTEP);
double LotSize=MarketInfo(symbol,MODE_LOTSIZE);
double MinLots=MarketInfo(symbol,MODE_MINLOT);
double MaxLots=MarketInfo(symbol,MODE_MAXLOT);
double TickValue=MarketInfo(symbol,MODE_TICKVALUE);
double point=MarketInfo(symbol,MODE_POINT);
double ticksize=MarketInfo(symbol,MODE_TICKSIZE);
double margin_required=MarketInfo(symbol,MODE_MARGINREQUIRED);
if (mode=="fixed" || mode=="lots") {size=value;}
else if (mode=="block-equity") {size=(value/100)*AccountEquity()/margin_required;}
else if (mode=="block-balance") {size=(value/100)*AccountBalance()/margin_required;}
else if (mode=="block-freemargin") {size=(value/100)*AccountFreeMargin()/margin_required;}
else if (mode=="equity") {size=(value/100)*AccountEquity()/(LotSize*TickValue);}
else if (mode=="balance") {size=(value/100)*AccountBalance()/(LotSize*TickValue);}
else if (mode=="freemargin") {size=(value/100)*AccountFreeMargin()/(LotSize*TickValue);}
else if (mode=="equityRisk") {size=((value/100)*AccountEquity())/(sl*((TickValue/ticksize)*point)*PipValue(symbol));}
else if (mode=="balanceRisk") {size=((value/100)*AccountBalance())/(sl*((TickValue/ticksize)*point)*PipValue(symbol));}
else if (mode=="freemarginRisk") {size=((value/100)*AccountFreeMargin())/(sl*((TickValue/ticksize)*point)*PipValue(symbol));}
else if (mode=="fixedRisk") {size=(value)/(sl*((TickValue/ticksize)*point)*PipValue(symbol));}
else if (mode=="fixedRatio" || mode=="RJFR") {
static double RJFR_start_lots=0;
static double RJFR_delta=0;
static double RJFR_units=1;
static double RJFR_target_lower=0;
static double RJFR_target_upper=0;
if (RJFR_start_lots<=0) {RJFR_start_lots=value;}
if (RJFR_start_lots<MinLots) {RJFR_start_lots=MinLots;}
if (RJFR_delta<=0) {RJFR_delta=sl;}
if (RJFR_target_upper<=0) {
RJFR_target_upper=AccountEquity()+(RJFR_units*RJFR_delta);
Print("Fixed Ratio MM: Units=>",RJFR_units,"; Delta=",RJFR_delta,"; Upper Target Equity=>",RJFR_target_upper);
}
if (AccountEquity()>=RJFR_target_upper)
{
while(true) {
Print("Fixed Ratio MM going up to ",(RJFR_start_lots*(RJFR_units+1))," lots: Equity is above Upper Target Equity (",AccountEquity(),">=",RJFR_target_upper,")");
RJFR_units++;
RJFR_target_lower=RJFR_target_upper;
RJFR_target_upper=RJFR_target_upper+(RJFR_units*RJFR_delta);
Print("Fixed Ratio MM: Units=>",RJFR_units,"; Delta=",RJFR_delta,"; Lower Target Equity=>",RJFR_target_lower,"; Upper Target Equity=>",RJFR_target_upper);
if (AccountEquity()<RJFR_target_upper) {break;}
}
}
else if (AccountEquity()<=RJFR_target_lower)
{
while(true) {
if (AccountEquity()>RJFR_target_lower) {break;}
if (RJFR_units>1) {
Print("Fixed Ratio MM going down to ",(RJFR_start_lots*(RJFR_units-1))," lots: Equity is below Lower Target Equity | ", AccountEquity()," <= ",RJFR_target_lower,")");
RJFR_target_upper=RJFR_target_lower;
RJFR_target_lower=RJFR_target_lower-((RJFR_units-1)*RJFR_delta);
RJFR_units--;
Print("Fixed Ratio MM: Units=>",RJFR_units,"; Delta=",RJFR_delta,"; Lower Target Equity=>",RJFR_target_lower,"; Upper Target Equity=>",RJFR_target_upper);
} else {break;}
}
}
size=RJFR_start_lots*RJFR_units;
}
size=MathRound(size/LotStep)*LotStep;
static bool alert_min_lots=false;
if (size<MinLots && alert_min_lots==false) {
alert_min_lots=true;
Alert("You want to trade ",size," lot, but your broker's minimum is ",MinLots," lot. The trade/order will continue with ",MinLots," lot instead of ",size," lot. The same rule will be applied for next trades/orders with desired lot size lower than the minimum. You will not Показано первые 50% кода (символов: 92533)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.