Новые сообщения · Участники · Правила форума · Поиск · RSS · Вход · Регистрация ·

Страница 1 из 6123456»
Форум трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Исправление ошибок в советниках на новых билдах (Помощь в исправлении)
Исправление ошибок в советниках на новых билдах

expforexДата: Четверг, 04.09.2014, 12:55 | Сообщение # 1
Главный Администартор
Группа: Администраторы
Сообщений: 9113
Награды: 29
Статус: Offline


[Бонусы за сообщения ]


Исправление ошибок в советниках. Ошибки при компиляции? Мы постараемся Вам помочь.

С начала 2014 года компания MetaQuotes выпустила большое обновление для терминалов MetaTrader4.

В связи с этим, у трейдеров, которые не умеют программировать, возникли серьезные проблемы - советники попросту перестали работать.
Причина всему этому - более сложный язык программирования.
Эксперты, которые изначально были написаны правильно, не подвергаются такой проблеме. Но немало советников и индикаторов, которые изначально написаны неверно, вовсе отказались работать.
Есть несколько способов решения данной проблемы, от попросту - "забить" до исправления ошибок на профессиональном уровне.

Мы написали статью по стандартным ошибкам в старых экспертах, которые можно исправить:
Новый язык программирования, Исправление ошибок при компиляции экспертов

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

Для того чтобы Вам помогли в данной ветке, выполните несколько шагов:

  • 1. Прикрепите эксперт в открытом коде с ошибками (Декомпил не приветствуется)
  • 2. Прикрепите информацию по данному эксперту, первоначальное ТЗ на разработку, либо документацию, что эксперт должен делать
  • 3. Прикрепите картинку с графика, где стоит эксперт, если он работает но не так.
  • 4. Опишите проблемы, которые возникли с экспертом на новом билде.
    Мы постараемся помочь Вам в решении данных проблем.




Прикрепления: 0900205.jpg(24Kb)


Программирование на заказ || Наши Разработки
 
Сообщение

Исправление ошибок в советниках. Ошибки при компиляции? Мы постараемся Вам помочь.

С начала 2014 года компания MetaQuotes выпустила большое обновление для терминалов MetaTrader4.

В связи с этим, у трейдеров, которые не умеют программировать, возникли серьезные проблемы - советники попросту перестали работать.
Причина всему этому - более сложный язык программирования.
Эксперты, которые изначально были написаны правильно, не подвергаются такой проблеме. Но немало советников и индикаторов, которые изначально написаны неверно, вовсе отказались работать.
Есть несколько способов решения данной проблемы, от попросту - "забить" до исправления ошибок на профессиональном уровне.

Мы написали статью по стандартным ошибкам в старых экспертах, которые можно исправить:
Новый язык программирования, Исправление ошибок при компиляции экспертов

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

Для того чтобы Вам помогли в данной ветке, выполните несколько шагов:

  • 1. Прикрепите эксперт в открытом коде с ошибками (Декомпил не приветствуется)
  • 2. Прикрепите информацию по данному эксперту, первоначальное ТЗ на разработку, либо документацию, что эксперт должен делать
  • 3. Прикрепите картинку с графика, где стоит эксперт, если он работает но не так.
  • 4. Опишите проблемы, которые возникли с экспертом на новом билде.
    Мы постараемся помочь Вам в решении данных проблем.





Автор - expforex
Дата добавления - 04.09.2014 в 12:55

ScrudgДата: Четверг, 04.09.2014, 12:55 | Сообщение # 2
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

Всем привет.
Собственно сабж в названии темы.
При переводе старого кода на новый билд, многие сталкиваются с проблемой ошибок.
По этому предлагаю в этой теме друг другу помогать и исправлять ошибки кода .

Моя проблема в следующем, этот код ругается на
check operator precedence for possible error; use parentheses to clarify precedence  

Прописав скобки

if ((OrderType() == OP_BUY && OrderOpenPrice() > Bid) || )OrderType() == OP_SELL && OrderOpenPrice() < Ask)) return;

появляются другие...  smile

Помогите исправить....



Код
void _TrailingStop() {
    double l_price_4;
    double l_price_20;
    double l_price_28;
    double l_price_36;
    double l_price_44;
    if (_trailingStop == 2) {
       for (int l_pos_0 = 0; l_pos_0 < OrdersTotal(); l_pos_0++) {
          if (OrderSelect(l_pos_0, SELECT_BY_POS)) {
             if (OrderSymbol() != Symbol() || OrderMagicNumber() != MAGICMA) continue;
            [color=#000000] [color=#1e84cc][color=#ff0000]if (OrderType() == OP_BUY && OrderOpenPrice() > Bid || OrderType() == OP_SELL && OrderOpenPrice() < Ask) return;
             l_price_4 = get_stop_loss(OrderType(), _trailing2 * Point);
             if ((OrderType() == OP_BUY && OrderStopLoss() < l_price_4) || (OrderType() == OP_SELL && OrderStopLoss() > l_price_4)) {
                while (IsTradeContextBusy()) Sleep(1000);
                RefreshRates();
                OrderModify(OrderTicket(), OrderOpenPrice(), l_price_4, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
             }
          }
       }
    }
    if (_trailingStop == 1) {
       l_price_20 = NormalizeDouble(iMA(Symbol(), 0, MA, 0, MODE_SMA, PRICE_CLOSE, 0) + 10.0 * Point, Digits);
       l_price_28 = NormalizeDouble(iMA(Symbol(), 0, MA, 0, MODE_SMA, PRICE_CLOSE, 0) - 10.0 * Point, Digits);
       l_price_36 = NormalizeDouble(iFractals(Symbol(), 0, MODE_UPPER, 3), Digits);
       l_price_44 = NormalizeDouble(iFractals(Symbol(), 0, MODE_LOWER, 3), Digits);
       if (OrdersTotal() > 0) {
          for (l_pos_0 = OrdersTotal() - 1; l_pos_0 >= 0; l_pos_0--) {
             if (OrderSelect(l_pos_0, SELECT_BY_POS)) {
                if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) {
                   [color=#ff0000]if (OrderType() == OP_BUY && OrderOpenPrice() > Bid || OrderType() == OP_SELL && OrderOpenPrice() < Ask) break;
                   if (OrderType() == OP_BUY && OrderStopLoss() < OrderOpenPrice()) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_28, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                   if (OrderType() == OP_BUY && OrderStopLoss() > OrderOpenPrice() && OrderStopLoss() < l_price_44) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_44, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                   if (OrderType() == OP_SELL && OrderStopLoss() > OrderOpenPrice()) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_20, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                   if (OrderType() == OP_SELL && OrderStopLoss() < OrderOpenPrice() && OrderStopLoss() > l_price_36 && l_price_36 != 0.0) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_36, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                }
             }
          }
       }
    }
}

 
СообщениеВсем привет.
Собственно сабж в названии темы.
При переводе старого кода на новый билд, многие сталкиваются с проблемой ошибок.
По этому предлагаю в этой теме друг другу помогать и исправлять ошибки кода .

Моя проблема в следующем, этот код ругается на
check operator precedence for possible error; use parentheses to clarify precedence  

Прописав скобки

if ((OrderType() == OP_BUY && OrderOpenPrice() > Bid) || )OrderType() == OP_SELL && OrderOpenPrice() < Ask)) return;

появляются другие...  smile

Помогите исправить....


Код
void _TrailingStop() {
    double l_price_4;
    double l_price_20;
    double l_price_28;
    double l_price_36;
    double l_price_44;
    if (_trailingStop == 2) {
       for (int l_pos_0 = 0; l_pos_0 < OrdersTotal(); l_pos_0++) {
          if (OrderSelect(l_pos_0, SELECT_BY_POS)) {
             if (OrderSymbol() != Symbol() || OrderMagicNumber() != MAGICMA) continue;
            [color=#000000] [color=#1e84cc][color=#ff0000]if (OrderType() == OP_BUY && OrderOpenPrice() > Bid || OrderType() == OP_SELL && OrderOpenPrice() < Ask) return;
             l_price_4 = get_stop_loss(OrderType(), _trailing2 * Point);
             if ((OrderType() == OP_BUY && OrderStopLoss() < l_price_4) || (OrderType() == OP_SELL && OrderStopLoss() > l_price_4)) {
                while (IsTradeContextBusy()) Sleep(1000);
                RefreshRates();
                OrderModify(OrderTicket(), OrderOpenPrice(), l_price_4, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
             }
          }
       }
    }
    if (_trailingStop == 1) {
       l_price_20 = NormalizeDouble(iMA(Symbol(), 0, MA, 0, MODE_SMA, PRICE_CLOSE, 0) + 10.0 * Point, Digits);
       l_price_28 = NormalizeDouble(iMA(Symbol(), 0, MA, 0, MODE_SMA, PRICE_CLOSE, 0) - 10.0 * Point, Digits);
       l_price_36 = NormalizeDouble(iFractals(Symbol(), 0, MODE_UPPER, 3), Digits);
       l_price_44 = NormalizeDouble(iFractals(Symbol(), 0, MODE_LOWER, 3), Digits);
       if (OrdersTotal() > 0) {
          for (l_pos_0 = OrdersTotal() - 1; l_pos_0 >= 0; l_pos_0--) {
             if (OrderSelect(l_pos_0, SELECT_BY_POS)) {
                if (OrderSymbol() == Symbol() && OrderMagicNumber() == MAGICMA) {
                   [color=#ff0000]if (OrderType() == OP_BUY && OrderOpenPrice() > Bid || OrderType() == OP_SELL && OrderOpenPrice() < Ask) break;
                   if (OrderType() == OP_BUY && OrderStopLoss() < OrderOpenPrice()) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_28, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                   if (OrderType() == OP_BUY && OrderStopLoss() > OrderOpenPrice() && OrderStopLoss() < l_price_44) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_44, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                   if (OrderType() == OP_SELL && OrderStopLoss() > OrderOpenPrice()) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_20, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                   if (OrderType() == OP_SELL && OrderStopLoss() < OrderOpenPrice() && OrderStopLoss() > l_price_36 && l_price_36 != 0.0) {
                      while (IsTradeContextBusy()) Sleep(1000);
                      RefreshRates();
                      OrderModify(OrderTicket(), OrderOpenPrice(), l_price_36, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                   }
                }
             }
          }
       }
    }
}

Автор - Scrudg
Дата добавления - 04.09.2014 в 12:55

expforexДата: Четверг, 04.09.2014, 12:55 | Сообщение # 3
Главный Администартор
Группа: Администраторы
Сообщений: 9113
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

привет

ошибок здесь действительно много, но дело даже не в переводе.

по сути - переводить старый код в новый код - не должно возникать особых проблем, изменения минимум. Все они описаны здесь: http://www.expforex.com/publ....1-0-126



Программирование на заказ || Наши Разработки
 
Сообщениепривет

ошибок здесь действительно много, но дело даже не в переводе.

по сути - переводить старый код в новый код - не должно возникать особых проблем, изменения минимум. Все они описаны здесь: http://www.expforex.com/publ....1-0-126

Автор - expforex
Дата добавления - 04.09.2014 в 12:55

expforexДата: Четверг, 04.09.2014, 12:55 | Сообщение # 4
Главный Администартор
Группа: Администраторы
Сообщений: 9113
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Scrudg, возможно это форум добавил :-) когда Вы выделили данную строку другим цветом. ок

тогда все ок
даже не имея всего кода, данный код не выдает ошибок 

check operator precedence for possible error; use parentheses to clarify precedence ыв.mq4 11 64

Это не ошибка а предупреждение о том, что компилятор не знает как расставлять скобки в инструкции:

           

Код
if (OrderType() == OP_BUY && OrderOpenPrice() > Bid || OrderType() == OP_SELL && OrderOpenPrice() < Ask) return;
 

если смотреть на код с точки зреняи программиста то скобки должны быть сделаны так:

           
Код
if ((OrderType() == OP_BUY && OrderOpenPrice() > Bid) || (OrderType() == OP_SELL && OrderOpenPrice() < Ask)) return;
 

Причина таких издевательств - декомпилированный код советника, который неправильно декомпилирует.



Программирование на заказ || Наши Разработки
 
СообщениеScrudg, возможно это форум добавил :-) когда Вы выделили данную строку другим цветом. ок

тогда все ок
даже не имея всего кода, данный код не выдает ошибок 

check operator precedence for possible error; use parentheses to clarify precedence ыв.mq4 11 64

Это не ошибка а предупреждение о том, что компилятор не знает как расставлять скобки в инструкции:

           
Код
if (OrderType() == OP_BUY && OrderOpenPrice() > Bid || OrderType() == OP_SELL && OrderOpenPrice() < Ask) return;
 

если смотреть на код с точки зреняи программиста то скобки должны быть сделаны так:

           
Код
if ((OrderType() == OP_BUY && OrderOpenPrice() > Bid) || (OrderType() == OP_SELL && OrderOpenPrice() < Ask)) return;
 

Причина таких издевательств - декомпилированный код советника, который неправильно декомпилирует.

Автор - expforex
Дата добавления - 04.09.2014 в 12:55

ScrudgДата: Четверг, 04.09.2014, 12:56 | Сообщение # 5
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

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

Там ещё четыре ошибки: return value of 'OrderModify' should be checked

пробовал bool modify1=OrderModify..........
две строки исправляет, а две нет.......

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

Там ещё четыре ошибки: return value of 'OrderModify' should be checked

пробовал bool modify1=OrderModify..........
две строки исправляет, а две нет.......

Автор - Scrudg
Дата добавления - 04.09.2014 в 12:56

expforexДата: Четверг, 04.09.2014, 12:56 | Сообщение # 6
Главный Администартор
Группа: Администраторы
Сообщений: 9113
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Scrudg, давайте еще раз определимся с пониманием ОШИБКА и ПРЕДУПРЕЖДЕНИЕ

return value of 'OrderModify' should be checked
Это ПРЕДУПРЕЖДЕНИЕ.
Предупреждение не влияет на исоплнение кода, оно подсказывает - что здесь нужно подправить. 



Цитата
10. Еще один нюанс в 625 билде терминала мт4 should be checked

  • return value of 'OrderSelect' should be checked
  • return value of 'OrderDelete' should be checked
  • return value of 'OrderSend' should be checked
  • return value of 'OrderClose' should be checked
  • return value of 'OrderModify' should be checked


для того, чтобы не было таких предупреждений  нужно явно указать возврат в переменную
например так:
  • bool select1=OrderSelect..........
  • bool delete1=OrderDelete..........
  • bool close1=OrderClose..........
  • bool modify1=OrderModify..........
  • int send1=OrderSend..........



Имеется ввиду что две переменные нельзя называть одним именем
  • bool modify2=OrderModify..........

  • bool modify3=OrderModify..........



попробуйте так.



Программирование на заказ || Наши Разработки
 
СообщениеScrudg, давайте еще раз определимся с пониманием ОШИБКА и ПРЕДУПРЕЖДЕНИЕ

return value of 'OrderModify' should be checked
Это ПРЕДУПРЕЖДЕНИЕ.
Предупреждение не влияет на исоплнение кода, оно подсказывает - что здесь нужно подправить. 


Цитата
10. Еще один нюанс в 625 билде терминала мт4 should be checked

  • return value of 'OrderSelect' should be checked
  • return value of 'OrderDelete' should be checked
  • return value of 'OrderSend' should be checked
  • return value of 'OrderClose' should be checked
  • return value of 'OrderModify' should be checked


для того, чтобы не было таких предупреждений  нужно явно указать возврат в переменную
например так:
  • bool select1=OrderSelect..........
  • bool delete1=OrderDelete..........
  • bool close1=OrderClose..........
  • bool modify1=OrderModify..........
  • int send1=OrderSend..........



Имеется ввиду что две переменные нельзя называть одним именем
  • bool modify2=OrderModify..........

  • bool modify3=OrderModify..........



попробуйте так.

Автор - expforex
Дата добавления - 04.09.2014 в 12:56

ScrudgДата: Четверг, 04.09.2014, 12:56 | Сообщение # 7
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 14
Награды: 0
Статус: Offline


[Бонусы за сообщения ]

То есть как я понял, переменные прописываем по порядку.

Прописал bool modify0=
               bool modify2=
               bool modify3=
               bool modify4=

Предупреждения исчезли. Спасибо.

 
СообщениеТо есть как я понял, переменные прописываем по порядку.

Прописал bool modify0=
               bool modify2=
               bool modify3=
               bool modify4=

Предупреждения исчезли. Спасибо.

Автор - Scrudg
Дата добавления - 04.09.2014 в 12:56

expforexДата: Четверг, 04.09.2014, 12:56 | Сообщение # 8
Главный Администартор
Группа: Администраторы
Сообщений: 9113
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

Scrudgwink



Программирование на заказ || Наши Разработки
 
СообщениеScrudgwink

Автор - expforex
Дата добавления - 04.09.2014 в 12:56

NazarДата: Пятница, 19.09.2014, 11:48 | Сообщение # 9
Трейдер - Рядовой
Группа: Пользователи
Сообщений: 12
Награды: 0
Статус: Offline


[Бонусы за сообщения ]



Код
double Spread(double AddValue=0)
{
    double LastValue;
    static double ArrayTotal=0;
    //---   
    if (AddValue == 0 && SpreadSampleSize <= 0) return(Ask-Bid);
    if (AddValue == 0 && ArrayTotal == 0) return(Ask-Bid);
    if (AddValue == 0 ) return(ArrayTotal/ArraySize(Spread));
    //---   
    ArrayTotal = ArrayTotal + AddValue;
    ArraySetAsSeries(Spread, true);   
    if (ArraySize(Spread) == SpreadSampleSize)
    {
    LastValue = Spread[0];
    ArrayTotal = ArrayTotal - LastValue;
    ArraySetAsSeries(Spread, false);
    ArrayResize(Spread, ArraySize(Spread)-1 );
    ArraySetAsSeries(Spread, true);
    ArrayResize(Spread, ArraySize(Spread)+1 );   
    }
    else ArrayResize(Spread, ArraySize(Spread)+1 );   
    ArraySetAsSeries(Spread, false);
    Spread[0] = AddValue;
    //---
    return(NormalizeDouble(ArrayTotal/ArraySize(Spread), Digits));
}

Всем привет!
вот и у меня возникла проблема в новом билде.
суть проблемы: советник не правильно подсчитывает средний спред.в старом билде все работало отлично,в новом-работает неправильно. на скрине слева старый билд(average spread = 0.7 все ОК!),
справа- новый.(average spread = -1.7 ???). при компилировании никаких ошибок нет.

Прикрепления: 4862139.png(36Kb)


Сообщение отредактировал Nazar - Пятница, 19.09.2014, 11:50
 
Сообщение
Код
double Spread(double AddValue=0)
{
    double LastValue;
    static double ArrayTotal=0;
    //---   
    if (AddValue == 0 && SpreadSampleSize <= 0) return(Ask-Bid);
    if (AddValue == 0 && ArrayTotal == 0) return(Ask-Bid);
    if (AddValue == 0 ) return(ArrayTotal/ArraySize(Spread));
    //---   
    ArrayTotal = ArrayTotal + AddValue;
    ArraySetAsSeries(Spread, true);   
    if (ArraySize(Spread) == SpreadSampleSize)
    {
    LastValue = Spread[0];
    ArrayTotal = ArrayTotal - LastValue;
    ArraySetAsSeries(Spread, false);
    ArrayResize(Spread, ArraySize(Spread)-1 );
    ArraySetAsSeries(Spread, true);
    ArrayResize(Spread, ArraySize(Spread)+1 );   
    }
    else ArrayResize(Spread, ArraySize(Spread)+1 );   
    ArraySetAsSeries(Spread, false);
    Spread[0] = AddValue;
    //---
    return(NormalizeDouble(ArrayTotal/ArraySize(Spread), Digits));
}

Всем привет!
вот и у меня возникла проблема в новом билде.
суть проблемы: советник не правильно подсчитывает средний спред.в старом билде все работало отлично,в новом-работает неправильно. на скрине слева старый билд(average spread = 0.7 все ОК!),
справа- новый.(average spread = -1.7 ???). при компилировании никаких ошибок нет.


Автор - Nazar
Дата добавления - 19.09.2014 в 11:48

expforexДата: Пятница, 19.09.2014, 12:25 | Сообщение # 10
Главный Администартор
Группа: Администраторы
Сообщений: 9113
Награды: 29
Статус: Offline


[Бонусы за сообщения ]

у Вас функция и название переменной одинаковое - так нельзя. 
в вторых задавать размер массива = 0 также нельзя, нужно писать вообще без цифры. 
double Spread[];



Программирование на заказ || Наши Разработки
 
Сообщениеу Вас функция и название переменной одинаковое - так нельзя. 
в вторых задавать размер массива = 0 также нельзя, нужно писать вообще без цифры. 
double Spread[];

Автор - expforex
Дата добавления - 19.09.2014 в 12:25
Форум трейдеров » Скрипты Советники Индикаторы для Metatrader4/Metatrader5 » MT 4 MQL программирование, помощь. » Исправление ошибок в советниках на новых билдах (Помощь в исправлении)
Страница 1 из 6123456»
Поиск:


WebMoney Яндекс цитирования.