Дайте оценку ниже приведённому коду.
вот смотрите задание:
Открытие бай, при открытии выставляются ТП и СЛ или не выставляются: пересечение быстрой МА медленную снизу вверх. Открытие селл, при открытии выставляются ТП и СЛ или не выставляются: пересечение быстрой МА медленную сверху вниз. Закрытие позиции либо по обратному сигналу, либо по тейку, либо по стопу. нужен трейлин стандартный.
и вот исполнение:
//+------------------------------------------------------------------+ //| snowman .mq4 | //| ForTrader | //| https://www.mql5.com/ru/users/ForTrader | //+------------------------------------------------------------------+ #property copyright "ForTrader" #property link "https://www.mql5.com/ru/users/ForTrader" //--------------------------------------------------------------- 1 -- extern string Q = "Период усреднения."; extern int Period_MA_1=11; // Период МА 1 extern int Period_MA_2=31; // Период МА 2 extern string Q1 = "Сдвиг индикатора."; extern int ma_shift_1 = 0; extern int ma_shift_2 = 0; extern string Q2 = "Метод усреднения."; extern int ma_method_1 = 1; extern int ma_method_2 = 1; extern string Q3 = "Используемая цена."; extern int applied_price_1 = 0; extern int applied_price_2 = 0; extern string Q4 = "Индекс получаемого значения."; extern int shift_1 = 1; extern int shift_2 = 1; extern double StopLoss =400; // SL для открываемого ордера extern double TakeProfit =200; // ТР для открываемого ордера extern double Lots =0.1; // Жестко заданное колич. лотов extern double Prots =0.07; // Процент свободных средств extern int TralingStop=0; int Total, // Количество ордеров в окне Tip=-1, // Тип выбран. ордера (B=0,S=1) Level_new, Ticket; // Номер ордера double Price, // Цена выбранного ордера SL, // SL выбранного ордера TP; // TP выбранного ордера bool Opn_B2=false, // Критерий для открытия Buy Opn_S2=false, // Критерий для открытия Sell Work=true; // Эксперт будет работать. string Symb; // Название финанс. инструмента //--------------------------------------------------------------- 2 -- int start() { double MA_1_t, // Значен. МА_1 текущее MA_2_t, // Значен. МА_2 текущее MA_1_prev, // Значен. МА_1 MA_2_prev, // Значен. МА_2 Lot, // Колич. лотов в выбран.ордере Lts, // Колич. лотов в открыв.ордере Min_Lot, // Минимальное количество лотов Step, // Шаг изменения размера лота Free, // Текущие свободные средства One_Lot; // Стоимость одного лота bool Ans =false, // Ответ сервера после закрытия Cls_B=false, // Критерий для закрытия Buy Cls_S=false, // Критерий для закрытия Sell Opn_B=false, // Критерий для открытия Buy Opn_S=false; // Критерий для открытия Sell //--------------------------------------------------------------- 3 -- // Предварит.обработка if(Bars < Period_MA_2) // Недостаточно баров { Alert("Недостаточно баров в окне. Эксперт не работает."); return; // Выход из start() } if(Work==false) // Критическая ошибка { Alert("Критическая ошибка. Эксперт не работает."); return; // Выход из start() } //--------------------------------------------------------------- 4 -- // Учёт ордеров Symb=Symbol(); // Название фин.инстр. Total=0; // Количество ордеров for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер { if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий { // Анализ ордеров: if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм if (OrderType()>1) // Попался отложенный { Alert("Обнаружен отложенный ордер. Эксперт не работает."); return; // Выход из start() } Total++; // Счётчик рыночн. орд if (Total>1) // Не более одного орд { Alert("Несколько рыночных ордеров. Эксперт не работает."); return; // Выход из start() } Ticket=OrderTicket(); // Номер выбранн. орд. Tip =OrderType(); // Тип выбранного орд. Price =OrderOpenPrice(); // Цена выбранн. орд. SL =OrderStopLoss(); // SL выбранного орд. TP =OrderTakeProfit(); // TP выбранного орд. Lot =OrderLots(); // Количество лотов if(OrderTakeProfit()>0 && TralingStop>0) Tral_Stop(Tip); } } //--------------------------------------------------------------- 5 -- // Торговые критерии MA_1_t =iMA(NULL,0,Period_MA_1,ma_shift_1,ma_method_1,applied_price_1,shift_1); // МА_1 MA_2_t =iMA(NULL,0,Period_MA_2,ma_shift_2,ma_method_2,applied_price_2,shift_1); // МА_2 MA_1_prev=iMA(NULL,0,Period_MA_1,ma_shift_1,ma_method_1,applied_price_1,shift_1+1); // МА_1 MA_2_prev=iMA(NULL,0,Period_MA_2,ma_shift_2,ma_method_2,applied_price_2,shift_2+1); // МА_2 if (MA_1_t > MA_2_t && MA_1_prev < MA_2_prev && Opn_B2==false) { Opn_B=true; // Критерий откр. Buy Opn_B2=true; // Критерий закр. Opn_S2=false; } if (MA_1_t < MA_2_t && MA_1_prev > MA_2_prev && Opn_S2==false) { Opn_S =true; // Критерий откр. Sell Opn_S2=true; Opn_B2=false; // Критерий закр. Buy } //--------------------------------------------------------------- 6 -- // Закрытие ордеров while(true) // Цикл закрытия орд. { if (Tip==0 && Cls_B==true) // Открыт ордер Buy.. { //и есть критерий закр Alert("Попытка закрыть Buy ",Ticket,". Ожидание ответа.."); RefreshRates(); // Обновление данных Ans=OrderClose(Ticket,Lot,Bid,2); // Закрытие Buy if (Ans==true) // Получилось :) { Alert ("Закрыт ордер Buy ",Ticket); break; // Выход из цикла закр } if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return; // Выход из start() } if (Tip==1 && Cls_S==true) // Открыт ордер Sell.. { // и есть критерий закр Alert("Попытка закрыть Sell ",Ticket,". Ожидание ответа.."); RefreshRates(); // Обновление данных Ans=OrderClose(Ticket,Lot,Ask,2); // Закрытие Sell if (Ans==true) // Получилось :) { Alert ("Закрыт ордер Sell ",Ticket); break; // Выход из цикла закр } if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return; // Выход из start() } break; // Выход из while } //--------------------------------------------------------------- 7 -- // Стоимость ордеров RefreshRates(); // Обновление данных Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Миним. колич. лотов Free =AccountFreeMargin(); // Свободн средства One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота Step =MarketInfo(Symb,MODE_LOTSTEP); // Шаг изменен размера if (Lots > 0) // Если заданы лоты,то Lts =Lots; // с ними и работаем 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() } //--------------------------------------------------------------- 8 -- // Открытие ордеров while(true) // Цикл закрытия орд. { if (Total==0 && Opn_B==true) // Открытых орд. нет + { // критерий откр. Buy RefreshRates(); // Обновление данных if(StopLoss>0) SL=Bid - New_Stop(StopLoss)*Point; // Вычисление SL откр. else SL=0; if(TakeProfit>0) TP=Bid + New_Stop(TakeProfit)*Point; // Вычисление TP откр. else TP=0; Alert("Попытка открыть Buy. Ожидание ответа.."); Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//Открытие Buy if (Ticket > 0) // Получилось :) { Alert ("Открыт ордер Buy ",Ticket); 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);//Открытие Sel if (Ticket > 0) // Получилось :) { Alert ("Открыт ордер Sell ",Ticket); return; // Выход из start() } if (Fun_Error(GetLastError())==1) // Обработка ошибок continue; // Повторная попытка return; // Выход из start() } break; // Выход из while } //--------------------------------------------------------------- 9 -- return; // Выход из start() } //-------------------------------------------------------------- 10 -- 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); // Выход из функции } } //-------------------------------------------------------------- 11 -- int New_Stop(int Parametr) // Проверка стоп-прик. { int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция if (Parametr<Min_Dist) // Если меньше допуст. { Parametr=Min_Dist; // Установим допуст. Alert("Увеличена дистанция стоп-приказа."); } return(Parametr); // Возврат значения } //-------------------------------------------------------------- 12 -- // Mas_Ord_New Массив ордеров последний известный // int TralingStop Значение TralingStop(количество пунктов) //--------------------------------------------------------------- 13 -- int Tral_Stop(int Tip) { double TS; // TralingStop (относит.знач.цены) bool Modify; // Признак необходимости модифи. //--------------------------------------------------------------- 14 -- for(int i=1;i<=OrdersTotal();i++) // Цикл по всем ордерам { // Ищем ордера задан. типа Modify=false; // Пока не назначен к модифи //if (TralingStop<Level_new) // Если меньше допустимого.. // TralingStop=Level_new; // .. то допустимый TS=TralingStop*Point; // То же в относит.знач.цены //--------------------------------------------------------- 15 -- switch(Tip) // Переход на тип ордера { case 0 : // Ордер Buy if (NormalizeDouble(SL,Digits)<// Если ниже желаемого.. NormalizeDouble(Bid-TS,Digits)) { // ..то модифицируем его: SL=Bid-TS; // Новый его StopLoss Modify=true; // Назначен к модифи. } break; // Выход из switch case 1 : // Ордер Sell if (NormalizeDouble(SL,Digits)>// Если выше желаемого.. NormalizeDouble(Ask+TS,Digits)|| NormalizeDouble(SL,Digits)==0)//.. или нулевой(!) { // ..то модифицируем его SL=Ask+TS; // Новый его StopLoss Modify=true; // Назначен к модифи. } } // Конец switch if (Modify==false) // Если его не надо модифи.. continue; // ..то идём по циклу дальше bool Ans=OrderModify(Ticket,Price,SL,TP,0);//Модифицируем его! //--------------------------------------------------------- 16 -- } return; // Выход из пользов. функции } //--------------------------------------------------------------- 17 --
if(OrderTakeProfit()>0 && TralingStop>0) Tral_Stop(Tip);
а если тейкпрофита нет то траллинг не пашет?
Этот код из учебника! Для новичков супер.
А зачем нужна оценка? Чей это код?
не считаю что автора кода нужно указывать, мне интересно мнение спецов.
У меня были претензии по коду но исполнитель не захотел исправлять, вот и подумал: быть может не прав я?
не считаю что автора кода нужно указывать, мне интересно мнение спецов.
У меня были претензии по коду но исполнитель не захотел исправлять, вот и подумал: быть может не прав я?
кстати а что в Вашем задании нужен трейлин стандартный
мне для себя интересно, кем определен стандарт? и где он стандартный трелйинг? где расписан его алгоритма для стандартного трейлинга?
а если тейкпрофита нет то траллинг не пашет?
Этот код из учебника! Для новичков супер.
не считаю что автора кода нужно указывать, мне интересно мнение спецов.
У меня были претензии по коду но исполнитель не захотел исправлять, вот и подумал: быть может не прав я?
Тогда какие были претензии? А то нападать на исполнителей все мастера. Для претензий есть арбитраж. Почему бы в арбитраж не обратиться и не решить там все вопросы?
Это эта работа? https://www.mql5.com/ru/job/7572 - тут тоже на МА
![MQL5 работа: Сов на машках MQL5 работа: Сов на машках](/i/community/logo_mql5_small.png)
- www.mql5.com
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования