//+------------------------------------------------------------------+ //| amomotov.mq4 | //| Copyright © 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ // ///==================================================================+ ///---Глобальные и внешние переменные--------------------------------+ ///------------------------------------------------------------------+ extern double StopLoss =1000; // SL для открываемого ордера extern double TakeProfit =50; // ТР для открываемого ордера extern double Lots =1; // Жестко заданное колич. лотов extern double Prots =0.90; // Процент свободных средств (70%) bool Work=true; // Эксперт будет работать. string Symb; // Название финанс. инструмента //datetime T_1, T_2; // Условная авторская переменная ///==================================================================+ ///---Начало работы эксперта-----------------------------------------+ ///------------------------------------------------------------------+ int init(){Alert("Начало работы эксперта"); return(0);} ///==================================================================+ ///---Конец работы эксперта------------------------------------------+ ///------------------------------------------------------------------+ int deinit(){Alert("Конец работы эксперта"); return(0);} ///==================================================================+ ///---Старт----------------------------------------------------------+ ///------------------------------------------------------------------+ int start(){ ///==================================================================+ ///---Внутренние переменные------------------------------------------+ ///------------------------------------------------------------------+ int Total, // Количество ордеров в окне Tip=-1, // Тип выбран. ордера (Buy=0,Sell=1) Ticket; // Номер ордера double Price, // Цена выбранного ордера SL, // SL выбранного ордера TP, // TP выбранного ордера Lot, // Колич. лотов в выбран.ордере Min_Lot, // Минимальное количество лотов Free, // Текущие свободные средства One_Lot, // Стоимость одного лота Step, // Шаг изменения размера лота Lts; // Колич. лотов в открыв.ордере bool Cls_B=false, // Критерий для закрытия Buy Cls_S=false, // Критерий для закрытия Sell Opn_B=false, // Критерий для открытия Buy Opn_S=false, // Критерий для открытия Sell Ans =false; // Ответ сервера после закрытия ///==================================================================+ ///---Предварительная обработка--------------//----------------------+ ///------------------------------------------//----------------------+ if(Bars<50){ // Если баров меньше 50 Alert("Недостаточно баров в окне. Эксперт не работает."); return; return;} // Выход из start() if(Work==false){ // Критическая ошибка Alert("Критическая ошибка. Эксперт не работает."); return;} // Выход из start() ///==================================================================+ ///---Учёт ордеров---------------------------//----------------------+ Производится после открытия ордера, перед закрытием или модификацией ///------------------------------------------//----------------------+ Symb=Symbol(); // Название фин.инстр. Total=0; // Количество ордеров for(int i=1; i<=OrdersTotal(); i=i+1){ // Цикл перебора ордер if(OrderSelect(i-1,SELECT_BY_POS)==true){ // Если есть следующий // Анализ ордеров: if(OrderSymbol()!=Symb)continue; // Не наш фин. инструм if(OrderType()>1){ // Попался отложенный Alert("Обнаружен отложенный ордер. Эксперт не работает."); return;} // Выход из start() Total=Total+1; // Счётчик рыночн. орд if(Total>1){ // Не более одного орд Alert("Несколько рыночных ордеров. Эксперт не работает."); return;} // Выход из start() Ticket=OrderTicket(); // Номер выбранн. орд. Tip =OrderType(); // Тип выбранного орд. Price =OrderOpenPrice(); // Цена выбранн. орд. SL =OrderStopLoss(); // SL выбранного орд. TP =OrderTakeProfit(); // TP выбранного орд. Lot =OrderLots();}} // Количество лотов ///==================================================================+ ///---Торговые критерии----------------------//----------------------+ ///------------------------------------------//----------------------+ // Т - это массив таймсерии, а 7200 - это 2 часа double H_2=High[2]; double L_2=Low[2]; double L_3=Low[3]; double n_2=double MathRound((H_2*100000-L_2*100000)/2)*0.00001; double N_2=L_2+n_2; double H_1=High[1]; double L_1=Low[1]; double H_3=High[3]; double n_1=double MathRound((H_1*100000-L_1*100000)/2)*0.00001; double N_1=L_1+n_1; //T_1=Time[0]; && T_2+7200H_2 ){ // Покупаем Opn_B=true;} // Критерий откр. Buy //if(N_1>H_2){ // Cls_S=true;} // Критерий закр. Sell if(N_2>H_3 && N_10) Lts=Lots; // Если заданы лоты,то с ними и работаем Например, 2 else // Иначе, берём % свободных средств Lts=MathFloor(Free*Prots/One_Lot/Step)*Step; // Для открытия возвращает наибольшее целое число, кот. меньше или равно (...) if(Lts < Min_Lot) Lts=Min_Lot; // Лот будет не меньше миним. лота if (Lts*One_Lot > Free){ // Если лот дороже свободн. средств Alert(" Не хватает денег на ", Lts," лотов"); return;} // Выход из start() ///==================================================================+ ///---Открытие ордеров-----------------------//----------------------+ ///------------------------------------------//----------------------+ while(true){ // Цикл открытия орд. if(Total==0&&Opn_B==true){ // Если открытых нет и готовы открыть Buy, то RefreshRates(); // Обновление данных SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр. TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр. Alert("Попытка открыть Buy. Ожидание ответа.."); Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP,NULL,0,0,Green); if(Ticket>0){ // Получилось :) Alert ("Открыт ордер Buy ",Ticket); // q=1; //T_2=Time[0]; Alert ("Time = ",T_2); return;} // Выход из start() // if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return;} // Выход из start() if(Total==0&&Opn_S==true){ // Если открытых нет и готовы открыть Sell, то RefreshRates(); // Обновление данных SL=Ask + New_Stop(StopLoss)*Point; // Вычисление SL откр. TP=Ask - New_Stop(TakeProfit)*Point; // Вычисление TP откр. Alert("Попытка открыть Sell. Ожидание ответа.."); Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP,NULL,0,0,Red); if(Ticket>0){ // Получилось :) Alert ("Открыт ордер Sell ",Ticket); // q=2; //T_2=Time[0]; Alert ("Time = ",T_2); return;} // Выход из start() // if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return;} // Выход из start() break;} // Выход из while ///==================================================================+ ///---Выход из старта------------------------------------------------+ ///------------------------------------------------------------------+ return(0);} ///==================================================================+ ///---Функция обработки ошибок---------------//----------------------+ ///------------------------------------------//----------------------+ int Fun_Error(int Error){ // Ф-ия обработ ошибок switch(Error){ // Преодолимые ошибки case 4: Alert("Торговый сервер занят. Пробуем ещё раз.."); Sleep(3000); // Простое решение return(1); // Выход из функции case 135:Alert("Цена изменилась. Пробуем ещё раз.."); RefreshRates(); // Обновим данные return(1); // Выход из функции case 136:Alert("Нет цен. Ждём новый тик.."); while(RefreshRates()==false) // До нового тика Sleep(1); // Задержка в цикле return(1); // Выход из функции case 137:Alert("Брокер занят. Пробуем ещё раз.."); Sleep(3000); // Простое решение return(1); // Выход из функции case 146:Alert("Подсистема торговли занята. Пробуем ещё.."); Sleep(500); // Простое решение return(1); // Выход из функции case 2: Alert("Общая ошибка."); // Критические ошибки return(0); // Выход из функции case 5: Alert("Старая версия терминала."); Work=false; // Больше не работать return(0); // Выход из функции case 64: Alert("Счет заблокирован."); Work=false; // Больше не работать return(0); // Выход из функции case 133:Alert("Торговля запрещена."); return(0); // Выход из функции case 134:Alert("Недостаточно денег для совершения операции."); return(0); // Выход из функции default: Alert("Возникла ошибка ",Error); // Другие варианты return(0);}} // Выход из функции ///==================================================================+ ///---Функция проверки стопов----------------//----------------------+ ///------------------------------------------//----------------------+ int New_Stop(int Parametr){ // Проверка стоп-прик. int M_D=MarketInfo(Symb,MODE_STOPLEVEL); // Миним. дистанция if (Parametr