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

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

Стоимость полного кода
4 255,50₽ ≈ $52.02