//+------------------------------------------------------------------+
//| SL&TP_Up.mq4 |
//| Copyright © 2011, http://easyfx.narod.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, http://easyfx.narod.ru"
#property link "http://easyfx.narod.ru"
extern int Tral_Up=20; // Дист. преследования в пунктах
extern int TPp=250; //TakeProfit в пунктах
extern bool info=false;
//--------------------------------------------------------------- 1 --
int start() // Спец. функция start
{
string Symb=Symbol(); // Финанс. инструмент
double StopLevel=MarketInfo(Symb,MODE_STOPLEVEL);
double spred=MarketInfo(Symb,MODE_SPREAD);
double mindist=(StopLevel+spred+Tral_Up);
double LotSize=MarketInfo(Symb,MODE_LOTSIZE);
double minLot=MarketInfo(Symb,MODE_MINLOT);
double TICKVALUE=MarketInfo(Symb,MODE_TICKVALUE);
double Lot=0.02; //OrderLots( ) ; //
double Pp=(LotSize*Point)*Lot;
double P=0.03; // OrderProfit( ) ;
double RealPofit=P/Pp;
if (info==true)
{
Alert("mindist=",mindist," Digits=",Digits);
}
//--------------------------------------------------------------- 2 --
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордеров
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
int Tip=OrderType(); // Тип ордера
if(Tip>1)continue; // Не наш ордер
double SL=OrderStopLoss(); // SL выбранного орд.
double TP=OrderTakeProfit(); // TP выбранного орд.
//-------------------------------------------------------------- 3 --
while(true) // Цикл модификации
{
SL=OrderStopLoss();
TP=OrderTakeProfit();
StopLevel=MarketInfo(Symb,MODE_STOPLEVEL); //Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах
spred=MarketInfo(Symb,MODE_SPREAD); //Спрэд в пунктах 0.0002
mindist=(StopLevel+spred+Tral_Up); // 0.0009
LotSize=MarketInfo(Symb,MODE_LOTSIZE); //Размер лота
P=OrderProfit( ) ; // Прибыль ордера в $$$
minLot=MarketInfo(Symb,MODE_MINLOT); // Минимальный лот
Lot=OrderLots( ) ; // Величина лота ордеров
Pp=LotSize*Point*Lot; // Стоимость 1 пункта лота
RealPofit=P/Pp; // Прибыль ордеров в пунктах
//---------------------------------------------------------------- 4 --
bool Modify=false; // Не назначен к модифи
switch(Tip) // По типу ордера
{
case 0 : // Ордер Buy
if (SL<=(Ask-mindist*Point)&&RealPofit>=mindist) // Если ниже желаем.то модифицируем его
{
SL=Bid-mindist*Point;
TP=Ask+TPp*Point;
string Text="Buy"; // Текст для Buy
Modify=true; // Назначен к модифи.
}
break; // Выход из switch
case 1 : // Ордер Sell
if (SL>=(Bid+mindist*Point)&&RealPofit>=mindist) // Если выше желаем.или равно нулю то модифицируем его
{
SL=Ask+mindist*Point;
TP=Bid-TPp*Point;
Text="Sell"; // Текст для Sell
Modify=true; // Назначен к модифи.
}
} // Конец switch
if (Modify==false) // Если его не модифи
break; // Выход из while
//--------------------------------------------------- 5 --
double Price =OrderOpenPrice(); // Цена выбранн. орд.
int Ticket=OrderTicket(); // Номер выбранн. орд.
// Print ("Модификация ",Text,Ticket,". Ждём ответ..");
bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифи его!
//--------------------------------------------------- 6 --
if (Ans==true) // Получилось :)
{
// Print ("Ордер ",Text,Ticket," модифицирован:)");
break; // Из цикла модифи.
}
//---------------------------------------------------------------- 7 --
int Error=GetLastError(); // Не получилось :(
switch(Error) // Преодолимые ошибки
{
case 130:Print("Неправильные стопы. Пробуем ещё раз.");
RefreshRates(); // Обновим данные
continue; // На след. итерацию
case 136:Print("Нет цен. Ждём новый тик..");
while(RefreshRates()==false) // До нового тика
Sleep(1); // Задержка в цикле
continue; // На след. итерацию
case 146:Print("Подсистема торгов занята.Пробуем ещё");
Sleep(100); // Простое решение
RefreshRates(); // Обновим данные
continue; // На след. итерацию
// Критические ошибки
case 2 : Print("Общая ошибка.");
break; // Выход из switch
case 5 : Print("Старая версия клиентского терминала.");
break; // Выход из switch
case 64: Print("Счет заблокирован.");
break; // Выход из switch
case 133:Print("Торговля запрещена");
break; // Выход из switch
default: Print("Возникла ошибка ",Error);//Др. ошибки
}
break; // Из цикла модифи.
} // Конец цикла модифи.
//-------------------------------------------------------------- 8 --
} // Конец анализа орд.
} // Конец перебора орд.
//--------------------------------------------------------------- 9 --
return; // Выход из start()
}
//-------------------------------------------------------------- 10 --
