XMT-Scalper V3.0
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «xmt scalper v3.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
XMT-Scalper V3.0 — это советник для MetaTrader 4, предназначенный для торговли на минимальном таймфрейме M1. Советник анализирует волатильность цены, используя скользящую среднюю (LWMA) и полосы Боллинджера, и открывает отложенные ордера BUYSTOP и SELLSTOP при пробое ценовых каналов.
Основная торговая логика строится на сравнении текущей волатильности (разница между максимумом и минимумом текущего бара) с заданным лимитом волатильности, который может рассчитываться динамически на основе среднего спреда с учётом комиссии. Если цена пробивает нижнюю или верхнюю границу канала, советник определяет направление сделки и отправляет соответствующий отложенный ордер.
Советник поддерживает два режима управления ордерами: виртуальные отложенные ордера и виртуальные стопы, позволяющие отслеживать и управлять ордерами и их стоп-лоссами/тейк-профитами без прямого взаимодействия с сервером. Также реализованы фильтрация по спреду и времени выполнения, управление лотом на основе риска или фиксированного размера, а также возможность автоматического создания магического номера.
Дополнительные функции включают съёмку экрана при определённых условиях, измерение скорости выполнения торговых операций, подробный вывод отладочной информации и учёт ошибок брокера.
Настройки программы
| Настройка | Описание |
|---|---|
| Configuration | Конфигурация — Группа настроек конфигурации |
| Magic | Магический номер — Магический номер для идентификации ордеров советника |
| OrderCmt | Комментарий к ордерам — Комментарий, присваиваемый ордерам |
| ECN_Mode | ECN-режим — Режим ECN — отправка отложенных ордеров без стоп-лосса и тейк-профита с последующей модификацией |
| Debug | Отладка — Включение режима отладки с выводом дополнительной информации |
| Verbose | Подробный вывод — Включение подробного вывода информации о торговых параметрах |
| VirtualPendingOrders | Виртуальные отложенные ордера — Включение виртуальных отложенных ордеров для отслеживания без отправки на сервер |
| VirtualStops | Виртуальные стопы — Включение виртуальных стоп-лоссов и тейк-профитов для управления ордерами |
| TradingSettings | Настройки торговли — Группа настроек торговли |
| MaxSpread | Максимальный спред — Максимально допустимый спред в пунктах для открытия сделок |
| MaxExecution | Максимальное время выполнения — Максимальное допустимое время выполнения торговой операции в миллисекундах |
| MaxExecutionMinutes | Максимальное время ожидания — Максимальное время ожидания выполнения в минутах для периодической проверки скорости |
| TakeProfit | Тейк-профит — Тейк-профит в пунктах |
| StopLoss | Стоп-лосс — Стоп-лосс в пунктах |
| TrailingStart | Начало трейлинг-стопа — Расстояние в пунктах от начала активации трейлинг-стопа |
| Commission | Комиссия — Комиссия в пунктах, учитываемая при расчёте цен и волатильности |
| Slippage | Проскальзывание — Допустимое проскальзывание в пунктах |
| UseDynamicVolatilityLimit | Динамический лимит волатильности — Использование динамического расчёта лимита волатильности на основе среднего спреда |
| VolatilityMultiplier | Множитель волатильности — Множитель для расчёта динамического лимита волатильности |
| VolatilityLimit | Лимит волатильности — Абсолютный лимит волатильности для определения момента открытия сделки |
| UseVolatilityPercentage | Процент волатильности — Использование процентного порога волатильности в дополнение к абсолютному лимиту |
| VolatilityPercentageLimit | Процентный лимит волатильности — Процентный порог волатильности для дополнительной проверки при открытии сделки |
| UseMovingAverage | Скользящая средняя — Использование скользящей средней LWMA для определения ценовых каналов |
| UseBollingerBands | Полосы Боллинджера — Использование полос Боллинджера для определения ценовых каналов |
| Deviation | Отклонение — Отклонение полос Боллинджера |
| OrderExpireSeconds | Время жизни ордера — Время жизни ордера в секундах |
| Money_Management | Управление денежными средствами — Группа настроек управления денежными средствами |
| MoneyManagement | Управление денежными средствами — Включение автоматического расчёта размера лота на основе риска |
| MinLots | Минимальный лот — Минимально допустимый размер лота |
| MaxLots | Максимальный лот — Максимально допустимый размер лота |
| Risk | Риск — Процент риска для автоматического расчёта размера лота |
| ManualLotsize | Ручной размер лота — Фиксированный размер лота при отключённом управлении денежными средствами |
| Screen_Shooter | Скриншот — Группа настроек скриншотов |
| TakeShots | Съёмка экрана — Включение автоматической съёмки экрана |
| DelayTicks | Задержка тиков — Задержка в тиках перед съёмкой экрана |
| ShotsPerBar | Снимков на бар — Количество снимков экрана на бар |
| _tmp50_ | Виртуальные ордера: графика — Группа настроек виртуальных ордеров (графика) |
| VOrdText_corner | Угол текста — Угол расположения текста виртуальных ордеров на графике |
| VOrdText_x | Абсцисса — Абсцисса текста виртуальных ордеров |
| VOrdText_dx | Шаг абсциссы — Шаг абсциссы столбцов текста виртуальных ордеров |
| VOrdText_y | Ордината — Ордината текста виртуальных ордеров |
| VOrdText_dy | Шаг ординаты — Шаг ординаты строк текста виртуальных ордеров |
| VOrdText_font | Шрифт — Шрифт текста виртуальных ордеров |
| VOrdText_font_size | Размер шрифта — Размер шрифта текста виртуальных ордеров |
| VOrdText_font_color | Цвет шрифта — Цвет шрифта текста виртуальных ордеров |
Поиск по коду файла
#include <stdlib.mqh>
input string Configuration = "==== Configuration ====";
input int Magic = -1;
input string OrderCmt = "";
input bool ECN_Mode = FALSE;
input bool Debug = FALSE;
input bool Verbose = FALSE;
input bool VirtualPendingOrders = true;
input bool VirtualStops = true;
input string TradingSettings = "==== Trade settings ====";
input double MaxSpread = 30.0;
input int MaxExecution = 0;
input int MaxExecutionMinutes = 5;
input double TakeProfit = 10.0;
input double StopLoss = 60.0;
input double TrailingStart = 0;
input double Commission = 0;
input int Slippage = 3;
input bool UseDynamicVolatilityLimit = TRUE;
input double VolatilityMultiplier = 125;
input double VolatilityLimit = 180;
input bool UseVolatilityPercentage = TRUE;
input double VolatilityPercentageLimit = 60;
input bool UseMovingAverage = TRUE;
input bool UseBollingerBands = TRUE;
input double Deviation = 1.50;
input int OrderExpireSeconds = 3600;
input string Money_Management = "==== Money Management ====";
input bool MoneyManagement = TRUE;
input double MinLots = 0.01;
input double MaxLots = 100.0;
input double Risk = 2.0;
input double ManualLotsize = 0.1;
input string Screen_Shooter = "==== Screen Shooter ====";
input bool TakeShots = FALSE;
input int DelayTicks = 1;
input int ShotsPerBar = 1;
input string _tmp50_ = " --- Virtual Orders: graphic ---";
input ENUM_BASE_CORNER VOrdText_corner = CORNER_RIGHT_UPPER;
input int VOrdText_x = 25;
input int VOrdText_dx = 60;
input int VOrdText_y = 20;
input int VOrdText_dy = 14;
input string VOrdText_font = "Arial";
input int VOrdText_font_size = 8;
input color VOrdText_font_color = clrGold;
string ea_version = "XMT-Scalper V3.0";
int indicatorperiod = 3;
int brokerdigits = 0;
int globalerror = 0;
int lasttime = 0;
int tickcounter = 0;
int upto30counter = 0;
int execution = -1;
int avg_execution = 0;
int execution_samples = 0;
int starttime;
int leverage;
int lotbase;
int err_busyserver;
int err_lostconnection;
int err_toomanyrequest;
int err_invalidprice;
int err_invalidstops;
int err_invalidtradevolume;
int err_pricechange;
int err_brokerbuzy;
int err_requotes;
int err_toomanyrequests;
int err_trademodifydenied;
int err_tradecontextbuzy;
double array_spread[30];
double lotsize;
double highest;
double lowest;
double stoplevel;
double stopout;
double lotstep;
double marginforonelot;
int skipedticks=0;
int ticks_samples=0;
double avg_tickspermin=0;
double vStopLoss;
double vTakeProfit;
double vManualLotsize;
double vRisk;
double vMinLots;
double vMaxLots;
double vVolatilityPercentageLimit;
double vVolatilityLimit;
double vVolatilityMultiplier;
double vCommission;
double vTrailingStart;
int vMaxExecutionMinutes;
int vMagic;
#define VO_MAX 1000
int a_N = 0;
int a_tickets[VO_MAX];
int a_type[VO_MAX];
string a_symbol[VO_MAX];
double a_volume[VO_MAX];
double a_open_price[VO_MAX];
double a_sl[VO_MAX];
double a_tp[VO_MAX];
int a_magic[VO_MAX];
string a_comment[VO_MAX];
color a_color[VO_MAX];
int vo_sel_ind;
string vo_prefix;
void OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
sub_printsumofbrokererrors();
Print (ea_version, " has been deinitialized!");
}
void OnTick()
{
// код доступен только после оплаты
}
void sub_trade()
{
string local_textstring;
string local_pair;
bool local_wasordermodified;
bool local_ordersenderror;
bool local_isbidgreaterthanima;
bool local_isbidgreaterthanibands;
bool local_isbidgreaterthanindy;
int local_orderticket;
int local_orderexpiretime;
int local_loopcount2;
int local_loopcount1;
int local_pricedirection;
int local_counter1;
int local_counter2;
int local_askpart;
int local_bidpart;
double local_ask;
double local_bid;
double local_askplusdistance;
double local_bidminusdistance;
double local_volatilitypercentage;
double local_orderstoploss;
double local_ordertakeprofit;
double local_tpadjust;
double local_ihigh;
double local_ilow;
double local_imalow;
double local_imahigh;
double local_imadiff;
double local_ibandsupper;
double local_ibandslower;
double local_ibandsdiff;
double local_volatility;
double local_spread;
double local_avgspread;
double local_realavgspread;
double local_fakeprice;
double local_sumofspreads;
double local_askpluscommission;
double local_bidminuscommission;
double local_skipticks;
bool bRC;
if (lasttime < Time[0])
{
if (ticks_samples < 10)
ticks_samples++;
avg_tickspermin = avg_tickspermin + (tickcounter - avg_tickspermin) / ticks_samples;
lasttime = Time[0];
tickcounter = 0;
}
else
tickcounter++;
if (IsTesting() && MaxExecution!=0 && execution!=-1) {
local_skipticks=MathRound(avg_tickspermin * MaxExecution/(60*1000));
if (skipedticks>=local_skipticks) {
execution=-1;
skipedticks=0;
}
else {
skipedticks++;
return;
}
}
local_ask = MarketInfo(Symbol(), MODE_ASK);
local_bid = MarketInfo(Symbol(), MODE_BID);
local_ihigh = iHigh(Symbol(), PERIOD_M1, 0);
local_ilow = iLow(Symbol(), PERIOD_M1, 0);
local_volatility = local_ihigh - local_ilow;
local_imalow = iMA(Symbol(), PERIOD_M1, indicatorperiod, 0, MODE_LWMA, PRICE_LOW, 0);
local_imahigh = iMA(Symbol(), PERIOD_M1, indicatorperiod, 0, MODE_LWMA, PRICE_HIGH, 0);
local_imadiff = local_imahigh - local_imalow;
local_isbidgreaterthanima = local_bid >= local_imalow + local_imadiff / 2.0;
local_ibandsupper = iBands(Symbol(), PERIOD_M1, indicatorperiod, Deviation, 0, PRICE_OPEN, MODE_UPPER, 0);
local_ibandslower = iBands(Symbol(), PERIOD_M1, indicatorperiod, Deviation, 0, PRICE_OPEN, MODE_LOWER, 0);
local_ibandsdiff = local_ibandsupper - local_ibandslower;
local_isbidgreaterthanibands = local_bid >= local_ibandslower + local_ibandsdiff / 2.0;
local_isbidgreaterthanindy = FALSE;
if (UseMovingAverage == FALSE && UseBollingerBands == TRUE && local_isbidgreaterthanibands == TRUE)
{
local_isbidgreaterthanindy = TRUE;
highest = local_ibandsupper;
lowest = local_ibandslower;
}
else if (UseMovingAverage == TRUE && UseBollingerBands == FALSE && local_isbidgreaterthanima == TRUE)
{
local_isbidgreaterthanindy = TRUE;
highest = local_imahigh;
lowest = local_imalow;
}
else if (UseMovingAverage == TRUE && UseBollingerBands == TRUE && local_isbidgreaterthanima == TRUE && local_isbidgreaterthanibands == TRUE)
{
local_isbidgreaterthanindy = TRUE;
highest = MathMax(local_ibandsupper, local_imahigh);
lowest = MathMin(local_ibandslower, local_imalow);
}
local_spread = local_ask - local_bid;
local_orderexpiretime = TimeCurrent() + OrderExpireSeconds;
local_orderexpiretime = TimeCurrent() + OrderExpireSeconds;
lotsize = sub_calculatelotsize();
ArrayCopy(array_spread, array_spread, 0, 1, 29);
array_spread[29] = local_spread;
if (upto30counter < 30)
upto30counter++;
local_sumofspreads = 0;
local_loopcount2 = 29;
for (local_loopcount1 = 0; local_loopcount1 < upto30counter; local_loopcount1++)
{
local_sumofspreads += array_spread[local_loopcount2];
local_loopcount2--;
}
local_avgspread = local_sumofspreads / upto30counter;
local_askpluscommission = sub_normalizebrokerdigits(local_ask + vCommission);
local_bidminuscommission = sub_normalizebrokerdigits(local_bid - vCommission);
local_realavgspread = local_avgspread + vCommission;
if (UseDynamicVolatilityLimit == TRUE)
vVolatilityLimit = local_realavgspread * vVolatilityMultiplier;
local_pricedirection = 0;
if (local_volatility && vVolatilityLimit && lowest && highest)
{
if (local_volatility > vVolatilityLimit)
{
local_volatilitypercentage = local_volatility / vVolatilityLimit;
if ((UseVolatilityPercentage == FALSE) || (UseVolatilityPercentage == TRUE && local_volatilitypercentage > vVolatilityPercentageLimit))
{
if (local_bid < lowest)
local_pricedirection = -1; // BUY or BUYSTOP
else if (local_bid > highest)
local_pricedirection = 1; // SELL or SELLSTOP
}
}
else
local_volatilitypercentage = 0;
}
if (AccountBalance() <= 0.0)
{
Comment("ERROR -- Account Balance is " + DoubleToStr(MathRound(AccountBalance()), 0));
return;
}
execution = -1;
local_counter1 = 0;
local_counter2 = 0;
for (local_loopcount2 = 0; local_loopcount2 < OrdersTotalEx(); local_loopcount2++)
{
bRC = OrderSelectEx(local_loopcount2, SELECT_BY_POS, MODE_TRADES);
if (OrderMagicNumberEx() == vMagic /*&& OrderCloseTime() == 0*/)
{
if (OrderSymbolEx() != Symbol())
{
local_counter2++;
continue;
}
switch (OrderTypeEx())
{
case OP_BUY:
while (true)
{
local_orderstoploss = OrderStopLossEx();
local_ordertakeprofit = OrderTakeProfitEx();
if (local_ordertakeprofit < sub_normalizebrokerdigits(local_askpluscommission + stoplevel) && local_askpluscommission + stoplevel - local_ordertakeprofit > vTrailingStart)
{
local_orderstoploss = sub_normalizebrokerdigits(local_bid - stoplevel);
local_ordertakeprofit = sub_normalizebrokerdigits(local_askpluscommission + stoplevel);
execution = GetTickCount();
local_wasordermodified = OrderModifyEx(OrderTicketEx(), 0, local_orderstoploss, local_ordertakeprofit, local_orderexpiretime, Lime);
if (local_wasordermodified > 0)
{
execution = GetTickCount() - execution;
if (TakeShots && !IsTesting())
sub_takesnapshot();
}
else
{
execution = -1;
sub_errormessages();
}
}
break;
}
local_counter1++;
break;
case OP_SELL:
while (true)
{
local_orderstoploss = OrderStopLossEx();
local_ordertakeprofit = OrderTakeProfitEx();
if (local_ordertakeprofit > sub_normalizebrokerdigits(local_bidminuscommission - stoplevel) && local_ordertakeprofit - local_bidminuscommission + stoplevel > vTrailingStart)
{
local_orderstoploss = sub_normalizebrokerdigits(local_ask + stoplevel);
local_ordertakeprofit = sub_normalizebrokerdigits(local_bidminuscommission - stoplevel);
execution = GetTickCount();
local_wasordermodified = OrderModifyEx(OrderTicketEx(), 0, local_orderstoploss, local_ordertakeprofit, local_orderexpiretime, Orange);
if (local_wasordermodified > 0)
{
execution = GetTickCount() - execution;
if (TakeShots && !IsTesting())
sub_takesnapshot();
}
else
{
execution = -1;
sub_errormessages();
}
}
break;
}
local_counter1++;
break;
case OP_BUYSTOP:
if (local_isbidgreaterthanindy == FALSE)
{
local_tpadjust = OrderTakeProfitEx() - OrderOpenPriceEx() - vCommission;
while (true)
{
if (sub_normalizebrokerdigits(local_ask + stoplevel) < OrderOpenPriceEx() && OrderOpenPriceEx() - local_ask - stoplevel > vTrailingStart)
{
execution = GetTickCount();
local_wasordermodified = OrderModifyEx(OrderTicketEx(), sub_normalizebrokerdigits(local_ask + stoplevel), sub_normalizebrokerdigits(local_bid + stoplevel - local_tpadjust), sub_normalizebrokerdigits(local_askpluscommission + stoplevel + local_tpadjust), 0, Lime);
if (local_wasordermodified > 0)
{
execution = GetTickCount() - execution;
if (Debug || Verbose)
Print ("Order executed in " + execution + " ms");
}
else
{
execution = -1;
sub_errormessages();
}
}
break;
}
local_counter1++;
}
else
bRC = OrderDeleteEx(OrderTicketEx());
break;
case OP_SELLSTOP:
if (local_isbidgreaterthanindy == TRUE)
{
local_tpadjust = OrderOpenPriceEx() - OrderTakeProfitEx() - vCommission;
while (true)
{
if (sub_normalizebrokerdigits(local_bid - stoplevel) > OrderOpenPriceEx() && local_bid - stoplevel - OrderOpenPriceEx() > vTrailingStart)
{
execution = GetTickCount();
local_wasordermodified = OrderModifyEx(OrderTicketEx(), sub_normalizebrokerdigits(local_bid - stoplevel), sub_normalizebrokerdigits(local_ask - stoplevel + local_tpadjust), sub_normalizebrokerdigits(local_bidminuscommission - stoplevel - local_tpadjust), 0, Orange);
if (local_wasordermodified > 0)
{
execution = GetTickCount() - execution;
if (Debug || Verbose)
Print ("Order executed in " + execution + " ms");
}
else
{
execution = -1;
sub_errormessages();
}
}
break;
}
local_counter1++;
}
else
bRC = OrderDeleteEx(OrderTicketEx());
} // end of switch
} // end if OrderMagicNumber
} // end for loopcount2 - end of loop through open orders
if (globalerror >= 0 || globalerror == -2)
{
local_bidpart = NormalizeDouble(local_bid / Point, 0);
local_askpart = NormalizeDouble(local_ask / Point, 0);
if (local_bidpart % 10 != 0 || local_askpart % 10 != 0)
globalerror = -1;
else
{
if (globalerror >= 0 && globalerror < 10)
globalerror++;
else
globalerror = -2;
}
}
local_ordersenderror = FALSE;
if (local_pricedirection != 0 && MaxExecution > 0 && avg_execution > MaxExecution)
{
local_pricedirection = 0; // Ignore the order opening triger
if (Debug || Verbose)
Print("Server is too Slow. Average Execution: " + avg_execution);
}
if (local_counter1 == 0 && local_pricedirection != 0 && sub_normalizebrokerdigits(local_realavgspread) <= sub_normalizebrokerdigits(MaxSpread * Point) && globalerror == -1)
{
if (local_pricedirection < 0) // Send a BUYSTOP
{
execution = GetTickCount();
local_askplusdistance = local_ask + stoplevel;
if (ECN_Mode == TRUE)
{
local_orderticket = OrderSendEx(Symbol(), OP_BUYSTOP, lotsize, local_askplusdistance, Slippage, 0, 0, OrderCmt, vMagic, 0, Lime);
if (local_orderticket > 0)
{
execution = GetTickCount() - execution;
if (Debug || Verbose)
Print ("Order executed in " + execution + " ms");
PlaySound("news.wav");
Print("BUYSTOP: " + sub_dbl2strbrokerdigits(local_ask + stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_bid + stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_askpluscommission + stoplevel));
if (TakeShots && !IsTesting())
sub_takesnapshot();
} // end if ordersend
else
{
local_ordersenderror = TRUE;
Print("ERROR OrderSend BUYSTOP : " + sub_dbl2strbrokerdigits(local_ask + stoplevel) + " SL:" + sub_dbl2strbrokerdigits(local_bid + stoplevel) + " TP:" + sub_dbl2strbrokerdigits(local_askpluscommission + stoplevel));
execution = -1;
sub_errormessages();
}
if (OrderSelectEx(local_orderticket, SELECT_BY_TICKET))
{
local_wasordermodified = OrderModifyEx(OrderTicketEx(), OrderOpenPriceEx(), local_askplusdistance - vStopLoss * Point, local_askplusdistance + vTakeProfit * Point, local_orderexpiretime, Lime);
if (local_wasordermodified > 0)
{
execution = GetTickCount() - execution;
if (Debug || Verbose)
Print ("Order executed in " + execution + " ms");
PlaySound("news.wav");
Print("BUYSTOP: " + sub_dbl2strbrokerdigits(local_ask + stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_bid + stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_askpluscommission + stoplevel));
if (TakeShots && !IsTesting())
sub_takesnapshot();
} // end successful ordermodiify
else
{
local_ordersenderror = TRUE;
Print("ERROR OrderModify BUYSTOP: " + sub_dbl2strbrokerdigits(local_ask + stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_bid + stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_askpluscommission + stoplevel));
execution = -1;
sub_errormessages();
} // end if-else
} // end if ordermodify
} // end if ECN_Mode
else
{
/*
Print(
"vStopLoss= ", vStopLoss,
", vTakeProfit= ", vTakeProfit,
", Ask= ", DoubleToStr(Ask, Digits),
", local_askplusdistance= ", DoubleToStr(local_askplusdistance, Digits),
", sl= ", DoubleToStr(local_askplusdistance - vStopLoss * Point, Digits),
", tp= ", DoubleToStr(local_askplusdistance + vTakeProfit * Point, Digits),
", point= ", DoubleToStr(Point(), Digits));
*/
local_orderticket = OrderSendEx(Symbol(), OP_BUYSTOP, lotsize, local_askplusdistance, Slippage, local_askplusdistance - vStopLoss * Point, local_askplusdistance + vTakeProfit * Point, OrderCmt, vMagic, local_orderexpiretime, Lime);
if (local_orderticket > 0) // OrderSend was executed suxxessfully
{
execution = GetTickCount() - execution;
if (Debug || Verbose)
Print ("Order executed in " + execution + " ms");
PlaySound("news.wav");
Print("BUYSTOP: " + sub_dbl2strbrokerdigits(local_ask + stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_bid + stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_askpluscommission + stoplevel));
if (TakeShots && !IsTesting())
sub_takesnapshot();
} // end successful ordersend
else
{
local_ordersenderror = TRUE;
Print("ERROR BUYSTOP : " + sub_dbl2strbrokerdigits(local_ask + stoplevel) + " SL:" + sub_dbl2strbrokerdigits(local_bid + stoplevel) + " TP:" + sub_dbl2strbrokerdigits(local_askpluscommission + stoplevel));
execution = -1;
sub_errormessages();
} // end if-else
} // end no ECN-mode
} // end local_pricedirection < 0
else if (local_pricedirection > 0)
{
local_bidminusdistance = local_bid - stoplevel;
execution = GetTickCount();
if (ECN_Mode)
{
local_orderticket = OrderSendEx(Symbol(), OP_SELLSTOP, lotsize, local_bidminusdistance, Slippage, 0, 0, OrderCmt, vMagic, 0, Orange);
if (OrderSelectEx(local_orderticket, SELECT_BY_TICKET))
local_wasordermodified = OrderModifyEx(OrderTicketEx(), OrderOpenPriceEx(), local_bidminusdistance + vStopLoss * Point, local_bidminusdistance - vTakeProfit * Point, local_orderexpiretime, Orange);
if (local_wasordermodified > 0)
{
execution = GetTickCount() - execution;
if (Debug || Verbose)
Print ("Order executed in " + execution + " ms");
PlaySound("news.wav");
Print("SELLSTOP: " + sub_dbl2strbrokerdigits(local_bid - stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_ask - stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_bidminuscommission - stoplevel));
if (TakeShots && !IsTesting())
sub_takesnapshot();
} // end if ordermodify was executed successfully
else
{
local_ordersenderror = TRUE;
Print("SELLSTOP : " + sub_dbl2strbrokerdigits(local_bid - stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_ask - stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_bidminuscommission - stoplevel));
execution = -1;
sub_errormessages();
}
}
else // No ECN-mode, SL and TP can be sent directly
{
local_orderticket = OrderSendEx(Symbol(), OP_SELLSTOP, lotsize, local_bidminusdistance, Slippage, local_bidminusdistance + vStopLoss * Point, local_bidminusdistance - vTakeProfit * Point, OrderCmt, vMagic, local_orderexpiretime, Orange);
if (local_orderticket > 0)
{
execution = GetTickCount() - execution;
if (Debug || Verbose)
Print ("Order executed in " + execution + " ms");
if (TakeShots && !IsTesting())
sub_takesnapshot();
PlaySound("news.wav");
Print("SELLSTOP : " + sub_dbl2strbrokerdigits(local_bid - stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_ask - stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_bidminuscommission - stoplevel));
} // end successful ordersend
else
{
local_ordersenderror = TRUE;
Print("ERROR SELLSTOP: " + sub_dbl2strbrokerdigits(local_bid - stoplevel) + " SL: " + sub_dbl2strbrokerdigits(local_ask - stoplevel) + " TP: " + sub_dbl2strbrokerdigits(local_bidminuscommission - stoplevel));
execution = -1;
sub_errormessages();
} // end if-else
} // end no ECN-mode
} // end local_pricedirection > 0
} // end if execute new orders
if (MaxExecution && execution == -1 && (TimeLocal() - starttime) % vMaxExecutionMinutes == 0)
{
if (IsTesting() && MaxExecution)
{
MathSrand(TimeLocal());
execution = MathRand() / (32767 / MaxExecution);
}
else
{
if (!IsTesting())
{
local_fakeprice = local_ask * 2.0;
local_orderticket = OrderSendEx(Symbol(), OP_BUYSTOP, lotsize, local_fakeprice, Slippage, 0, 0, OrderCmt, vMagic, 0, Lime);
execution = GetTickCount();
local_wasordermodified = OrderModifyEx(local_orderticket, local_fakeprice + 10 * Point, 0, 0, 0, Lime);
execution = GetTickCount() - execution;
bRC = OrderDeleteEx(local_orderticket);
}
}
}
if (execution >= 0)
{
if (execution_samples < 10)
execution_samples++;
avg_execution = avg_execution + (execution - avg_execution) / execution_samples;
}
if (globalerror >= 0)
Comment("Robot is initializing...");
else
{
if (globalerror == -2)
Comment("ERROR -- Instrument " + Symbol() + " prices should have " + brokerdigits + " fraction digits on broker account");
else
{
local_textstring = TimeToStr(TimeCurrent()) + " Tick: " + sub_adjust00instring(tickcounter) + " Ticks/min:" + avg_tickspermin;
if (Debug || Verbose)
{
local_textstring = local_textstring + "\n*** DEBUG MODE *** \nCurrency pair: " + Symbol() + ", Volatility: " + sub_dbl2strbrokerdigits(local_volatility) + ", vVolatilityLimit: " + sub_dbl2strbrokerdigits(vVolatilityLimit) + ", VolatilityPercentage: " + sub_dbl2strbrokerdigits(local_volatilitypercentage);
local_textstring = local_textstring + "\nPriceDirection: " + StringSubstr("BUY NULLSELL", 4 * local_pricedirection + 4, 4) + ", ImaHigh: " + sub_dbl2strbrokerdigits(local_imahigh) + ", ImaLow: " + sub_dbl2strbrokerdigits(local_imalow) + ", BBandUpper: " + sub_dbl2strbrokerdigits(local_ibandsupper);
local_textstring = local_textstring + ", BBandLower: " + sub_dbl2strbrokerdigits(local_ibandslower) + ", Expire: " + TimeToStr(local_orderexpiretime, TIME_MINUTES) + ", NumOrders: " + local_counter1;
local_textstring = local_textstring + "\nTrailingLimit: " + sub_dbl2strbrokerdigits(stoplevel) + ", Stoplevel: " + sub_dbl2strbrokerdigits(stoplevel) + "; TrailingStart: " + sub_dbl2strbrokerdigits(vTrailingStart);
}
local_textstring = local_textstring + "\nBid: " + sub_dbl2strbrokerdigits(local_bid) + ", ASK: " + sub_dbl2strbrokerdigits(local_ask) + ", AvgSpread: " + sub_dbl2strbrokerdigits(local_avgspread) + ", Commission: " + sub_dbl2strbrokerdigits(vCommission) + ", RealAvgSpread: " + sub_dbl2strbrokerdigits(local_realavgspread) + ", Lots: " + DoubleToStr(lotsize, 5) + ", MinLots: " + DoubleToStr(vMinLots,5) + ", Execution: " + execution + " ms";
if (sub_normalizebrokerdigits(local_realavgspread) > sub_normalizebrokerdigits(MaxSpread * Point))
{
local_textstring = local_textstring + "\n" + "The current spread (" + sub_dbl2strbrokerdigits(local_realavgspread) +") is higher than what has been set as MaxSpread (" + sub_dbl2strbrokerdigits(MaxSpread * Point) + ") so no trading is allowed right now on this currency pair!";
}
if (MaxExecution > 0 && avg_execution > MaxExecution)
{
local_textstring = local_textstring + "\n" + "The current Avg Execution (" + avg_execution +") is higher than what has been set as MaxExecution (" + MaxExecution+ " ms), so no trading is allowed right now on this currency pair!";
}
Comment(local_textstring);
if (local_counter1 != 0 || local_pricedirection != 0 || Verbose)
sub_printformattedstring(local_textstring);
} // end if-else
} // end check initialization
} // end sub
string sub_dbl2strbrokerdigits(double par_a)
{
return (DoubleToStr(par_a, brokerdigits));
}
double sub_normalizebrokerdigits(double par_a)
{
return (NormalizeDouble(par_a, brokerdigits));
}
string sub_adjust00instring(int par_a)
{
if (par_a < 10)
return ("00" + par_a);
if (par_a < 100)
return ("0" + par_a);
return ("" + par_a);
}
void sub_priПоказано первые 50% кода (символов: 42555)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.