XMT-Scalper
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «xmt-scalper_v2.45.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
XMT-Scalper v.2.45 — это советник-эксперт для платформы MetaTrader 4, предназначенный для скальпирования. Основной торговый инструмент — анализ ценовых данных и технических индикаторов (скользящая средняя, полосы Боллинджера, огибающие) для обнаружения пробоев ценовых каналов с последующей установкой отложенных ордеров BUYSTOP и SELLSTOP. Советник работает на паре EURUSD M1, но также может использоваться на других валютных парах, золоте и CFD.
В советнике реализовано автоматическое управление лотом на основе риска и баланса, трейлинг-стоп для открытых позиций, а также режим ECN для брокеров, не принимающих стоп-лосс и тейк-профит одновременно с ордером. Встроен мониторинг спреда и времени исполнения ордеров с возможностью блокировки торговли при превышении заданных лимитов. Также предусмотрено создание снимков экрана при открытии или закрытии ордеров и автоматический расчёт магического номера для идентификации ордеров советника.
Настройки программы
| Настройка | Описание |
|---|---|
| Configuration | Конфигурация — Текстовый параметр конфигурации. |
| If TRUE, then trade in opposite direction (ReverseTrade) | Обратная торговля — Если TRUE, торговля ведётся в противоположном направлении от сигнала индикатора. |
| If set to a number less than 0 it will calculate MagicNumber automatically (Magic) | Магический номер — Магический номер ордеров. Если установлен в значение меньше 0, рассчитывается автоматически на основе номера счёта и торгового инструмента. |
| Trade comments that appears in the Trade and Account History tab (OrderCmt) | Комментарий ордера — Комментарий к ордерам, отображаемый на вкладках «Торговля» и «История счёта». |
| True for brokers that don't accept SL and TP to be sent at the same time as the order (ECN_Mode) | ECN-режим — Если TRUE, используется режим ECN для брокеров, которые не принимают стоп-лосс и тейк-профит одновременно с орденом. Ордер отправляется без SL/TP и модифицируется отдельно. |
| Print huge log files with info, only for debugging purposes (Debug) | Режим отладки — Если TRUE, выводятся подробные журналы с информацией для отладки. Используется только в целях отладки. |
| Additional information printed in the chart (Verbose) | Подробный вывод — Если TRUE, дополнительная информация выводится на график в виде комментариев. |
| TradingSettings | Настройки торговли — Текстовый параметр группы настроек торговли. |
| Max allowed spread in points (1 / 10 pip) (MaxSpread) | Максимальный спред — Максимально допустимый спред в пунктах (1/10 пипа). Если текущий спред превышает это значение, торговля блокируется. |
| Max allowed average execution time in ms (0 means no restrictions) (MaxExecution) | Максимальное время исполнения — Максимально допустимое среднее время исполнения ордера в миллисекундах. Если равно 0, ограничений нет. При превышении торговля блокируется. |
| How often in minutes should fake orders be sent to measure execution speed (MaxExecutionMinutes) | Период измерения скорости исполнения — Периодичность в минутах отправки тестовых ордеров для измерения скорости исполнения. |
| StopLoss from as many points. Default 60 (= 6 pips) (StopLoss) | Стоп-лосс — Стоп-лосс в пунктах от текущей цены. По умолчанию 60 пунктов (6 пипсов). При необходимости корректируется до уровня стопа брокера. |
| TakeProfit from as many points. Default 100 (= 10 pip) (TakeProfit) | Тейк-профит — Тейк-профит в пунктах от текущей цены. По умолчанию 100 пунктов (10 пипсов). При необходимости корректируется до уровня стопа брокера. |
| Additional price gap in points added to SL and TP in order to avoid Error 130 (AddPriceGap) | Дополнительный ценовой разрыв — Дополнительный ценовой разрыв в пунктах, добавляемый к стоп-лоссу и тейк-профиту для предотвращения ошибки 130 (неверные стопы). |
| Start trailing profit from as so many pips. Default 23 (TrailingStart) | Начало трейлинг-стопа — Начало трейлинг-стопа, в пипсах от текущей цены. По умолчанию 23. Трейлинг-стоп применяется к открытым позициям. |
| Some broker accounts charge commission in USD per 1.0 lot. Commission in dollar (Commission) | Комиссия — Комиссия брокерского счёта в долларах США на 1.0 лот. Используется при расчёте цен с учётом комиссии. |
| Maximum allowed Slippage in points (Slippage) | Максимальное проскальзывание — Максимально допустимое проскальзывание цены в пунктах при отправке ордера. |
| Minimum stop level. Stoplevel to use will be max value of either this value or broker stoplevel (MinimumUseStopLevel) | Минимальный стоп-уровень — Минимальный уровень стопа. Используемый стоп-уровень будет равен максимальному из этого значения или стоп-уровня брокера. |
| VolatilitySettings | Настройки волатильности — Текстовый параметр группы настроек волатильности. |
| Calculate VolatilityLimit based on INT (spread * VolatilityMultiplier) (UseDynamicVolatilityLimit) | Динамический предел волатильности — Если TRUE, предел волатильности рассчитывается динамически на основе спреда и множителя волатильности. Если FALSE, используется фиксированное значение. |
| Dynamic value, only used if UseDynamicVolatilityLimit is set to TRUE (VolatilityMultiplier) | Множитель волатильности — Множитель волатильности для динамического расчёта предела. Используется только при включённом динамическом режиме (UseDynamicVolatilityLimit = TRUE). |
| Fix value, only used if UseDynamicVolatilityLimit is set to FALSE (VolatilityLimit) | Предел волатильности — Фиксированное значение предела волатильности в пунктах. Используется только при выключенном динамическом режиме (UseDynamicVolatilityLimit = FALSE). |
| If true, then price must break out more than a specific percentage (UseVolatilityPercentage) | Использовать процент волатильности — Если TRUE, для открытия торговли цена должна пробить канал на определённый процент от предела волатильности. |
| Percentage of how much iHigh-iLow difference must differ from VolatilityLimit. 0 is risky, 60 means (VolatilityPercentag | Процентный предел волатильности — Процент, на который разница между диапазоном цены (iHigh-iLow) должна отличаться от предела волатильности для подтверждения пробоя. 0 — рискованное значение, 60 — безопасное. |
| UseIndicatorSet | Настройки индикаторов — Текстовый параметр группы настроек индикаторов. |
| Switch User indicators. (UseIndicatorSwitch) | Выбор индикатора — Переключатель используемого индикатора: 1 — скользящая средняя, 2 — полосы Боллинджера, 3 — огибающие, 4 — ATR. |
| Period in bars for indicators (Indicatorperiod) | Период индикатора — Период в барах для расчёта технических индикаторов. |
| Deviation for the iBands indicator (BBDeviation) | Отклонение полос Боллинджера — Отклонение для индикатора полос Боллинджера (iBands). |
| Deviation for the iEnvelopes indicator (EnvelopesDeviation) | Отклонение огибающих — Отклонение для индикатора огибающие (iEnvelopes). |
| Orders are deleted after so many seconds (OrderExpireSeconds) | Время жизни ордера — Время в секундах, через которое неисполненные отложенные ордера удаляются. |
| Money_Management | Управление капиталом — Текстовый параметр группы настроек управления капиталом. |
| If TRUE then calculate lotsize automaticallay based on Risk, if False then use ManualLotsize below (MoneyManagement) | Автоматическое управление лотом — Если TRUE, размер лота рассчитывается автоматически на основе риска и стоп-лосса. Если FALSE, используется ручной размер лота (ManualLotsize). |
| Minimum lot-size to trade with (MinLots) | Минимальный лот — Минимально допустимый размер лота для торговли. При необходимости корректируется в зависимости от возможностей брокера. |
| Maximum allowed lot-size to trade with (MaxLots) | Максимальный лот — Максимально допустимый размер лота для торговли. При необходимости корректируется в зависимости от возможностей брокера. |
| Risk setting in percentage, For 10.000 in Equity 10% Risk and 60 StopLoss lotsize = 16.66 (Risk) | Процент риска — Процент риска для расчёта размера лота. Например, при риске 10% от депозита и стоп-лоссе 60 пунктов лот рассчитывается автоматически. |
| Manual lotsize to trade with if MoneyManagement above is set to FALSE (ManualLotsize) | Ручной размер лота — Ручной размер лота для торговли, используется при отключённом автоматическом управлении лотом (MoneyManagement = FALSE). |
| Screen_Shooter | Снимки экрана — Текстовый параметр группы настроек создания снимков экрана. |
| Save screen shots on STOP orders? (TakeShots) | Создавать снимки экрана — Если TRUE, создание снимков экрана при открытии или закрытии ордеров (только при ручной торговле, не при бэктестировании). |
| Delay so many ticks after new bar (DelayTicks) | Задержка в тиках — Задержка в тиках после появления нового бара. Используется для создания снимков экрана. |
| How many screen shots per bar (ShotsPerBar) | Снимков на бар — Количество снимков экрана, создаваемых на один бар. |
Поиск по коду файла
#property version "2.45"
#property description "This is a FREE Shareware Expert Advisor for MetaTrader 4."
#property description "Please do not remove the property section and version history."
#property description "XMT-Scalper is a Tick Scalper for EURUSD M1, but can also work on other pairs, Gold and CFD's"
#property description "It's extremely broker sensitive and requires tight spread."
#property description "Read the PDF-file for explanations and settings."
#include "stdlib.mqh" // "stdlib.mqh" or "<sdlib.mqh>
#include "stderror.mqh" // "stderror.mqh" or <stderror.mqh>
extern string Configuration = "==== Configuration ====";
extern bool ReverseTrade = FALSE; // If TRUE, then trade in opposite direction
extern int Magic = -1; // If set to a number less than 0 it will calculate MagicNumber automatically
extern string OrderCmt = "XMT-Scalper 2.45"; // Trade comments that appears in the Trade and Account History tab
extern bool ECN_Mode = FALSE; // True for brokers that don't accept SL and TP to be sent at the same time as the order
extern bool Debug = FALSE; // Print huge log files with info, only for debugging purposes
extern bool Verbose = FALSE; // Additional information printed in the chart
extern string TradingSettings = "==== Trade settings ====";
extern double MaxSpread = 30.0; // Max allowed spread in points (1 / 10 pip)
extern int MaxExecution = 0; // Max allowed average execution time in ms (0 means no restrictions)
extern int MaxExecutionMinutes = 5; // How often in minutes should fake orders be sent to measure execution speed
extern double StopLoss = 60; // StopLoss from as many points. Default 60 (= 6 pips)
extern double TakeProfit = 100; // TakeProfit from as many points. Default 100 (= 10 pip)
extern double AddPriceGap = 0; // Additional price gap in points added to SL and TP in order to avoid Error 130
extern double TrailingStart = 20; // Start trailing profit from as so many pips. Default 23
extern double Commission = 0; // Some broker accounts charge commission in USD per 1.0 lot. Commission in dollar
extern int Slippage = 3; // Maximum allowed Slippage in points
extern double MinimumUseStopLevel = 0; // Minimum stop level. Stoplevel to use will be max value of either this value or broker stoplevel
extern string VolatilitySettings = "==== Volatility Settings ====";
extern bool UseDynamicVolatilityLimit = TRUE; // Calculate VolatilityLimit based on INT (spread * VolatilityMultiplier)
extern double VolatilityMultiplier = 125; // Dynamic value, only used if UseDynamicVolatilityLimit is set to TRUE
extern double VolatilityLimit = 180; // Fix value, only used if UseDynamicVolatilityLimit is set to FALSE
extern bool UseVolatilityPercentage = TRUE; // If true, then price must break out more than a specific percentage
extern double VolatilityPercentageLimit = 0; // Percentage of how much iHigh-iLow difference must differ from VolatilityLimit. 0 is risky, 60 means a safe value
extern string UseIndicatorSet = "=== Indicators: 1 = Moving Average, 2 = BollingerBand, 3 = Envelopes";
extern int UseIndicatorSwitch = 1; // Switch User indicators.
extern int Indicatorperiod = 3; // Period in bars for indicators
extern int BBDeviation = 2; // Deviation for the iBands indicator
extern double EnvelopesDeviation = 0.07; // Deviation for the iEnvelopes indicator
extern int OrderExpireSeconds = 3600; // Orders are deleted after so many seconds
extern string Money_Management = "==== Money Management ====";
extern bool MoneyManagement = TRUE; // If TRUE then calculate lotsize automaticallay based on Risk, if False then use ManualLotsize below
extern double MinLots = 0.01; // Minimum lot-size to trade with
extern double MaxLots = 100.0; // Maximum allowed lot-size to trade with
extern double Risk = 2.0; // Risk setting in percentage, For 10.000 in Equity 10% Risk and 60 StopLoss lotsize = 16.66
extern double ManualLotsize = 0.1; // Manual lotsize to trade with if MoneyManagement above is set to FALSE
extern string Screen_Shooter = "==== Screen Shooter ====";
extern bool TakeShots = FALSE; // Save screen shots on STOP orders?
extern int DelayTicks = 1; // Delay so many ticks after new bar
extern int ShotsPerBar = 1; // How many screen shots per bar
string ea_version = "XMT-Scalper v. 2.45";
int brokerdigits = 0; // Nnumber of digits that the broker uses for this currency pair
int globalerror = 0; // To keep track on number of added errors
int lasttime = 0; // For measuring tics
int tickcounter = 0; // Counting tics
int upto30counter = 0; // For calculating average spread
int execution = -1; // For execution speed, -1 means no speed
int avg_execution = 0; // Average execution speed
int execution_samples = 0; // For calculating average execution speed
int starttime; // Initial time
int leverage; // Account leverage in percentage
int lotbase; // Amount of money in base currency for 1 lot
int err_unchangedvalues; // Error count for unchanged values (modify to the same values)
int err_busyserver; // Error count for busy server
int err_lostconnection; // Error count for lost connection
int err_toomanyrequest; // Error count for too many requests
int err_invalidprice; // Error count for invalid price
int err_invalidstops; // Error count for invalid SL and/or TP
int err_invalidtradevolume;// Error count for invalid lot size
int err_pricechange; // Error count for change of price
int err_brokerbuzy; // Error count for broker is buzy
int err_requotes; // Error count for requotes
int err_toomanyrequests; // Error count for too many requests
int err_trademodifydenied; // Error count for modify orders is denied
int err_tradecontextbuzy; // error count for trade context is buzy
int skippedticks = 0; // Used for simulation of latency during backtests, how many tics that should be skipped
int ticks_samples = 0; // Used for simulation of latency during backtests, number of tick samples
double array_spread[30]; // Store spreads for the last 30 tics
double lotsize; // Lotsize
double highest; // Highest indicator value
double lowest; // Lowest indicator value
double stoplevel; // Broker stoplevel
double stopout; // Broker stoput percentage
double lotstep; // Broker lotstep
double marginforonelot; // Margin required for 1 lot
double avg_tickspermin = 0;// Used for simulation of latency during backtests
int init()
{
// код доступен только после оплаты
}
int deinit()
{
string local_text = "";
if (IsTesting() && MaxExecution > 0)
{
local_text = local_text + "During backtesting " + skippedticks + " number of ticks was ";
local_text = local_text + "skipped to simulate latency of up to " + MaxExecution + " ms";
sub_printandcomment ( local_text );
}
sub_printsumofbrokererrors();
Print ( ea_version, " has been deinitialized!" );
return ( 0 );
}
int start()
{
// код доступен только после оплаты
}
void sub_trade()
{
string local_textstring;
string local_pair;
string local_indy;
bool local_select;
bool local_wasordermodified;
bool local_ordersenderror;
bool local_isbidgreaterthanima;
bool local_isbidgreaterthanibands;
bool local_isbidgreaterthanenvelopes;
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_orderprice;
double local_orderstoploss;
double local_ordertakeprofit;
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_envelopesupper;
double local_envelopeslower;
double local_envelopesdiff;
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;
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 ( skippedticks >= local_skipticks )
{
execution = -1;
skippedticks = 0;
}
else
{
skippedticks ++;
}
}
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_indy = "";
if ( UseIndicatorSwitch == 1 || UseIndicatorSwitch == 4 )
{
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_indy = "iMA_low: " + sub_dbl2strbrokerdigits ( local_imalow ) + ", iMA_high: " + sub_dbl2strbrokerdigits ( local_imahigh ) + ", iMA_diff: " + sub_dbl2strbrokerdigits ( local_imadiff );
}
if ( UseIndicatorSwitch == 2 )
{
local_ibandsupper = iBands ( Symbol(), PERIOD_M1, Indicatorperiod, BBDeviation, 0, PRICE_OPEN, MODE_UPPER, 0 );
local_ibandslower = iBands ( Symbol(), PERIOD_M1, Indicatorperiod, BBDeviation, 0, PRICE_OPEN, MODE_LOWER, 0 );
local_ibandsdiff = local_ibandsupper - local_ibandslower;
local_isbidgreaterthanibands = local_bid >= local_ibandslower + local_ibandsdiff / 2.0;
local_indy = "iBands_upper: " + sub_dbl2strbrokerdigits ( local_ibandslower ) + ", iBands_lower: " + sub_dbl2strbrokerdigits ( local_ibandslower ) + ", iBands_diff: " + sub_dbl2strbrokerdigits ( local_ibandsdiff );
}
if ( UseIndicatorSwitch == 3 )
{
local_envelopesupper = iEnvelopes ( Symbol(), PERIOD_M1, Indicatorperiod, MODE_LWMA, 0, PRICE_OPEN, EnvelopesDeviation, MODE_UPPER, 0 );
local_envelopeslower = iEnvelopes ( Symbol(), PERIOD_M1, Indicatorperiod, MODE_LWMA, 0, PRICE_OPEN, EnvelopesDeviation, MODE_LOWER, 0 );
local_envelopesdiff = local_envelopesupper - local_envelopeslower;
local_isbidgreaterthanenvelopes = local_bid >= local_envelopeslower + local_envelopesdiff / 2.0;
local_indy = "iEnvelopes_upper: " + sub_dbl2strbrokerdigits ( local_envelopesupper ) + ", iEnvelopes_lower: " + sub_dbl2strbrokerdigits ( local_envelopeslower ) + ", iEnvelopes_diff: " + sub_dbl2strbrokerdigits ( local_envelopesdiff) ;
}
local_isbidgreaterthanindy = FALSE;
local_pricedirection = 0;
if ( UseIndicatorSwitch == 1 && local_isbidgreaterthanima == TRUE )
{
local_isbidgreaterthanindy = TRUE;
highest = local_imahigh;
lowest = local_imalow;
}
else if ( UseIndicatorSwitch == 2 && local_isbidgreaterthanibands == TRUE )
{
local_isbidgreaterthanindy = TRUE;
highest = local_ibandsupper;
lowest = local_ibandslower;
}
else if ( UseIndicatorSwitch == 3 && local_isbidgreaterthanenvelopes == TRUE )
{
local_isbidgreaterthanindy = TRUE;
highest = local_envelopesupper;
lowest = local_envelopeslower;
}
local_spread = local_ask - local_bid;
lotsize = sub_calculatelotsize();
if ( OrderExpireSeconds != 0 )
local_orderexpiretime = TimeCurrent() + OrderExpireSeconds;
else
local_orderexpiretime = 0;
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 + Commission );
local_bidminuscommission = sub_normalizebrokerdigits ( local_bid - Commission );
local_realavgspread = local_avgspread + Commission;
if ( UseDynamicVolatilityLimit == TRUE )
VolatilityLimit = local_realavgspread * VolatilityMultiplier;
if ( local_volatility && VolatilityLimit && lowest && highest && UseIndicatorSwitch != 4 )
{
if ( local_volatility > VolatilityLimit )
{
local_volatilitypercentage = local_volatility / VolatilityLimit;
if ( ( UseVolatilityPercentage == FALSE ) || ( UseVolatilityPercentage == TRUE && local_volatilitypercentage > VolatilityPercentageLimit ) )
{
if ( local_bid < lowest )
if ( ReverseTrade == FALSE )
local_pricedirection = -1; // BUY or BUYSTOP
else // ReverseTrade == true
local_pricedirection = 1; // SELL or SELLSTOP
else if ( local_bid > highest )
if ( ReverseTrade == FALSE )
local_pricedirection = 1; // SELL or SELLSTOP
else // ReverseTrade == true
local_pricedirection = -1; // BUY or BUYSTOP
}
}
else
local_volatilitypercentage = 0;
}
if ( AccountEquity() <= 0.0 )
{
Comment ( "ERROR -- Account Equity is " + DoubleToStr ( MathRound ( AccountEquity() ), 0 ) );
return;
}
execution = -1;
local_counter1 = 0;
local_counter2 = 0;
for ( local_loopcount2 = 0; local_loopcount2 < OrdersTotal(); local_loopcount2 ++ )
{
local_select = OrderSelect ( local_loopcount2, SELECT_BY_POS, MODE_TRADES );
if ( OrderMagicNumber() == Magic && OrderCloseTime() == 0 )
{
if ( OrderSymbol() != Symbol() )
{
local_counter2 ++;
continue;
}
switch ( OrderType() )
{
case OP_BUY:
while ( TRUE )
{
RefreshRates();
local_orderstoploss = OrderStopLoss();
local_ordertakeprofit = OrderTakeProfit();
if ( local_ordertakeprofit < sub_normalizebrokerdigits ( local_askpluscommission + TakeProfit * Point + AddPriceGap ) && local_askpluscommission + TakeProfit * Point + AddPriceGap - local_ordertakeprofit > TrailingStart )
{
local_orderstoploss = sub_normalizebrokerdigits ( local_bid - StopLoss * Point - AddPriceGap );
local_ordertakeprofit = sub_normalizebrokerdigits ( local_askpluscommission + TakeProfit * Point + AddPriceGap );
if ( local_orderstoploss != OrderStopLoss() && local_ordertakeprofit != OrderTakeProfit() )
{
execution = GetTickCount();
local_wasordermodified = OrderModify ( OrderTicket(), 0, local_orderstoploss, local_ordertakeprofit, local_orderexpiretime, Lime );
}
if ( local_wasordermodified == TRUE )
{
execution = GetTickCount() - execution;
if ( TakeShots && !IsTesting() )
sub_takesnapshot();
break;
}
else
{
execution = -1;
sub_errormessages();
if ( Debug || Verbose )
Print ("Order could not be modified because of ", ErrorDescription(GetLastError()));
if ( local_orderstoploss == 0 )
local_wasordermodified = OrderModify ( OrderTicket(), 0, NormalizeDouble ( Bid - 30, brokerdigits ), 0, 0, Red );
}
}
break;
}
local_counter1 ++;
break;
case OP_SELL:
while ( TRUE )
{
RefreshRates();
local_orderstoploss = OrderStopLoss();
local_ordertakeprofit = OrderTakeProfit();
if ( local_ordertakeprofit > sub_normalizebrokerdigits(local_bidminuscommission - TakeProfit * Point - AddPriceGap ) && local_ordertakeprofit - local_bidminuscommission + TakeProfit * Point - AddPriceGap > TrailingStart )
{
local_orderstoploss = sub_normalizebrokerdigits ( local_ask + StopLoss * Point + AddPriceGap );
local_ordertakeprofit = sub_normalizebrokerdigits ( local_bidminuscommission - TakeProfit * Point - AddPriceGap );
if ( local_orderstoploss != OrderStopLoss() && local_ordertakeprofit != OrderTakeProfit() )
{
execution = GetTickCount();
local_wasordermodified = OrderModify ( OrderTicket(), 0, local_orderstoploss, local_ordertakeprofit, local_orderexpiretime, Orange );
}
if ( local_wasordermodified == TRUE )
{
execution = GetTickCount() - execution;
if ( TakeShots && !IsTesting() )
sub_takesnapshot();
break;
}
else
{
execution = -1;
sub_errormessages();
if ( Debug || Verbose )
Print ( "Order could not be modified because of ", ErrorDescription ( GetLastError() ) );
Sleep ( 1000 );
if ( local_orderstoploss == 0 )
local_wasordermodified = OrderModify ( OrderTicket(), 0, NormalizeDouble ( Ask + 30, brokerdigits), 0, 0, Red );
}
}
break;
}
local_counter1 ++;
break;
case OP_BUYSTOP:
if ( local_isbidgreaterthanindy == FALSE )
{
local_orderprice = sub_normalizebrokerdigits(local_ask + stoplevel + AddPriceGap);
local_orderstoploss = sub_normalizebrokerdigits ( local_orderprice - local_spread - StopLoss * Point - AddPriceGap );
local_ordertakeprofit = sub_normalizebrokerdigits ( local_orderprice + Commission + TakeProfit * Point + AddPriceGap );
while ( TRUE )
{
if ( local_orderprice < OrderOpenPrice() && OrderOpenPrice() - local_orderprice > TrailingStart )
{
if ( local_orderstoploss != OrderStopLoss() && local_ordertakeprofit != OrderTakeProfit() )
{
RefreshRates();
execution = GetTickCount();
local_wasordermodified = OrderModify ( OrderTicket(), local_orderprice, local_orderstoploss, local_ordertakeprofit, 0, Lime );
}
if ( local_wasordermodified == TRUE )
{
execution = GetTickCount() - execution;
if ( Debug || Verbose )
Print ( "Order executed in " + execution + " ms" );
}
else
{
execution = -1;
sub_errormessages();
}
}
break;
}
local_counter1 ++;
}
else
local_select = OrderDelete ( OrderTicket() );
break;
case OP_SELLSTOP:
if ( local_isbidgreaterthanindy == TRUE )
{
local_orderprice = sub_normalizebrokerdigits ( local_bid - stoplevel - AddPriceGap );
local_orderstoploss = sub_normalizebrokerdigits ( local_orderprice + local_spread + StopLoss * Point + AddPriceGap );
local_ordertakeprofit = sub_normalizebrokerdigits ( local_orderprice - Commission - TakeProfit * Point - AddPriceGap );
while ( TRUE )
{
if (local_orderprice > OrderOpenPrice() && local_orderprice - OrderOpenPrice() > TrailingStart)
{
if(local_orderstoploss != OrderStopLoss() && local_ordertakeprofit != OrderTakeProfit())
{
RefreshRates();
execution = GetTickCount();
local_wasordermodified = OrderModify ( OrderTicket(), local_orderprice, local_orderstoploss, local_ordertakeprofit, 0, Orange );
}
if ( local_wasordermodified == TRUE )
{
execution = GetTickCount() - execution;
if ( Debug || Verbose )
Print ( "Order executed in " + execution + " ms" );
}
else
{
execution = -1;
sub_errormessages();
}
}
break;
}
local_counter1 ++;
}
else
local_select = OrderDelete ( OrderTicket() );
} // 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 );
}
local_askplusdistance = local_ask + stoplevel;
local_bidminusdistance = local_bid - stoplevel;
if ( local_counter1 == 0 && local_pricedirection != 0 && sub_normalizebrokerdigits ( local_realavgspread) <= sub_normalizebrokerdigits ( MaxSpread * Point ) && globalerror == -1 )
{
if ( local_pricedirection == -1 || local_pricedirection == 2 ) // Send a BUYSTOP
{
local_orderprice = local_ask + stoplevel;
if ( ECN_Mode == TRUE )
{
local_orderprice = local_askplusdistance;
local_orderstoploss = 0;
local_ordertakeprofit = 0;
execution = GetTickCount();
local_orderticket = OrderSend ( Symbol(), OP_BUYSTOP, lotsize, local_orderprice, Slippage, local_orderstoploss, local_ordertakeprofit, OrderCmt, Magic, 0, Lime );
if ( local_orderticket > 0 )
{
execution = GetTickCount() - execution;
if ( Debug || Verbose )
Print ( "Order executed in " + execution + " ms" );
if ( TakeShots && !IsTesting() )
sub_takesnapshot();
} // end if ordersend
else
{
local_ordersenderror = TRUE;
execution = -1;
sub_errormessages();
}
if ( OrderSelect ( local_orderticket, SELECT_BY_TICKET ) )
{
RefreshRates();
local_orderprice = OrderOpenPrice();
local_ordersПоказано первые 50% кода (символов: 37062)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.