Ошибки, баги, вопросы - страница 52

 
а в МТ4  вроде не так было, спасибо. просто снес его
 

При тестировании экспертов:
 Exp_TEMA.mq5,из статьи: "Создание эксперта, торгующего на разных инструментах" , выражения Told[]  Tnew[1]получают следующие значения:
Told[]      Expression could not be evaluated
Tnew[1]   Invalid array range.

и  My_First_EA.mq5, из статьи: "Пошаговое руководство по написанию MQL5-советников для начинающих", выражение
New_Time[1] получает  значение:Invalid array range

Что обозначают значения Expression could not be evaluated,Invalid array range, и как они влияют на результаты работы экспертов?

 

 

Told - пустой массив без размера

Tnew[1] - выходит за пределы массива, массив описан как Tnew[1], поэтому к его элементам можно обращаться только как к Tnew[0], так как индекс начинается с нуля.

 
Renat:

Told - пустой массив без размера

Tnew[1] - выходит за пределы массива, массив описан как Tnew[1], поэтому к его элементам можно обращаться только как к Tnew[0], так как индекс начинается с нуля.


На счет Tnew я уже говорил в другой ветке форума, видимо нужен был комментарий разработчиков :)
 

Подскажите пожалуйста как открывать только одну сделку по условию. С моим кодом терминал открывает несколько сделок по данному условию, а нужно только одну.

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

В результате получается такая картинка:

 

 Как проверить совершалась ли сделка с данными условиями или нет? Пробовал так не идет:

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

Подскажите пожалуйста как открывать только одну сделку по условию. С моим кодом терминал открывает несколько сделок по данному условию, а нужно только одну.

В результате получается такая картинка:

 

 Как проверить совершалась ли сделка с данными условиями или нет? Пробовал так не идет:

 

А нафига устраивать перебор в цикле если есть такая замечательная вещица как PositionSelect?

Просто проверяем наличие позиции по интересующему нас инструменту и если возвращается true идем спокойно пить коньяк и курить сигары... :)

PS

При этом как я понимаю PositionGetString без PositionSelect работать не должна. Нам ведь не нужно узнать символы всех открытых поз, верно?

 
Interesting:

А нафига устраивать перебор в цикле если есть такая замечательная вещица как PositionSelect?

Просто проверяем наличие позиции по интересующему нас инструменту и если возвращается true идем спокойно пить коньяк и курить сигары... :)

PS

При этом как я понимаю PositionGetString без PositionSelect работать не должна. Нам ведь не нужно узнать символы всех открытых поз, верно?

 

Такой код учитывает наличие открытой позиции:

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

Но продолжает при условии открывать позиции при выполнении условия Buy_Signal. Мне нужно чтобы до наступления условия Sell_Signal позиции по Buy_Signal больше не открывались. Пытаюсь реализовать это так:

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
Не идет.
 
AM2:

Такой код учитывает наличие открытой позиции:

Но продолжает при условии открывать позиции при выполнении условия Buy_Signal. Мне нужно чтобы до наступления условия Sell_Signal позиции по Buy_Signal больше не открывались. Пытаюсь реализовать это так:

Не идет.

А почему именно такой код? Он даже с большой натяжкой не напоминает то что я имел введу (я вообще сомневаюсь в том что там все верно)

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

А я имел введу примерно вот это:

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

На худой конец все можно оформить в блоке

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

А почему именно такой код? Он даже с большой натяжкой не напоминает то что я имел введу (я вообще сомневаюсь в том что там все верно)

А я имел введу примерно вот это:

На худой конец все можно оформить в блоке

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

Такой и выше код не откроют позицию пока она не закрыта, но откороют заново после закрытия на следующем баре при выполнении условия. Я реализовал это так:

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

Спасибо! Учел все пожелания. Сейчас все работает. Советник выложил для публикации. Можно и еще внести изменения в код. Совращенству нет предела )))

 
В документации не нашел описания кодов ответа (Retcode) для структуры результатов проверки торгового запроса MqlTradeCheckResult. Будут ли они?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5
Причина обращения: