//+------------------------------------------------------------------+ //| 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 --