Поклонникам ГУО - страница 4

 
komposter 08.02.05 21:07

Flower_of_Life 08.02.05 17:17

Этот скрипт - первый шаг к ГУО. Это - установка ордера. Причём, сырая ещё....
Дальше можно сделать редактирование, удаление, и т.д.


Так ведь уже есть программная примочка, через которую, и так, легко можно выставить отложенный ордер на том уровне где находится курсор мыши

... достаточно правую кнопку мыши нажать, потом навести курсор на пункт "торговля", а далее уже выбрать нужный тип ордера(из двух предложенных). Причем там сразу же видна цена на которую предлогается выставить ордер , что, на мой взгляд, намного удобнее чем в этом скрипте, так как более оперативно и более грамотно реализовано ;-)

а ГУО - это в первую очередь модификация уже выставленных ордеров, путем перетаскивания линий(уроня, стопа, профита) прямо на графике...

...а потом уже все остальное...
 
Flower_of_Life 09.02.05 01:07

Так ведь уже есть программная примочка

а как же лось и профит? их то ручками приходится....
более грамотно реализовано ;-)

на звание "лучший программист" не претендую :))) попытка - не пытка ;)

а по управлению уже выставленных ордеров подумаю.....
 
2komposter

вообще-то стоп и профит это тоже отложенные ордера... (просто они идут в комплекте с основным ордером)
поэтому как раз про них и речь в основном и идет. это их и надо в большенстве случаев хватаясь за линии двигать и модифицировать

но скрипт пока основан на выставлении отложенного ордера. что давно реализовано. а графика где? где ГУО?...
 
таки склепал сегодня :))))
Зацените, господа!

редакция от 18.03.2005
Перед использованием прочитайте инструкцию =)

//+------------------------------------------------------------------+
//|                                                 Modify_Order.mq4 |
//|                                                        komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "komposter"
#property link      "mailto:komposterius@mail.ru"

/*
-----------------------------В-Н-И-М-А-Н-И-Е---------------------------------
Перед запуском скрипта настоятельно рекомендую изучить следующее руководство:

Скрипт предназначен для модификации/удаления/закрытия позиции/отложенного ордера.
Для этого необходимо:
 1) Ознакомиться с данным руководством =), !установить значения по умолчанию! (находятся под описанием,
 	 начинаются и заканчиваются строкой //+----------------------------------------------+ ),
 	 разрешить импорт внешних экспертов через меню
 	 "Сервис" -> "Настройки" -> "Советники" -> "Разрешить импортирование внешних экспертов"
 	 (необходимо для описания ошибки, которая может возникнуть при модификации ордера)
 2) Перетащить скрипт на график недалеко от ордера/позиции, который(-ую) необходимо модифицировать.
 
 3) Переместить все линии на необходимые уровни:
		- Open_Price_Line (по умолчанию - белая) - цена открытия (ТОЛЬКО ДЛЯ ОТЛОЖЕННЫХ ОРДЕРОВ)
		- Stop_Loss_Line (красная) - уровень Стоп Лосс
		- Take_Profit_Line (зелёная) - уровень Тейк Профит
		- Expiration_Line (жёлтая) - время истечения (ТОЛЬКО ДЛЯ ОТЛОЖЕННЫХ ОРДЕРОВ)

	Чтоб удалить Стоп Лосс/Тейк Профит/Время истечения - просто удалите соответствующую линию.
	Чтоб удалить отложенный ордер/закрыть позицию  - удалите линию Open_Price_Line.

 4) Когда всё будет готово, в появившемся окне нажать кнопку "ОК".
 
 Для прекращения работы скрипта в любой момент можно воспользоваться кнопкой "Отмена".
 Если Вами будет найдена ошибка в коде, или в логике работы скрипта, просьба сообщить на komposterius@mail.ru
*/
#include <stdlib.mqh>

int first = 1;
int start()
{
//+------------------------------------------------------------------+
// Максимальное расстояние в пунктах от места, на которое был "отпущен" скрипт, до
// цены открытия ордера. Для макимальной точности работы используйте "0",
// тогда ордер выделится только в случае точного попадания.
int Order_Find_Radius = 10;

// Расстояние между линией Take_Profit/Stop_Loss и линией Open_Price в пунктах по умолчанию.
// Если Take_Profit/Stop_Loss использоваться не будет, установите 0
int Take_Profit = 50;
int Stop_Loss = 50;

// Максимальное отклонение от запрошенной цены (для закрытия позиции)
int Slippage = 5;

// Время истечения ордера, выраженное в свечах
// Для периода графика H4 и Expiration_Shift = 3 время истечения наступит через 12 часов после установки
// Если необходимо стандартное время истечения для всех периодов графика, укажите "0" (без кавычек), и переходите к следующей настройке
// Если время истечения ордера использоваться не будет, установите 0
int Expiration_Shift = 0;
// Время истечения ордера, выраженное в часах
// Для того, чтоб использовать эту настройку, необходимо установить Expiration_Shift (см. выше на 2 строки) "0" (без кавычек)
// Если время истечения ордера использоваться не будет, установите 0
int Expiration_Shift_H = 0;

// Цвета отображения ордеров на графике
color Buy_Color = Lime; //( для ордеров BUYSTOP и BUYLIMIT )
color Sell_Color = Red; //( для ордеров SELLLIMIT и SELLSTOP )

// Цвета линий:
color Open_Price_Line_Color = White;
color Stop_Loss_Line_Color = Red;
color Take_Profit_Line_Color = Lime;
color Expiration_Line_Color = Yellow;

//+------------------------------------------------------------------+

double Open_Price_Level, Stop_Loss_Level, Take_Profit_Level;
datetime Expiration_Time;
int _break, error;
double DropPrice = PriceOnDropped();

// поиск ордера
for ( int x = 0; x <= Order_Find_Radius; x ++ )
{
	for ( int z = 0; z < OrdersTotal(); z ++ )
	{
		OrderSelect( z, SELECT_BY_POS, MODE_TRADES );
		if ( OrderSymbol() == Symbol() )
		{
			if ( ( DropPrice - OrderOpenPrice() )/Point <= x && ( DropPrice - OrderOpenPrice() )/Point >= 0 )
			{ _break = 1; break; }
			if ( ( OrderOpenPrice() - DropPrice )/Point <= x && ( OrderOpenPrice() - DropPrice )/Point >= 0 )
			{ _break = 1; break; }
		}
	}
	if ( _break == 1 ) { break; }
}

if ( _break != 1 )
{
	MessageBox(  "Не удалось найти ордер!\n\n" +
					 "Переместите скрипт на график недалеко от цены открытия ордера, который хотите модифицировать	", 
          	 	 "Начало работы", 0x00000000 | 0x00000010 | 0x00040000 ); 
	return(0);
}

int _OrderType = OrderType();
int _OrderTicket = OrderTicket();
double _OrderOpenPrice = OrderOpenPrice();
double _OrderStopLoss = OrderStopLoss();
double _OrderTakeProfit = OrderTakeProfit();
datetime _OrderExpiration = OrderExpiration();

// Установка начальных значений:
Open_Price_Level = _OrderOpenPrice;

if ( _OrderStopLoss > 0 )
{ Stop_Loss_Level = _OrderStopLoss; }
else
{
	if ( Stop_Loss > 0 )
	{
		if ( _OrderType == OP_BUY || _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
		{ Stop_Loss_Level = Open_Price_Level - Stop_Loss*Point; }
		else
		{ Stop_Loss_Level = Open_Price_Level + Stop_Loss*Point; }
	}
}

if ( _OrderTakeProfit > 0 )
{ Take_Profit_Level = _OrderTakeProfit; }
else
{
	if ( Take_Profit > 0 )
	{
		if ( _OrderType == OP_BUY || _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
		{ Take_Profit_Level = Open_Price_Level + Take_Profit*Point; }
		else
		{ Take_Profit_Level = Open_Price_Level - Take_Profit*Point; }
	}
}

if ( _OrderExpiration > 0 )
{ Expiration_Time = _OrderExpiration; }
else
{
	if ( _OrderType != OP_BUY && _OrderType != OP_SELL )
	{
		if ( Expiration_Shift > 0 )
		{ Expiration_Time = CurTime() + Period()*60*Expiration_Shift; }
		else
		{
			if ( Expiration_Shift_H > 0 )
				{ Expiration_Time = CurTime() + 3600*Expiration_Shift_H; }
		}
	}
}

// Создание линий:
if ( first == 1 )
{						
	ObjectCreate( "Open_Price_Line", OBJ_HLINE, 0, 0, Open_Price_Level, 0, 0, 0, 0 );
	ObjectSet( "Open_Price_Line", OBJPROP_COLOR, Open_Price_Line_Color );
	ObjectSetText( "Open_Price_Line", "Open_Price_Line", 6, "Arial", Open_Price_Line_Color );

	if ( Stop_Loss_Level > 0 )
	{
		ObjectCreate( "Stop_Loss_Line", OBJ_HLINE, 0, 0, Stop_Loss_Level, 0, 0, 0, 0 );
		ObjectSet( "Stop_Loss_Line", OBJPROP_COLOR, Stop_Loss_Line_Color );
		ObjectSetText( "Stop_Loss_Line", "Stop_Loss_Line", 6, "Arial", Stop_Loss_Line_Color );
	}

	if ( Take_Profit_Level > 0 )
	{
		ObjectCreate( "Take_Profit_Line", OBJ_HLINE, 0, 0, Take_Profit_Level, 0, 0, 0, 0 );
		ObjectSet( "Take_Profit_Line", OBJPROP_COLOR, Take_Profit_Line_Color );
		ObjectSetText( "Take_Profit_Line", "Take_Profit_Line", 6, "Arial", Take_Profit_Line_Color );
	}

	if ( Expiration_Time > 0 )
	{
		ObjectCreate( "Expiration_Line", OBJ_VLINE, 0, Expiration_Time, 0, 0, 0, 0, 0 );
		ObjectSet( "Expiration_Line", OBJPROP_COLOR, Expiration_Line_Color );
		ObjectSetText( "Expiration_Line", "Expiration_Line", 6, "Arial", Expiration_Line_Color );
	}

// вывод месседжбокса
	string Question = "Для внесения изменений переместите линии на необходимые уровни и нажмите \"ОК\".\n" + 
							"Чтоб отказаться от модификации и завершить работу, нажмите \"Отмена\".";
	int  Answer = MessageBox( Question, "Модификация ордера", 0x00000001 | 0x00000040 | 0x00040000  );
	first = 0;

	// если нажата любая кроме "ОК" кнопка - выходим
	if ( Answer != 1 ) { deinit(); return(0); }
}
// считываем значения с объектов и нормализуем:
	Open_Price_Level = NormalizeDouble( ObjectGet( "Open_Price_Line", OBJPROP_PRICE1 ), MarketInfo( Symbol(), MODE_DIGITS ) );
	Stop_Loss_Level = NormalizeDouble( ObjectGet( "Stop_Loss_Line", OBJPROP_PRICE1 ), MarketInfo( Symbol(), MODE_DIGITS ) );
	Take_Profit_Level = NormalizeDouble( ObjectGet( "Take_Profit_Line", OBJPROP_PRICE1 ), MarketInfo( Symbol(), MODE_DIGITS ) );
	Expiration_Time = ObjectGet( "Expiration_Line", OBJPROP_TIME1 );
	
	if ( Open_Price_Level == 0 )
	{
		int order;
		if ( _OrderType == OP_BUY || _OrderType == OP_SELL )
		{
			if ( _OrderType == OP_BUY ) 
			{ order = OrderClose( _OrderTicket, OrderLots(), Bid, Slippage, Buy_Color ); }
			else
			{ order = OrderClose( _OrderTicket, OrderLots(), Ask, Slippage, Sell_Color ); }
		}
		else
		{ order = OrderDelete( _OrderTicket ); }

		if ( order > 0 )
		{
// если всё ок, выводим лог и выходим
			Print( "Ордер №", _OrderTicket, " закрыт/удалён успешно!");
			return(0);
		}
		else
		{
// если ошибка - выводим сообщение и выходим
			error = GetLastError();
			Print("Ошибка при закрытии/удалении! GetLastError = ", error, ", ErrorDescription =  \"", ErrorDescription( error ), "\"" );
			MessageBox( "Ошибка при закрытии/удалении! GetLastError = " + error + ", ErrorDescription = \"" + ErrorDescription( error ) + "\"", 
             	 			"Ошибка закрытия/удаления ордера", 0x00000000 | 0x00000010 | 0x00040000 ); 
			return(-1);
		}
	return(0);
	}
	
	color _Color = Buy_Color;
// проверяем все значения
	if ( _OrderType == OP_BUY )
	{
		if ( Bid - Stop_Loss_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
		{
			Answer = MessageBox( "Неправильно установлена Stop_Loss_Line (красная линия)!\n" + 
				 		 			 	"\n" +
				 		 			 	"Для Buy - позиции она должна быть НИЖЕ Bid.	\n" + 
				 		 			 	"Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
				 		 			 	"\n\n" +
				 		 			 	"Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
				 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
		if ( Take_Profit_Level - Bid < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
		{
			Answer = MessageBox( "Неправильно установлена Take_Profit_Line (зелёная линия)!\n" + 
			 		 			 		"\n" +
			 		 			 		"Для Buy - позиции она должна быть ВЫШЕ Bid.	\n" + 
			 		 			 		"Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
			 		 			 		"\n\n" +
			 		 			 		"Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
			 		 			 		"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
	}

	if ( _OrderType == OP_BUYSTOP || _OrderType == OP_BUYLIMIT )
	{
		if ( Open_Price_Level - Stop_Loss_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
		{
			Answer = MessageBox(  "Неправильно установлена Stop_Loss_Line (красная линия)!\n" + 
					 		 			 "\n" +
					 		 			 "Для Buy, BuyLimit и BuyStop - ордеров она должна быть НИЖЕ линии Open_Price_Line.	\n" + 
					 		 			 "Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 "\n\n" +
					 		 			 "Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 "Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
		if ( Take_Profit_Level - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
		{
			Answer = MessageBox(  "Неправильно установлена Take_Profit_Line (зелёная линия)!\n" + 
					 		 			 "\n" +
					 		 			 "Для Buy, BuyLimit и BuyStop - ордеров она должна быть ВЫШЕ линии Open_Price_Line.	\n" + 
					 		 			 "Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 "\n\n" +
					 		 			 "Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 "Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
		if ( _OrderType == OP_BUYSTOP )
		{
			if ( Open_Price_Level - Bid < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
			{
				Answer = MessageBox( "Неправильно установлена Open_Price_Line (белая линия)!\n" + 
					 		 			 	"\n" +
					 		 			 	"Для BuyStop - ордера она должна быть ВЫШЕ текущей цены.	\n" + 
					 		 			 	"Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 	"\n\n" +
					 		 			 	"Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
				if ( Answer == 4 ) { start(); }
				deinit();
				return(-1);
			}
		}
		if ( _OrderType == OP_BUYLIMIT )
		{
			if ( Bid - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
			{
				Answer = MessageBox( "Неправильно установлена Open_Price_Line (белая линия)!\n" + 
					 		 			 	"\n" +
					 		 			 	"Для BuyLimit - ордера она должна быть НИЖЕ текущей цены.	\n" + 
					 		 			 	"Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 	"\n\n" +
					 		 			 	"Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
				if ( Answer == 4 ) { start(); }
				deinit();
				return(-1);
			}
		}

	}
	if ( _OrderType == OP_SELL )
	{
		_Color = Sell_Color;
		if ( Stop_Loss_Level - Ask < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
		{
			Answer = MessageBox(  "Неправильно установлена Stop_Loss_Line (красная линия)!\n" + 
					 		 			 "\n" +
					 		 			 "Для Sell - позиции она должна быть ВЫШЕ Ask.	\n" + 
					 		 			 "Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 "\n\n" +
					 		 			 "Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 "Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
		if ( Ask - Take_Profit_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
		{
			Answer = MessageBox(  "Неправильно установлена Take_Profit_Line (зелёная линия)!\n" + 
					 		 			 "\n" +
					 		 			 "Для Sell - позиции она должна быть НИЖЕ Ask.	\n" + 
					 		 			 "Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 "\n\n" +
					 		 			 "Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 "Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
	}
	if ( _OrderType == OP_SELLLIMIT || _OrderType == OP_SELLSTOP )
	{
		_Color = Sell_Color;
		if ( Stop_Loss_Level - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Stop_Loss_Level != 0 )
		{
			Answer = MessageBox(  "Неправильно установлена Stop_Loss_Line (красная линия)!\n" + 
					 		 			 "\n" +
					 		 			 "Для Sell, SellLimit и SellStop - ордеров она должна быть ВЫШЕ линии Open_Price_Line.	\n" + 
					 		 			 "Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 "\n\n" +
					 		 			 "Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 "Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
		if ( Open_Price_Level - Take_Profit_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point && Take_Profit_Level != 0 )
		{
			Answer = MessageBox(  "Неправильно установлена Take_Profit_Line (зелёная линия)!\n" + 
					 		 			 "\n" +
					 		 			 "Для Sell, SellLimit и SellStop - ордеров она должна быть НИЖЕ линии Open_Price_Line.	\n" + 
					 		 			 "Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 "\n\n" +
					 		 			 "Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 "Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { start(); }
			deinit();
			return(-1);
		}
		if ( _OrderType == OP_SELLLIMIT )
		{
			if ( Open_Price_Level - Ask < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
			{
				Answer = MessageBox( "Неправильно установлена Open_Price_Line (белая линия)!\n" + 
					 		 			 	"\n" +
					 		 			 	"Для SellLimit - ордера она должна быть НИЖЕ текущей цены.	\n" + 
					 		 			 	"Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 	"\n\n" +
					 		 			 	"Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
				if ( Answer == 4 ) { start(); }
				deinit();
				return(-1);
			}
		}
		if ( _OrderType == OP_SELLSTOP )
		{
			if ( Ask - Open_Price_Level < MarketInfo( Symbol(), MODE_STOPLEVEL )*Point )
			{
				Answer = MessageBox( "Неправильно установлена Open_Price_Line (белая линия)!\n" + 
					 		 			 	"\n" +
					 		 			 	"Для SellStop - ордера она должна быть ВЫШЕ текущей цены.	\n" + 
					 		 			 	"Минимальный отступ (" + Symbol() + ") - " + DoubleToStr( MarketInfo( Symbol(), MODE_STOPLEVEL ), 0 ) + " пунктов.\n" + 
					 		 			 	"\n\n" +
					 		 			 	"Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
				if ( Answer == 4 ) { start(); }
				deinit();
				return(-1);
			}
		}
	}

	if ( _OrderType == OP_BUY || _OrderType == OP_SELL )
	{
		if ( Open_Price_Level != _OrderOpenPrice )
		{
			Answer = MessageBox( "Нельзя двигать Open_Price_Line (белая линия) для уже открытых позиций!\n" + 
				 		 			 	"\n\n" +
				 		 			 	"Чтобы установить линию в начальное положение и начать модификацию с начала, нажмите \"Повтор\".\n" +
				 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
			if ( Answer == 4 ) { ObjectSet( "Open_Price_Line", OBJPROP_PRICE1, _OrderOpenPrice ); start(); }
			deinit();
			return(-1);
		}
		if ( Expiration_Time != 0 )
		{
				Answer = MessageBox( "Нельзя устанавливать Expiration_Line (жёлтая линия) для уже открытых позиций!\n" + 
					 		 			 	"\n\n" +
					 		 			 	"Чтобы удалить линию и начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
				if ( Answer == 4 ) {	ObjectDelete( "Expiration_Line" ); start(); }
				deinit();
				return(-1);
		}
	}
	else
	{
		if ( Expiration_Time <= CurTime() && Expiration_Time != 0 )
		{
				Answer = MessageBox( "Неправильно установлена Expiration_Line (жёлтая линия)!\n" + 
					 		 			 	"\n" +
					 		 			 	"Срок истечения ордера не может быть в прошедшем времени!		\n" + 
					 		 			 	"\n\n" +
					 		 			 	"Чтобы начать модификацию с начала, нажмите \"Повтор\".\n" +
					 		 			 	"Чтоб отказаться от модификации, нажмите \"Отмена\".", "Модификация ордера", 0x00000005 | 0x00000030 | 0x00040000 );
				if ( Answer == 4 ) { start(); }
				deinit();
				return(-1);
		}
	}
	
// выводим инфу о запросе и пытаемся модифицировать ордер
	Print( "OrderTicket=",_OrderTicket, ",_OrderType=",_OrderType, ",Open_Price_Level=",Open_Price_Level, ",Stop_Loss_Level=", Stop_Loss_Level, ",Take_Profit_Level=", Take_Profit_Level, ",Expiration_Time=", Expiration_Time, ",_Color=", _Color );
	int ordermodify = OrderModify( _OrderTicket, Open_Price_Level, Stop_Loss_Level, Take_Profit_Level, Expiration_Time, _Color );
	if ( ordermodify > 0 )
	{
// если всё ок, выводим лог и выходим
		OrderPrint();
		Print( "Ордер №", _OrderTicket, " модифицирован успешно!");
		return(0);
	}
// если ошибка - выводим сообщение и выходим
	error = GetLastError();
	Print("Ошибка при модификации! GetLastError = ", error, ", ErrorDescription =  \"", ErrorDescription( error ), "\"" );
	MessageBox( "Ошибка при модификации! GetLastError = " + error + ", ErrorDescription = \"" + ErrorDescription( error ) + "\"", 
             	 	"Ошибка модификации ордера", 0x00000000 | 0x00000010 | 0x00040000 ); 
return(-1);
}

int deinit()
{
// удаление всех объектов, созданных скриптом
	ObjectDelete( "Open_Price_Line" );
	ObjectDelete( "Stop_Loss_Line" );
	ObjectDelete( "Take_Profit_Line" );
	ObjectDelete( "Expiration_Line" );
return(0);
}
 
чёт с кодировкой....... вот мля....

разобрался.....всё ок
 
Спасибо за титанический труд :)

Только надо бы ещё и для цвета цены ордера создать переменную чтобы можно было не рыская по коду в поисках нужного места поменять его

color Price_Color = Orange;
...
// и где-то в строке 116 поменять ObjectSet( "Open_Price_Line", OBJPROP_COLOR, Black ); на 
ObjectSet( "Open_Price_Line", OBJPROP_COLOR, Price_Color );



А то на чёрном графике (а он у многих так по умолчанию и остаётся чёрным) трудно понять куда делась линия цены открытия ордера.

 
Ну и в каталог скриптов этот скрипт и Send_pending_order.mq4 было бы не плохо поместить.
 
Horn, спасибо :)

с цветами уже сделал, а вот в каталог ещё рано - надо потестить.... там наверняка глюков море всплывёт =)
 
Komposter, отдохни, попей пива, пятница же сегодня. Смотреть даже больно. ))))))
 
пиво будет вечером :) и до понедельника........... )))