Группа "Напишу исправлю советник индикатор MQL4"

Рейтинг 27



если можно заменить в советнике который вы помогли собрать еще чуток дороботать его.

если не сильно напрягаю — можно добавить пересечение 2 машек для открытия ордера при условии что советник сам торгует. вместо выше или ниже средней.
заранее благодарен буду.

//------- мувинги для работы ----------------------------------------+
extern string name_MA1 = "________ Быстрый MA_1 ________"; // Индикатор ==>>
extern int ma1_period = 13; // Период
extern int ma1_shift = 0; // Сдвиг
extern ENUM_MA_METHOD ma1_method = MODE_EMA; // Метод MA
extern ENUM_APPLIED_PRICE ma1_applied_price = PRICE_CLOSE; // Применить к

input string name_MA2 = "________ Средний MA_2 ________"; // Индикатор ==>>
extern int ma2_period = 26; // Период
extern int ma2_shift = 0; // Сдвиг
extern ENUM_MA_METHOD ma2_method = MODE_EMA; // Метод MA
extern ENUM_APPLIED_PRICE ma2_applied_price = PRICE_CLOSE; // Применить к

//+------------------------------------------------------------------+
//|                           Copyright © 2021, forex-time@mail.ru   |
//+------------------------------------------------------------------+
#property copyright   "Copyright © 2021, forex-time@mail.ru"
#property strict 
//+------------------------------------------------------------------+
enum trade
  {
   Auto,  //Авто
   Fixed  //Ручная
  };
//+----------------+
extern trade  MethodTrade = Auto;  //Торговля МЕНЮ ==>>

extern double Lots        = 0.1;   //Фиксированный лот
extern double MaxLot      = 5.0;   //MAX лот
extern double KLot        = 2.0;   //Увеличение лота

extern double Profit      = 15.0;  //Закрыть общий профит $
extern double Loss        = 0.0;   //Общий убыток $ (=0 откл)

extern int    TakeProfit  = 0;     //Тейк профит (=0 откл)
extern int    DistNewOrd  = 300;   //Дистанция новый ордер
extern int    MaxOrd      = 10;    //MAX ордеров
extern int    Magic       = 0;     //Магик ордеров

extern string IndMA       = "=== Moving Average ==="; //Индикатор ===>>
extern int    PeriodMA    = 20;            //Период
extern int    ShiftMA     = 3;             //Сдвиг линии
extern ENUM_MA_METHOD MethodMA = MODE_SMA; //Метод
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   //Убрать сетку при тесте
   if(IsTesting()) ChartSetInteger(0,CHART_SHOW_GRID,false);
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //Закрытие ордеров
   if(OP(-1)>0 && //Если есть ордера
     (PrfOP(-1)>=Profit|| //Общий профит больше значения
     (PrfOP(-1)<0 && Loss!=0.0 && MathAbs(PrfOP(-1))>=MathAbs(Loss))|| //Общий убыток больше значения
     (OP(0)==0 && OP(1)==0))) //Нет открытых рыночных ордеров
      DeleteAll(); //Закрыть и удалить все ордера

   //Если выбран метод торговли АВТО
   if(MethodTrade==Auto){
     //Сигналы индикатора МА
     int SignalMA=-1;
     //Цена открытия текущей свечи выше МА и цена открытия предыдущей свечи ниже МА
     if(Open[0]>MA(0) && Open[1]<=MA(1)) SignalMA=0;
     //Цена открытия текущей свечи ниже МА и цена открытия предыдущей свечи выше МА
     if(Open[0]<MA(0) && Open[1]>=MA(1)) SignalMA=1;
     //Если нет ордеров, то открыть первый по сигналу МА
     if(OP(-1)==0){
        double TPb=0.0,TPs=0.0;
        if(TakeProfit>0){
           TPs=ND(Bid-TakeProfit*Point,Digits);
           TPb=ND(Ask+TakeProfit*Point,Digits);
           }
        //Сигнал МА, открыть ордер в направлении
        if(SignalMA==0) Send(OP_BUY,Lots,Ask,0,TPb,Blue);
        if(SignalMA==1) Send(OP_SELL,Lots,Bid,0,TPs,Red);
        }
      }
   //Если есть рыночные ордера то ставить отложенные
   if((OP(0)>0||OP(1)>0) && OP(-1)<MaxOrd)
     {
      //Рассчитать тейк профит для отложенных
      double TPb=0.0,TPs=0.0;
      if(TakeProfit>0){
         TPs=ND(LastPrcOP(0)-(DistNewOrd+TakeProfit)*Point,Digits);
         TPb=ND(LastPrcOP(1)+(DistNewOrd+TakeProfit)*Point,Digits);
         }
      //Поставить отложенный противоположный последнему рыночному 
      int Spread=int(((Ask-Bid)/Point)*2); //Дистанция нового ордера должна быть больше спреда *2
      if(DistNewOrd>0 && DistNewOrd>=Spread){
      if(LastTypeOP()==0 && OP(5)==0) Send(OP_SELLSTOP,Lot(),ND(LastPrcOP(0)-DistNewOrd*Point,Digits),0,TPs,Red);
      if(LastTypeOP()==1 && OP(4)==0) Send(OP_BUYSTOP,Lot(),ND(LastPrcOP(1)+DistNewOrd*Point,Digits),0,TPb,Blue);
      }
    }
  }   
//+------------------------------------------------------------------+
//| Индикатор Moving Average                                         |
//+------------------------------------------------------------------+
double MA(int bar){ 
   double ma=iMA(Symbol(),0, PeriodMA,ShiftMA,MethodMA,PRICE_CLOSE, bar);
return(ma);}
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу                                 |
//+------------------------------------------------------------------+
int OP(int type=-1){
   int op=0;
   for(int i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(OrderType()==type||type<0) op++;}
return(op);}
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу                                      |
//+------------------------------------------------------------------+
double PrfOP(int type=-1){
   double pf=0.0;
   for(int i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol()){
   if(OrderType()==type||type<0) pf+=OrderProfit()+OrderCommission()+OrderSwap();}
return(pf);}
//+------------------------------------------------------------------+
//| Цена последнего ордера по типу                                   |
//+------------------------------------------------------------------+
double LastPrcOP(int type=-1){
   double prc=0.0;
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if((OrderType()==type||type<0) && t<OrderOpenTime()) {t=OrderOpenTime(); prc=OrderOpenPrice();}}
return(prc);}
//+------------------------------------------------------------------+
//| Тип последнего ордера                                            |
//+------------------------------------------------------------------+
int LastTypeOP(){
   int type=-1;
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(t<OrderOpenTime()) {t=OrderOpenTime(); type=OrderType();}}
return(type);}
//+------------------------------------------------------------------+
//| Расчёт лота                                                      |
//+------------------------------------------------------------------+
double Lot(){
   double lot=0;
   if(OP(-1)>0) lot=ND(Lots*MathPow(KLot,OP(-1)),2);
   if(lot>MaxLot) lot=Lots;
return(lot);}
//+------------------------------------------------------------------+
//| ND - нормализация числа                                          |
//-------------------------------------------------------------------+
double ND(double value, int digits) {  
      return(NormalizeDouble(value, digits));}
//+------------------------------------------------------------------+
//| Открытие, закрытие ордеров                                       | 
//+------------------------------------------------------------------+
void Send(int type, double lt, double price, double sl, double tp, color clr){
   int send=0;
       send=OrderSend(Symbol(),type,lt,price,30,sl,tp,"",Magic,0,clr);
   if (send>0)
       Print("Успешно открыт ордер "+TypeToStr(type),", Lot: "+(string)lt,", Ticket: "+(string)send,", Magic: "+(string)Magic);
       else 
       Print("Невозможно открыть ордер "+TypeToStr(type),". Ошибка: "+string(GetLastError()));}
//+------------------------------------------------------------------+ 
void DeleteAll(){
   color cls=Gray;
   for(int i=OrdersTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(OrderType()==OP_BUY)  cls=DeepSkyBlue;
   if(OrderType()==OP_SELL) cls=Magenta;
   if(!OrderSelect(OrderTicket(),SELECT_BY_TICKET)||OrderCloseTime()>0) return;
   if(OrderType()<2 && !OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,cls)) Print("Невозможно закрыть ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));
   if(OrderType()>1 && !OrderDelete(OrderTicket())) Print("Невозможно удалить ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));}} 
//+------------------------------------------------------------------+ 
string TypeToStr(int type) {
   switch(type) {
      case 0: return("Buy");
      case 1: return("Sell");
      case 2: return("BuyLimit");
      case 3: return("SellLimit");
      case 4: return("BuyStop");
      case 5: return("SellStop");}
return("NONE");}
//-------------------------------------------------------------------+
  • +4
  • Просмотров: 1504
  • 4 февраля 2022, 06:57
  • eduard9898
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Напишу исправлю советник индикатор MQL4", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
индикатор исправить
30 января 2022
04 марта 2022

Брокер для ваших роботов, 15 лет на рынке

Комментарии (3)

+
0
Советник EA2ma
Сигнал по факту пересечения 2-х МА
Скачать: www.opentraders.ru/downloads/3244/
Редактировать: forex-time@mail.ru
avatar

  15  forextime Сообщений: 141 - ExpertFX

  • 4 февраля 2022, 10:57
+
0
я пытался сам переделать но не смог чуток мозга не хватило — сижу сейчас учюсь спасибо еще раз.
avatar

  6  eduard9898 Автор Сообщений: 81

  • 4 февраля 2022, 12:24
+
0
forextime ExpertFX доброе время суток! пользуюсь советником уже 8 месяцев помаленьку в профите с условием что сам не чего не трогаю *good* 

можно попросить добавить трейлинг стоп т.к бывает что уходит в + до тейка не доходит и опять ожидание чуда. с благодарностью и уважением.
avatar

  6  eduard9898 Автор Сообщений: 81

  • 27 декабря 2022, 13:01

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий