Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1115

 
всё разобрался, это просто битый файл, а экзешник целый, вот он и работает...
 
xxz:

......
советник работает но при попытке его открыть в эдиторе

......

xxz:

это не экзешник, а mq5 файл...

это мой код...

Ну так правильно формируйте фразы.

По теме. Я обычно открываю такие проблемные в Notepad++. Помогает. Но не всегда )))

 
Сергей Таболин:

Ну так правильно формируйте фразы.

По теме. Я обычно открываю такие проблемные в Notepad++. Помогает. Но не всегда )))

вот и я в нехт редакторе решил просмотреть, а там почти одни нули, хотя размер у файла был нормальный как и должен быть...

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 

Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.

Функция OnTick()

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   
   GetData();
   CheckForOpen();
   CheckForCloseCP();
   CheckForCloseAll();

}
//+------------------------------------------------------------------+

За открытие позиций отвечает только функция CheckForOpen(), вот она:

enum opp_mode {
   DoClose,       // Close and reverse with initial lot
   DoReverse,     // Close and reverse (continue Martingale last lot)
   DoHedge,       // No closing reversal (Hedge mode)
};

// Trade & MM Section
input opp_mode Mode_opp    = DoHedge;     // Trading Mode

//+------------------------------------------------------------------+
//| Check for Open function                                          |
//+------------------------------------------------------------------+
void CheckForOpen() {

   if (!IsBarNew) return;

double lot=0;
positions=Positions();

   if (Signal==OP_BUY) {
      if (longs>0) return;
      if (shorts==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
      }
      if (shorts>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode SELL by opposite signal."); 
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing SELL by opposite signal.");
            lot=GetMaxLot(ORDER_TYPE_SELL);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging SELL by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
         }
      }
   }
   if (Signal==OP_SELL) {
      if (shorts>0) return;
      if (longs==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
      }
      if (longs>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode BUY by opposite signal."); 
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing BUY by opposite signal."); 
            lot=GetMaxLot(ORDER_TYPE_BUY);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging BUY by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
         }
      }
   }
}
//+------------------------------------------------------------------+

Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.

//+------------------------------------------------------------------+
//| Place Market Order function                                      |
//+------------------------------------------------------------------+
bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) {   //  mn - Magic Number

double d_sl=0, d_tp=0;

   MqlTick stTick;
   if (SymbolInfoTick(_Symbol,stTick)==false) {
      Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
   }

   Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
         ", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));

   if (MathAbs(lot-Lot)<1e-5) {MartinCounterB=0; MartinCounterS=0;}
     
   if (oper==OP_BUY)  {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _ask=stTick.ask;
         d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1e-5) d_sl=ND(0.0);
         d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1e-5) d_tp=ND(0.0);
         if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
   if (oper==OP_SELL) {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _bid=stTick.bid;
         d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1e-5) d_sl=ND(0.0);
         d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1e-5) d_tp=ND(0.0);
         if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
     
   return(false);
     
}
//+------------------------------------------------------------------+

Функция контроля открытия нового бара:

//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
bool   IsBarNew=false;


//+------------------------------------------------------------------+
//| Bar refreshing function                                          |
//| true - new bar opened, false - not opened                        |
//+------------------------------------------------------------------+
bool IsNewBar() {

static datetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
       datetime curTime  =iTime(NULL,PERIOD_CURRENT,0);

   if (curTime>SavedTime) {
         SavedTime=curTime;
         return(true);
   }
   else return(false);
}
//+------------------------------------------------------------------+

Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.


Весь советник.

Файлы:
 
Grigori.S.B:

Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.

Функция OnTick()

За открытие позиций отвечает только функция CheckForOpen(), вот она:

Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.

Функция контроля открытия нового бара:

Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.


Весь советник.

Я использую такую функцию для контроля нового бара - бывает, что имеются ошибки при копировании даты бара.

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(_Symbol,0,0,1,tm)<0)
     {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
     }
   else
     {
      if(prevBarTime!=tm[0])
        {
         prevBarTime=tm[0];
         return true;
        }
      return false;
     }
   return true;
  }
 
Aleksey Vyazmikin:

Я использую такую функцию для контроля нового бара - бывает, что имеются ошибки при копировании даты бара.

Спасибо. Попробую заменить. Хотя до сих пор и мною использованная функция работала нормально. Появилась идея вывести принтами время открытия бара и цену, тогда будет четко видно что ошибка именно в этом.

Но смущает то, что дуплеты появляются только при открытии первой позиции, последующие позиции открываются корректно и советник работает часами, генерируя их десятками. А функция контроля открытия бара работает каждый раз. Да и по условиям советник открывает первую позицию когда нет ни одной, а последующие только когда цена прошла достаточное расстояние после открытия первой.

 
Grigori.S.B:

Написал советник. У того кому писал, при первом запуске открывает две позиции сразу одна за другой. У себя такой проблемы воспроизвести не могу. Прошу помощи.

Функция OnTick()

За открытие позиций отвечает только функция CheckForOpen(), вот она:

Функция, отправляющая запрос на открытие позиции с рынка. Добавил в нее повтор с задержкой при отказе сервера т.к. при тестировании на MetaQuotes MT5 demo очень часто получал requotes/offquotes.

Функция контроля открытия нового бара:

Вторая позиция открывается сразу же после первой, в ту же секунду, тикеты различаются на единицу. Изначально предполагал что висит вторая копия советника на втором графике, попросил закрыть все, оставить один график и запустить советник, но по словам и судя по скриншоту заказчика причина не в этом. Последующие позиции открываются по одной, больше дуплетов нет. Воспроизвести не могу, уже голову сломал об это. Тестирую как и заказчик на МТ5 демо ICMarkets hedge. Скриншот дуплета.


Весь советник.

А как вы проверяете, что на этом баре ещё не открывалась позиция?

 
Artyom Trishkin:

А как вы проверяете, что на этом баре ещё не открывалась позиция?

Нет, такой проверки нет.

Есть такие проверки:

  • Если открылся новый бар, то с его первым тиком может быть открыта позиция,
  • Если позиций нет, то может быть открыта первая позиция.
Т.е. тут получается почему-то на первом же тике нового бара открываются две позиции разом. Причем только первые позиции. Дальше такого феномена не наблюдается.
 
Grigori.S.B:

Нет, такой проверки нет.

Есть такие проверки:

  • Если открылся новый бар, то с его первым тиком может быть открыта позиция,
  • Если позиций нет, то может быть открыта первая позиция.
Т.е. тут получается почему-то на первом же тике нового бара открываются две позиции разом. Причем только первые позиции. Дальше такого феномена не наблюдается.

Нет времени разбираться что там у вас. Но попробуйте проверять количество открытых позиций на новом баре. Если нету - то открыть.

Причина обращения: