Помогите решить Error 1 с OrderModify - страница 5

 
Alexey Volchanskiy:
printf, он же PrintFormat, более удобен и универсален, чем Print. Учебник описывает старую версию MQL4, так что устарел. Общего списка обновлений по версиям нет, некоторые сведения печатаются на этом форуме. 

Спасибо. 

Т.е. если что-то перестало работать или работает не корректно, то я либо случайно замечу это на форуме либо код не будет выполнятся? 

 
Roman Meskhidze:

Спасибо. 

Т.е. если что-то перестало работать или работает не корректно, то я либо случайно замечу это на форуме либо код не будет выполнятся? 

Надо ориентироваться на встроенную справку, а не на учебник. Справка обновляется постоянно и там редко бывают ошибки. Если я нахожу там или в МТ ошибку, пишу в сервис-дек, обычно реагируют оперативно исправляют в следующей версии терминала.

Пример по массивам:

1. В старом MQL4 можно было передавать массивы по ссылке или не по ссылке. Теперь можно только по ссылке. Но эта ошибка отслеживается компилятором.

2. В старом MQL локальные массивы сохранялись при выходе из функции, т.е. по умолчанию были static. Теперь это привели к правилам С/С++ и массивы уничтожаются. Старые программы, скомпилированные новым компилятором, могут работать некорректно с такими массивами.

 
Roman Meskhidze:
Коллеги, добрый день,

Есть тралл ТП который работает, но всегда выдает Error 1, а в редких случаях переводить ТП в убыток. Помогите решать проблему пожалуйста.

[code]
void TrallTP()
{
   double price = 0, lots = 0, avgprice = 0;
   for (int i=OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS)) 
      {
         if (OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
         {
            price +=OrderOpenPrice() * OrderLots();
            lots +=OrderLots();
         }      
      }
   }
   
   if (price == 0) return;
   avgprice = NormalizeDouble(price / lots, Digits);
   
   if (OrderType() == OP_BUY) TP = NormalizeDouble(avgprice + Takeprofit * Point, Digits);
   if (OrderType() == OP_SELL) TP = NormalizeDouble(avgprice - Takeprofit * Point, Digits);
   
   for (int i=OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS)) 
      {
         if (OrderMagicNumber() == Magic)
         {
            if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP, OrderExpiration(), clrAliceBlue)) printf("Error: ", GetLastError());
         }
      }
   }       
}

[/code]

Здравствуйте Роман.

Вам удалось решить проблему с ошибкой 1, функции OrderModify()? Информации по этому вопросу найти не получается. Эта ветвь в форуме, пожалуй, лучшее, что попалось на глаза. Но указанная в ней информация не решить проблему не помогла помогла....

Если Вы более удачливы в этом вопросе, не поделитесь информацией? 

 
Hossar:

Здравствуйте Роман.

Вам удалось решить проблему с ошибкой 1, функции OrderModify()? Информации по этому вопросу найти не получается. Эта ветвь в форуме, пожалуй, лучшее, что попалось на глаза. Но указанная в ней информация не решить проблему не помогла помогла....

Если Вы более удачливы в этом вопросе, не поделитесь информацией? 

Мне лениво перечитывать всё что написано здесь, поэтому может быть повторю уже сказанное.

Ошибка #1 -

1

ERR_NO_RESULT

Нет ошибки, но результат неизвестен

появляется тогда когда отправляется приказ модифицировать ордер с теми параметрами которые уже установлены ордеру. Следовательно чтобы от неё избавиться надо проверить новое значение с тем которое есть у ордера и только если эти значения не равны, а лучше их нормализованная разность не равна нулю, тогда отправлять приказ OrderModify();
 
Alexey Viktorov:

Мне лениво перечитывать всё что написано здесь, поэтому может быть повторю уже сказанное.

Ошибка #1 -

1

ERR_NO_RESULT

Нет ошибки, но результат неизвестен

появляется тогда когда отправляется приказ модифицировать ордер с теми параметрами которые уже установлены ордеру. Следовательно чтобы от неё избавиться надо проверить новое значение с тем которое есть у ордера и только если эти значения не равны, а лучше их нормализованная разность не равна нулю, тогда отправлять приказ OrderModify();

Спасибо за скорый ответ, но (по моему субъективному мнению, возникшему вскоре после написания 1-го сообщения) ....

Вообще то, void TrallTP() - функция усреднения, а не трала. Просто вначале не внимательно просмотрел...

" Коллеги, добрый день,
Есть тралл ТП который работает, но всегда выдает Error 1, а в редких случаях переводить ТП в убыток. Помогите решать проблему пожалуйста.
[code]

void TrallTP() "

Если происходит модификация 1-го ордера, то основная проблема будет заключаться в условии: for (int i = OrdersTotal() - 1; i  >=  0;  i--)  т.к., если ордер 1, то логическое выражение в конечном итоге будет равно 0. Более того, при компиляции MetaEditor честно предупреждает, что "expression has no effect" - т.е. "не эффективно". Указанное условие имеет смысл, если ордеров не менее 2-х. В противном случае - ошибка 1 будет возникать постоянно. Указанное условие следует применять при усреднении ордеров, где предполагается возникновение отрицательного TakeProfit (положительного StopLoss) - иначе, при использовании метода Мартингейла (в разных вариантах).

Если речь идет о модификации 1-го предварительно выбранного ордера, то лучше использовать "правильное" условие (минимум 1): for (i  =  0; i  <  ot;  i++), где  int ot = OrdersTotal(). При этом обязательно нормализировать цены и пункты, как и говорили другие участники обсуждения. И если всё сделать нормально - ошибка 1 не возникает. А ещё лучше задачи модификации разделить на: OrderModify() StopLoss   и  OrderModify() TakeProfit.

Но суть вопроса в том, что если установлен 1 ордер, и функция  OrderModify()  содержит условие  for (int i = OrdersTotal() - 1; i  >=  0;  i--) и предполагает усреднение, то ошибка 1 возникает постоянно. Пока не хватает мозгов, чтобы её исправить. Хотя некоторые догадки, требующие проверки ещё остались, но лучше предварительно спросить у коллективного разума. Поэтому, я и уточняю:

- удалось ли решить проблему непосредственно в функции  OrderModify() ? (может какое-нибудь "исключительное" условие-проверка)

- или лучше всё же придумывать условие для вызова функции OrderModify() обособленно?

 

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

=====================

// только для трала ордеров; всегда будет устанавливаться минимальный  StopLoss  +1 пт; для трала - TakeProfit проверять и модифицировать (как и его наличие вообще) не обязательно.

bool Trailing;

int Tral = FALSE, SL = 0;

// для Buy-ордеров 

SL = NormalizeDouble(Bid - (Tral - 1)*Point, Digits);

if ((Bid - OrderOpenPrice() > Tral*Point ) && (OrderStopLoss() < Bid - Tral*Point)) 

// для Sell-ордеров  

SL = NormalizeDouble(Ask + (Tral - 1)*Point, Digits);

if ((OrderOpenPrice() - Ask > Tral*Point) && (OrderStopLoss() > Ask + Tral*Point || OrderStopLoss() == 0))

// сама функция

bool Trailing = OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0, clrYellow); 

=====================

Если прописано:  for (i  =  0; i  <  ot;  i++), где  int ot = OrdersTotal()  , ошибка 1 при модификации 1-го ордера (OrdersTotal() = 1) не возникает (про группу ордеров не уверен; если не подводит память, при таком условии группа ордеров модифицироваться не будет вообще).

Если прописано: for (int i = OrdersTotal() - 1; i  >=  0;  i--)  , ошибка 1 будет возникать если установлен 1 ордер (OrdersTotal() = 1). Если ордеров больше чем 1, ошибок не будет. При этом ордера модифицируются все. Может нужно прописать, например: for (int i = OrdersTotal() - 1; i  >  0;  i--) ? Нужно будет проверить...

 

Не надо путать ошибку 1 и работу цикла в одну кучу.

Пишу "на коленке" поэтому извиняйте если что-то пропустил

double sl, tp;
 // Потом рассчитываем эти sl и tp или получаем их из входных параметров функции
 // и потом цикл для всех ордеров...
for(int i = OrdersTotal()-1; i >=0; i--)
 {
  if(OrderSelect(i, SELECT_BY_POS) // можно добавить проверку символа и магика
   {
    if(NormalizeDouble(OrderStopLoss()-sl, _Digits) != 0 || NormalizeDouble(OrderTakeProfit()-tp, _Digits) != 0)// Об этом я говорил в предыдущем сообщении
     if(!OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0))
       Print("Чё-та не получился ордермодифай, ");
   }
 }

sl и tp в этом примере уже должны быть в виде цены.

Если ордер всего 1 то цикл повторится только 1 раз.

 
Alexey Viktorov:

Не надо путать ошибку 1 и работу цикла в одну кучу.

Пишу "на коленке" поэтому извиняйте если что-то пропустил

sl и tp в этом примере уже должны быть в виде цены.

Если ордер всего 1 то цикл повторится только 1 раз.

Алексей!

Ошибка 1 и циклы взаимосвязаны, может не прямо - но косвенно или опосредованно. Но не будем распространяться далее.

Как понял - решения вопроса с ошибкой 1 у вас нет. Как и особого желания дискутировать это вопрос снова.

Хорошо. Спасибо за комментарии и потраченное время.

Я ещё покопаюсь с этим. Если будут подвижки - отпишусь.

Всем спасибо! Вы лучшие! 

 
Hossar:

Алексей!

Ошибка 1 и циклы взаимосвязаны, может не прямо - но косвенно или опосредованно. Но не будем распространяться далее.

Как понял - решения вопроса с ошибкой 1 у вас нет. Как и особого желания дискутировать это вопрос снова.

Хорошо. Спасибо за комментарии и потраченное время.

Я ещё покопаюсь с этим. Если будут подвижки - отпишусь.

Всем спасибо! Вы лучшие! 

Вы на ровном месте проблему делаете.

Проверяйте перед модификацией чтобы модифицируемые параметры не были равны параметрам модифицируемого ордера. Тогда и не будет ошибки 1

А цикл тут совсем не при чём. Совершенно. Цикл у вас верный - от количества ордеров-1, до нуля включительно. И он не влияет на ошибку модификации. Цикл влияет только на верность выбора очередного ордера в списке.

 
Да ладно Артём, мы с тобой ничего не понимаем в программировании. Вон люди уже больше года разбираются с проблемой и никак не решат...
 
Alexey Viktorov:
Да ладно Артём, мы с тобой ничего не понимаем в программировании. Вон люди уже больше года разбираются с проблемой и никак не решат...
Ну может заняться просто людям больше нечем? 
Причина обращения: