Alexey Volchanskiy:
printf, он же PrintFormat, более удобен и универсален, чем Print. Учебник описывает старую версию MQL4, так что устарел. Общего списка обновлений по версиям нет, некоторые сведения печатаются на этом форуме.
Спасибо.
Т.е. если что-то перестало работать или работает не корректно, то я либо случайно замечу это на форуме либо код не будет выполнятся?
Т.е. если что-то перестало работать или работает не корректно, то я либо случайно замечу это на форуме либо код не будет выполнятся?
Надо ориентироваться на встроенную справку, а не на учебник. Справка обновляется постоянно и там редко бывают ошибки. Если я нахожу там или в МТ ошибку, пишу в сервис-дек, обычно реагируют оперативно исправляют в следующей версии терминала.
Пример по массивам:
1. В старом MQL4 можно было передавать массивы по ссылке или не по ссылке. Теперь можно только по ссылке. Но эта ошибка отслеживается компилятором.
2. В старом MQL локальные массивы сохранялись при выходе из функции, т.е. по умолчанию были static. Теперь это привели к правилам С/С++ и массивы уничтожаются. Старые программы, скомпилированные новым компилятором, могут работать некорректно с такими массивами.
Есть тралл ТП который работает, но всегда выдает 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()? Информации по этому вопросу найти не получается. Эта ветвь в форуме, пожалуй, лучшее, что попалось на глаза. Но указанная в ней информация не решить проблему не помогла помогла....
Если Вы более удачливы в этом вопросе, не поделитесь информацией?
Вам удалось решить проблему с ошибкой 1, функции OrderModify()? Информации по этому вопросу найти не получается. Эта ветвь в форуме, пожалуй, лучшее, что попалось на глаза. Но указанная в ней информация не решить проблему не помогла помогла....
Если Вы более удачливы в этом вопросе, не поделитесь информацией?
Мне лениво перечитывать всё что написано здесь, поэтому может быть повторю уже сказанное.
Ошибка #1 -
1
ERR_NO_RESULT
Нет ошибки, но результат неизвестен
появляется тогда когда отправляется приказ модифицировать ордер с теми параметрами которые уже установлены ордеру. Следовательно чтобы от неё избавиться надо проверить новое значение с тем которое есть у ордера и только если эти значения не равны, а лучше их нормализованная разность не равна нулю, тогда отправлять приказ OrderModify();
Мне лениво перечитывать всё что написано здесь, поэтому может быть повторю уже сказанное.
Ошибка #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 проверять и модифицировать (как и его наличие вообще) не обязательно.
Если прописано: 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 раз.
Ошибка 1 и циклы взаимосвязаны, может не прямо - но косвенно или опосредованно. Но не будем распространяться далее.
Как понял - решения вопроса с ошибкой 1 у вас нет. Как и особого желания дискутировать это вопрос снова.
Хорошо. Спасибо за комментарии и потраченное время.
Я ещё покопаюсь с этим. Если будут подвижки - отпишусь.
Всем спасибо! Вы лучшие!
Вы на ровном месте проблему делаете.
Проверяйте перед модификацией чтобы модифицируемые параметры не были равны параметрам модифицируемого ордера. Тогда и не будет ошибки 1
А цикл тут совсем не при чём. Совершенно. Цикл у вас верный - от количества ордеров-1, до нуля включительно. И он не влияет на ошибку модификации. Цикл влияет только на верность выбора очередного ордера в списке.
Alexey Viktorov: Да ладно Артём, мы с тобой ничего не понимаем в программировании. Вон люди уже больше года разбираются с проблемой и никак не решат...
printf, он же PrintFormat, более удобен и универсален, чем Print. Учебник описывает старую версию MQL4, так что устарел. Общего списка обновлений по версиям нет, некоторые сведения печатаются на этом форуме.
Спасибо.
Т.е. если что-то перестало работать или работает не корректно, то я либо случайно замечу это на форуме либо код не будет выполнятся?
Спасибо.
Т.е. если что-то перестало работать или работает не корректно, то я либо случайно замечу это на форуме либо код не будет выполнятся?
Надо ориентироваться на встроенную справку, а не на учебник. Справка обновляется постоянно и там редко бывают ошибки. Если я нахожу там или в МТ ошибку, пишу в сервис-дек, обычно реагируют оперативно исправляют в следующей версии терминала.
Пример по массивам:
1. В старом MQL4 можно было передавать массивы по ссылке или не по ссылке. Теперь можно только по ссылке. Но эта ошибка отслеживается компилятором.
2. В старом MQL локальные массивы сохранялись при выходе из функции, т.е. по умолчанию были static. Теперь это привели к правилам С/С++ и массивы уничтожаются. Старые программы, скомпилированные новым компилятором, могут работать некорректно с такими массивами.
Здравствуйте Роман.
Вам удалось решить проблему с ошибкой 1, функции OrderModify()? Информации по этому вопросу найти не получается. Эта ветвь в форуме, пожалуй, лучшее, что попалось на глаза. Но указанная в ней информация не решить проблему не помогла помогла....
Если Вы более удачливы в этом вопросе, не поделитесь информацией?
Здравствуйте Роман.
Вам удалось решить проблему с ошибкой 1, функции OrderModify()? Информации по этому вопросу найти не получается. Эта ветвь в форуме, пожалуй, лучшее, что попалось на глаза. Но указанная в ней информация не решить проблему не помогла помогла....
Если Вы более удачливы в этом вопросе, не поделитесь информацией?
Мне лениво перечитывать всё что написано здесь, поэтому может быть повторю уже сказанное.
Ошибка #1 -
1
ERR_NO_RESULT
Нет ошибки, но результат неизвестен
Мне лениво перечитывать всё что написано здесь, поэтому может быть повторю уже сказанное.
Ошибка #1 -
1
ERR_NO_RESULT
Нет ошибки, но результат неизвестен
Спасибо за скорый ответ, но (по моему субъективному мнению, возникшему вскоре после написания 1-го сообщения) ....
Вообще то, void TrallTP() - функция усреднения, а не трала. Просто вначале не внимательно просмотрел...
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-ордеров
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 и работу цикла в одну кучу.
Пишу "на коленке" поэтому извиняйте если что-то пропустил
sl и tp в этом примере уже должны быть в виде цены.
Если ордер всего 1 то цикл повторится только 1 раз.
Не надо путать ошибку 1 и работу цикла в одну кучу.
Пишу "на коленке" поэтому извиняйте если что-то пропустил
sl и tp в этом примере уже должны быть в виде цены.
Если ордер всего 1 то цикл повторится только 1 раз.
Алексей!
Ошибка 1 и циклы взаимосвязаны, может не прямо - но косвенно или опосредованно. Но не будем распространяться далее.
Как понял - решения вопроса с ошибкой 1 у вас нет. Как и особого желания дискутировать это вопрос снова.
Хорошо. Спасибо за комментарии и потраченное время.
Я ещё покопаюсь с этим. Если будут подвижки - отпишусь.
Всем спасибо! Вы лучшие!
Алексей!
Ошибка 1 и циклы взаимосвязаны, может не прямо - но косвенно или опосредованно. Но не будем распространяться далее.
Как понял - решения вопроса с ошибкой 1 у вас нет. Как и особого желания дискутировать это вопрос снова.
Хорошо. Спасибо за комментарии и потраченное время.
Я ещё покопаюсь с этим. Если будут подвижки - отпишусь.
Всем спасибо! Вы лучшие!
Вы на ровном месте проблему делаете.
Проверяйте перед модификацией чтобы модифицируемые параметры не были равны параметрам модифицируемого ордера. Тогда и не будет ошибки 1
А цикл тут совсем не при чём. Совершенно. Цикл у вас верный - от количества ордеров-1, до нуля включительно. И он не влияет на ошибку модификации. Цикл влияет только на верность выбора очередного ордера в списке.
Да ладно Артём, мы с тобой ничего не понимаем в программировании. Вон люди уже больше года разбираются с проблемой и никак не решат...