помогите доработать советник

 

всем привет! Помогите пожалуйста доработать советник. Не могу поменять бай и селл местами



extern string EASettings  = "";     // EA Settings

extern double fixLot      = 0.01;   // FixLot

extern int    stopLoss    = 50;     // StopLoss

extern int    takeProfit  = 50;     // TakeProfit

extern int    deviation   = 80;     // Deviation

extern int    magic       = 123;    // Magic


extern string             MASettings = "";            // Moving Average Settings

extern int                MAPeriod   = 50;            // Period

extern ENUM_MA_METHOD     MAMethod   = MODE_SMA;      // Method

extern ENUM_APPLIED_PRICE MAPrice    = PRICE_CLOSE;   // Price


//--- глобальные переменные

double MAValue;     // текущее значение МА

double openPrice;   // цена открытия позиции

long   chartID;     // идентификатор графика

bool   upTrend;     // true - текущая тенденция восходящая

bool   dnTrend;     // true - текущая тенденция нисходящая

bool   posOpen;     // true - позиция открыта

//+-----------------------------------------------------------------------------------------------+

int OnInit()

{  

   //--- проверим корректность настроек

   if(!CheckSettings()) ExpertRemove();

   chartID = ChartID();

   if(GetOrdersNumber() > 0) posOpen = true;

   return INIT_SUCCEEDED;

}

//+-----------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

   ObjectDelete("OpenPrice");

}

//+-----------------------------------------------------------------------------------------------+

void OnTick()

{

   if(GetOrdersNumber() == 0) posOpen = false;

   

   //--- узнаем текущую тенденцию

   MAValue = NormPrice(iMA(_Symbol, PERIOD_CURRENT, MAPeriod, 0, MAMethod, MAPrice, 0));

   

   if(MAValue < Bid) { upTrend = true; dnTrend = false; }

   if(MAValue > Bid) { dnTrend = true; upTrend = false; }

   

   //--- текущая тенденция восходящая

   if(upTrend)

   {

      //--- нет открытых позиций

      if(!posOpen)

      {

         openPrice = MAValue + deviation * _Point;

         CreateLine("OpenPrice", "Продажа", openPrice, clrDimGray);

      }

      //--- откроем позицию на продажу

      if(!posOpen && Bid >= openPrice)

         OpenMarketOrder(OP_SELL, fixLot, Bid);

   }

   

   //--- текущая тенденция нисходящая

   if(dnTrend)

   {

      //--- нет открытых позиций

      if(!posOpen)

      {

         openPrice = MAValue - deviation * _Point;

         CreateLine("OpenPrice", "Покупка", openPrice, clrDimGray);

      }

      //--- откроем позицию на покупку

      if(!posOpen && Ask <= openPrice)

         OpenMarketOrder(OP_BUY, fixLot, Ask);

   }

}

//+-----------------------------------------------------------------------------------------------+

//| Функция открывает рыночный ордер                                                              |

//+-----------------------------------------------------------------------------------------------+

void OpenMarketOrder(int type, double lots, double price)

{

   int ticket = OrderSend(_Symbol, type, lots, price, 0, 0, 0, "", magic, 0);

   

   if(ticket > 0) { SetSLTP(ticket); posOpen = true; ObjectDelete("OpenPrice"); }

}

//+-----------------------------------------------------------------------------------------------+

//| Функция устанавливает StopLoss и TakeProfit                                                   |

//+-----------------------------------------------------------------------------------------------+

void SetSLTP(int ticket)

{

   double sl = 0;

   double tp = 0;

   

   if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))

   {

      int    type = OrderType();

      double oop  = OrderOpenPrice();

      

      if(type == OP_BUY)

      {

         sl = NormPrice(oop - stopLoss   * _Point);

         tp = NormPrice(oop + takeProfit * _Point);

      }

      if(type == OP_SELL)

      {

         sl = NormPrice(oop + stopLoss   * _Point);

         tp = NormPrice(oop - takeProfit * _Point);

      }

      if(OrderModify(ticket, oop, sl, tp, 0)) return;

   }

}

//+-----------------------------------------------------------------------------------------------+

//| Функция создает линию на графике                                                              |

//+-----------------------------------------------------------------------------------------------+

void CreateLine(string name, string descrip, double price, color clr)

{

   ObjectDelete(name);

   

   ObjectCreate(chartID, name, OBJ_HLINE, 0, 0, price);

   ObjectSetInteger(chartID, name, OBJPROP_WIDTH, 1);

   ObjectSetInteger(chartID, name, OBJPROP_STYLE,STYLE_SOLID);

   ObjectSetInteger(chartID, name, OBJPROP_COLOR, clr);

   ObjectSetInteger(chartID, name, OBJPROP_BACK, false);

   ObjectSetInteger(chartID, name, OBJPROP_SELECTABLE, false);

   ObjectSetInteger(chartID, name, OBJPROP_SELECTED, false);

   ObjectSetInteger(chartID, name, OBJPROP_HIDDEN, true);

   ObjectSetString(chartID, name, OBJPROP_TEXT, descrip);

}

//+-----------------------------------------------------------------------------------------------+

//| Функция возвращает количество открытых ордеров                                                |

//+-----------------------------------------------------------------------------------------------+

int GetOrdersNumber(void)

{

   int number = 0;

   for(int i = 0; i < OrdersTotal(); i++)

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

         if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic)

            number++;

   return number;

}

//+-----------------------------------------------------------------------------------------------+

//| Функция нормализует цену                                                                      |

//+-----------------------------------------------------------------------------------------------+

double NormPrice(double price)

{

   return NormalizeDouble(price, _Digits);

}

//+-----------------------------------------------------------------------------------------------+

//| Функция проверяет корректность настроек советника                                             |

//+-----------------------------------------------------------------------------------------------+

bool CheckSettings(void)

{

   double maxLot = MarketInfo(_Symbol, MODE_MAXLOT);

   double minLot = MarketInfo(_Symbol, MODE_MINLOT);

   

   if(fixLot > maxLot)

   {

      Alert("Количество лотов должно быть меньше или равно ", maxLot);

      return false;

   }

   if(fixLot < minLot)

   {

      Alert("Количество лотов должно быть больше или равно ", minLot);

      return false;

   }

   

   double stopLevel = MarketInfo(_Symbol, MODE_STOPLEVEL);

   double spread    = MarketInfo(_Symbol, MODE_SPREAD);

   

   if(stopLoss < stopLevel + spread)

   {

      Alert("Убыток должен быть больше или равен ", stopLevel + spread, " пунктам");

      return false;

   }

   if(takeProfit < stopLevel + spread)

   {

      Alert("Прибыль должна быть больше или равна ", stopLevel + spread, " пунктам");

      return false;

   }

   

   int pip = 2;

   if(_Digits == 3 || _Digits == 5) pip *= 10;

   

   if(deviation < pip)

   {

      Alert("Отклонение должно быть больше или равно ", pip, " пунктам");

      return false;

   }

   return true;

}

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Sergey Golubev, 2020.03.23 16:08

Вставляйте правильно код -

----------------‌

MQL5.community - Памятка пользователя 

Кнопка  Исходный кодпредназначена для вставки исходного кода в текст сообщения. При нажатии появляется пустое окно, в которое необходимо вставить код и далее нажать кнопку Вставить. Для отмены вставки кода необходимо нажать кнопку Отмена.


 
gala_aka_47:

всем привет! Помогите пожалуйста доработать советник. Не могу поменять бай и селл местами

если бы Вы, код правильно вставили - я бы уже поменял местами, придётся пол дня лишние строчки удалять, что бы разобраться с кодом

  Снимок

 
Alexsandr San:

если бы Вы, код правильно вставили - я бы уже поменял местами, придётся пол дня лишние строчки удалять, что бы разобраться с кодом

Если есть огромное желание колупаться в этом, то достаточно поставить метку в стилизаторе

И одним кликом крыски все пустые строки будут удалены.

 
Alexey Viktorov:

Если есть огромное желание колупаться в этом, то достаточно поставить метку в стилизаторе

И одним кликом крыски все пустые строки будут удалены.

Спасибо! сейчас попробую - а то я, уже забросил

-------------------

блин хорошая штука, а я, частенько время трачу на это дело .  правда ещё немного все равно остались пустоты - но это не так много   

 

не чего такого не менял - только вот это добавил Revers 

extern bool   Revers      = false;  // Revers
      //--- нет открытых позиций
      if(!posOpen)
        {
         openPrice = MAValue + deviation * _Point;
         CreateLine("OpenPrice", "Продажа", openPrice, clrDimGray);
        }
      if(Revers)
        {
         //--- откроем позицию на продажу
         if(!posOpen && Bid >= openPrice)
            OpenMarketOrder(OP_SELL, fixLot, Bid);
        }
      if(!Revers)
        {
         //--- откроем позицию на покупку
         if(!posOpen && Ask <= openPrice)
            OpenMarketOrder(OP_BUY, fixLot, Ask);
        }
     }
//--- текущая тенденция нисходящая
   if(dnTrend)
     {
      //--- нет открытых позиций
      if(!posOpen)
        {
         openPrice = MAValue - deviation * _Point;
         CreateLine("OpenPrice", "Покупка", openPrice, clrDimGray);
        }
      if(Revers)
        {
         //--- откроем позицию на покупку
         if(!posOpen && Ask <= openPrice)
            OpenMarketOrder(OP_BUY, fixLot, Ask);
        }
      if(!Revers)
        {
         //--- откроем позицию на продажу
         if(!posOpen && Bid >= openPrice)
            OpenMarketOrder(OP_SELL, fixLot, Bid);
        }

результат до 

был

результат реверс 

стал

Файлы:
revers.mq4  18 kb
 
Alexsandr San:

не чего такого не менял - только вот это добавил Revers 

результат до 

результат реверс 


ещё если стрелочки развернуть 

вот так 

//--- текущая тенденция восходящая
   if(upTrend)
     {
      //--- нет открытых позиций
      if(!posOpen)
        {
         openPrice = MAValue + deviation * _Point;
         CreateLine("OpenPrice", "Продажа", openPrice, clrDimGray);
        }
      if(Revers)
        {
         //--- откроем позицию на продажу
         if(!posOpen && Bid >= openPrice)
            OpenMarketOrder(OP_SELL, fixLot, Bid);
        }
      if(!Revers)
        {
         //--- откроем позицию на покупку
         if(!posOpen && Ask >= openPrice)
            OpenMarketOrder(OP_BUY, fixLot, Ask);
        }
     }
//--- текущая тенденция нисходящая
   if(dnTrend)
     {
      //--- нет открытых позиций
      if(!posOpen)
        {
         openPrice = MAValue - deviation * _Point;
         CreateLine("OpenPrice", "Покупка", openPrice, clrDimGray);
        }
      if(Revers)
        {
         //--- откроем позицию на покупку
         if(!posOpen && Ask <= openPrice)
            OpenMarketOrder(OP_BUY, fixLot, Ask);
        }
      if(!Revers)
        {
         //--- откроем позицию на продажу
         if(!posOpen && Bid <= openPrice)
            OpenMarketOrder(OP_SELL, fixLot, Bid);
        }

вот результат

этот второй как правильно открывает 

после стрелок 

Файлы:
2_revers.mq4  18 kb
 
Брибыль от этого советника есть?
Причина обращения: