Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 762

 
Artyom Trishkin:

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

  1. Добавляете в советник отслеживание вновь открытых позиций и, если она не имеет магика, значит она открыта вручную. Советник при этом должен выставить значок открытия этой позиции на цене и баре её открытия. В имени объекта обязательно должен присутствовать префикс с общим названием объекта для всех таких объектов, например - "manual_", и обязательно должен присутствовать тикет позиции. В итоге имя создаваемого объекта может быть таким: "manual_12345678". Здесь: manual_ - префикс, 12345678 - тикет позиции.
  2. Добавляете в советник OnChartEvent() и отслеживаете событие щелчка мыши по объекту. Анализируете имя объекта и, если там присутствует подстрока manual_, то смотрите что там за номер после manual_. Этот номер и есть тикет позиции, по значку которой вы щёлкнули мышкой.
  3. Далее дело техники: нужно сохранить найденный номер так, чтобы он не потерялся при перезапуске советника/терминала/компьютера/мира... Например, в ресурсах или глобальных переменных терминала.
  4. Советник должен читать этот ресурс и брать из него тикеты позиций, которые ему предстоит тралить
  5. В цикле трала берёте тикет выбранной позиции и ищете этот номер в сохранённом списке тикетов. Если такой тикет найден, то позицию с этим тикетом нужно тралить.
  6. При изменении количества позиций нужно проверить тикет закрытой позиции и найти его в сохранённом списке. Если такой тикет в списке существует, то его нужно удалить из этого списка - позиции уже нету, и нечего её тикету делать в списке тикетов для трала.
Как-то так примерно. Логику писал на коленке, так что мог не учесть чего...


Спасибо за разъяснения, теперь понятно про что речь.

Мне пока что для использования советника о проскальзывании мало что известно - в уроках по mql рекомендуют ставить 3(речь шла о EURUSD), но ведь ликвидность у валют разная и скорость движения то же. На какие цифры можно ориентироваться при спокойном рынке для долларовых пар и кросссов?

 
Можно ли заполнить многомерный буфер с помощью функций CopyOpen, CopyHigh, CopyLow и CopyClose а то у меня не получается. В описании сказано что копирует в динамический массив - а динамический массив может быть многомерным MQL5
 
Alexandr Sokolov:
Можно ли заполнить многомерный буфер с помощью функций CopyOpen, CopyHigh, CopyLow и CopyClose а то у меня не получается. В описании сказано что копирует в динамический массив - а динамический массив может быть многомерным MQL5

используйте одномерный массив...

 
Alexandr Sokolov:
Можно ли заполнить многомерный буфер с помощью функций CopyOpen, CopyHigh, CopyLow и CopyClose а то у меня не получается. В описании сказано что копирует в динамический массив - а динамический массив может быть многомерным MQL5

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

int  ArrayCopyRates( 
   void&     dest_array[][],    // массив, переданный по ссылке 
   string    symbol=NULL,       // инструмент 
   int       timeframe=0        // таймфрейм 
   );

Если всё нормально с пониманием, то лучше

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

