← К каталогу
Исходный код · ID 746

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 и перейдите к оплате.

Стоимость полного кода
3 706,20₽ ≈ $45.30