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

 
Переменной, а не котировки. Есть подсчёт в строковой переменной, а дабл в строковую преобразуется с указанной точностью. Это конечно сильно.
 
Кстати, это к теме, что котировка на пятизнаке приходит с количеством знаков после запятой больше пяти. Хотел сделать автоматическую проверку, оказывается, не так это просто на этом языке. А пока вручную принтом проверил. Нету там знаков больше пяти, часто это бывает? Может это на 4м терминале было?
 
ладно, тут систематический игнор сообщений. Надо опять тему создавать.
 
pribludilsa #:
ладно, тут систематический игнор сообщений. Надо опять тему создавать.

темы были уже на эту тему. В строку и количество знаков стринг посчитать. Сперва правда надо посчитать количество знаков перед запятой. Можно приведением к целому. И коряво так же к стринг привести))))

 
Alexey Viktorov #:

В тестере мт4 нельзя открывать ордера на других парах, а всё остальное доступно без проблем.

Благодарю, и вправду, можно получать в тестере значение индикаторов с другого инструмента.
Александр #:

Проверьте наличие котировок по AUDUSD, по нужному ТФ

Именно в этом и оказалась загвоздка. Дело в том, что я тестировал в выходной день (воскресенье) и "загружал" архив котировок по нужному инструменту (AUDUSD), но, оказывается, они просто не загружались в выходной день, поскольку серверы моего форекс-дилера в выходной день были недоступны. А сегодня в понедельник загрузка архива котировок и тестирование прошли успешно.
MakarFX #:
Каюсь, не прав, сам не знал.
Ничего страшного, твои ответы в личных сообщениях оказались гораздо более ценными.

Очень приятно, что здесь люди отвечают и помогают друг другу. Далеко не все ответы можно найти в документации)
 
Valeriy Yastremskiy #:

темы были уже на эту тему. В строку и количество знаков стринг посчитать. Сперва правда надо посчитать количество знаков перед запятой. Можно приведением к целому. И коряво так же к стринг привести))))

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

 
Valeriy Yastremskiy #:

темы были уже на эту тему. В строку и количество знаков стринг посчитать. Сперва правда надо посчитать количество знаков перед запятой. Можно приведением к целому. И коряво так же к стринг привести))))

Приведение к целому, да, наверно только это. Мне тоже это в голову пришло, но показалось слишком сложным, сделать какой то цикл умножения либо деления на 10. Еще не продумал.
 
MakarFX #:
 
//+----------------------------------------------------------------------------+
//| Модификация ордеров                           |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
 double
   BuyPriceMax = 0, BuyPriceMin = 0, BuyPriceMaxLot = 0, BuyPriceMinLot = 0, 
   SelPriceMin = 0, SelPriceMax = 0, SelPriceMinLot = 0, SelPriceMaxLot = 0;

   int
   BuyPriceMaxTic = 0, BuyPriceMinTic = 0, SelPriceMaxTic = 0, SelPriceMinTic = 0;

   double
   op = 0, lt = 0, order_lots = 0;

   int
   tk = 0, b = 0, s = 0;
   price = 0;tp = 0;

   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber() == Magic)
            if(OrderSymbol() == Symbol() &&  OrderType() == otype)
              {
               op = NormalizeDouble(OrderOpenPrice(), Digits());
               lt = NormalizeDouble(OrderLots(), 2);
               tk = OrderTicket();
               if(otype == OP_BUY)
                 {
                  b++;
                  if(op > BuyPriceMax || BuyPriceMax == 0)
                    {
                     BuyPriceMax    = op;
                     BuyPriceMaxLot = lt;
                     BuyPriceMaxTic = tk;
                    }
                  if(op < BuyPriceMin || BuyPriceMin == 0)
                    {
                     BuyPriceMin    = op;
                     BuyPriceMinLot = lt;
                     BuyPriceMinTic = tk;
                    }
                 }
               
               if(otype == OP_SELL)
                 {
                  s++;
                  if(op > SelPriceMax || SelPriceMax == 0)
                    {
                     SelPriceMax    = op;
                     SelPriceMaxLot = lt;
                     SelPriceMaxTic = tk;
                    }
                  if(op < SelPriceMin || SelPriceMin == 0)
                    {
                     SelPriceMin    = op;
                     SelPriceMinLot = lt;
                     SelPriceMinTic = tk;
                    }
                 }
               if (otype == OP_BUY || otype == OP_SELL) 
                  {
                   price += OrderOpenPrice() * OrderLots();
                   order_lots += OrderLots();
                  }
              }
//*************************************************************//
double   AwerageBuyPrice = 0, AwerageSelPrice = 0, avg_price = 0;
      if(b >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
         AwerageBuyPrice = NormalizeDouble((BuyPriceMax*BuyPriceMaxLot + BuyPriceMin*BuyPriceMinLot)/
         (BuyPriceMaxLot + BuyPriceMinLot) + TakeProfitMinMaxOrder* Point(), Digits());
      if(s >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
         AwerageSelPrice = NormalizeDouble((SelPriceMax * SelPriceMaxLot + SelPriceMin * SelPriceMinLot)/ 
         (SelPriceMaxLot + SelPriceMinLot) - TakeProfitMinMaxOrder* Point(), Digits());
      if (Drawdown < DrawdownClosingMinMaxOrder) 
         avg_price = NormalizeDouble(price / order_lots, Digits);
//*************************************************************//
   for(int i = OrdersTotal() - 1; i >= 0; i--)
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber() == Magic)
            if(OrderSymbol() == Symbol())
              {
               op  = NormalizeDouble(OrderOpenPrice(), Digits());
               tp = NormalizeDouble(OrderTakeProfit(), Digits());
               lt  = NormalizeDouble(OrderLots(), 2);
               tk  = OrderTicket();

                  if(otype == OP_BUY && b >= 2 && Drawdown >= DrawdownClosingMinMaxOrder)
                    {
                     if(tk == BuyPriceMaxTic || tk == BuyPriceMinTic)
                        if(Bid < AwerageBuyPrice && tp != AwerageBuyPrice)
                           if(!OrderModify(tk, op, OrderStopLoss(), AwerageBuyPrice, 0, clrRed))
                              Print("OrderModify error #", GetLastError());

                     if(tk != BuyPriceMaxTic && tk != BuyPriceMinTic && tp != 0)
                        if(!OrderModify(tk, op, 0, 0, 0, clrRed))
                           Print("OrderModify error #", GetLastError());
                    }
                  if(otype == OP_SELL && s >= 2  && Drawdown >= DrawdownClosingMinMaxOrder)
                    {
                     if(tk == SelPriceMaxTic || tk == SelPriceMinTic)
                        if(Ask > AwerageSelPrice && tp != AwerageSelPrice)
                           if(!OrderModify(tk, op, OrderStopLoss(), AwerageSelPrice, 0, clrRed))
                              Print("OrderModify error #", GetLastError());

                     if(tk != SelPriceMaxTic && tk != SelPriceMinTic && tp != 0)
                        if(!OrderModify(tk, op, 0, 0, 0, clrRed))
                           Print("OrderModify error #", GetLastError());
                    }
                 if (Drawdown < DrawdownClosingMinMaxOrder)    
                 if (otype == OP_BUY) tp = NormalizeDouble (avg_price + TakeProfitGroupOrder*Point, Digits);
                 if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfitGroupOrder*Point, Digits); 
                    {
                    if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                      Print("Ордера успешно модифицированы!");
                      else Print("Ошибка модификации ордеров!");
                    } 
             } 
}
 
Valeriy Yastremskiy #:

Может что то не знаю? Так же не возможно получить данные баров с других инструментов по времени тестера, они будут получены по текущему времени. Поэтому мультивалютник даже просто в расчетной части у меня не получается тестировать в 4ке.

Всегда считал что тестер МТ4 полностью эмулирует среду одного инструмента, а МТ5 всю среду, которая доступна.

Или это не так?

Валерий, обрати внимание на строку

  sd = (int)MarketInfo("EURJPY", MODE_DIGITS);

в моём коде… Я уже давно использую пятёрочные функции, но вот аналогичная функция

SymbolInfoInteger("EURJPY", SYMBOL_DIGITS);

дала ссстакая 0.

Вот и думай где тараканы… А в следствии того, что мт4 поддерживать отказываются, то можно предположить, что исправлено не будет никогда…

Всё остальное надо проверять. Я этим не заморачивался так давно, что и вспоминать не хочется.

 

Alexey Viktorov #:

Я уже давно использую пятёрочные функции

Можете подсказать, где можно изучить MQL5 (на русском языке)?

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