Здравствуйте. Попытался собрать советник из нескольких, в тестере стратегий все работает как надо (проверял в режиме визуализации). Ставлю на демо счет и периодически возникает следующая проблема ордер открывается и тут же удаляется и так на протяжении часа пока не сменится час. Думал одновременно возникает условие на вход и удаление ордера, но здесь удаление только по времени, удалял весь этот блок ошибка не исчезла. Если кому не трудно подскажите где ошибка.

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
      
   CurrHour = TimeHour(TimeCurrent());
   
   if (CloseByTime == true && DayOfWeek() == DayEnd && CurrHour >= CloseHour)
   {
      if (CountTrades() > 0 || CountStop() > 0) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek() && CurrHour == StartHour && ((!SetLimits && CountStop() == 0) || (SetLimits && CountLimits() == 0)) && CountTrades() == 0)
   {
      high = iHigh(Symbol(), 0, 1);
      low  = iLow(Symbol(), 0, 1);
      spread = MarketInfo(Symbol(),MODE_SPREAD);
      
      if ((high - low)/Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble(high + Indent*Point, Digits);
         sell = NormalizeDouble(low - Indent*Point, Digits);
        
      
         if (FixedLot > 0)
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true)
         {
            if (AccountBalance() < abalance) 
               Lots = getlotlast();
            else abalance = AccountBalance();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread*Point - TPP*Point);
            tp_buy  = ND(buy + spread*Point + TPP*Point);
         
            sl_sell = ND(sell + SLP*Point+spread*Point);
            sl_buy  = ND(buy-SLP*Point-spread*Point);
            
          if (iClose(NULL,1440,1) < iMA(NULL,1440,PeriodMA,0,MODE_EMA,PRICE_CLOSE,1)) 
                  OrderSendReliable(Symbol(), OP_SELLSTOP, Lots, (sell-spread*Point), Slippage, sl_sell,  tp_sell, comment, Magic, 0, Red);
                                                                         
                                                                        else
                  OrderSendReliable(Symbol(), OP_BUYSTOP,  Lots, (buy+spread*Point),  Slippage, sl_buy, tp_buy,  comment, Magic, 0, Blue);
                                                                       
         
            
         }else
         {
            tp_sell = ND(sell - MathAbs(buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +  MathAbs(buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs(buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs(buy-sell)*StopLossK);
         
            OrderSendReliable(Symbol(), OP_SELLLIMIT, Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0, Red);
            OrderSendReliable(Symbol(), OP_BUYLIMIT,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0, Blue);
         }
      }
   }
   return(0);
}
 
craft11111:

Здравствуйте. Попытался собрать советник из нескольких, в тестере стратегий все работает как надо (проверял в режиме визуализации). Ставлю на демо счет и периодически возникает следующая проблема ордер открывается и тут же удаляется и так на протяжении часа пока не сменится час. Думал одновременно возникает условие на вход и удаление ордера, но здесь удаление только по времени, удалял весь этот блок ошибка не исчезла. Если кому не трудно подскажите где ошибка.

Нужно делать перебор в цикле через OrderSelect

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

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

void ModifyLoss()
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() < SL && (Ask - OrderOpenPrice())/Point>= BUP)
         {
            if (SL != ND(OrderStopLoss()))
               OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      } else
      if (OrderType() == OP_SELL)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() > SL && (OrderOpenPrice()-Bid)/Point >= BUP)
         {
            if (SL != ND(OrderStopLoss()))
                OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      }
   }
}
 
craft11111:

Здравствуйте. Попытался собрать советник из нескольких, в тестере стратегий все работает как надо (проверял в режиме визуализации). Ставлю на демо счет и периодически возникает следующая проблема ордер открывается и тут же удаляется и так на протяжении часа пока не сменится час. Думал одновременно возникает условие на вход и удаление ордера, но здесь удаление только по времени, удалял весь этот блок ошибка не исчезла. Если кому не трудно подскажите где ошибка.

Прописывай в управляющих торговлей функциях Print(__FUNCTION__) или в блоках Print(такой-то блок, такие-то параметры) . Смотри, что в каком порядке срабатывают функции/блоки. Первая, что сработала, а не должна была, вот к ней тогда и вопрос. Полагаться на то, что "я описал тут довольно несовместимые условия для одновременного их срабатывания" не стоит. Может быть блок не должен был сработать, но внешние параметры позволили ему включится, может внутри блока что-то не должно было сработать.

 

OnChartEvent() не работает в тестере.

Покажите, пожалуйста, кнопку которая может работать в тестере. Например, нажать на которую, будет поднят флаг trade = true; ещё раз нажать? trade = false;

 
Ghabo:

OnChartEvent() не работает в тестере.

Покажите, пожалуйста, кнопку которая может работать в тестере. Например, нажать на которую, будет поднят флаг trade = true; ещё раз нажать? trade = false;

В OnTick() контролируйте нажатие кнопки. Можно сделать по условию, если работает в тестере - контроль в OnTick(), а в реале блок этого контроля выполняться не будет и будет контроль в OnChartEvent()

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